X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Freverse.cc;h=10fce584423b22f8b3edc7ef252cd9a49c1e5d7f;hb=ecb0cd5d119d28092a8f48e4521ac5eba197bb54;hp=13dd531bac5dafc1eb0c427020deb1e852cf1b9d;hpb=b09ab546542040b1d468c9925c60bda2dfd80da8;p=ardour.git diff --git a/libs/ardour/reverse.cc b/libs/ardour/reverse.cc index 13dd531bac..10fce58442 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 @@ -15,18 +15,17 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #include -#include +#include "pbd/basename.h" -#include -#include -#include -#include -#include +#include "ardour/types.h" +#include "ardour/reverse.h" +#include "ardour/audiofilesource.h" +#include "ardour/session.h" +#include "ardour/audioregion.h" #include "i18n.h" @@ -34,7 +33,7 @@ using namespace std; using namespace ARDOUR; Reverse::Reverse (Session& s) - : AudioFilter (s) + : Filter (s) { } @@ -43,72 +42,72 @@ Reverse::~Reverse () } int -Reverse::run (AudioRegion& region) +Reverse::run (boost::shared_ptr r) { - AudioRegion::SourceList nsrcs; - AudioRegion::SourceList::iterator si; - const jack_nframes_t blocksize = 256 * 1048; - Sample buf[blocksize]; - char * workbuf = 0;; - jack_nframes_t fpos; - jack_nframes_t fend; - jack_nframes_t fstart; - jack_nframes_t to_read; + SourceList nsrcs; + SourceList::iterator si; + framecnt_t blocksize = 256 * 1024; + Sample* buf = 0; + framepos_t fpos; + framepos_t fstart; + framecnt_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)) { goto out; } - workbuf = new char[blocksize * 4]; - - fend = region.start() + region.length(); - fstart = region.start(); + fstart = region->start(); - if (blocksize < fend) { - fpos =max(fstart, fend - blocksize); - } else { - fpos = fstart; + if (blocksize > region->length()) { + blocksize = region->length(); } - to_read = min (region.length(), blocksize); + fpos = max (fstart, (fstart + region->length() - blocksize)); + + buf = new Sample[blocksize]; + to_read = blocksize; /* now read it backwards */ - while (1) { + while (to_read) { uint32_t n; - for (n = 0, si = nsrcs.begin(); n < region.n_channels(); ++n, ++si) { + for (n = 0, si = nsrcs.begin(); n < region->n_channels(); ++n, ++si) { + + /* read it in directly from the source */ - /* read it in */ - - if (region.source (n).read (buf, fpos, to_read, workbuf) != to_read) { + if (region->audio_source (n)->read (buf, fpos, to_read) != to_read) { goto out; } - + /* swap memory order */ - - for (jack_nframes_t i = 0; i < to_read/2; ++i) { + + for (nframes_t i = 0; i < to_read/2; ++i) { swap (buf[i],buf[to_read-1-i]); } - + /* write it out */ - if ((*si)->write (buf, to_read, workbuf) != to_read) { + boost::shared_ptr asrc(boost::dynamic_pointer_cast(*si)); + + if (asrc && asrc->write (buf, to_read) != to_read) { goto out; } } - if (fpos == fstart) { - break; - } else if (fpos > fstart + to_read) { + if (fpos > fstart + blocksize) { fpos -= to_read; - to_read = min (fstart - fpos, blocksize); + to_read = blocksize; } else { - to_read = fpos-fstart; + to_read = fpos - fstart; fpos = fstart; } }; @@ -117,15 +116,14 @@ Reverse::run (AudioRegion& region) out: + delete [] buf; + if (ret) { for (si = nsrcs.begin(); si != nsrcs.end(); ++si) { - (*si)->mark_for_remove (); - delete *si; + boost::shared_ptr asrc(boost::dynamic_pointer_cast(*si)); + asrc->mark_for_remove (); } } - if (workbuf) { - delete [] workbuf; - } - + return ret; }