summaryrefslogtreecommitdiff
path: root/gtk2_ardour/sfdb_ui.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2007-09-02 15:17:13 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2007-09-02 15:17:13 +0000
commitf2a2e9c00281c9bfe5ff7df31cdc8860129b282c (patch)
treee45988a790da04e1e72e917d2b0f7935526fe8a2 /gtk2_ardour/sfdb_ui.cc
parent6c2728f9815bcdbf1cbd702f271344e295ddb074 (diff)
limited history depth (no GUI yet); more work on import dialog and semantics
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@2361 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/sfdb_ui.cc')
-rw-r--r--gtk2_ardour/sfdb_ui.cc256
1 files changed, 187 insertions, 69 deletions
diff --git a/gtk2_ardour/sfdb_ui.cc b/gtk2_ardour/sfdb_ui.cc
index 819d13aa5b..0abb810bc2 100644
--- a/gtk2_ardour/sfdb_ui.cc
+++ b/gtk2_ardour/sfdb_ui.cc
@@ -295,7 +295,6 @@ SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::S
found_list_view (found_list),
import (rgroup2, _("Copy to Ardour-native files")),
embed (rgroup2, _("Use file without copying")),
- mode (ImportAsTrack),
found_search_btn (_("Search")),
selected_track_cnt (selected_tracks)
{
@@ -303,8 +302,9 @@ SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::S
VBox* vbox;
HBox* hbox;
HBox* hpacker;
-
+
set_session (s);
+ resetting_ourselves = false;
vpacker = manage (new VBox);
vpacker->pack_start (preview, true, true);
@@ -320,6 +320,25 @@ SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::S
options.set_spacing (12);
+ vector<string> action_strings;
+ vector<string> 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"));
+ where_strings.push_back (_("at session start"));
+ set_popdown_strings (where_combo, where_strings);
+ where_combo.set_active_text (where_strings.front());
+
Label* l = manage (new Label);
l->set_text (_("Add files:"));
@@ -358,6 +377,8 @@ SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::S
options.pack_start (*vbox, false, false);
reset_options ();
+
+ action_combo.signal_changed().connect (mem_fun (*this, &SoundFileBrowser::reset_options_noret));
block_four.pack_start (import, false, false);
block_four.pack_start (embed, false, false);
@@ -394,6 +415,7 @@ SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::S
chooser.add_filter (matchall_filter);
chooser.set_select_multiple (true);
chooser.signal_update_preview().connect(mem_fun(*this, &SoundFileBrowser::update_preview));
+ chooser.signal_selection_changed().connect (mem_fun (*this, &SoundFileBrowser::file_selection_changed));
chooser.signal_file_activated().connect (mem_fun (*this, &SoundFileBrowser::chooser_file_activated));
if (!persistent_folder.empty()) {
@@ -405,10 +427,19 @@ SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::S
found_search_btn.signal_clicked().connect(mem_fun(*this, &SoundFileBrowser::found_search_clicked));
found_entry.signal_activate().connect(mem_fun(*this, &SoundFileBrowser::found_search_clicked));
- add_button (Stock::OK, RESPONSE_OK);
add_button (Stock::CANCEL, RESPONSE_CANCEL);
+ add_button (Stock::OK, RESPONSE_OK);
+
+ /* setup disposition map */
- set_response_sensitive (RESPONSE_OK, false);
+ disposition_map.insert (pair<Glib::ustring,ImportChannel>(_("one track per file"), ImportDistinctFiles));
+ disposition_map.insert (pair<Glib::ustring,ImportChannel>(_("one track per channel"), ImportDistinctChannels));
+ disposition_map.insert (pair<Glib::ustring,ImportChannel>(_("merge files"), ImportMergeFiles));
+ disposition_map.insert (pair<Glib::ustring,ImportChannel>(_("sequence files"), ImportSerializeFiles));
+
+ disposition_map.insert (pair<Glib::ustring,ImportChannel>(_("one region per file"), ImportDistinctFiles));
+ disposition_map.insert (pair<Glib::ustring,ImportChannel>(_("one region per channel"), ImportDistinctChannels));
+ disposition_map.insert (pair<Glib::ustring,ImportChannel>(_("all files in one region"), ImportMergeFiles));
}
SoundFileBrowser::~SoundFileBrowser ()
@@ -417,6 +448,24 @@ SoundFileBrowser::~SoundFileBrowser ()
}
void
+SoundFileBrowser::file_selection_changed ()
+{
+ if (resetting_ourselves) {
+ return;
+ }
+
+ if (!reset_options ()) {
+ set_response_sensitive (RESPONSE_OK, false);
+ } else {
+ if (chooser.get_filenames().size() > 0) {
+ set_response_sensitive (RESPONSE_OK, true);
+ } else {
+ set_response_sensitive (RESPONSE_OK, false);
+ }
+ }
+}
+
+void
SoundFileBrowser::chooser_file_activated ()
{
preview.audition ();
@@ -438,32 +487,36 @@ SoundFileBrowser::set_session (Session* s)
bool
SoundFileBrowser::on_custom (const FileFilter::Info& filter_info)
{
- return AudioFileSource::safe_file_extension(filter_info.filename);
+ return AudioFileSource::safe_file_extension (filter_info.filename);
}
void
SoundFileBrowser::update_preview ()
{
preview.setup_labels (chooser.get_filename());
- set_response_sensitive (RESPONSE_OK, true);
- reset_options ();
}
void
SoundFileBrowser::found_list_view_selected ()
{
- Glib::ustring file;
-
- TreeView::Selection::ListHandle_Path rows = found_list_view.get_selection()->get_selected_rows ();
-
- if (!rows.empty()) {
- TreeIter iter = found_list->get_iter(*rows.begin());
- file = (*iter)[found_list_columns.pathname];
- chooser.set_filename (file);
+ if (!reset_options ()) {
+ set_response_sensitive (RESPONSE_OK, false);
+ } else {
+ Glib::ustring file;
+
+ TreeView::Selection::ListHandle_Path rows = found_list_view.get_selection()->get_selected_rows ();
+
+ if (!rows.empty()) {
+ TreeIter iter = found_list->get_iter(*rows.begin());
+ file = (*iter)[found_list_columns.pathname];
+ chooser.set_filename (file);
+ set_response_sensitive (RESPONSE_OK, true);
+ } else {
+ set_response_sensitive (RESPONSE_OK, false);
+ }
+
+ preview.setup_labels (file);
}
- preview.setup_labels (file);
- set_response_sensitive (RESPONSE_OK, true);
- reset_options ();
}
void
@@ -524,95 +577,155 @@ SoundFileBrowser::get_paths ()
}
void
+SoundFileBrowser::reset_options_noret ()
+{
+ (void) reset_options ();
+}
+
+bool
SoundFileBrowser::reset_options ()
{
vector<Glib::ustring> paths = get_paths ();
- bool selection_includes_multichannel = check_multichannel_status (paths);
- bool selection_can_be_embedded_with_links = check_link_status (*session, paths);
- vector<string> action_strings;
- vector<string> where_strings;
- vector<string> channel_strings;
+ if (paths.empty()) {
- 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"));
+ channel_combo.set_sensitive (false);
+ action_combo.set_sensitive (false);
+ where_combo.set_sensitive (false);
+ import.set_sensitive (false);
+ embed.set_sensitive (false);
+ return false;
- set_popdown_strings (action_combo, action_strings);
- action_combo.set_active_text (action_strings.front());
+ } else {
- where_strings.push_back (_("use file timestamp"));
- where_strings.push_back (_("at edit cursor"));
- where_strings.push_back (_("at playhead"));
- where_strings.push_back (_("at session start"));
-
- set_popdown_strings (where_combo, where_strings);
- where_combo.set_active_text (where_strings.front());
+ channel_combo.set_sensitive (true);
+ action_combo.set_sensitive (true);
+ where_combo.set_sensitive (true);
+ import.set_sensitive (true);
+ embed.set_sensitive (true);
+
+ }
- if (mode == ImportAsTrack) {
- channel_strings.push_back (_("one file per track"));
+ bool same_size;
+ bool err;
+ bool selection_includes_multichannel = check_multichannel_status (paths, same_size, err);
+ bool selection_can_be_embedded_with_links = check_link_status (*session, paths);
+ ImportMode mode;
+
+ if (err) {
+ Glib::signal_idle().connect (mem_fun (*this, &SoundFileBrowser::bad_file_message));
+ return false;
+ }
+
+ if ((mode = get_mode()) == ImportAsRegion) {
+ where_combo.set_sensitive (false);
+ } else {
+ where_combo.set_sensitive (true);
+ }
+
+ vector<string> channel_strings;
+
+ if (mode == ImportAsTrack || mode == ImportAsTapeTrack || mode == ImportToTrack) {
+ channel_strings.push_back (_("one track per file"));
if (selection_includes_multichannel) {
- channel_strings.push_back (_("one channel per track"));
+ channel_strings.push_back (_("one track per channel"));
}
+
if (paths.size() > 1) {
- channel_strings.push_back (_("all files in one track"));
+ /* tape tracks are a single region per track, so we cannot
+ sequence multiple files.
+ */
+ if (mode != ImportAsTapeTrack) {
+ channel_strings.push_back (_("sequence files"));
+ }
+ if (same_size) {
+ channel_strings.push_back (_("all files in one track"));
+ }
+
}
- channel_combo.show();
+
} else {
- channel_combo.hide();
+ channel_strings.push_back (_("one region per file"));
+
+ if (selection_includes_multichannel) {
+ channel_strings.push_back (_("one region per channel"));
+ }
+
+ if (paths.size() > 1) {
+ if (same_size) {
+ channel_strings.push_back (_("all files in one region"));
+ }
+ }
}
set_popdown_strings (channel_combo, channel_strings);
channel_combo.set_active_text (channel_strings.front());
-
+
if (Profile->get_sae()) {
if (selection_can_be_embedded_with_links) {
- block_four.show ();
+ embed.set_sensitive (true);
} else {
- block_four.hide ();
+ embed.set_sensitive (false);
}
} else {
- block_four.show ();
- }
-
- if ((mode == ImportAsTrack || mode == ImportAsTapeTrack) && paths.size() == 2) {
- merge_stereo.set_sensitive (true);
- } else {
- merge_stereo.set_sensitive (false);
+ embed.set_sensitive (true);
}
- if (selection_includes_multichannel) {
- split_files.set_sensitive (true);
- } else {
- split_files.set_sensitive (false);
- }
+ return true;
}
bool
-SoundFileBrowser::check_multichannel_status (const vector<Glib::ustring>& paths)
+SoundFileBrowser::bad_file_message()
+{
+ MessageDialog msg (*this,
+ _("One or more of the selected files\ncannot be used by Ardour"),
+ true,
+ Gtk::MESSAGE_INFO,
+ Gtk::BUTTONS_OK);
+ msg.run ();
+ resetting_ourselves = true;
+ chooser.unselect_uri (chooser.get_preview_uri());
+ resetting_ourselves = false;
+}
+
+bool
+SoundFileBrowser::check_multichannel_status (const vector<Glib::ustring>& paths, bool& same_size, bool& err)
{
SNDFILE* sf;
SF_INFO info;
-
+ nframes64_t sz = 0;
+ bool some_mult = false;
+
+ same_size = true;
+ err = false;
+
for (vector<Glib::ustring>::const_iterator i = paths.begin(); i != paths.end(); ++i) {
info.format = 0; // libsndfile says to clear this before sf_open().
if ((sf = sf_open ((char*) (*i).c_str(), SFM_READ, &info)) != 0) {
sf_close (sf);
+
if (info.channels > 1) {
- return true;
+ some_mult = true;
}
+
+ if (sz == 0) {
+ sz = info.frames;
+ } else {
+ if (sz != info.frames) {
+ same_size = false;
+ }
+ }
+ } else {
+ err = true;
}
}
- return false;
+ return some_mult;
}
bool
@@ -720,13 +833,18 @@ SoundFileBrowser::get_position() const
ImportChannel
SoundFileBrowser::get_channel_disposition () const
{
+ /* we use a map here because the channel combo can contain different strings
+ depending on the state of the other combos. the map contains all possible strings
+ and the ImportDisposition enum that corresponds to it.
+ */
+
Glib::ustring str = channel_combo.get_active_text();
+ DispositionMap::const_iterator x = disposition_map.find (str);
- if (str == _("one file per track")) {
- return ImportThingPerFile;
- } else if (str == _("one channel per track")) {
- return ImportThingPerChannel;
- } else {
- return ImportThingForAll;
+ if (x == disposition_map.end()) {
+ fatal << string_compose (_("programming error: %1"), "unknown string for import disposition") << endmsg;
+ /*NOTREACHED*/
}
+
+ return x->second;
}