new automation state model, sort of working, but not really
[ardour.git] / libs / ardour / session_timefx.cc
index b8f0068a9174de12fff3ad27e0ac4eb744243852..d7274388aab35af77bf0968351deed9e2adbbe2c 100644 (file)
 
 #include <ardour/session.h>
 #include <ardour/audioregion.h>
-#include <ardour/filesource.h>
 #include <ardour/sndfilesource.h>
+#include <ardour/region_factory.h>
+#include <ardour/source_factory.h>
 
 #include "i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
+using namespace PBD;
 using namespace soundtouch;
 
-AudioRegion*
+boost::shared_ptr<AudioRegion>
 Session::tempoize_region (TimeStretchRequest& tsr)
 {
-       AudioRegion::SourceList sources;
-       AudioRegion::SourceList::iterator it;
-       AudioRegion* r = 0;
+       SourceList sources;
+       SourceList::iterator it;
+       boost::shared_ptr<AudioRegion> r;
        SoundTouch st;
        string region_name;
        string ident = X_("-TIMEFX-");
        float percentage;
-       jack_nframes_t total_frames;
-       jack_nframes_t done;
+       nframes_t total_frames;
+       nframes_t done;
 
        /* the soundtouch code wants a *tempo* change percentage, which is 
           of opposite sign to the length change.  
@@ -80,7 +82,8 @@ Session::tempoize_region (TimeStretchRequest& tsr)
                }
 
                try {
-                       sources.push_back(new FileSource (path, frame_rate()));
+                       sources.push_back (boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createWritable (*this, path, false, frame_rate())));
+
                } catch (failed_constructor& err) {
                        error << string_compose (_("tempoize: error creating new audio file %1 (%2)"), path, strerror (errno)) << endmsg;
                        goto out;
@@ -88,17 +91,17 @@ Session::tempoize_region (TimeStretchRequest& tsr)
        }
        
        try {
-               const jack_nframes_t bufsize = 16384;
+               const nframes_t bufsize = 16384;
 
                for (uint32_t i = 0; i < sources.size(); ++i) {
                        gain_t gain_buffer[bufsize];
                        Sample buffer[bufsize];
-                       jack_nframes_t pos = 0;
-                       jack_nframes_t this_read = 0;
+                       nframes_t pos = 0;
+                       nframes_t this_read = 0;
 
                        st.clear();
                        while (tsr.running && pos < tsr.region->length()) {
-                               jack_nframes_t this_time;
+                               nframes_t this_time;
                        
                                this_time = min (bufsize, tsr.region->length() - pos);
 
@@ -149,15 +152,17 @@ Session::tempoize_region (TimeStretchRequest& tsr)
        xnow = localtime (&now);
 
        for (it = sources.begin(); it != sources.end(); ++it) {
-               dynamic_cast<FileSource*>(*it)->update_header (tsr.region->position(), *xnow, now);
+               boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*it);
+               if (afs) {
+                       afs->update_header (tsr.region->position(), *xnow, now);
+               }
        }
 
        region_name = tsr.region->name() + X_(".t");
 
-       r = new AudioRegion (sources, 0, sources.front()->length(), region_name,
-                       0, AudioRegion::Flag (AudioRegion::DefaultFlags | AudioRegion::WholeFile));
-
-
+       r = (boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (sources, 0, sources.front()->length(), region_name,
+                                                                             0, AudioRegion::Flag (AudioRegion::DefaultFlags | AudioRegion::WholeFile))));
+            
   out:
 
        if (sources.size()) {
@@ -166,21 +171,19 @@ Session::tempoize_region (TimeStretchRequest& tsr)
                   for deletion.
                */
 
-               if ((r == 0 || !tsr.running)) {
+               if ((!r || !tsr.running)) {
                        for (it = sources.begin(); it != sources.end(); ++it) {
                                (*it)->mark_for_remove ();
-                               delete *it;
                        }
                }
+
+               sources.clear ();
        }
        
        /* if the process was cancelled, delete the region */
 
        if (!tsr.running) {
-               if (r) {
-                       delete r;
-                       r = 0;
-               } 
+               r.reset ();
        }
        
        return r;