X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Freverse.cc;h=45d7c83051d7a54954ba37087d6d93179ee27700;hb=ac367e89043e0a7f0db6ca44edf5edaab27e8091;hp=e0cc5d95fbb5b5c7c6c7608196c166a8e2a1944c;hpb=c268314b64c2235b0d69c3854e303accd2cad4d9;p=ardour.git diff --git a/libs/ardour/reverse.cc b/libs/ardour/reverse.cc index e0cc5d95fb..45d7c83051 100644 --- a/libs/ardour/reverse.cc +++ b/libs/ardour/reverse.cc @@ -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 @@ -19,13 +19,13 @@ #include -#include +#include "pbd/basename.h" -#include -#include -#include -#include -#include +#include "ardour/types.h" +#include "ardour/reverse.h" +#include "ardour/audiofilesource.h" +#include "ardour/session.h" +#include "ardour/audioregion.h" #include "i18n.h" @@ -33,7 +33,7 @@ using namespace std; using namespace ARDOUR; Reverse::Reverse (Session& s) - : AudioFilter (s) + : Filter (s) { } @@ -42,17 +42,21 @@ Reverse::~Reverse () } int -Reverse::run (boost::shared_ptr region) +Reverse::run (boost::shared_ptr r, Progress*) { SourceList nsrcs; SourceList::iterator si; - nframes_t blocksize = 256 * 1024; - Sample* buf; - nframes_t fpos; - nframes_t fstart; - nframes_t to_read; + framecnt_t blocksize = 256 * 1024; + Sample* buf = 0; + framepos_t fpos; + framepos_t fstart; + framecnt_t to_read; int ret = -1; + boost::shared_ptr region = boost::dynamic_pointer_cast(r); + if (!region) + return ret; + /* create new sources */ if (make_new_sources (region, nsrcs)) { @@ -66,11 +70,10 @@ Reverse::run (boost::shared_ptr 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) { @@ -79,23 +82,23 @@ Reverse::run (boost::shared_ptr 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 (framecnt_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 asrc(boost::dynamic_pointer_cast(*si)); + + if (asrc && asrc->write (buf, to_read) != to_read) { goto out; } } @@ -105,7 +108,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; } }; @@ -118,9 +120,10 @@ Reverse::run (boost::shared_ptr region) 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 (); } } - + return ret; }