X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Freverse.cc;h=9f829ba0d6a5542fde6c8623ef833ab0887113af;hb=b285559767e21aae4467270590f048c3263fd742;hp=c7ebecea317029172a8d927a7cb005421861b3ab;hpb=2a52135c663e9a60b5f0cc9cc6673799c3ea5549;p=ardour.git diff --git a/libs/ardour/reverse.cc b/libs/ardour/reverse.cc index c7ebecea31..9f829ba0d6 100644 --- a/libs/ardour/reverse.cc +++ b/libs/ardour/reverse.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2004 Paul Davis + Copyright (C) 2004 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,21 +19,18 @@ #include -#include - -#include -#include -#include -#include -#include - -#include "i18n.h" +#include "ardour/audioregion.h" +#include "ardour/audiosource.h" +#include "ardour/reverse.h" +#include "ardour/types.h" using namespace std; using namespace ARDOUR; +namespace ARDOUR { class Progress; class Session; } + Reverse::Reverse (Session& s) - : AudioFilter (s) + : Filter (s) { } @@ -42,20 +39,24 @@ Reverse::~Reverse () } int -Reverse::run (boost::shared_ptr region) +Reverse::run (boost::shared_ptr r, Progress*) { SourceList nsrcs; SourceList::iterator si; - nframes_t blocksize = 256 * 1024; + samplecnt_t blocksize = 256 * 1024; Sample* buf = 0; - nframes_t fpos; - nframes_t fstart; - nframes_t to_read; + samplepos_t fpos; + samplepos_t fstart; + samplecnt_t to_read; int ret = -1; + boost::shared_ptr region = boost::dynamic_pointer_cast(r); + if (!region) + return ret; + /* create new sources */ - if (make_new_sources (region, nsrcs)) { + if (make_new_sources (region, nsrcs, "", false)) { goto out; } @@ -66,6 +67,7 @@ Reverse::run (boost::shared_ptr region) } fpos = max (fstart, (fstart + region->length() - blocksize)); + buf = new Sample[blocksize]; to_read = blocksize; @@ -77,18 +79,18 @@ Reverse::run (boost::shared_ptr region) for (n = 0, si = nsrcs.begin(); n < region->n_channels(); ++n, ++si) { - /* read it in */ - + /* read it in directly from the source */ + if (region->audio_source (n)->read (buf, fpos, to_read) != to_read) { goto out; } /* swap memory order */ - - for (nframes_t i = 0; i < to_read/2; ++i) { + + for (samplecnt_t i = 0; i < to_read/2; ++i) { swap (buf[i],buf[to_read-1-i]); } - + /* write it out */ boost::shared_ptr asrc(boost::dynamic_pointer_cast(*si)); @@ -111,9 +113,7 @@ Reverse::run (boost::shared_ptr region) out: - if (buf) { - delete [] buf; - } + delete [] buf; if (ret) { for (si = nsrcs.begin(); si != nsrcs.end(); ++si) { @@ -121,6 +121,6 @@ Reverse::run (boost::shared_ptr region) asrc->mark_for_remove (); } } - + return ret; }