summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2012-01-24 17:04:15 +0000
committerCarl Hetherington <carl@carlh.net>2012-01-24 17:04:15 +0000
commitddd162bdb050558f93222800ebd57d737f2c9e0d (patch)
tree6b2f9e0f9a5f7f9c4aa9f9d44163e8aabe59980a
parentf3624c18748f2a07d6be16558ce069e6f1366569 (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.cc4
-rw-r--r--gtk2_ardour/editor_timefx.cc15
-rw-r--r--gtk2_ardour/time_fx_dialog.cc7
-rw-r--r--gtk2_ardour/time_fx_dialog.h10
-rw-r--r--libs/ardour/ardour/pitch.h2
-rw-r--r--libs/ardour/rb_effect.cc11
-rw-r--r--libs/ardour/st_pitch.cc3
-rw-r--r--libs/ardour/st_stretch.cc7
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);