Move Diskstream ownership to Track, so that Session no longer holds lists of Diskstre...
[ardour.git] / gtk2_ardour / editor_audio_import.cc
index 108dcde7d398ad7a1525fe98a8d9e2ee0f253bb7..119ea3bc5127f337887da759a03aa0646b8c1c15 100644 (file)
@@ -29,6 +29,7 @@
 #include "pbd/pthread_utils.h"
 #include "pbd/basename.h"
 #include "pbd/shortpath.h"
+#include "pbd/stateful_diff_command.h"
 
 #include <gtkmm2ext/choice.h>
 
@@ -57,6 +58,7 @@
 #include "session_import_dialog.h"
 #include "utils.h"
 #include "gui_thread.h"
+#include "interthread_progress_window.h"
 
 #include "i18n.h"
 
@@ -325,9 +327,11 @@ Editor::do_import (vector<ustring> paths, ImportDisposition chns, ImportMode mod
        vector<ustring> to_import;
        int nth = 0;
 
-       if (interthread_progress_window == 0) {
-               build_interthread_progress_window ();
-       }
+       current_interthread_info = &import_status;
+       import_status.current = 1;
+       import_status.total = paths.size ();
+
+       ImportProgressWindow ipw (&import_status, _("Import"), _("Cancel Import"));
 
        if (chns == Editing::ImportMergeFiles) {
 
@@ -345,47 +349,69 @@ Editor::do_import (vector<ustring> paths, ImportDisposition chns, ImportMode mod
                }
 
                if (!cancel) {
-                       import_sndfiles (paths, mode, quality, pos, 1, 1, track, false, paths.size());
+                       import_sndfiles (paths, mode, quality, pos, 1, 1, track, false);
                }
 
        } else {
 
-               for (vector<ustring>::iterator a = paths.begin(); a != paths.end(); ++a) {
-
-                       int const check = check_whether_and_how_to_import (*a, true);
-
-                       if (check != 2) {
-                               to_import.push_back (*a);
-                       }
-               }
-
+                bool replace = false;
                bool ok = true;
 
-               switch (chns) {
-               case Editing::ImportDistinctFiles:
+               for (vector<ustring>::iterator a = paths.begin(); a != paths.end(); ++a) {
 
-                       if (mode == Editing::ImportToTrack) {
-                               track = get_nth_selected_audio_track (nth++);
+                        const int check = check_whether_and_how_to_import (*a, true);
+                        
+                       switch (check) {
+                       case 2:
+                               // user said skip
+                               continue;
+                       case 0:
+                               fatal << "Updating existing sources should be disabled!" << endmsg;
+                               /* NOTREACHED*/
+                               break;
+                       case 1:
+                               replace = false;
+                               break;
+                       default:
+                               fatal << "Illegal return " << check <<  " from check_whether_and_how_to_import()!" << endmsg;
+                               /* NOTREACHED*/
                        }
 
-                       ok = (import_sndfiles (to_import, mode, quality, pos, 1, -1, track, false, to_import.size()) == 0);
-                       break;
-
-               case Editing::ImportDistinctChannels:
-                       ok = (import_sndfiles (to_import, mode, quality, pos, -1, -1, track, false, to_import.size()) == 0);
-                       break;
+                        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);
 
-               case Editing::ImportSerializeFiles:
-                       ok = (import_sndfiles (to_import, mode, quality, pos, 1, 1, track, false, to_import.size()) == 0);
-                       break;
+                                ok = (import_sndfiles (to_import, mode, quality, pos, 1, 1, track, replace) == 0);
+                                break;
 
-               case Editing::ImportMergeFiles:
-                       // Not entered, handled in earlier if() branch
-                       break;
-               }
+                        case Editing::ImportMergeFiles:
+                                // Not entered, handled in earlier if() branch
+                                break;
+                        }
+                }
        }
-
-       interthread_progress_window->hide_all ();
 }
 
 void
@@ -431,7 +457,7 @@ Editor::do_embed (vector<ustring> paths, ImportDisposition chns, ImportMode mode
                if (embed_sndfiles (paths, multi, check_sample_rate, mode, pos, 1, 1, track) < -1) {
                        goto out;
                }
-       break;
+                break;
 
        case Editing::ImportSerializeFiles:
                for (vector<ustring>::iterator a = paths.begin(); a != paths.end(); ++a) {
@@ -456,14 +482,8 @@ Editor::do_embed (vector<ustring> paths, ImportDisposition chns, ImportMode mode
 
 int
 Editor::import_sndfiles (vector<ustring> paths, ImportMode mode, SrcQuality quality, nframes64_t& pos,
-                        int target_regions, int target_tracks, boost::shared_ptr<Track> track, bool replace, uint32_t total)
+                        int target_regions, int target_tracks, boost::shared_ptr<Track>& track, bool replace)
 {
-       interthread_progress_window->set_title (string_compose (_("Importing %1"), paths.front()));
-       interthread_progress_window->set_position (Gtk::WIN_POS_MOUSE);
-       interthread_progress_bar.set_fraction (0.0f);
-       interthread_cancel_label.set_text (_("Cancel Import"));
-       current_interthread_info = &import_status;
-
        import_status.paths = paths;
        import_status.done = false;
        import_status.cancel = false;
@@ -471,7 +491,6 @@ Editor::import_sndfiles (vector<ustring> paths, ImportMode mode, SrcQuality qual
        import_status.done = 0.0;
        import_status.quality = quality;
        import_status.replace_existing_source = replace;
-       import_status.total = total;
 
        import_status.mode = mode;
        import_status.pos = pos;
@@ -479,8 +498,6 @@ Editor::import_sndfiles (vector<ustring> paths, ImportMode mode, SrcQuality qual
        import_status.target_regions = target_regions;
        import_status.track = track;
        import_status.replace = replace;
-       interthread_progress_connection = Glib::signal_timeout().connect
-               (sigc::bind (sigc::mem_fun(*this, &Editor::import_progress_timeout), (gpointer) 0), 500);
 
        track_canvas->get_window()->set_cursor (Gdk::Cursor (Gdk::WATCH));
        gdk_flush ();
@@ -497,9 +514,7 @@ Editor::import_sndfiles (vector<ustring> paths, ImportMode mode, SrcQuality qual
                gtk_main_iteration ();
        }
 
-       interthread_progress_window->hide ();
        import_status.done = true;
-       interthread_progress_connection.disconnect ();
 
        if (!import_status.cancel && !import_status.sources.empty()) {
                if (add_sources (import_status.paths,
@@ -508,7 +523,7 @@ Editor::import_sndfiles (vector<ustring> paths, ImportMode mode, SrcQuality qual
                                 import_status.mode,
                                 import_status.target_regions,
                                 import_status.target_tracks,
-                                import_status.track, false) == 0) {
+                                track, false) == 0) {
                        _session->save_state ("");
                }
 
@@ -596,9 +611,11 @@ Editor::embed_sndfiles (vector<Glib::ustring> paths, bool multifile,
                                choices.push_back (_("Embed all without questions"));
 
                                Gtkmm2ext::Choice rate_choice (
+                                       _("Sample rate"),
                                        string_compose (_("%1\nThis audiofile's sample rate doesn't match the session sample rate!"),
                                                        short_path (path, 40)),
-                                       choices, false);
+                                       choices, false
+                                       );
 
                                int resx = rate_choice.run ();
 
@@ -623,8 +640,10 @@ Editor::embed_sndfiles (vector<Glib::ustring> paths, bool multifile,
                                choices.push_back (_("Embed it anyway"));
 
                                Gtkmm2ext::Choice rate_choice (
+                                       _("Sample rate"),
                                        string_compose (_("%1\nThis audiofile's sample rate doesn't match the session sample rate!"), path),
-                                       choices, false);
+                                       choices, false
+                                       );
 
                                int resx = rate_choice.run ();
 
@@ -702,7 +721,7 @@ Editor::add_sources (vector<Glib::ustring> paths, SourceList& sources, nframes64
                if (sources[0]->natural_position() != 0) {
                        pos = sources[0]->natural_position();
                } else {
-                       pos = get_preferred_edit_position ();
+                       pos = _session->current_start_frame();
                }
        }
 
@@ -716,8 +735,16 @@ Editor::add_sources (vector<Glib::ustring> paths, SourceList& sources, nframes64
 
                region_name = region_name_from_path (paths.front(), (sources.size() > 1), false);
 
-               boost::shared_ptr<Region> r = RegionFactory::create (sources, 0, sources[0]->length(pos), region_name, 0,
-                                                                    Region::Flag (Region::DefaultFlags|Region::WholeFile|Region::External));
+               PropertyList plist; 
+               
+               plist.add (ARDOUR::Properties::start, 0);
+               plist.add (ARDOUR::Properties::length, sources[0]->length (pos));
+               plist.add (ARDOUR::Properties::name, region_name);
+               plist.add (ARDOUR::Properties::layer, 0);
+               plist.add (ARDOUR::Properties::whole_file, true);
+               plist.add (ARDOUR::Properties::external, true);
+
+               boost::shared_ptr<Region> r = RegionFactory::create (sources, plist);
 
                if (use_timestamp && boost::dynamic_pointer_cast<AudioRegion>(r)) {
                        boost::dynamic_pointer_cast<AudioRegion>(r)->special_set_position(sources[0]->natural_position());
@@ -741,8 +768,16 @@ Editor::add_sources (vector<Glib::ustring> paths, SourceList& sources, nframes64
 
                        region_name = region_name_from_path ((*x)->path(), false, false, sources.size(), n);
 
-                       boost::shared_ptr<Region> r = RegionFactory::create (just_one, 0, (*x)->length(pos), region_name, 0,
-                                                                            Region::Flag (Region::DefaultFlags|Region::WholeFile|Region::External));
+                       PropertyList plist; 
+                       
+                       plist.add (ARDOUR::Properties::start, 0);
+                       plist.add (ARDOUR::Properties::length, (*x)->length (pos));
+                       plist.add (ARDOUR::Properties::name, region_name);
+                       plist.add (ARDOUR::Properties::layer, 0);
+                       plist.add (ARDOUR::Properties::whole_file, true);
+                       plist.add (ARDOUR::Properties::external, true);
+
+                       boost::shared_ptr<Region> r = RegionFactory::create (just_one, plist);
 
                        if (use_timestamp && boost::dynamic_pointer_cast<AudioRegion>(r)) {
                                boost::dynamic_pointer_cast<AudioRegion>(r)->special_set_position((*x)->natural_position());
@@ -817,12 +852,12 @@ Editor::finish_bringing_in_material (boost::shared_ptr<Region> region, uint32_t
                        }
                }
 
-               boost::shared_ptr<Playlist> playlist = existing_track->diskstream()->playlist();
-               boost::shared_ptr<Region> copy (RegionFactory::create (region));
+               boost::shared_ptr<Playlist> playlist = existing_track->playlist();
+               boost::shared_ptr<Region> copy (RegionFactory::create (region, region->properties()));
                begin_reversible_command (_("insert file"));
-               XMLNode &before = playlist->get_state();
+                playlist->clear_history ();
                playlist->add_region (copy, pos);
-               _session->add_command (new MementoCommand<Playlist>(*playlist, &before, &playlist->get_state()));
+               _session->add_command (new StatefulDiffCommand (playlist));
                commit_reversible_command ();
                break;
        }
@@ -852,7 +887,7 @@ Editor::finish_bringing_in_material (boost::shared_ptr<Region> region, uint32_t
                }
 
                boost::shared_ptr<Region> copy (RegionFactory::create (region));
-               existing_track->diskstream()->playlist()->add_region (copy, pos);
+               existing_track->playlist()->add_region (copy, pos);
                break;
        }
 
@@ -866,7 +901,7 @@ Editor::finish_bringing_in_material (boost::shared_ptr<Region> region, uint32_t
                if (!at.empty()) {
                        boost::shared_ptr<Region> copy (RegionFactory::create (region));
                        at.front()->set_name (basename_nosuffix (copy->name()));
-                       at.front()->diskstream()->playlist()->add_region (copy, pos);
+                       at.front()->playlist()->add_region (copy, pos);
                }
                break;
        }
@@ -892,43 +927,3 @@ Editor::import_thread ()
        /*NOTREACHED*/
        return 0;
 }
-
-gint
-Editor::import_progress_timeout (void */*arg*/)
-{
-       bool reset = false;
-
-       if (!interthread_progress_window->is_visible()) {
-               interthread_progress_window->show_all ();
-               reset = true;
-       }
-
-       interthread_progress_label.set_text (import_status.doing_what);
-
-       if (import_status.freeze) {
-               interthread_cancel_button.set_sensitive(false);
-       } else {
-               interthread_cancel_button.set_sensitive(true);
-       }
-
-       if (import_status.doing_what == "building peak files") {
-               interthread_progress_bar.pulse ();
-               return FALSE;
-       } else {
-               float val = import_status.progress;
-               interthread_progress_bar.set_fraction (min (max (0.0f, val), 1.0f));
-       }
-
-       if (reset) {
-
-               /* the window is now visible, speed up the updates */
-
-               interthread_progress_connection.disconnect ();
-               interthread_progress_connection = Glib::signal_timeout().connect
-                       (sigc::bind (sigc::mem_fun(*this, &Editor::import_progress_timeout), (gpointer) 0), 100);
-               return false;
-       } else {
-               return !(import_status.done || import_status.cancel);
-       }
-}
-