#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"
, tsr (req)
{
- tsr.progress = 0.0f;
+
}
RBEffect::~RBEffect ()
}
int
-RBEffect::run (boost::shared_ptr<Region> r)
+RBEffect::run (boost::shared_ptr<Region> r, Progress* progress)
{
boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (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<AudioRegion> result;
cerr << "RBEffect: source region: position = " << region->position()
<< ", start = " << region->start()
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();
(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);
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();
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);
}
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();
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);
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);
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<AudioRegion> (results.front());
+ assert (result);
+ result->envelope()->x_scale (tsr.time_fraction);
}
out: