X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Freverse.cc;h=c7ebecea317029172a8d927a7cb005421861b3ab;hb=c7e404a1c0ee9af941a335e4bdd2f667b0c6317a;hp=7495fd177f008aeac62373ea2365edb40830a4e6;hpb=7e277f96d78f56073cd2021dc1c0305cdabd3d90;p=ardour.git diff --git a/libs/ardour/reverse.cc b/libs/ardour/reverse.cc index 7495fd177f..c7ebecea31 100644 --- a/libs/ardour/reverse.cc +++ b/libs/ardour/reverse.cc @@ -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 @@ -48,7 +47,7 @@ Reverse::run (boost::shared_ptr 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 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 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 region) /* write it out */ - if ((*si)->write (buf, to_read) != to_read) { + boost::shared_ptr asrc(boost::dynamic_pointer_cast(*si)); + + if (asrc && asrc->write (buf, to_read) != to_read) { goto out; } } @@ -106,7 +103,6 @@ Reverse::run (boost::shared_ptr 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 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 asrc(boost::dynamic_pointer_cast(*si)); + asrc->mark_for_remove (); } }