summaryrefslogtreecommitdiff
path: root/libs/ardour/reverse.cc
diff options
context:
space:
mode:
authorTaybin Rutkin <taybin@taybin.com>2005-09-24 19:13:41 +0000
committerTaybin Rutkin <taybin@taybin.com>2005-09-24 19:13:41 +0000
commit8af0757b61990767f2a85e68f535a5af9976fd79 (patch)
treef9e06fe12cac866d658a2e7074a61aa74d12f68f /libs/ardour/reverse.cc
parentf9546e5c76afa101e9dbe8a057e72463b03430e5 (diff)
libardour added.
git-svn-id: svn://localhost/trunk/ardour2@17 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/reverse.cc')
-rw-r--r--libs/ardour/reverse.cc125
1 files changed, 125 insertions, 0 deletions
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 <algorithm>
+
+#include <pbd/basename.h>
+
+#include <ardour/types.h>
+#include <ardour/reverse.h>
+#include <ardour/filesource.h>
+#include <ardour/session.h>
+#include <ardour/audioregion.h>
+
+#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;
+}