Fixed bug where embedded sources did not correctly obey the BWF time stamp and would...
[ardour.git] / gtk2_ardour / editor_audio_import.cc
index 7f56cd9121225db90714585d0ef34412ce77dcdc..c2351c74fc17adc41da9895001ffe07d1c724ccd 100644 (file)
@@ -84,7 +84,7 @@ Editor::add_external_audio_action (ImportMode mode_hint)
                msg.run ();
                return;
        }
-       
+
        if (sfbrowser == 0) {
                sfbrowser = new SoundFileOmega (*this, _("Add Existing Media"), _session, 0, true, mode_hint);
        } else {
@@ -155,7 +155,7 @@ Editor::external_audio_dialog ()
                 for (vector<string>::iterator x = upaths.begin(); x != upaths.end(); ++x) {
                         paths.push_back (*x);
                 }
-                
+
                ImportPosition pos = sfbrowser->get_position ();
                ImportMode mode = sfbrowser->get_mode ();
                ImportDisposition chns = sfbrowser->get_channel_disposition ();
@@ -370,7 +370,7 @@ Editor::do_import (vector<string> paths, ImportDisposition chns, ImportMode mode
                for (vector<string>::iterator a = paths.begin(); a != paths.end(); ++a) {
 
                        const int check = check_whether_and_how_to_import (*a, true);
-                        
+
                        switch (check) {
                        case 2:
                                // user said skip
@@ -388,36 +388,36 @@ Editor::do_import (vector<string> paths, ImportDisposition chns, ImportMode mode
                        }
 
                        /* have to reset this for every file we handle */
-                        
+
                        if (use_timestamp) {
                                pos = -1;
                        }
 
                        ipw.show ();
-                                
+
                        switch (chns) {
                        case Editing::ImportDistinctFiles:
-                                
+
                                to_import.clear ();
                                to_import.push_back (*a);
-                                
+
                                if (mode == Editing::ImportToTrack) {
                                        track = get_nth_selected_audio_track (nth++);
                                }
-                       
+
                                ok = (import_sndfiles (to_import, mode, quality, pos, 1, -1, track, replace) == 0);
                                break;
-                               
+
                        case Editing::ImportDistinctChannels:
-                               
+
                                to_import.clear ();
                                to_import.push_back (*a);
-                               
+
                                ok = (import_sndfiles (to_import, mode, quality, pos, -1, -1, track, replace) == 0);
                                break;
-                               
+
                        case Editing::ImportSerializeFiles:
-                               
+
                                to_import.clear ();
                                to_import.push_back (*a);
 
@@ -447,11 +447,17 @@ Editor::do_embed (vector<string> paths, ImportDisposition chns, ImportMode mode,
        vector<string> to_embed;
        bool multi = paths.size() > 1;
        int nth = 0;
+       bool use_timestamp = (pos == -1);
 
        switch (chns) {
        case Editing::ImportDistinctFiles:
                for (vector<string>::iterator a = paths.begin(); a != paths.end(); ++a) {
 
+                       /* have to reset this for every file we handle */
+                       if (use_timestamp) {
+                               pos = -1;
+                       }
+
                        to_embed.clear ();
                        to_embed.push_back (*a);
 
@@ -468,6 +474,11 @@ Editor::do_embed (vector<string> paths, ImportDisposition chns, ImportMode mode,
        case Editing::ImportDistinctChannels:
                for (vector<string>::iterator a = paths.begin(); a != paths.end(); ++a) {
 
+                       /* have to reset this for every file we handle */
+                       if (use_timestamp) {
+                               pos = -1;
+                       }
+
                        to_embed.clear ();
                        to_embed.push_back (*a);
 
@@ -486,6 +497,11 @@ Editor::do_embed (vector<string> paths, ImportDisposition chns, ImportMode mode,
        case Editing::ImportSerializeFiles:
                for (vector<string>::iterator a = paths.begin(); a != paths.end(); ++a) {
 
+                       /* have to reset this for every file we handle */
+                       if (use_timestamp) {
+                               pos = -1;
+                       }
+
                        to_embed.clear ();
                        to_embed.push_back (*a);
 
@@ -521,7 +537,7 @@ Editor::import_sndfiles (vector<string> paths, ImportMode mode, SrcQuality quali
        import_status.target_regions = target_regions;
        import_status.track = track;
        import_status.replace = replace;
-        
+
        set_canvas_cursor (_cursors->wait);
        gdk_flush ();
 
@@ -719,8 +735,8 @@ Editor::add_sources (vector<string> paths, SourceList& sources, framepos_t& pos,
                        region_name = bump_name_once (region_name, '.');
                }
 
-               PropertyList plist; 
-               
+               PropertyList plist;
+
                plist.add (ARDOUR::Properties::start, 0);
                plist.add (ARDOUR::Properties::length, sources[0]->length (pos));
                plist.add (ARDOUR::Properties::name, region_name);
@@ -750,12 +766,28 @@ Editor::add_sources (vector<string> paths, SourceList& sources, framepos_t& pos,
                        just_one.clear ();
                        just_one.push_back (*x);
 
-                       region_name = region_name_from_path ((*x)->path(), false, false, sources.size(), n);
+                       boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (*x);
+
+                       if (fs) {
+                               region_name = region_name_from_path (fs->path(), false, false, sources.size(), n);
+                       } else{
+                               region_name = (*x)->name();
+                       }
+
+                       PropertyList plist;
+
+                       /* Fudge region length to ensure it is non-zero; make it 1 beat at 120bpm
+                          for want of a better idea.  It can't be too small, otherwise if this
+                          is a MIDI region the conversion from frames -> beats -> frames will
+                          round it back down to 0 again.
+                       */
+                       framecnt_t len = (*x)->length (pos);
+                       if (len == 0) {
+                               len = (60 / 120) * _session->frame_rate ();
+                       }
 
-                       PropertyList plist; 
-                       
                        plist.add (ARDOUR::Properties::start, 0);
-                       plist.add (ARDOUR::Properties::length, (*x)->length (pos));
+                       plist.add (ARDOUR::Properties::length, len);
                        plist.add (ARDOUR::Properties::name, region_name);
                        plist.add (ARDOUR::Properties::layer, 0);
                        plist.add (ARDOUR::Properties::whole_file, true);
@@ -790,19 +822,19 @@ Editor::add_sources (vector<string> paths, SourceList& sources, framepos_t& pos,
        int n = 0;
        framepos_t rlen = 0;
 
-       for (vector<boost::shared_ptr<Region> >::iterator r = regions.begin(); r != regions.end(); ++r, ++n) {                
+       for (vector<boost::shared_ptr<Region> >::iterator r = regions.begin(); r != regions.end(); ++r, ++n) {
                boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (*r);
-                
+
                if (use_timestamp) {
                         if (ar) {
-                        
+
                                 /* get timestamp for this region */
-                                
+
                                 const boost::shared_ptr<Source> s (ar->sources().front());
                                 const boost::shared_ptr<AudioSource> as = boost::dynamic_pointer_cast<AudioSource> (s);
-                                
+
                                 assert (as);
-                                
+
                                 if (as->natural_position() != 0) {
                                         pos = as->natural_position();
                                 } else if (target_tracks == 1) {
@@ -821,15 +853,15 @@ Editor::add_sources (vector<string> paths, SourceList& sources, framepos_t& pos,
                                 pos = get_preferred_edit_position ();
                         }
                 }
-                        
+
 
                finish_bringing_in_material (*r, input_chan, output_chan, pos, mode, track);
 
                rlen = (*r)->length();
-                
+
                if (target_tracks != 1) {
                        track.reset ();
-               } else { 
+               } else {
                        if (!use_timestamp || !ar) {
                                /* line each one up right after the other */
                                pos += (*r)->length();
@@ -903,11 +935,10 @@ Editor::finish_bringing_in_material (boost::shared_ptr<Region> region, uint32_t
 
                                existing_track = mt.front();
                        }
-                        
+
                        existing_track->set_name (region->name());
                }
 
-
                boost::shared_ptr<Playlist> playlist = existing_track->playlist();
                boost::shared_ptr<Region> copy (RegionFactory::create (region));
                begin_reversible_command (Operations::insert_file);
@@ -918,7 +949,6 @@ Editor::finish_bringing_in_material (boost::shared_ptr<Region> region, uint32_t
                break;
        }
 
-
        case ImportAsTapeTrack:
        {
                if (!ar) {