From 449aab3c465bbbf66d221fac3d7ea559f1720357 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 2 Jun 2008 21:41:35 +0000 Subject: rollback to 3428, before the mysterious removal of libs/* at 3431/3432 git-svn-id: svn://localhost/ardour2/branches/3.0@3435 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/reverse.cc | 130 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 libs/ardour/reverse.cc (limited to 'libs/ardour/reverse.cc') diff --git a/libs/ardour/reverse.cc b/libs/ardour/reverse.cc new file mode 100644 index 0000000000..02ec2924b0 --- /dev/null +++ b/libs/ardour/reverse.cc @@ -0,0 +1,130 @@ +/* + 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 + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include + +#include + +#include +#include +#include +#include +#include + +#include "i18n.h" + +using namespace std; +using namespace ARDOUR; + +Reverse::Reverse (Session& s) + : Filter (s) +{ +} + +Reverse::~Reverse () +{ +} + +int +Reverse::run (boost::shared_ptr r) +{ + SourceList nsrcs; + SourceList::iterator si; + nframes_t blocksize = 256 * 1024; + Sample* buf = 0; + nframes_t fpos; + nframes_t fstart; + nframes_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; + } + + fstart = region->start(); + + if (blocksize > region->length()) { + blocksize = region->length(); + } + + fpos = max (fstart, (fstart + region->length() - blocksize)); + buf = new Sample[blocksize]; + to_read = blocksize; + + /* now read it backwards */ + + while (to_read) { + + uint32_t n; + + for (n = 0, si = nsrcs.begin(); n < region->n_channels(); ++n, ++si) { + + /* read it in */ + + 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) { + swap (buf[i],buf[to_read-1-i]); + } + + /* write it out */ + + boost::shared_ptr asrc(boost::dynamic_pointer_cast(*si)); + + if (asrc && asrc->write (buf, to_read) != to_read) { + goto out; + } + } + + if (fpos > fstart + blocksize) { + fpos -= to_read; + to_read = blocksize; + } else { + to_read = fpos - fstart; + fpos = fstart; + } + }; + + ret = finish (region, nsrcs); + + out: + + if (buf) { + delete [] buf; + } + + if (ret) { + for (si = nsrcs.begin(); si != nsrcs.end(); ++si) { + boost::shared_ptr asrc(boost::dynamic_pointer_cast(*si)); + asrc->mark_for_remove (); + } + } + + return ret; +} -- cgit v1.2.3