fixes for various bugs including dangling ref to route in session, opening sessions...
[ardour.git] / libs / ardour / import.cc
index c68eb16aae6745c4a4ea6134d6f254300465319c..2d409e11f78c891a615d9a73bf70092358905c74 100644 (file)
@@ -40,6 +40,9 @@
 #include <ardour/sndfilesource.h>
 #include <ardour/sndfile_helpers.h>
 #include <ardour/audioregion.h>
+#include <ardour/region_factory.h>
+#include <ardour/source_factory.h>
+
 
 #include "i18n.h"
 
@@ -52,8 +55,8 @@ int
 Session::import_audiofile (import_status& status)
 {
        SNDFILE *in;
-       AudioFileSource **newfiles = 0;
-       AudioRegion::SourceList sources;
+       vector<boost::shared_ptr<AudioFileSource> > newfiles;
+       SourceList sources;
        SF_INFO info;
        float *data = 0;
        Sample **channel_data = 0;
@@ -61,7 +64,7 @@ Session::import_audiofile (import_status& status)
        long n;
        string basepath;
        string sounds_dir;
-       jack_nframes_t so_far;
+       nframes_t so_far;
        char buf[PATH_MAX+1];
        int ret = -1;
        vector<string> new_paths;
@@ -94,11 +97,10 @@ Session::import_audiofile (import_status& status)
                }
        }
 
-       newfiles = new AudioFileSource *[info.channels];
        for (n = 0; n < info.channels; ++n) {
-               newfiles[n] = 0;
+               newfiles.push_back (boost::shared_ptr<AudioFileSource>());
        }
-       
+
        sounds_dir = discover_best_sound_dir ();
        basepath = PBD::basename_nosuffix (status.pathname);
 
@@ -135,12 +137,8 @@ Session::import_audiofile (import_status& status)
 
                } while ( !goodfile);
 
-                       
                try { 
-                       newfiles[n] = new SndFileSource (buf, 
-                                                        Config->get_native_file_data_format(),
-                                                        Config->get_native_file_header_format(),
-                                                        frame_rate ());
+                       newfiles[n] = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createWritable (*this, buf, false, frame_rate()));
                }
 
                catch (failed_constructor& err) {
@@ -217,8 +215,8 @@ Session::import_audiofile (import_status& status)
                        sources.push_back(newfiles[n]);
                }
 
-               AudioRegion *r = new AudioRegion (sources, 0, newfiles[0]->length(), region_name_from_path (Glib::path_get_basename (basepath)),
-                                       0, AudioRegion::Flag (AudioRegion::DefaultFlags | AudioRegion::WholeFile));
+               boost::shared_ptr<AudioRegion> r (boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (sources, 0, newfiles[0]->length(), region_name_from_path (Glib::path_get_basename (basepath)),
+                                                                                                                  0, AudioRegion::Flag (AudioRegion::DefaultFlags | AudioRegion::WholeFile))));
                
                status.new_regions.push_back (r);
 
@@ -233,10 +231,10 @@ Session::import_audiofile (import_status& status)
                           did not bother to create whole-file AudioRegions for them. Do it now.
                        */
                
-                       AudioRegion *r = new AudioRegion (*newfiles[n], 0, newfiles[n]->length(), region_name_from_path (Glib::path_get_basename (newfiles[n]->name())),
-                                               0, AudioRegion::Flag (AudioRegion::DefaultFlags | AudioRegion::WholeFile | AudioRegion::Import));
-
-                       status.new_regions.push_back (r);
+                       status.new_regions.push_back (boost::dynamic_pointer_cast<AudioRegion> 
+                                                     (RegionFactory::create (boost::static_pointer_cast<Source> (newfiles[n]), 0, newfiles[n]->length(), 
+                                                                             region_name_from_path (Glib::path_get_basename (newfiles[n]->name())),
+                                                                             0, AudioRegion::Flag (AudioRegion::DefaultFlags | AudioRegion::WholeFile | AudioRegion::Import))));
                }
        }
        
@@ -262,19 +260,14 @@ Session::import_audiofile (import_status& status)
        }
 
        if (status.cancel) {
-               for (vector<AudioRegion *>::iterator i = status.new_regions.begin(); i != status.new_regions.end(); ++i) {
-                       delete *i;
-               }
+
+               status.new_regions.clear ();
 
                for (vector<string>::iterator i = new_paths.begin(); i != new_paths.end(); ++i) {
                        unlink ((*i).c_str());
                }
        }
 
-       if (newfiles) {
-               delete [] newfiles;
-       }
-
        if (tmp_convert_file.length()) {
                unlink(tmp_convert_file.c_str());
        }
@@ -312,14 +305,18 @@ Session::sample_rate_convert (import_status& status, string infile, string& outf
        sf_count_t  input_count = 0;
 
        SNDFILE* in = sf_open(infile.c_str(), SFM_READ, &sf_info);
+       if (!in) {
+               error << string_compose(_("Import/SRC: could not open input file: %1"), outfile) << endmsg;
+               return false;
+       }
        sf_count_t total_input_frames = sf_info.frames;
        
        outfile = build_tmp_convert_name(infile);
        SNDFILE* out = sf_open(outfile.c_str(), SFM_RDWR, &sf_info);
-       if(!out) {
-               error << string_compose(_("Import: could not open temp file: %1"), outfile) << endmsg;
-               return false;
-       }
+       if (!out) {
+               error << string_compose(_("Import/SRC: could not open output file: %1"), outfile) << endmsg;
+               return false;
+       }
        
        sf_seek (in, 0, SEEK_SET) ;
        sf_seek (out, 0, SEEK_SET) ;
@@ -378,8 +375,6 @@ Session::sample_rate_convert (import_status& status, string infile, string& outf
        sf_close(in);
        sf_close(out);
 
-       status.done = true;
-
        if (status.cancel) {
                return false;
        } else {