diff options
Diffstat (limited to 'gtk2_ardour/editor_audio_import.cc')
-rw-r--r-- | gtk2_ardour/editor_audio_import.cc | 57 |
1 files changed, 47 insertions, 10 deletions
diff --git a/gtk2_ardour/editor_audio_import.cc b/gtk2_ardour/editor_audio_import.cc index e13eb81181..fb6e2c8673 100644 --- a/gtk2_ardour/editor_audio_import.cc +++ b/gtk2_ardour/editor_audio_import.cc @@ -22,6 +22,7 @@ #include <sys/time.h> #include <errno.h> #include <unistd.h> +#include <algorithm> #include <sndfile.h> @@ -312,9 +313,26 @@ Editor::get_nth_selected_midi_track (int nth) const return mtv->midi_track(); } +bool +Editor::idle_do_import (vector<ustring> paths, ImportDisposition chns, ImportMode mode, SrcQuality quality, nframes64_t& pos) +{ + _do_import (paths, chns, mode, quality, pos); + return false; +} + void Editor::do_import (vector<ustring> paths, ImportDisposition chns, ImportMode mode, SrcQuality quality, nframes64_t& pos) { +#ifdef GTKOSX + Glib::signal_idle().connect (bind (mem_fun (*this, &Editor::idle_do_import), paths, chns, mode, quality, pos)); +#else + _do_import (paths, chns, mode, quality, pos); +#endif +} + +void +Editor::_do_import (vector<ustring> paths, ImportDisposition chns, ImportMode mode, SrcQuality quality, nframes64_t& pos) +{ boost::shared_ptr<Track> track; vector<ustring> to_import; bool ok = true; @@ -324,7 +342,6 @@ Editor::do_import (vector<ustring> paths, ImportDisposition chns, ImportMode mod build_interthread_progress_window (); } - if (chns == Editing::ImportMergeFiles) { /* create 1 region from all paths, add to 1 track, ignore "track" @@ -511,7 +528,6 @@ Editor::import_sndfiles (vector<ustring> paths, ImportMode mode, SrcQuality qual interthread_progress_window->set_title (title.get_string()); interthread_progress_window->set_position (Gtk::WIN_POS_MOUSE); - interthread_progress_window->show_all (); interthread_progress_bar.set_fraction (0.0f); interthread_cancel_label.set_text (_("Cancel Import")); current_interthread_info = &import_status; @@ -525,9 +541,9 @@ Editor::import_sndfiles (vector<ustring> paths, ImportMode mode, SrcQuality qual import_status.replace_existing_source = replace; interthread_progress_connection = Glib::signal_timeout().connect - (bind (mem_fun(*this, &Editor::import_progress_timeout), (gpointer) 0), 100); + (bind (mem_fun(*this, &Editor::import_progress_timeout), (gpointer) 0), 500); - track_canvas.get_window()->set_cursor (Gdk::Cursor (Gdk::WATCH)); + track_canvas->get_window()->set_cursor (Gdk::Cursor (Gdk::WATCH)); ARDOUR_UI::instance()->flush_pending (); /* start import thread for this spec. this will ultimately call Session::import_audiofiles() @@ -559,7 +575,7 @@ Editor::import_sndfiles (vector<ustring> paths, ImportMode mode, SrcQuality qual } out: - track_canvas.get_window()->set_cursor (*current_canvas_cursor); + track_canvas->get_window()->set_cursor (*current_canvas_cursor); return 0; } @@ -574,7 +590,7 @@ Editor::embed_sndfiles (vector<Glib::ustring> paths, bool multifile, SoundFileInfo finfo; int ret = 0; - track_canvas.get_window()->set_cursor (Gdk::Cursor (Gdk::WATCH)); + track_canvas->get_window()->set_cursor (Gdk::Cursor (Gdk::WATCH)); ARDOUR_UI::instance()->flush_pending (); for (vector<Glib::ustring>::iterator p = paths.begin(); p != paths.end(); ++p) { @@ -674,7 +690,7 @@ Editor::embed_sndfiles (vector<Glib::ustring> paths, bool multifile, } } - track_canvas.get_window()->set_cursor (Gdk::Cursor (Gdk::WATCH)); + track_canvas->get_window()->set_cursor (Gdk::Cursor (Gdk::WATCH)); for (int n = 0; n < finfo.channels; ++n) { try { @@ -684,6 +700,9 @@ Editor::embed_sndfiles (vector<Glib::ustring> paths, bool multifile, boost::shared_ptr<Source> s; if ((s = session->source_by_path_and_channel (path, n)) == 0) { + + cerr << "add embed/import source with defer_peaks = true\n"; + source = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createReadable (DataType::AUDIO, *session, path, n, (mode == ImportAsTapeTrack ? @@ -713,7 +732,7 @@ Editor::embed_sndfiles (vector<Glib::ustring> paths, bool multifile, ret = add_sources (paths, sources, pos, mode, target_regions, target_tracks, track, true); out: - track_canvas.get_window()->set_cursor (*current_canvas_cursor); + track_canvas->get_window()->set_cursor (*current_canvas_cursor); return ret; } @@ -915,6 +934,13 @@ Editor::import_thread () 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) { @@ -927,9 +953,20 @@ Editor::import_progress_timeout (void *arg) interthread_progress_bar.pulse (); return FALSE; } else { - interthread_progress_bar.set_fraction (import_status.progress); + float val = import_status.progress; + interthread_progress_bar.set_fraction (min (max (0.0f, val), 1.0f)); } - return !(import_status.done || import_status.cancel); + if (reset) { + + /* the window is now visible, speed up the updates */ + + interthread_progress_connection.disconnect (); + interthread_progress_connection = Glib::signal_timeout().connect + (bind (mem_fun(*this, &Editor::import_progress_timeout), (gpointer) 0), 100); + return false; + } else { + return !(import_status.done || import_status.cancel); + } } |