#ifndef XTC_SAMPLE_EDITOR_HPP #define XTC_SAMPLE_EDITOR_HPP #include "xtc/xtc_sample.h" #include "ui.hpp" #include #include #include class UiValue_Input; class UiBox; class SampleCanvas; class SampleEditor : public UiDouble_Window { public: /* Takes ownership of loaded snapshot. Modal edits never touch audio callbacks. */ using Data=std::unique_ptr; explicit SampleEditor(Data sample); std::function trim; xtc_result trim_clip(); std::function adopt; xtc_result save_copy(const char *path,bool use_in_project); xtc_result export_selection(const char *path); xtc_result process(xtc_sample_operation operation,double amount=0); xtc_result undo_sample(); xtc_result select_audible(double threshold,size_t padding); xtc_result snap_zero_crossings(size_t radius); std::function &)> slice; xtc_result detect_attacks(double threshold,size_t gap); xtc_result slice_clip(); const std::vector &attacks() const {return attacks_;} void run(); xtc_result select(size_t begin,size_t end); xtc_result view(size_t begin,unsigned int zoom); const xtc_sample *sample() const {return sample_.get();} size_t begin() const {return begin_;} size_t end() const {return end_;} size_t frames() const {return frames_;} size_t origin() const {return origin_;} unsigned int zoom() const {return zoom_;} void refresh(); private: std::unique_ptr sample_{nullptr,xtc_sample_destroy}; std::unique_ptr previous_{nullptr,xtc_sample_destroy}; std::vector attacks_; size_t frames_=0,begin_=0,end_=0,origin_=0;unsigned int rate_=0,zoom_=1; UiValue_Input *begin_input_,*end_input_,*origin_input_;UiBox *stats_;SampleCanvas *canvas_; }; #endif