diff options
author | Carl Hetherington <carl@carlh.net> | 2012-01-24 17:04:15 +0000 |
---|---|---|
committer | Carl Hetherington <carl@carlh.net> | 2012-01-24 17:04:15 +0000 |
commit | ddd162bdb050558f93222800ebd57d737f2c9e0d (patch) | |
tree | 6b2f9e0f9a5f7f9c4aa9f9d44163e8aabe59980a | |
parent | f3624c18748f2a07d6be16558ce069e6f1366569 (diff) |
Make time stretch respect edit groups (#4615).
git-svn-id: svn://localhost/ardour2/branches/3.0@11334 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r-- | gtk2_ardour/editor_drag.cc | 4 | ||||
-rw-r--r-- | gtk2_ardour/editor_timefx.cc | 15 | ||||
-rw-r--r-- | gtk2_ardour/time_fx_dialog.cc | 7 | ||||
-rw-r--r-- | gtk2_ardour/time_fx_dialog.h | 10 | ||||
-rw-r--r-- | libs/ardour/ardour/pitch.h | 2 | ||||
-rw-r--r-- | libs/ardour/rb_effect.cc | 11 | ||||
-rw-r--r-- | libs/ardour/st_pitch.cc | 3 | ||||
-rw-r--r-- | libs/ardour/st_stretch.cc | 7 |
8 files changed, 32 insertions, 27 deletions
diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 5201d3346d..dd4249f597 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -3292,7 +3292,9 @@ TimeFXDrag::finished (GdkEvent* /*event*/, bool movement_occurred) RegionSelection rs; rs.add (_primary); - if (_editor->time_stretch (rs, percentage) == -1) { + RegionSelection all = _editor->get_equivalent_regions (rs, ARDOUR::Properties::edit.property_id); + + if (_editor->time_stretch (all, percentage) == -1) { error << _("An error occurred while executing time stretch operation") << endmsg; } } diff --git a/gtk2_ardour/editor_timefx.cc b/gtk2_ardour/editor_timefx.cc index 1c4162eda2..830d8999a4 100644 --- a/gtk2_ardour/editor_timefx.cc +++ b/gtk2_ardour/editor_timefx.cc @@ -107,8 +107,6 @@ Editor::time_fx (RegionSelection& regions, float val, bool pitching) current_timefx = new TimeFXDialog (*this, pitching); - current_timefx->progress_bar.set_fraction (0.0f); - switch (current_timefx->run ()) { case RESPONSE_ACCEPT: break; @@ -234,7 +232,6 @@ Editor::time_fx (RegionSelection& regions, float val, bool pitching) current_timefx->request.quick_seek = current_timefx->quick_button.get_active(); current_timefx->request.antialias = !current_timefx->antialias_button.get_active(); #endif - current_timefx->request.progress = 0.0f; current_timefx->request.done = false; current_timefx->request.cancel = false; @@ -256,14 +253,10 @@ Editor::time_fx (RegionSelection& regions, float val, bool pitching) pthread_detach (current_timefx->request.thread); - sigc::connection c = Glib::signal_timeout().connect (sigc::mem_fun (current_timefx, &TimeFXDialog::update_progress), 100); - while (!current_timefx->request.done && !current_timefx->request.cancel) { gtk_main_iteration (); } - c.disconnect (); - current_timefx->hide (); return current_timefx->status; } @@ -276,6 +269,8 @@ Editor::do_timefx (TimeFXDialog& dialog) boost::shared_ptr<Region> new_region; bool in_command = false; + uint32_t const N = dialog.regions.size (); + for (RegionSelection::iterator i = dialog.regions.begin(); i != dialog.regions.end(); ) { AudioRegionView* arv = dynamic_cast<AudioRegionView*>(*i); @@ -324,7 +319,9 @@ Editor::do_timefx (TimeFXDialog& dialog) #endif } - if (fx->run (region)) { + current_timefx->descend (1.0 / N); + + if (fx->run (region, current_timefx)) { dialog.status = -1; dialog.request.done = true; delete fx; @@ -344,6 +341,8 @@ Editor::do_timefx (TimeFXDialog& dialog) _session->add_command (new StatefulDiffCommand (playlist)); } + current_timefx->ascend (); + i = tmp; delete fx; } diff --git a/gtk2_ardour/time_fx_dialog.cc b/gtk2_ardour/time_fx_dialog.cc index de5786c982..97e661df84 100644 --- a/gtk2_ardour/time_fx_dialog.cc +++ b/gtk2_ardour/time_fx_dialog.cc @@ -186,11 +186,10 @@ TimeFXDialog::TimeFXDialog (Editor& e, bool pitch) show_all_children (); } -gint -TimeFXDialog::update_progress () +void +TimeFXDialog::update_progress_gui (float p) { - progress_bar.set_fraction (request.progress); - return !request.done; + progress_bar.set_fraction (p); } void diff --git a/gtk2_ardour/time_fx_dialog.h b/gtk2_ardour/time_fx_dialog.h index aee9d40b16..20b0538a7f 100644 --- a/gtk2_ardour/time_fx_dialog.h +++ b/gtk2_ardour/time_fx_dialog.h @@ -24,10 +24,13 @@ #include "ardour_dialog.h" #include "region_selection.h" +#include "progress_reporter.h" class Editor; -struct TimeFXDialog : public ArdourDialog { +class TimeFXDialog : public ArdourDialog, public ProgressReporter +{ +public: ARDOUR::TimeFXRequest request; Editor& editor; bool pitching; @@ -58,11 +61,14 @@ struct TimeFXDialog : public ArdourDialog { TimeFXDialog (Editor& e, bool for_pitch); - gint update_progress (); sigc::connection first_cancel; sigc::connection first_delete; void cancel_in_progress (); gint delete_in_progress (GdkEventAny*); + +private: + + void update_progress_gui (float); }; #endif /* __ardour_time_fx_dialog_h__ */ diff --git a/libs/ardour/ardour/pitch.h b/libs/ardour/ardour/pitch.h index 8c7718f685..3bb179127e 100644 --- a/libs/ardour/ardour/pitch.h +++ b/libs/ardour/ardour/pitch.h @@ -53,7 +53,7 @@ class Pitch : public Filter { Pitch (ARDOUR::Session&, TimeFXRequest&); ~Pitch () {} - int run (boost::shared_ptr<ARDOUR::Region>); + int run (boost::shared_ptr<ARDOUR::Region>, Progress *); private: TimeFXRequest& tsr; diff --git a/libs/ardour/rb_effect.cc b/libs/ardour/rb_effect.cc index e90149926c..d928377e25 100644 --- a/libs/ardour/rb_effect.cc +++ b/libs/ardour/rb_effect.cc @@ -29,6 +29,7 @@ #include "ardour/audiofilesource.h" #include "ardour/session.h" #include "ardour/audioregion.h" +#include "ardour/progress.h" #include "i18n.h" @@ -52,7 +53,7 @@ RBEffect::RBEffect (Session& s, TimeFXRequest& req) , tsr (req) { - tsr.progress = 0.0f; + } RBEffect::~RBEffect () @@ -60,7 +61,7 @@ RBEffect::~RBEffect () } int -RBEffect::run (boost::shared_ptr<Region> r, Progress*) +RBEffect::run (boost::shared_ptr<Region> r, Progress* progress) { boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (r); @@ -160,7 +161,7 @@ RBEffect::run (boost::shared_ptr<Region> r, Progress*) (session.frame_rate(), channels, (RubberBandStretcher::Options) tsr.opts, stretch, shift); - tsr.progress = 0.0f; + progress->set_progress (0); tsr.done = false; stretcher.setExpectedInputDuration(read_duration); @@ -238,7 +239,7 @@ RBEffect::run (boost::shared_ptr<Region> r, Progress*) pos += this_read; done += this_read; - tsr.progress = ((float) done / read_duration) * 0.25; + progress->set_progress (((float) done / read_duration) * 0.25); stretcher.study(buffers, this_read, pos == read_duration); } @@ -279,7 +280,7 @@ RBEffect::run (boost::shared_ptr<Region> r, Progress*) pos += this_read; done += this_read; - tsr.progress = 0.25 + ((float) done / read_duration) * 0.75; + progress->set_progress (0.25 + ((float) done / read_duration) * 0.75); stretcher.process(buffers, this_read, pos == read_duration); diff --git a/libs/ardour/st_pitch.cc b/libs/ardour/st_pitch.cc index 307a41cbf7..8e65ea2b56 100644 --- a/libs/ardour/st_pitch.cc +++ b/libs/ardour/st_pitch.cc @@ -39,13 +39,12 @@ Pitch::Pitch (Session& s, TimeFXRequest& req) , tsr (req) { - tsr.progress = 0.0f; + } int Pitch::run (boost::shared_ptr<Region> region) { - tsr.progress = 1.0f; tsr.done = true; return 1; diff --git a/libs/ardour/st_stretch.cc b/libs/ardour/st_stretch.cc index 3660ff34d3..d8009c1218 100644 --- a/libs/ardour/st_stretch.cc +++ b/libs/ardour/st_stretch.cc @@ -56,7 +56,6 @@ STStretch::STStretch (Session& s, TimeFXRequest& req) st.setSetting(SETTING_USE_QUICKSEEK, tsr.quick_seek); st.setSetting(SETTING_USE_AA_FILTER, tsr.antialias); - tsr.progress = 0.0f; } STStretch::~STStretch () @@ -64,7 +63,7 @@ STStretch::~STStretch () } int -STStretch::run (boost::shared_ptr<Region> a_region) +STStretch::run (boost::shared_ptr<Region> a_region, Progress* progress) { SourceList nsrcs; framecnt_t total_frames; @@ -77,7 +76,7 @@ STStretch::run (boost::shared_ptr<Region> a_region) string new_name; string::size_type at; - tsr.progress = 0.0f; + progress->set_progress (0); tsr.done = false; boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion>(a_region); @@ -131,7 +130,7 @@ STStretch::run (boost::shared_ptr<Region> a_region) pos += this_read; done += this_read; - tsr.progress = (float) done / total_frames; + progress->set_progress ((float) done / total_frames); st.putSamples (buffer, this_read); |