Use PBD::copy_file in Session::create() to copy the template file.
[ardour.git] / libs / ardour / reverse.cc
index 7495fd177f008aeac62373ea2365edb40830a4e6..c7ebecea317029172a8d927a7cb005421861b3ab 100644 (file)
@@ -15,7 +15,6 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id$
 */
 
 #include <algorithm>
@@ -48,7 +47,7 @@ Reverse::run (boost::shared_ptr<AudioRegion> region)
        SourceList nsrcs;
        SourceList::iterator si;
        nframes_t blocksize = 256 * 1024;
-       Sample* buf;
+       Sample* buf = 0;
        nframes_t fpos;
        nframes_t fstart;
        nframes_t to_read;
@@ -70,8 +69,6 @@ Reverse::run (boost::shared_ptr<AudioRegion> region)
        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) {
@@ -81,10 +78,8 @@ Reverse::run (boost::shared_ptr<AudioRegion> region)
                for (n = 0, si = nsrcs.begin(); n < region->n_channels(); ++n, ++si) {
 
                        /* read it in */
-
-                       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;
                        }
 
@@ -96,7 +91,9 @@ Reverse::run (boost::shared_ptr<AudioRegion> region)
                        
                        /* 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 +103,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;
                }
        };
@@ -115,11 +111,14 @@ Reverse::run (boost::shared_ptr<AudioRegion> region)
 
   out:
 
-       delete [] buf;
+       if (buf) {
+               delete [] buf;
+       }
 
        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 ();
                }
        }