Add option to limit automatable control parmaters
[ardour.git] / libs / ardour / reverse.cc
index 7495fd177f008aeac62373ea2365edb40830a4e6..9f829ba0d6a5542fde6c8623ef833ab0887113af 100644 (file)
@@ -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
     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/audiofilesource.h>
-#include <ardour/session.h>
-#include <ardour/audioregion.h>
-
-#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)
 {
 }
 
@@ -43,20 +39,24 @@ Reverse::~Reverse ()
 }
 
 int
-Reverse::run (boost::shared_ptr<AudioRegion> region)
+Reverse::run (boost::shared_ptr<Region> r, Progress*)
 {
        SourceList nsrcs;
        SourceList::iterator si;
-       nframes_t blocksize = 256 * 1024;
-       Sample* buf;
-       nframes_t fpos;
-       nframes_t fstart;
-       nframes_t to_read;
+       samplecnt_t blocksize = 256 * 1024;
+       Sample* buf = 0;
+       samplepos_t fpos;
+       samplepos_t fstart;
+       samplecnt_t to_read;
        int ret = -1;
 
+       boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion>(r);
+       if (!region)
+               return ret;
+
        /* create new sources */
 
-       if (make_new_sources (region, nsrcs)) {
+       if (make_new_sources (region, nsrcs, "", false)) {
                goto out;
        }
 
@@ -67,11 +67,10 @@ Reverse::run (boost::shared_ptr<AudioRegion> region)
        }
 
        fpos = max (fstart, (fstart + region->length() - blocksize));
+
        buf = new Sample[blocksize];
        to_read = blocksize;
 
-       cerr << "Reverse " << region->name() << " len = " << region->length() << " blocksize = " << blocksize << " start at " << fstart << endl;
-
        /* now read it backwards */
 
        while (to_read) {
@@ -80,23 +79,23 @@ Reverse::run (boost::shared_ptr<AudioRegion> region)
 
                for (n = 0, si = nsrcs.begin(); n < region->n_channels(); ++n, ++si) {
 
-                       /* read it in */
+                       /* read it in directly from the source */
 
-                       cerr << "read at " << fpos << " for " << to_read << endl;
-                       
-                       if (region->source (n)->read (buf, fpos, to_read) != to_read) {
+                       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 */
 
-                       if ((*si)->write (buf, to_read) != to_read) {
+                       boost::shared_ptr<AudioSource> asrc(boost::dynamic_pointer_cast<AudioSource>(*si));
+
+                       if (asrc && asrc->write (buf, to_read) != to_read) {
                                goto out;
                        }
                }
@@ -106,7 +105,6 @@ Reverse::run (boost::shared_ptr<AudioRegion> region)
                        to_read = blocksize;
                } else {
                        to_read = fpos - fstart;
-                       cerr << "Last read detected, only " << fpos - fstart << " left; move to start and read " << to_read << endl;
                        fpos = fstart;
                }
        };
@@ -119,9 +117,10 @@ Reverse::run (boost::shared_ptr<AudioRegion> region)
 
        if (ret) {
                for (si = nsrcs.begin(); si != nsrcs.end(); ++si) {
-                       (*si)->mark_for_remove ();
+                       boost::shared_ptr<AudioSource> asrc(boost::dynamic_pointer_cast<AudioSource>(*si));
+                       asrc->mark_for_remove ();
                }
        }
-       
+
        return ret;
 }