From 2b3716526bdf34a051cf960dca826fcc428fb76a Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 4 Sep 2007 21:01:32 +0000 Subject: [PATCH] sort of make to-selected-tracks import/embed work git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@2416 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/editor.h | 4 +- gtk2_ardour/editor_audio_import.cc | 90 +++++++++++----- gtk2_ardour/sfdb_ui.cc | 160 +++++++++++++++++++++-------- gtk2_ardour/sfdb_ui.h | 2 + 4 files changed, 186 insertions(+), 70 deletions(-) diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 9f12110102..9a8d59fd35 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -983,7 +983,9 @@ class Editor : public PublicEditor int add_sources (vector paths, ARDOUR::SourceList& sources, nframes64_t& pos, Editing::ImportMode, int target_regions, int target_tracks, boost::shared_ptr&); int finish_bringing_in_audio (boost::shared_ptr region, uint32_t, uint32_t, nframes64_t& pos, Editing::ImportMode mode, - boost::shared_ptr& existing_track, int nth); + boost::shared_ptr& existing_track); + + boost::shared_ptr get_nth_selected_audio_track (int nth) const; /* generic interthread progress window */ diff --git a/gtk2_ardour/editor_audio_import.cc b/gtk2_ardour/editor_audio_import.cc index 71c64bf033..f2873f3f0b 100644 --- a/gtk2_ardour/editor_audio_import.cc +++ b/gtk2_ardour/editor_audio_import.cc @@ -81,6 +81,8 @@ Editor::external_audio_dialog () if (sfbrowser == 0) { sfbrowser = new SoundFileBrowser (*this, _("Add existing audio"), session, selection->tracks.size()); + } else { + sfbrowser->reset (selection->tracks.size()); } sfbrowser->show_all (); @@ -128,12 +130,38 @@ Editor::external_audio_dialog () } } +boost::shared_ptr +Editor::get_nth_selected_audio_track (int nth) const +{ + AudioTimeAxisView* atv; + TrackSelection::iterator x; + + for (x = selection->tracks.begin(); nth > 0 && x != selection->tracks.end(); ++x) { + if (dynamic_cast(*x)) { + --nth; + } + } + + if (x == selection->tracks.end()) { + atv = dynamic_cast(selection->tracks.back()); + } else { + atv = dynamic_cast(*x); + } + + if (!atv) { + return boost::shared_ptr(); + } + + return atv->audio_track(); +} + void Editor::do_import (vector paths, ImportDisposition chns, ImportMode mode, nframes64_t& pos) { boost::shared_ptr track; vector to_import; bool ok = false; + int nth = 0; if (interthread_progress_window == 0) { build_interthread_progress_window (); @@ -146,9 +174,9 @@ Editor::do_import (vector paths, ImportDisposition chns, ImportMode mod to_import.clear (); to_import.push_back (*a); - /* create 1 region from this path, add to 1 track, - ignore "track" - */ + if (mode == Editing::ImportToTrack) { + track = get_nth_selected_audio_track (nth++); + } if (import_sndfiles (to_import, mode, pos, 1, -1, track)) { goto out; @@ -163,11 +191,6 @@ Editor::do_import (vector paths, ImportDisposition chns, ImportMode mod to_import.clear (); to_import.push_back (*a); - /* create as many regions as there are channels, add them - to that many tracks, ignore "track" - */ - - if (import_sndfiles (to_import, mode, pos, -1, -1, track)) { goto out; } @@ -237,6 +260,7 @@ Editor::_do_embed (vector paths, ImportDisposition chns, ImportMode mod bool ok = false; vector to_embed; bool multi = paths.size() > 1; + int nth = 0; switch (chns) { case Editing::ImportDistinctFiles: @@ -245,6 +269,10 @@ Editor::_do_embed (vector paths, ImportDisposition chns, ImportMode mod to_embed.clear (); to_embed.push_back (*a); + if (mode == Editing::ImportToTrack) { + track = get_nth_selected_audio_track (nth++); + } + if (embed_sndfiles (to_embed, multi, check_sample_rate, mode, pos, 1, -1, track) < -1) { goto out; } @@ -267,7 +295,7 @@ Editor::_do_embed (vector paths, ImportDisposition chns, ImportMode mod if (embed_sndfiles (paths, multi, check_sample_rate, mode, pos, 1, 1, track) < -1) { goto out; } - break; + break; case Editing::ImportSerializeFiles: for (vector::iterator a = paths.begin(); a != paths.end(); ++a) { @@ -553,7 +581,15 @@ Editor::add_sources (vector paths, SourceList& sources, nframes64 } } - input_chan = sources.size(); + if (target_regions == 1) { + input_chan = regions.front()->n_channels(); + } else { + if (target_tracks == 1) { + input_chan = regions.size(); + } else { + input_chan = 1; + } + } if (Config->get_output_auto_connect() & AutoConnectMaster) { output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan); @@ -561,11 +597,9 @@ Editor::add_sources (vector paths, SourceList& sources, nframes64 output_chan = input_chan; } - int n = 0; + for (vector >::iterator r = regions.begin(); r != regions.end(); ++r) { - for (vector >::iterator r = regions.begin(); r != regions.end(); ++r, ++n) { - - finish_bringing_in_audio (*r, input_chan, output_chan, pos, mode, track, n); + finish_bringing_in_audio (*r, input_chan, output_chan, pos, mode, track); if (target_tracks != 1) { track.reset (); @@ -579,9 +613,8 @@ Editor::add_sources (vector paths, SourceList& sources, nframes64 int Editor::finish_bringing_in_audio (boost::shared_ptr region, uint32_t in_chans, uint32_t out_chans, nframes64_t& pos, - ImportMode mode, boost::shared_ptr& existing_track, int nth) + ImportMode mode, boost::shared_ptr& existing_track) { - boost::shared_ptr track; switch (mode) { case ImportAsRegion: @@ -590,19 +623,22 @@ Editor::finish_bringing_in_audio (boost::shared_ptr region, uint32_ case ImportToTrack: { - if (selection->tracks.empty()) { - return -1; - } + if (!existing_track) { + + if (selection->tracks.empty()) { + return -1; + } - AudioTimeAxisView* atv = dynamic_cast(selection->tracks.front()); - - if (!atv) { - return -1; + AudioTimeAxisView* atv = dynamic_cast(selection->tracks.front()); + + if (!atv) { + return -1; + } + + existing_track = atv->audio_track(); } - - track = atv->audio_track(); - - boost::shared_ptr playlist = track->diskstream()->playlist(); + + boost::shared_ptr playlist = existing_track->diskstream()->playlist(); boost::shared_ptr copy (boost::dynamic_pointer_cast (RegionFactory::create (region))); begin_reversible_command (_("insert sndfile")); XMLNode &before = playlist->get_state(); diff --git a/gtk2_ardour/sfdb_ui.cc b/gtk2_ardour/sfdb_ui.cc index 7c5947e767..2350136067 100644 --- a/gtk2_ardour/sfdb_ui.cc +++ b/gtk2_ardour/sfdb_ui.cc @@ -58,7 +58,9 @@ using namespace Gtk; using namespace Gtkmm2ext; using namespace Editing; -Glib::ustring SoundFileBrowser::persistent_folder; +using Glib::ustring; + +ustring SoundFileBrowser::persistent_folder; SoundFileBox::SoundFileBox () : @@ -168,7 +170,7 @@ SoundFileBox::set_session(Session* s) } bool -SoundFileBox::setup_labels (const Glib::ustring& filename) +SoundFileBox::setup_labels (const ustring& filename) { path = filename; @@ -234,7 +236,7 @@ SoundFileBox::audition () return; } - typedef std::map > RegionCache; + typedef std::map > RegionCache; static RegionCache region_cache; RegionCache::iterator the_region; @@ -345,7 +347,7 @@ SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::S set_session (s); resetting_ourselves = false; - + hpacker = manage (new HBox); hpacker->set_spacing (6); hpacker->pack_start (notebook, true, true); @@ -357,18 +359,8 @@ SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::S options.set_spacing (12); - vector action_strings; vector where_strings; - action_strings.push_back (_("as new tracks")); - if (selected_track_cnt > 0) { - action_strings.push_back (_("to selected tracks")); - } - action_strings.push_back (_("to the region list")); - action_strings.push_back (_("as new tape tracks")); - set_popdown_strings (action_combo, action_strings); - action_combo.set_active_text (action_strings.front()); - where_strings.push_back (_("use file timestamp")); where_strings.push_back (_("at edit cursor")); where_strings.push_back (_("at playhead")); @@ -469,14 +461,14 @@ SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::S /* setup disposition map */ - disposition_map.insert (pair(_("one track per file"), ImportDistinctFiles)); - disposition_map.insert (pair(_("one track per channel"), ImportDistinctChannels)); - disposition_map.insert (pair(_("merge files"), ImportMergeFiles)); - disposition_map.insert (pair(_("sequence files"), ImportSerializeFiles)); + disposition_map.insert (pair(_("one track per file"), ImportDistinctFiles)); + disposition_map.insert (pair(_("one track per channel"), ImportDistinctChannels)); + disposition_map.insert (pair(_("merge files"), ImportMergeFiles)); + disposition_map.insert (pair(_("sequence files"), ImportSerializeFiles)); - disposition_map.insert (pair(_("one region per file"), ImportDistinctFiles)); - disposition_map.insert (pair(_("one region per channel"), ImportDistinctChannels)); - disposition_map.insert (pair(_("all files in one region"), ImportMergeFiles)); + disposition_map.insert (pair(_("one region per file"), ImportDistinctFiles)); + disposition_map.insert (pair(_("one region per channel"), ImportDistinctChannels)); + disposition_map.insert (pair(_("all files in one region"), ImportMergeFiles)); } SoundFileBrowser::~SoundFileBrowser () @@ -484,6 +476,13 @@ SoundFileBrowser::~SoundFileBrowser () persistent_folder = chooser.get_current_folder(); } +void +SoundFileBrowser::reset (int selected_tracks) +{ + selected_track_cnt = selected_tracks; + reset_options (); +} + void SoundFileBrowser::file_selection_changed () { @@ -540,7 +539,7 @@ SoundFileBrowser::found_list_view_selected () if (!reset_options ()) { set_response_sensitive (RESPONSE_OK, false); } else { - Glib::ustring file; + ustring file; TreeView::Selection::ListHandle_Path rows = found_list_view.get_selection()->get_selected_rows (); @@ -581,16 +580,16 @@ SoundFileBrowser::found_search_clicked () } } -vector +vector SoundFileBrowser::get_paths () { - vector results; + vector results; int n = notebook.get_current_page (); if (n == 0) { - vector filenames = chooser.get_filenames(); - vector::iterator i; + vector filenames = chooser.get_filenames(); + vector::iterator i; for (i = filenames.begin(); i != filenames.end(); ++i) { struct stat buf; if ((!stat((*i).c_str(), &buf)) && S_ISREG(buf.st_mode)) { @@ -606,7 +605,7 @@ SoundFileBrowser::get_paths () ListPath rows = found_list_view.get_selection()->get_selected_rows (); for (ListPath::iterator i = rows.begin() ; i != rows.end(); ++i) { TreeIter iter = found_list->get_iter(*i); - Glib::ustring str = (*iter)[found_list_columns.pathname]; + ustring str = (*iter)[found_list_columns.pathname]; results.push_back (str); } @@ -617,13 +616,15 @@ SoundFileBrowser::get_paths () void SoundFileBrowser::reset_options_noret () { - (void) reset_options (); + if (!resetting_ourselves) { + (void) reset_options (); + } } bool SoundFileBrowser::reset_options () { - vector paths = get_paths (); + vector paths = get_paths (); if (paths.empty()) { @@ -656,6 +657,63 @@ SoundFileBrowser::reset_options () return false; } + ustring existing_choice; + vector action_strings; + + if (selected_track_cnt > 0) { + if (channel_combo.get_active_text().length()) { + ImportDisposition id = get_channel_disposition(); + + switch (id) { + case Editing::ImportDistinctFiles: + if (selected_track_cnt == paths.size()) { + action_strings.push_back (_("to selected tracks")); + } + break; + + case Editing::ImportDistinctChannels: + /* XXX it would be nice to allow channel-per-selected track + but its too hard we don't want to deal with all the + different per-file + per-track channel configurations. + */ + break; + + default: + action_strings.push_back (_("to selected tracks")); + break; + } + } + } + + action_strings.push_back (_("as new tracks")); + action_strings.push_back (_("to the region list")); + action_strings.push_back (_("as new tape tracks")); + + existing_choice = action_combo.get_active_text(); + + set_popdown_strings (action_combo, action_strings); + + /* preserve any existing choice, if possible */ + + resetting_ourselves = true; + + if (existing_choice.length()) { + vector::iterator x; + for (x = action_strings.begin(); x != action_strings.end(); ++x) { + if (*x == existing_choice) { + action_combo.set_active_text (existing_choice); + break; + } + } + if (x == action_strings.end()) { + action_combo.set_active_text (action_strings.front()); + } + } else { + action_combo.set_active_text (action_strings.front()); + } + + resetting_ourselves = false; + if ((mode = get_mode()) == ImportAsRegion) { where_combo.set_sensitive (false); } else { @@ -698,8 +756,26 @@ SoundFileBrowser::reset_options () } } + existing_choice = channel_combo.get_active_text(); + set_popdown_strings (channel_combo, channel_strings); - channel_combo.set_active_text (channel_strings.front()); + + /* preserve any existing choice, if possible */ + + if (existing_choice.length()) { + vector::iterator x; + for (x = channel_strings.begin(); x != channel_strings.end(); ++x) { + if (*x == existing_choice) { + channel_combo.set_active_text (existing_choice); + break; + } + } + if (x == channel_strings.end()) { + channel_combo.set_active_text (channel_strings.front()); + } + } else { + channel_combo.set_active_text (channel_strings.front()); + } if (Profile->get_sae()) { if (selection_can_be_embedded_with_links) { @@ -730,7 +806,7 @@ SoundFileBrowser::bad_file_message() } bool -SoundFileBrowser::check_multichannel_status (const vector& paths, bool& same_size, bool& err) +SoundFileBrowser::check_multichannel_status (const vector& paths, bool& same_size, bool& err) { SNDFILE* sf; SF_INFO info; @@ -740,7 +816,7 @@ SoundFileBrowser::check_multichannel_status (const vector& paths, same_size = true; err = false; - for (vector::const_iterator i = paths.begin(); i != paths.end(); ++i) { + for (vector::const_iterator i = paths.begin(); i != paths.end(); ++i) { info.format = 0; // libsndfile says to clear this before sf_open(). @@ -767,7 +843,7 @@ SoundFileBrowser::check_multichannel_status (const vector& paths, } bool -SoundFileBrowser::check_link_status (const Session& s, const vector& paths) +SoundFileBrowser::check_link_status (const Session& s, const vector& paths) { string tmpdir = s.sound_dir(); bool ret = false; @@ -780,7 +856,7 @@ SoundFileBrowser::check_link_status (const Session& s, const vector::const_iterator i = paths.begin(); i != paths.end(); ++i) { + for (vector::const_iterator i = paths.begin(); i != paths.end(); ++i) { char tmpc[MAXPATHLEN+1]; @@ -818,19 +894,19 @@ SoundFileChooser::SoundFileChooser (Gtk::Window& parent, string title, ARDOUR::S show_all (); } -Glib::ustring +ustring SoundFileChooser::get_filename () { - vector paths; + vector paths; #if 0 paths = browser.get_paths (); if (paths.empty()) { - return Glib::ustring (); + return ustring (); } if (!Glib::file_test (paths.front(), Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_REGULAR)) { - return Glib::ustring(); + return ustring(); } #endif return paths.front(); @@ -839,7 +915,7 @@ SoundFileChooser::get_filename () ImportMode SoundFileBrowser::get_mode () const { - Glib::ustring str = action_combo.get_active_text(); + ustring str = action_combo.get_active_text(); if (str == _("as new tracks")) { return ImportAsTrack; @@ -855,7 +931,7 @@ SoundFileBrowser::get_mode () const ImportPosition SoundFileBrowser::get_position() const { - Glib::ustring str = where_combo.get_active_text(); + ustring str = where_combo.get_active_text(); if (str == _("use file timestamp")) { return ImportAtTimestamp; @@ -876,11 +952,11 @@ SoundFileBrowser::get_channel_disposition () const and the ImportDisposition enum that corresponds to it. */ - Glib::ustring str = channel_combo.get_active_text(); + ustring str = channel_combo.get_active_text(); DispositionMap::const_iterator x = disposition_map.find (str); if (x == disposition_map.end()) { - fatal << string_compose (_("programming error: %1"), "unknown string for import disposition") << endmsg; + fatal << string_compose (_("programming error: %1 (%2)"), "unknown string for import disposition", str) << endmsg; /*NOTREACHED*/ } diff --git a/gtk2_ardour/sfdb_ui.h b/gtk2_ardour/sfdb_ui.h index cedcf5cc86..2ad7ebf9b6 100644 --- a/gtk2_ardour/sfdb_ui.h +++ b/gtk2_ardour/sfdb_ui.h @@ -126,6 +126,8 @@ class SoundFileBrowser : public ArdourDialog virtual void set_session (ARDOUR::Session*); std::vector get_paths (); + void reset (int selected_tracks); + Gtk::FileChooserWidget chooser; Gtk::TreeView found_list_view; -- 2.30.2