2 Copyright (C) 2005-2006 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 #include <sys/param.h>
28 #include <gtkmm/box.h>
29 #include <gtkmm/stock.h>
30 #include <glibmm/fileutils.h>
32 #include <pbd/convert.h>
33 #include <pbd/tokenizer.h>
34 #include <pbd/enumwriter.h>
36 #include <gtkmm2ext/utils.h>
38 #include <ardour/audio_library.h>
39 #include <ardour/auditioner.h>
40 #include <ardour/audioregion.h>
41 #include <ardour/audiofilesource.h>
42 #include <ardour/region_factory.h>
43 #include <ardour/source_factory.h>
44 #include <ardour/session.h>
45 #include <ardour/session_directory.h>
46 #include <ardour/profile.h>
48 #include "ardour_ui.h"
50 #include "gui_thread.h"
55 #include "gain_meter.h"
59 using namespace ARDOUR;
63 using namespace Gtkmm2ext;
64 using namespace Editing;
68 ustring SoundFileBrowser::persistent_folder;
71 string2importmode (string str)
73 if (str == "as new tracks") {
75 } else if (str == "to selected tracks") {
77 } else if (str == "to region list") {
78 return ImportAsRegion;
79 } else if (str == "as new tape tracks") {
80 return ImportAsTapeTrack;
83 warning << string_compose (_("programming error: unknown import mode string %1"), str) << endmsg;
89 importmode2string (ImportMode mode)
93 return _("as new tracks");
95 return _("to selected tracks");
97 return _("to region list");
98 case ImportAsTapeTrack:
99 return _("as new tape tracks");
102 return _("as new tracks");
105 SoundFileBox::SoundFileBox (bool persistent)
108 length_clock ("sfboxLengthClock", !persistent, "EditCursorClock", false, true, false),
109 timecode_clock ("sfboxTimecodeClock", !persistent, "EditCursorClock", false, false, false),
111 autoplay_btn (_("Auto-play"))
117 set_name (X_("SoundFileBox"));
118 set_size_request (300, -1);
120 preview_label.set_markup (_("<b>Soundfile Info</b>"));
122 border_frame.set_label_widget (preview_label);
123 border_frame.add (main_box);
125 pack_start (border_frame, true, true);
126 set_border_width (6);
128 main_box.set_border_width (6);
129 main_box.set_spacing (12);
131 length.set_text (_("Length:"));
132 timecode.set_text (_("Timestamp:"));
133 format.set_text (_("Format:"));
134 channels.set_text (_("Channels:"));
135 samplerate.set_text (_("Sample rate:"));
137 table.set_col_spacings (6);
138 table.set_homogeneous (false);
139 table.set_row_spacings (6);
141 table.attach (channels, 0, 1, 0, 1, FILL|EXPAND, (AttachOptions) 0);
142 table.attach (samplerate, 0, 1, 1, 2, FILL|EXPAND, (AttachOptions) 0);
143 table.attach (format, 0, 1, 2, 4, FILL|EXPAND, (AttachOptions) 0);
144 table.attach (length, 0, 1, 4, 5, FILL|EXPAND, (AttachOptions) 0);
145 table.attach (timecode, 0, 1, 5, 6, FILL|EXPAND, (AttachOptions) 0);
147 table.attach (channels_value, 1, 2, 0, 1, FILL, (AttachOptions) 0);
148 table.attach (samplerate_value, 1, 2, 1, 2, FILL, (AttachOptions) 0);
149 table.attach (format_text, 1, 2, 2, 4, FILL, AttachOptions (0));
150 table.attach (length_clock, 1, 2, 4, 5, FILL, (AttachOptions) 0);
151 table.attach (timecode_clock, 1, 2, 5, 6, FILL, (AttachOptions) 0);
153 length_clock.set_mode (ARDOUR_UI::instance()->secondary_clock.mode());
154 timecode_clock.set_mode (AudioClock::SMPTE);
156 hbox = manage (new HBox);
157 hbox->pack_start (table, false, false);
158 main_box.pack_start (*hbox, false, false);
160 tags_entry.set_editable (true);
161 tags_entry.signal_focus_out_event().connect (mem_fun (*this, &SoundFileBox::tags_entry_left));
162 hbox = manage (new HBox);
163 hbox->pack_start (tags_entry, true, true);
165 vbox = manage (new VBox);
167 Label* label = manage (new Label (_("Tags:")));
168 label->set_alignment (0.0f, 0.5f);
169 vbox->set_spacing (6);
170 vbox->pack_start(*label, false, false);
171 vbox->pack_start(*hbox, true, true);
173 main_box.pack_start(*vbox, true, true);
174 main_box.pack_start(bottom_box, false, false);
176 play_btn.set_image (*(manage (new Image (Stock::MEDIA_PLAY, ICON_SIZE_BUTTON))));
177 play_btn.set_label (_("Play (double click)"));
179 stop_btn.set_image (*(manage (new Image (Stock::MEDIA_STOP, ICON_SIZE_BUTTON))));
180 stop_btn.set_label (_("Stop"));
182 bottom_box.set_homogeneous (false);
183 bottom_box.set_spacing (6);
184 bottom_box.pack_start(play_btn, true, true);
185 bottom_box.pack_start(stop_btn, true, true);
186 bottom_box.pack_start(autoplay_btn, false, false);
188 play_btn.signal_clicked().connect (mem_fun (*this, &SoundFileBox::audition));
189 stop_btn.signal_clicked().connect (mem_fun (*this, &SoundFileBox::stop_audition));
191 length.set_alignment (0.0f, 0.5f);
192 format.set_alignment (0.0f, 0.5f);
193 channels.set_alignment (0.0f, 0.5f);
194 samplerate.set_alignment (0.0f, 0.5f);
195 timecode.set_alignment (0.0f, 0.5f);
197 channels_value.set_alignment (0.0f, 0.5f);
198 samplerate_value.set_alignment (0.0f, 0.5f);
202 SoundFileBox::set_session(Session* s)
207 play_btn.set_sensitive (false);
208 stop_btn.set_sensitive (false);
212 length_clock.set_session (s);
213 timecode_clock.set_session (s);
217 SoundFileBox::setup_labels (const ustring& filename)
220 // save existing tags
228 if(!AudioFileSource::get_soundfile_info (filename, sf_info, error_msg)) {
230 preview_label.set_markup (_("<b>Soundfile Info</b>"));
231 format_text.set_text (_("n/a"));
232 channels_value.set_text (_("n/a"));
233 samplerate_value.set_text (_("n/a"));
234 tags_entry.get_buffer()->set_text ("");
236 length_clock.set (0);
237 timecode_clock.set (0);
239 tags_entry.set_sensitive (false);
240 play_btn.set_sensitive (false);
245 preview_label.set_markup (string_compose ("<b>%1</b>", Glib::path_get_basename (filename)));
246 format_text.set_text (sf_info.format_name);
247 channels_value.set_text (to_string (sf_info.channels, std::dec));
249 if (_session && sf_info.samplerate != _session->frame_rate()) {
250 samplerate.set_markup (string_compose ("<b>%1</b>", _("Sample rate:")));
251 samplerate_value.set_markup (string_compose (X_("<b>%1 Hz</b>"), sf_info.samplerate));
252 samplerate_value.set_name ("NewSessionSR1Label");
253 samplerate.set_name ("NewSessionSR1Label");
255 samplerate.set_text (_("Sample rate:"));
256 samplerate_value.set_text (string_compose (X_("%1 Hz"), sf_info.samplerate));
257 samplerate_value.set_name ("NewSessionSR2Label");
258 samplerate.set_name ("NewSessionSR2Label");
261 length_clock.set (sf_info.length, true);
262 timecode_clock.set (sf_info.timecode, true);
264 // this is a hack that is fixed in trunk, i think (august 26th, 2007)
266 vector<string> tags = Library->get_tags (string ("//") + filename);
268 stringstream tag_string;
269 for (vector<string>::iterator i = tags.begin(); i != tags.end(); ++i) {
270 if (i != tags.begin()) {
275 tags_entry.get_buffer()->set_text (tag_string.str());
277 tags_entry.set_sensitive (true);
279 play_btn.set_sensitive (true);
286 SoundFileBox::autoplay() const
288 return autoplay_btn.get_active();
292 SoundFileBox::audition_oneshot()
299 SoundFileBox::audition ()
305 _session->cancel_audition();
307 if (!Glib::file_test (path, Glib::FILE_TEST_EXISTS)) {
308 warning << string_compose(_("Could not read file: %1 (%2)."), path, strerror(errno)) << endmsg;
312 boost::shared_ptr<Region> r;
314 boost::shared_ptr<AudioFileSource> afs;
315 bool old_sbp = AudioSource::get_build_peakfiles ();
317 /* don't even think of building peakfiles for these files */
319 AudioSource::set_build_peakfiles (false);
321 for (int n = 0; n < sf_info.channels; ++n) {
323 afs = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createReadable (DataType::AUDIO, *_session, path,
324 n, AudioFileSource::Flag (0), false));
326 srclist.push_back(afs);
328 } catch (failed_constructor& err) {
329 error << _("Could not access soundfile: ") << path << endmsg;
330 AudioSource::set_build_peakfiles (old_sbp);
335 AudioSource::set_build_peakfiles (old_sbp);
337 if (srclist.empty()) {
341 afs = boost::dynamic_pointer_cast<AudioFileSource> (srclist[0]);
342 string rname = region_name_from_path (afs->path(), false);
343 r = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (srclist, 0, srclist[0]->length(), rname, 0, Region::DefaultFlags, false));
345 _session->audition_region(r);
349 SoundFileBox::stop_audition ()
352 _session->cancel_audition();
357 SoundFileBox::tags_entry_left (GdkEventFocus *ev)
364 SoundFileBox::tags_changed ()
366 string tag_string = tags_entry.get_buffer()->get_text ();
368 if (tag_string.empty()) {
374 if (!PBD::tokenize (tag_string, string(",\n"), std::back_inserter (tags), true)) {
375 warning << _("SoundFileBox: Could not tokenize string: ") << tag_string << endmsg;
383 SoundFileBox::save_tags (const vector<string>& tags)
385 Library->set_tags (string ("//") + path, tags);
386 Library->save_changes ();
389 SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::Session* s, bool persistent)
390 : ArdourDialog (parent, title, false, false),
391 found_list (ListStore::create(found_list_columns)),
392 chooser (FILE_CHOOSER_ACTION_OPEN),
393 found_list_view (found_list),
394 preview (persistent),
395 found_search_btn (_("Search"))
398 if (ARDOUR::Profile->get_sae()) {
399 chooser.add_shortcut_folder_uri("file:///Library/GarageBand/Apple Loops");
400 chooser.add_shortcut_folder_uri("file:///Library/Application Support/GarageBand/Instrument Library/Sampler/Sampler Files");
409 resetting_ourselves = false;
411 hpacker.set_spacing (6);
412 hpacker.pack_start (notebook, true, true);
413 hpacker.pack_start (preview, false, false);
415 get_vbox()->pack_start (hpacker, true, true);
417 hbox = manage(new HBox);
418 hbox->pack_start (found_entry);
419 hbox->pack_start (found_search_btn);
421 vbox = manage(new VBox);
422 vbox->pack_start (*hbox, PACK_SHRINK);
423 vbox->pack_start (found_list_view);
424 found_list_view.append_column(_("Paths"), found_list_columns.pathname);
426 chooser.set_border_width (12);
428 notebook.append_page (chooser, _("Browse Files"));
429 notebook.append_page (*vbox, _("Search Tags"));
431 notebook.set_size_request (500, -1);
433 found_list_view.get_selection()->set_mode (SELECTION_MULTIPLE);
434 found_list_view.signal_row_activated().connect (mem_fun (*this, &SoundFileBrowser::found_list_view_activated));
436 custom_filter.add_custom (FILE_FILTER_FILENAME, mem_fun(*this, &SoundFileBrowser::on_custom));
437 custom_filter.set_name (_("Audio files"));
439 matchall_filter.add_pattern ("*.*");
440 matchall_filter.set_name (_("All files"));
442 chooser.add_filter (custom_filter);
443 chooser.add_filter (matchall_filter);
444 chooser.set_select_multiple (true);
445 chooser.signal_update_preview().connect(mem_fun(*this, &SoundFileBrowser::update_preview));
446 chooser.signal_file_activated().connect (mem_fun (*this, &SoundFileBrowser::chooser_file_activated));
448 if (!persistent_folder.empty()) {
449 chooser.set_current_folder (persistent_folder);
452 found_list_view.get_selection()->signal_changed().connect(mem_fun(*this, &SoundFileBrowser::found_list_view_selected));
454 found_search_btn.signal_clicked().connect(mem_fun(*this, &SoundFileBrowser::found_search_clicked));
455 found_entry.signal_activate().connect(mem_fun(*this, &SoundFileBrowser::found_search_clicked));
457 add_button (Stock::CANCEL, RESPONSE_CANCEL);
458 add_button (Stock::APPLY, RESPONSE_APPLY);
459 add_button (Stock::OK, RESPONSE_OK);
463 SoundFileBrowser::~SoundFileBrowser ()
465 persistent_folder = chooser.get_current_folder();
470 SoundFileBrowser::on_show ()
472 ArdourDialog::on_show ();
477 SoundFileBrowser::clear_selection ()
479 chooser.unselect_all ();
480 found_list_view.get_selection()->unselect_all ();
484 SoundFileBrowser::chooser_file_activated ()
490 SoundFileBrowser::found_list_view_activated (const TreeModel::Path& path, TreeViewColumn* col)
496 SoundFileBrowser::set_session (Session* s)
498 ArdourDialog::set_session (s);
499 preview.set_session (s);
503 remove_gain_meter ();
508 SoundFileBrowser::add_gain_meter ()
514 gm = new GainMeter (session->the_auditioner(), *session);
516 meter_packer.set_border_width (12);
517 meter_packer.pack_start (*gm, false, true);
518 hpacker.pack_end (meter_packer, false, false);
519 meter_packer.show_all ();
524 SoundFileBrowser::remove_gain_meter ()
527 meter_packer.remove (*gm);
528 hpacker.remove (meter_packer);
535 SoundFileBrowser::start_metering ()
537 metering_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect (mem_fun(*this, &SoundFileBrowser::meter));
541 SoundFileBrowser::stop_metering ()
543 metering_connection.disconnect();
547 SoundFileBrowser::meter ()
549 if (is_mapped () && session && gm) {
550 gm->update_meters ();
555 SoundFileBrowser::on_custom (const FileFilter::Info& filter_info)
557 return AudioFileSource::safe_file_extension (filter_info.filename);
561 SoundFileBrowser::update_preview ()
563 if (preview.setup_labels (chooser.get_filename())) {
564 if (preview.autoplay()) {
565 Glib::signal_idle().connect (mem_fun (preview, &SoundFileBox::audition_oneshot));
571 SoundFileBrowser::found_list_view_selected ()
573 if (!reset_options ()) {
574 set_response_sensitive (RESPONSE_OK, false);
578 TreeView::Selection::ListHandle_Path rows = found_list_view.get_selection()->get_selected_rows ();
581 TreeIter iter = found_list->get_iter(*rows.begin());
582 file = (*iter)[found_list_columns.pathname];
583 chooser.set_filename (file);
584 set_response_sensitive (RESPONSE_OK, true);
586 set_response_sensitive (RESPONSE_OK, false);
589 preview.setup_labels (file);
594 SoundFileBrowser::found_search_clicked ()
596 string tag_string = found_entry.get_text ();
600 if (!PBD::tokenize (tag_string, string(","), std::back_inserter (tags), true)) {
601 warning << _("SoundFileBrowser: Could not tokenize string: ") << tag_string << endmsg;
605 vector<string> results;
606 Library->search_members_and (results, tags);
609 for (vector<string>::iterator i = results.begin(); i != results.end(); ++i) {
610 TreeModel::iterator new_row = found_list->append();
611 TreeModel::Row row = *new_row;
612 string path = Glib::filename_from_uri (string ("file:") + *i);
613 row[found_list_columns.pathname] = path;
618 SoundFileBrowser::get_paths ()
620 vector<ustring> results;
622 int n = notebook.get_current_page ();
625 vector<ustring> filenames = chooser.get_filenames();
626 vector<ustring>::iterator i;
628 for (i = filenames.begin(); i != filenames.end(); ++i) {
630 if ((!stat((*i).c_str(), &buf)) && S_ISREG(buf.st_mode)) {
631 results.push_back (*i);
637 typedef TreeView::Selection::ListHandle_Path ListPath;
639 ListPath rows = found_list_view.get_selection()->get_selected_rows ();
640 for (ListPath::iterator i = rows.begin() ; i != rows.end(); ++i) {
641 TreeIter iter = found_list->get_iter(*i);
642 ustring str = (*iter)[found_list_columns.pathname];
644 results.push_back (str);
652 SoundFileOmega::reset_options_noret ()
654 if (!resetting_ourselves) {
655 (void) reset_options ();
660 SoundFileOmega::reset_options ()
662 vector<ustring> paths = get_paths ();
666 channel_combo.set_sensitive (false);
667 action_combo.set_sensitive (false);
668 where_combo.set_sensitive (false);
669 copy_files_btn.set_sensitive (false);
675 channel_combo.set_sensitive (true);
676 action_combo.set_sensitive (true);
677 where_combo.set_sensitive (true);
679 /* if we get through this function successfully, this may be
680 reset at the end, once we know if we can use hard links
684 if (Config->get_only_copy_imported_files()) {
685 copy_files_btn.set_sensitive (false);
687 copy_files_btn.set_sensitive (false);
693 bool selection_includes_multichannel;
694 bool selection_can_be_embedded_with_links = check_link_status (*session, paths);
697 if (check_info (paths, same_size, src_needed, selection_includes_multichannel)) {
698 Glib::signal_idle().connect (mem_fun (*this, &SoundFileOmega::bad_file_message));
702 ustring existing_choice;
703 vector<string> action_strings;
705 if (selected_track_cnt > 0) {
706 if (channel_combo.get_active_text().length()) {
707 ImportDisposition id = get_channel_disposition();
710 case Editing::ImportDistinctFiles:
711 if (selected_track_cnt == paths.size()) {
712 action_strings.push_back (importmode2string (ImportToTrack));
716 case Editing::ImportDistinctChannels:
717 /* XXX it would be nice to allow channel-per-selected track
718 but its too hard we don't want to deal with all the
719 different per-file + per-track channel configurations.
724 action_strings.push_back (importmode2string (ImportToTrack));
730 action_strings.push_back (importmode2string (ImportAsTrack));
731 action_strings.push_back (importmode2string (ImportAsRegion));
732 action_strings.push_back (importmode2string (ImportAsTapeTrack));
734 resetting_ourselves = true;
736 existing_choice = action_combo.get_active_text();
738 set_popdown_strings (action_combo, action_strings);
740 /* preserve any existing choice, if possible */
743 if (existing_choice.length()) {
744 vector<string>::iterator x;
745 for (x = action_strings.begin(); x != action_strings.end(); ++x) {
746 if (*x == existing_choice) {
747 action_combo.set_active_text (existing_choice);
751 if (x == action_strings.end()) {
752 action_combo.set_active_text (action_strings.front());
755 action_combo.set_active_text (action_strings.front());
758 resetting_ourselves = false;
760 if ((mode = get_mode()) == ImportAsRegion) {
761 where_combo.set_sensitive (false);
763 where_combo.set_sensitive (true);
766 vector<string> channel_strings;
768 if (mode == ImportAsTrack || mode == ImportAsTapeTrack || mode == ImportToTrack) {
769 channel_strings.push_back (_("one track per file"));
771 if (selection_includes_multichannel) {
772 channel_strings.push_back (_("one track per channel"));
775 if (paths.size() > 1) {
776 /* tape tracks are a single region per track, so we cannot
777 sequence multiple files.
779 if (mode != ImportAsTapeTrack) {
780 channel_strings.push_back (_("sequence files"));
783 channel_strings.push_back (_("all files in one region"));
789 channel_strings.push_back (_("one region per file"));
791 if (selection_includes_multichannel) {
792 channel_strings.push_back (_("one region per channel"));
795 if (paths.size() > 1) {
797 channel_strings.push_back (_("all files in one region"));
802 existing_choice = channel_combo.get_active_text();
804 set_popdown_strings (channel_combo, channel_strings);
806 /* preserve any existing choice, if possible */
808 if (existing_choice.length()) {
809 vector<string>::iterator x;
810 for (x = channel_strings.begin(); x != channel_strings.end(); ++x) {
811 if (*x == existing_choice) {
812 channel_combo.set_active_text (existing_choice);
816 if (x == channel_strings.end()) {
817 channel_combo.set_active_text (channel_strings.front());
820 channel_combo.set_active_text (channel_strings.front());
824 src_combo.set_sensitive (true);
826 src_combo.set_sensitive (false);
829 if (Config->get_only_copy_imported_files()) {
831 if (selection_can_be_embedded_with_links) {
832 copy_files_btn.set_sensitive (true);
834 copy_files_btn.set_sensitive (false);
839 copy_files_btn.set_sensitive (true);
847 SoundFileOmega::bad_file_message()
849 MessageDialog msg (*this,
850 _("One or more of the selected files\ncannot be used by Ardour"),
855 resetting_ourselves = true;
856 chooser.unselect_uri (chooser.get_preview_uri());
857 resetting_ourselves = false;
863 SoundFileOmega::check_info (const vector<ustring>& paths, bool& same_size, bool& src_needed, bool& multichannel)
872 multichannel = false;
874 for (vector<ustring>::const_iterator i = paths.begin(); i != paths.end(); ++i) {
876 info.format = 0; // libsndfile says to clear this before sf_open().
878 if ((sf = sf_open ((char*) (*i).c_str(), SFM_READ, &info)) != 0) {
881 if (info.channels > 1) {
888 if (sz != info.frames) {
893 if ((nframes_t) info.samplerate != session->frame_rate()) {
907 SoundFileOmega::check_link_status (const Session& s, const vector<ustring>& paths)
909 sys::path path = s.session_directory().sound_path() / "linktest";
910 string tmpdir = path.to_string();
913 if (mkdir (tmpdir.c_str(), 0744)) {
914 if (errno != EEXIST) {
919 for (vector<ustring>::const_iterator i = paths.begin(); i != paths.end(); ++i) {
921 char tmpc[MAXPATHLEN+1];
923 snprintf (tmpc, sizeof(tmpc), "%s/%s", tmpdir.c_str(), Glib::path_get_basename (*i).c_str());
927 if (link ((*i).c_str(), tmpc)) {
937 rmdir (tmpdir.c_str());
941 SoundFileChooser::SoundFileChooser (Gtk::Window& parent, string title, ARDOUR::Session* s)
942 : SoundFileBrowser (parent, title, s, false)
944 chooser.set_select_multiple (false);
945 found_list_view.get_selection()->set_mode (SELECTION_SINGLE);
949 SoundFileChooser::on_hide ()
951 ArdourDialog::on_hide();
955 session->cancel_audition();
960 SoundFileChooser::get_filename ()
962 vector<ustring> paths;
964 paths = get_paths ();
970 if (!Glib::file_test (paths.front(), Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_REGULAR)) {
974 return paths.front();
977 SoundFileOmega::SoundFileOmega (Gtk::Window& parent, string title, ARDOUR::Session* s, int selected_tracks, bool persistent,
978 Editing::ImportMode mode_hint)
979 : SoundFileBrowser (parent, title, s, persistent),
980 copy_files_btn ( _("Copy files to session")),
981 selected_track_cnt (selected_tracks)
987 set_size_request (-1, 450);
989 block_two.set_border_width (12);
990 block_three.set_border_width (12);
991 block_four.set_border_width (12);
993 options.set_spacing (12);
996 str.push_back (_("use file timestamp"));
997 str.push_back (_("at edit point"));
998 str.push_back (_("at playhead"));
999 str.push_back (_("at session start"));
1000 set_popdown_strings (where_combo, str);
1001 where_combo.set_active_text (str.front());
1003 Label* l = manage (new Label);
1004 l->set_text (_("Add files:"));
1006 hbox = manage (new HBox);
1007 hbox->set_border_width (12);
1008 hbox->set_spacing (6);
1009 hbox->pack_start (*l, false, false);
1010 hbox->pack_start (action_combo, false, false);
1011 vbox = manage (new VBox);
1012 vbox->pack_start (*hbox, false, false);
1013 options.pack_start (*vbox, false, false);
1015 /* dummy entry for action combo so that it doesn't look odd if we
1016 come up with no tracks selected.
1020 str.push_back (importmode2string (mode_hint));
1021 set_popdown_strings (action_combo, str);
1022 action_combo.set_active_text (str.front());
1023 action_combo.set_sensitive (false);
1025 l = manage (new Label);
1026 l->set_text (_("Insert:"));
1028 hbox = manage (new HBox);
1029 hbox->set_border_width (12);
1030 hbox->set_spacing (6);
1031 hbox->pack_start (*l, false, false);
1032 hbox->pack_start (where_combo, false, false);
1033 vbox = manage (new VBox);
1034 vbox->pack_start (*hbox, false, false);
1035 options.pack_start (*vbox, false, false);
1038 l = manage (new Label);
1039 l->set_text (_("Mapping:"));
1041 hbox = manage (new HBox);
1042 hbox->set_border_width (12);
1043 hbox->set_spacing (6);
1044 hbox->pack_start (*l, false, false);
1045 hbox->pack_start (channel_combo, false, false);
1046 vbox = manage (new VBox);
1047 vbox->pack_start (*hbox, false, false);
1048 options.pack_start (*vbox, false, false);
1051 str.push_back (_("one track per file"));
1052 set_popdown_strings (channel_combo, str);
1053 channel_combo.set_active_text (str.front());
1054 channel_combo.set_sensitive (false);
1056 l = manage (new Label);
1057 l->set_text (_("Conversion Quality:"));
1059 hbox = manage (new HBox);
1060 hbox->set_border_width (12);
1061 hbox->set_spacing (6);
1062 hbox->pack_start (*l, false, false);
1063 hbox->pack_start (src_combo, false, false);
1064 vbox = manage (new VBox);
1065 vbox->pack_start (*hbox, false, false);
1066 options.pack_start (*vbox, false, false);
1069 str.push_back (_("Best"));
1070 str.push_back (_("Good"));
1071 str.push_back (_("Quick"));
1072 str.push_back (_("Fast"));
1073 str.push_back (_("Fastest"));
1075 set_popdown_strings (src_combo, str);
1076 src_combo.set_active_text (str.front());
1077 src_combo.set_sensitive (false);
1081 action_combo.signal_changed().connect (mem_fun (*this, &SoundFileOmega::reset_options_noret));
1083 copy_files_btn.set_active (true);
1085 block_four.pack_start (copy_files_btn, false, false);
1087 options.pack_start (block_four, false, false);
1089 get_vbox()->pack_start (options, false, false);
1091 /* setup disposition map */
1093 disposition_map.insert (pair<ustring,ImportDisposition>(_("one track per file"), ImportDistinctFiles));
1094 disposition_map.insert (pair<ustring,ImportDisposition>(_("one track per channel"), ImportDistinctChannels));
1095 disposition_map.insert (pair<ustring,ImportDisposition>(_("merge files"), ImportMergeFiles));
1096 disposition_map.insert (pair<ustring,ImportDisposition>(_("sequence files"), ImportSerializeFiles));
1098 disposition_map.insert (pair<ustring,ImportDisposition>(_("one region per file"), ImportDistinctFiles));
1099 disposition_map.insert (pair<ustring,ImportDisposition>(_("one region per channel"), ImportDistinctChannels));
1100 disposition_map.insert (pair<ustring,ImportDisposition>(_("all files in one region"), ImportMergeFiles));
1102 chooser.signal_selection_changed().connect (mem_fun (*this, &SoundFileOmega::file_selection_changed));
1106 SoundFileOmega::set_mode (ImportMode mode)
1108 action_combo.set_active_text (importmode2string (mode));
1112 SoundFileOmega::get_mode () const
1114 return string2importmode (action_combo.get_active_text());
1118 SoundFileOmega::on_hide ()
1120 ArdourDialog::on_hide();
1122 session->cancel_audition();
1127 SoundFileOmega::get_position() const
1129 ustring str = where_combo.get_active_text();
1131 if (str == _("use file timestamp")) {
1132 return ImportAtTimestamp;
1133 } else if (str == _("at edit point")) {
1134 return ImportAtEditPoint;
1135 } else if (str == _("at playhead")) {
1136 return ImportAtPlayhead;
1138 return ImportAtStart;
1143 SoundFileOmega::get_src_quality() const
1145 ustring str = where_combo.get_active_text();
1147 if (str == _("Best")) {
1149 } else if (str == _("Good")) {
1151 } else if (str == _("Quick")) {
1153 } else if (str == _("Fast")) {
1161 SoundFileOmega::get_channel_disposition () const
1163 /* we use a map here because the channel combo can contain different strings
1164 depending on the state of the other combos. the map contains all possible strings
1165 and the ImportDisposition enum that corresponds to it.
1168 ustring str = channel_combo.get_active_text();
1169 DispositionMap::const_iterator x = disposition_map.find (str);
1171 if (x == disposition_map.end()) {
1172 fatal << string_compose (_("programming error: %1 (%2)"), "unknown string for import disposition", str) << endmsg;
1180 SoundFileOmega::reset (int selected_tracks)
1182 selected_track_cnt = selected_tracks;
1187 SoundFileOmega::file_selection_changed ()
1189 if (resetting_ourselves) {
1193 if (!reset_options ()) {
1194 set_response_sensitive (RESPONSE_OK, false);
1196 if (chooser.get_filenames().size() > 0) {
1197 set_response_sensitive (RESPONSE_OK, true);
1199 set_response_sensitive (RESPONSE_OK, false);