X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Frb_effect.cc;h=804b79f87df9e8a555adcbe56bb0a844279e5f8e;hb=5f00d2f3a7afaccaeb9f3057d55d5e1e59c54e47;hp=4cb77d1c5822862e2ca95ea8d712075c02f8d5ba;hpb=b9876aa1d08f83b9a9ef829e6a4dad94cf344e30;p=ardour.git diff --git a/libs/ardour/rb_effect.cc b/libs/ardour/rb_effect.cc index 4cb77d1c58..804b79f87d 100644 --- a/libs/ardour/rb_effect.cc +++ b/libs/ardour/rb_effect.cc @@ -20,15 +20,17 @@ #include #include +#include + #include "pbd/error.h" -#include "rubberband/RubberBandStretcher.h" -#include "ardour/types.h" -#include "ardour/stretch.h" +#include "ardour/audioregion.h" +#include "ardour/audiosource.h" #include "ardour/pitch.h" -#include "ardour/audiofilesource.h" +#include "ardour/progress.h" #include "ardour/session.h" -#include "ardour/audioregion.h" +#include "ardour/stretch.h" +#include "ardour/types.h" #include "i18n.h" @@ -52,7 +54,7 @@ RBEffect::RBEffect (Session& s, TimeFXRequest& req) , tsr (req) { - tsr.progress = 0.0f; + } RBEffect::~RBEffect () @@ -60,7 +62,7 @@ RBEffect::~RBEffect () } int -RBEffect::run (boost::shared_ptr r) +RBEffect::run (boost::shared_ptr r, Progress* progress) { boost::shared_ptr region = boost::dynamic_pointer_cast (r); @@ -70,16 +72,17 @@ RBEffect::run (boost::shared_ptr r) } SourceList nsrcs; - nframes_t done; + framecnt_t done; int ret = -1; - const nframes_t bufsize = 256; + const framecnt_t bufsize = 256; gain_t* gain_buffer = 0; Sample** buffers = 0; char suffix[32]; string new_name; string::size_type at; - nframes_t pos = 0; - int avail = 0; + framepos_t pos = 0; + framecnt_t avail = 0; + boost::shared_ptr result; cerr << "RBEffect: source region: position = " << region->position() << ", start = " << region->start() @@ -147,11 +150,11 @@ RBEffect::run (boost::shared_ptr r) double stretch = region->stretch() * tsr.time_fraction; double shift = region->shift() * tsr.pitch_fraction; - nframes_t read_start = region->ancestral_start() + - nframes_t(region->start() / (double)region->stretch()); + framecnt_t read_start = region->ancestral_start() + + framecnt_t(region->start() / (double)region->stretch()); - nframes_t read_duration = - nframes_t(region->length() / (double)region->stretch()); + framecnt_t read_duration = + framecnt_t(region->length() / (double)region->stretch()); uint32_t channels = region->n_channels(); @@ -159,7 +162,7 @@ RBEffect::run (boost::shared_ptr r) (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); @@ -205,16 +208,16 @@ RBEffect::run (boost::shared_ptr r) try { while (pos < read_duration && !tsr.cancel) { - nframes_t this_read = 0; + framecnt_t this_read = 0; for (uint32_t i = 0; i < channels; ++i) { this_read = 0; - nframes_t this_time; + framepos_t this_time; this_time = min(bufsize, read_duration - pos); - nframes_t this_position; + framepos_t this_position; this_position = read_start + pos - region->start() + region->position(); @@ -237,7 +240,7 @@ RBEffect::run (boost::shared_ptr r) 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); } @@ -247,15 +250,15 @@ RBEffect::run (boost::shared_ptr r) while (pos < read_duration && !tsr.cancel) { - nframes_t this_read = 0; + framecnt_t this_read = 0; for (uint32_t i = 0; i < channels; ++i) { this_read = 0; - nframes_t this_time; + framepos_t this_time; this_time = min(bufsize, read_duration - pos); - nframes_t this_position; + framepos_t this_position; this_position = read_start + pos - region->start() + region->position(); @@ -278,15 +281,15 @@ RBEffect::run (boost::shared_ptr r) 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); - int avail = 0; + framecnt_t avail = 0; while ((avail = stretcher.available()) > 0) { - this_read = min(bufsize, uint32_t(avail)); + this_read = min (bufsize, avail); stretcher.retrieve(buffers, this_read); @@ -307,7 +310,7 @@ RBEffect::run (boost::shared_ptr r) while ((avail = stretcher.available()) >= 0) { - uint32_t this_read = min(bufsize, uint32_t(avail)); + framecnt_t this_read = min (bufsize, avail); stretcher.retrieve(buffers, this_read); @@ -327,7 +330,7 @@ RBEffect::run (boost::shared_ptr r) } } catch (runtime_error& err) { - error << _("timefx code failure. please notify ardour-developers.") << endmsg; + error << string_compose (_("programming error: %1"), X_("timefx code failure")) << endmsg; error << err.what() << endmsg; goto out; } @@ -354,7 +357,19 @@ RBEffect::run (boost::shared_ptr r) stretch, shift); (*x)->set_master_sources (region->master_sources()); - (*x)->set_length( (*x)->length() * stretch, this); + /* multiply the old (possibly previously stretched) region length by the extra + stretch this time around to get its new length + */ + (*x)->set_length ((*x)->length() * tsr.time_fraction); + } + + /* stretch region gain envelope */ + /* XXX: assuming we've only processed one input region into one result here */ + + if (tsr.time_fraction != 1) { + result = boost::dynamic_pointer_cast (results.front()); + assert (result); + result->envelope()->x_scale (tsr.time_fraction); } out: @@ -374,8 +389,6 @@ RBEffect::run (boost::shared_ptr r) } } - tsr.done = true; - return ret; }