From 8af0757b61990767f2a85e68f535a5af9976fd79 Mon Sep 17 00:00:00 2001 From: Taybin Rutkin Date: Sat, 24 Sep 2005 19:13:41 +0000 Subject: libardour added. git-svn-id: svn://localhost/trunk/ardour2@17 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/reverse.cc | 125 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 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..2474e0cb8d --- /dev/null +++ b/libs/ardour/reverse.cc @@ -0,0 +1,125 @@ +/* + 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. + + $Id$ +*/ + +#include + +#include + +#include +#include +#include +#include +#include + +#include "i18n.h" + +using namespace std; +using namespace ARDOUR; + +Reverse::Reverse (Session& s) + : AudioFilter (s) +{ +} + +Reverse::~Reverse () +{ +} + +int +Reverse::run (AudioRegion& region) +{ + AudioRegion::SourceList nsrcs; + AudioRegion::SourceList::iterator si; + const jack_nframes_t blocksize = 256 * 1048; + Sample buf[blocksize]; + jack_nframes_t fpos; + jack_nframes_t fend; + jack_nframes_t fstart; + jack_nframes_t to_read; + int ret = -1; + + /* create new sources */ + + if (make_new_sources (region, nsrcs)) { + goto out; + } + + fend = region.start() + region.length(); + fstart = region.start(); + + if (blocksize < fend) { + fpos =max(fstart, fend - blocksize); + } else { + fpos = fstart; + } + + to_read = min (region.length(), blocksize); + + /* now read it backwards */ + + while (1) { + + uint32_t n; + + for (n = 0, si = nsrcs.begin(); n < region.n_channels(); ++n, ++si) { + + /* read it in */ + + if (region.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) { + swap (buf[i],buf[to_read-1-i]); + } + + /* write it out */ + + if ((*si)->write (buf, to_read) != to_read) { + goto out; + } + } + + if (fpos == fstart) { + break; + } else if (fpos > fstart + to_read) { + fpos -= to_read; + to_read = min (fstart - fpos, blocksize); + } else { + to_read = fpos-fstart; + fpos = fstart; + } + }; + + ret = finish (region, nsrcs); + + out: + + if (ret) { + for (si = nsrcs.begin(); si != nsrcs.end(); ++si) { + (*si)->mark_for_remove (); + delete *si; + } + } + + return ret; +} -- cgit v1.2.3