new automation state model, sort of working, but not really
[ardour.git] / libs / ardour / audiofilter.cc
index ab4728495f6f91fb6571d2cd625cab45b239b068..a7117cf9dc1646ad87f61408dc3f2a35f8d8d7b1 100644 (file)
 #include <cerrno>
 
 #include <pbd/basename.h>
-#include <ardour/filesource.h>
+#include <ardour/sndfilesource.h>
 #include <ardour/session.h>
 #include <ardour/audioregion.h>
 #include <ardour/audiofilter.h>
+#include <ardour/region_factory.h>
+#include <ardour/source_factory.h>
 
 #include "i18n.h"
 
 using namespace ARDOUR;
+using namespace PBD;
 
 int
-AudioFilter::make_new_sources (AudioRegion& region, AudioRegion::SourceList& nsrcs)
+AudioFilter::make_new_sources (boost::shared_ptr<AudioRegion> region, SourceList& nsrcs)
 {
-       vector<string> names = region.master_source_names();
+       vector<string> names = region->master_source_names();
 
-       for (uint32_t i = 0; i < region.n_channels(); ++i) {
+       for (uint32_t i = 0; i < region->n_channels(); ++i) {
 
                string path = session.path_from_region_name (PBD::basename_nosuffix (names[i]), string (""));
 
                if (path.length() == 0) {
-                       error << compose (_("audiofilter: error creating name for new audio file based on %1"), region.name()) 
+                       error << string_compose (_("audiofilter: error creating name for new audio file based on %1"), region->name()) 
                              << endmsg;
                        return -1;
                }
 
                try {
-                       nsrcs.push_back (new FileSource (path, session.frame_rate()));
+                       nsrcs.push_back (boost::dynamic_pointer_cast<AudioSource> (SourceFactory::createWritable (session, path, false, session.frame_rate())));
                } 
 
                catch (failed_constructor& err) {
-                       error << compose (_("audiofilter: error creating new audio file %1 (%2)"), path, strerror (errno)) << endmsg;
+                       error << string_compose (_("audiofilter: error creating new audio file %1 (%2)"), path, strerror (errno)) << endmsg;
                        return -1;
                }
        }
@@ -60,7 +63,7 @@ AudioFilter::make_new_sources (AudioRegion& region, AudioRegion::SourceList& nsr
 }
 
 int
-AudioFilter::finish (AudioRegion& region, AudioRegion::SourceList& nsrcs)
+AudioFilter::finish (boost::shared_ptr<AudioRegion> region, SourceList& nsrcs)
 {
        string region_name;
 
@@ -72,16 +75,19 @@ AudioFilter::finish (AudioRegion& region, AudioRegion::SourceList& nsrcs)
        time (&xnow);
        now = localtime (&xnow);
 
-       for (AudioRegion::SourceList::iterator si = nsrcs.begin(); si != nsrcs.end(); ++si) {
-               dynamic_cast<FileSource*>((*si))->update_header (session.transport_frame(), *now, xnow);
+       for (SourceList::iterator si = nsrcs.begin(); si != nsrcs.end(); ++si) {
+               boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*si);
+               if (afs) {
+                       afs->update_header (region->position(), *now, xnow);
+               }
        }
 
        /* create a new region */
 
-       region_name = session.new_region_name (region.name());
+       region_name = session.new_region_name (region->name());
        results.clear ();
-       results.push_back (new AudioRegion (nsrcs, 0, region.length(), region_name, 0, 
-                                           Region::Flag (Region::WholeFile|Region::DefaultFlags)));
-
+       results.push_back (boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (nsrcs, 0, region->length(), region_name, 0, 
+                                                                                           Region::Flag (Region::WholeFile|Region::DefaultFlags))));
+       
        return 0;
 }