enough with umpteen "i18n.h" files. Consolidate on pbd/i18n.h
[ardour.git] / libs / ardour / rb_effect.cc
index 32a2d056d671d4786a96ee1aa8e26cba64dcff3a..bc127e2d816f025727653ebf4e163dbe881212f7 100644 (file)
 #include <algorithm>
 #include <cmath>
 
+#include <rubberband/RubberBandStretcher.h>
+
 #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"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -52,7 +54,7 @@ RBEffect::RBEffect (Session& s, TimeFXRequest& req)
        , tsr (req)
 
 {
-       tsr.progress = 0.0f;
+
 }
 
 RBEffect::~RBEffect ()
@@ -70,18 +72,15 @@ RBEffect::run (boost::shared_ptr<Region> r, Progress* progress)
        }
 
        SourceList nsrcs;
-       nframes_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;
        boost::shared_ptr<AudioRegion> result;
-       
+
        cerr << "RBEffect: source region: position = " << region->position()
             << ", start = " << region->start()
             << ", length = " << region->length()
@@ -148,11 +147,11 @@ RBEffect::run (boost::shared_ptr<Region> r, Progress* progress)
        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();
 
@@ -160,7 +159,7 @@ RBEffect::run (boost::shared_ptr<Region> r, Progress* 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);
@@ -182,6 +181,10 @@ RBEffect::run (boost::shared_ptr<Region> r, Progress* progress)
 
        /* create new sources */
 
+       framepos_t pos   = 0;
+       framecnt_t avail = 0;
+       framecnt_t done  = 0;
+
        if (make_new_sources (region, nsrcs, suffix)) {
                goto out;
        }
@@ -199,23 +202,17 @@ RBEffect::run (boost::shared_ptr<Region> r, Progress* progress)
 
        /* study first, process afterwards. */
 
-       pos = 0;
-       avail = 0;
-       done = 0;
-
        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();
 
@@ -238,7 +235,7 @@ RBEffect::run (boost::shared_ptr<Region> r, Progress* 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);
                }
@@ -248,15 +245,14 @@ RBEffect::run (boost::shared_ptr<Region> r, Progress* progress)
 
                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();
 
@@ -279,15 +275,15 @@ RBEffect::run (boost::shared_ptr<Region> r, Progress* 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);
 
-                       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);
 
@@ -308,7 +304,7 @@ RBEffect::run (boost::shared_ptr<Region> r, Progress* progress)
 
                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);
 
@@ -328,7 +324,7 @@ RBEffect::run (boost::shared_ptr<Region> r, Progress* progress)
                }
 
        } 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;
        }
@@ -355,7 +351,10 @@ RBEffect::run (boost::shared_ptr<Region> r, Progress* progress)
                                          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. this is a non-music based edit atm.
+               */
+               (*x)->set_length ((*x)->length() * tsr.time_fraction, 0);
        }
 
        /* stretch region gain envelope */
@@ -384,8 +383,6 @@ RBEffect::run (boost::shared_ptr<Region> r, Progress* progress)
                }
        }
 
-       tsr.done = true;
-
        return ret;
 }