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.
21 #include "gtk2ardour-config.h"
30 #include <sys/param.h>
32 #include <gtkmm/box.h>
33 #include <gtkmm/stock.h>
34 #include <glibmm/fileutils.h>
36 #include "pbd/convert.h"
37 #include "pbd/tokenizer.h"
38 #include "pbd/enumwriter.h"
39 #include "pbd/pthread_utils.h"
40 #include "pbd/xml++.h"
42 #include <gtkmm2ext/utils.h>
44 #include "evoral/SMF.hpp"
46 #include "ardour/audio_library.h"
47 #include "ardour/auditioner.h"
48 #include "ardour/audioregion.h"
49 #include "ardour/audiofilesource.h"
50 #include "ardour/smf_source.h"
51 #include "ardour/region_factory.h"
52 #include "ardour/source_factory.h"
53 #include "ardour/session.h"
54 #include "ardour/session_directory.h"
56 #include "ardour_ui.h"
58 #include "gui_thread.h"
63 #include "gain_meter.h"
64 #include "main_clock.h"
65 #include "public_editor.h"
68 #include "sfdb_freesound_mootcher.h"
73 using namespace ARDOUR;
77 using namespace Gtkmm2ext;
78 using namespace Editing;
82 string SoundFileBrowser::persistent_folder;
85 string2importmode (string str)
87 if (str == _("as new tracks")) {
89 } else if (str == _("to selected tracks")) {
91 } else if (str == _("to region list")) {
92 return ImportAsRegion;
93 } else if (str == _("as new tape tracks")) {
94 return ImportAsTapeTrack;
97 warning << string_compose (_("programming error: unknown import mode string %1"), str) << endmsg;
103 importmode2string (ImportMode mode)
107 return _("as new tracks");
109 return _("to selected tracks");
111 return _("to region list");
112 case ImportAsTapeTrack:
113 return _("as new tape tracks");
116 return _("as new tracks");
119 SoundFileBox::SoundFileBox (bool persistent)
121 length_clock ("sfboxLengthClock", !persistent, "", false, false, true, false),
122 timecode_clock ("sfboxTimecodeClock", !persistent, "", false, false, false, false),
124 autoplay_btn (_("Auto-play"))
127 set_name (X_("SoundFileBox"));
128 set_size_request (300, -1);
130 preview_label.set_markup (_("<b>Sound File Information</b>"));
132 border_frame.set_label_widget (preview_label);
133 border_frame.add (main_box);
135 pack_start (border_frame, true, true);
136 set_border_width (6);
138 main_box.set_border_width (6);
140 length.set_text (_("Length:"));
141 length.set_alignment (1, 0.5);
142 timecode.set_text (_("Timestamp:"));
143 timecode.set_alignment (1, 0.5);
144 format.set_text (_("Format:"));
145 format.set_alignment (1, 0.5);
146 channels.set_text (_("Channels:"));
147 channels.set_alignment (1, 0.5);
148 samplerate.set_text (_("Sample rate:"));
149 samplerate.set_alignment (1, 0.5);
151 preview_label.set_max_width_chars (50);
152 preview_label.set_ellipsize (Pango::ELLIPSIZE_END);
154 format_text.set_max_width_chars (20);
155 format_text.set_ellipsize (Pango::ELLIPSIZE_END);
156 format_text.set_alignment (0, 1);
158 table.set_col_spacings (6);
159 table.set_homogeneous (false);
160 table.set_row_spacings (6);
162 table.attach (channels, 0, 1, 0, 1, FILL, FILL);
163 table.attach (samplerate, 0, 1, 1, 2, FILL, FILL);
164 table.attach (format, 0, 1, 2, 4, FILL, FILL);
165 table.attach (length, 0, 1, 4, 5, FILL, FILL);
166 table.attach (timecode, 0, 1, 5, 6, FILL, FILL);
168 table.attach (channels_value, 1, 2, 0, 1, FILL, FILL);
169 table.attach (samplerate_value, 1, 2, 1, 2, FILL, FILL);
170 table.attach (format_text, 1, 2, 2, 4, FILL, FILL);
171 table.attach (length_clock, 1, 2, 4, 5, FILL, FILL);
172 table.attach (timecode_clock, 1, 2, 5, 6, FILL, FILL);
174 length_clock.set_mode (ARDOUR_UI::instance()->secondary_clock->mode());
175 timecode_clock.set_mode (AudioClock::Timecode);
177 main_box.pack_start (table, false, false);
179 tags_entry.set_editable (true);
180 tags_entry.set_wrap_mode(Gtk::WRAP_WORD);
181 tags_entry.signal_focus_out_event().connect (sigc::mem_fun (*this, &SoundFileBox::tags_entry_left));
183 Label* label = manage (new Label (_("Tags:")));
184 label->set_alignment (0.0f, 0.5f);
185 main_box.pack_start (*label, false, false);
186 main_box.pack_start (tags_entry, true, true);
188 main_box.pack_start (bottom_box, false, false);
190 play_btn.set_image (*(manage (new Image (Stock::MEDIA_PLAY, ICON_SIZE_BUTTON))));
191 // play_btn.set_label (_("Play"));
193 stop_btn.set_image (*(manage (new Image (Stock::MEDIA_STOP, ICON_SIZE_BUTTON))));
194 // stop_btn.set_label (_("Stop"));
196 bottom_box.set_homogeneous (false);
197 bottom_box.set_spacing (6);
198 bottom_box.pack_start(play_btn, true, true);
199 bottom_box.pack_start(stop_btn, true, true);
200 bottom_box.pack_start(autoplay_btn, false, false);
202 play_btn.signal_clicked().connect (sigc::mem_fun (*this, &SoundFileBox::audition));
203 stop_btn.signal_clicked().connect (sigc::mem_fun (*this, &SoundFileBox::stop_audition));
205 channels_value.set_alignment (0.0f, 0.5f);
206 samplerate_value.set_alignment (0.0f, 0.5f);
210 SoundFileBox::set_session(Session* s)
212 SessionHandlePtr::set_session (s);
214 length_clock.set_session (s);
215 timecode_clock.set_session (s);
218 play_btn.set_sensitive (false);
219 stop_btn.set_sensitive (false);
224 SoundFileBox::setup_labels (const string& filename)
227 // save existing tags
235 if(!AudioFileSource::get_soundfile_info (filename, sf_info, error_msg)) {
237 preview_label.set_markup (_("<b>Sound File Information</b>"));
238 format_text.set_text ("");
239 channels_value.set_text ("");
240 samplerate_value.set_text ("");
241 tags_entry.get_buffer()->set_text ("");
243 length_clock.set (0);
244 timecode_clock.set (0);
246 tags_entry.set_sensitive (false);
247 play_btn.set_sensitive (false);
252 preview_label.set_markup (string_compose ("<b>%1</b>", Glib::Markup::escape_text (Glib::path_get_basename (filename))));
253 std::string n = sf_info.format_name;
254 if (n.substr (0, 8) == X_("Format: ")) {
257 format_text.set_text (n);
258 channels_value.set_text (to_string (sf_info.channels, std::dec));
260 if (_session && sf_info.samplerate != _session->frame_rate()) {
261 samplerate.set_markup (string_compose ("<b>%1</b>", _("Sample rate:")));
262 samplerate_value.set_markup (string_compose (X_("<b>%1 Hz</b>"), sf_info.samplerate));
263 samplerate_value.set_name ("NewSessionSR1Label");
264 samplerate.set_name ("NewSessionSR1Label");
266 samplerate.set_text (_("Sample rate:"));
267 samplerate_value.set_text (string_compose (X_("%1 Hz"), sf_info.samplerate));
268 samplerate_value.set_name ("NewSessionSR2Label");
269 samplerate.set_name ("NewSessionSR2Label");
272 framecnt_t const nfr = _session ? _session->nominal_frame_rate() : 25;
273 double src_coef = (double) nfr / sf_info.samplerate;
275 length_clock.set (sf_info.length * src_coef + 0.5, true);
276 timecode_clock.set (sf_info.timecode * src_coef + 0.5, true);
278 // this is a hack that is fixed in trunk, i think (august 26th, 2007)
280 vector<string> tags = Library->get_tags (string ("//") + filename);
282 stringstream tag_string;
283 for (vector<string>::iterator i = tags.begin(); i != tags.end(); ++i) {
284 if (i != tags.begin()) {
289 tags_entry.get_buffer()->set_text (tag_string.str());
291 tags_entry.set_sensitive (true);
293 play_btn.set_sensitive (true);
300 SoundFileBox::autoplay() const
302 return autoplay_btn.get_active();
306 SoundFileBox::audition_oneshot()
313 SoundFileBox::audition ()
319 if (SMFSource::safe_midi_file_extension (path)) {
320 error << _("Auditioning of MIDI files is not yet supported") << endmsg;
324 _session->cancel_audition();
326 if (!Glib::file_test (path, Glib::FILE_TEST_EXISTS)) {
327 warning << string_compose(_("Could not read file: %1 (%2)."), path, strerror(errno)) << endmsg;
331 boost::shared_ptr<Region> r;
333 boost::shared_ptr<AudioFileSource> afs;
334 bool old_sbp = AudioSource::get_build_peakfiles ();
336 /* don't even think of building peakfiles for these files */
338 AudioSource::set_build_peakfiles (false);
340 for (int n = 0; n < sf_info.channels; ++n) {
342 afs = boost::dynamic_pointer_cast<AudioFileSource> (
343 SourceFactory::createReadable (DataType::AUDIO, *_session,
344 path, n, Source::Flag (0), false));
346 srclist.push_back(afs);
348 } catch (failed_constructor& err) {
349 error << _("Could not access soundfile: ") << path << endmsg;
350 AudioSource::set_build_peakfiles (old_sbp);
355 AudioSource::set_build_peakfiles (old_sbp);
357 if (srclist.empty()) {
361 afs = boost::dynamic_pointer_cast<AudioFileSource> (srclist[0]);
362 string rname = region_name_from_path (afs->path(), false);
366 plist.add (ARDOUR::Properties::start, 0);
367 plist.add (ARDOUR::Properties::length, srclist[0]->length(srclist[0]->timeline_position()));
368 plist.add (ARDOUR::Properties::name, rname);
369 plist.add (ARDOUR::Properties::layer, 0);
371 r = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (srclist, plist, false));
373 _session->audition_region(r);
377 SoundFileBox::stop_audition ()
380 _session->cancel_audition();
385 SoundFileBox::tags_entry_left (GdkEventFocus *)
392 SoundFileBox::tags_changed ()
394 string tag_string = tags_entry.get_buffer()->get_text ();
396 if (tag_string.empty()) {
402 if (!PBD::tokenize (tag_string, string(",\n"), std::back_inserter (tags), true)) {
403 warning << _("SoundFileBox: Could not tokenize string: ") << tag_string << endmsg;
411 SoundFileBox::save_tags (const vector<string>& tags)
413 Library->set_tags (string ("//") + path, tags);
414 Library->save_changes ();
417 SoundFileBrowser::SoundFileBrowser (string title, ARDOUR::Session* s, bool persistent)
418 : ArdourWindow (title)
419 , found_list (ListStore::create(found_list_columns))
420 , freesound_list (ListStore::create(freesound_list_columns))
421 , chooser (FILE_CHOOSER_ACTION_OPEN)
422 , preview (persistent)
423 , found_search_btn (_("Search"))
424 , found_list_view (found_list)
425 , freesound_search_btn (_("Search"))
426 , freesound_list_view (freesound_list)
427 , resetting_ourselves (false)
431 , ok_button (Stock::OK)
432 , cancel_button (Stock::CANCEL)
433 , apply_button (Stock::APPLY)
438 chooser.add_shortcut_folder_uri("file:///Library/GarageBand/Apple Loops");
439 chooser.add_shortcut_folder_uri("file:///Library/Audio/Apple Loops");
440 chooser.add_shortcut_folder_uri("file:///Library/Application Support/GarageBand/Instrument Library/Sampler/Sampler Files");
441 chooser.add_shortcut_folder_uri("file:///Volumes");
444 //add the file chooser
446 chooser.set_border_width (12);
448 audio_and_midi_filter.add_custom (FILE_FILTER_FILENAME, sigc::mem_fun (*this, &SoundFileBrowser::on_audio_and_midi_filter));
449 audio_and_midi_filter.set_name (_("Audio and MIDI files"));
451 audio_filter.add_custom (FILE_FILTER_FILENAME, sigc::mem_fun(*this, &SoundFileBrowser::on_audio_filter));
452 audio_filter.set_name (_("Audio files"));
454 midi_filter.add_custom (FILE_FILTER_FILENAME, sigc::mem_fun(*this, &SoundFileBrowser::on_midi_filter));
455 midi_filter.set_name (_("MIDI files"));
457 matchall_filter.add_pattern ("*.*");
458 matchall_filter.set_name (_("All files"));
460 chooser.add_filter (audio_and_midi_filter);
461 chooser.add_filter (audio_filter);
462 chooser.add_filter (midi_filter);
463 chooser.add_filter (matchall_filter);
464 chooser.set_select_multiple (true);
465 chooser.signal_update_preview().connect(sigc::mem_fun(*this, &SoundFileBrowser::update_preview));
466 chooser.signal_file_activated().connect (sigc::mem_fun (*this, &SoundFileBrowser::chooser_file_activated));
469 /* some broken redraw behaviour - this is a bandaid */
470 chooser.signal_selection_changed().connect (mem_fun (chooser, &Widget::queue_draw));
473 if (!persistent_folder.empty()) {
474 chooser.set_current_folder (persistent_folder);
477 notebook.append_page (chooser, _("Browse Files"));
479 hpacker.set_spacing (6);
480 hpacker.pack_start (notebook, true, true);
481 hpacker.pack_start (preview, false, false);
483 vpacker.set_spacing (6);
484 vpacker.pack_start (hpacker, true, true);
494 hbox = manage(new HBox);
495 hbox->pack_start (found_entry);
496 hbox->pack_start (found_search_btn);
498 Gtk::ScrolledWindow *scroll = manage(new ScrolledWindow);
499 scroll->add(found_list_view);
500 scroll->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
502 vbox = manage(new VBox);
503 vbox->pack_start (*hbox, PACK_SHRINK);
504 vbox->pack_start (*scroll);
506 found_list_view.append_column(_("Paths"), found_list_columns.pathname);
508 found_list_view.get_selection()->signal_changed().connect(sigc::mem_fun(*this, &SoundFileBrowser::found_list_view_selected));
510 found_list_view.signal_row_activated().connect (sigc::mem_fun (*this, &SoundFileBrowser::found_list_view_activated));
512 found_search_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::found_search_clicked));
513 found_entry.signal_activate().connect(sigc::mem_fun(*this, &SoundFileBrowser::found_search_clicked));
515 freesound_stop_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_stop_clicked));
517 notebook.append_page (*vbox, _("Search Tags"));
521 //add freesound search
523 mootcher = new Mootcher();
528 passbox = manage(new HBox);
529 passbox->set_spacing (6);
531 label = manage (new Label);
532 label->set_text (_("Tags:"));
533 passbox->pack_start (*label, false, false);
534 passbox->pack_start (freesound_entry, true, true);
536 label = manage (new Label);
537 label->set_text (_("Sort:"));
538 passbox->pack_start (*label, false, false);
539 passbox->pack_start (freesound_sort, false, false);
540 freesound_sort.clear_items();
542 // Order of the following must correspond with enum sortMethod
543 // in sfdb_freesound_mootcher.h
544 freesound_sort.append_text(_("None"));
545 freesound_sort.append_text(_("Longest"));
546 freesound_sort.append_text(_("Shortest"));
547 freesound_sort.append_text(_("Newest"));
548 freesound_sort.append_text(_("Oldest"));
549 freesound_sort.append_text(_("Most downloaded"));
550 freesound_sort.append_text(_("Least downloaded"));
551 freesound_sort.append_text(_("Highest rated"));
552 freesound_sort.append_text(_("Lowest rated"));
553 freesound_sort.set_active(0);
555 passbox->pack_start (freesound_search_btn, false, false);
556 passbox->pack_end (freesound_stop_btn, false, false);
557 freesound_stop_btn.set_label(_("Stop"));
559 scroll = manage(new ScrolledWindow);
560 scroll->add(freesound_list_view);
561 scroll->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
563 vbox = manage(new VBox);
564 vbox->set_spacing (3);
565 vbox->pack_start (*passbox, PACK_SHRINK);
566 vbox->pack_start (freesound_progress_bar, PACK_SHRINK);
567 vbox->pack_start (*scroll);
569 freesound_list_view.append_column(_("ID") , freesound_list_columns.id);
570 freesound_list_view.append_column(_("Filename"), freesound_list_columns.filename);
571 // freesound_list_view.append_column(_("URI") , freesound_list_columns.uri);
572 freesound_list_view.append_column(_("Duration"), freesound_list_columns.duration);
573 freesound_list_view.append_column(_("Size"), freesound_list_columns.filesize);
574 freesound_list_view.append_column(_("Samplerate"), freesound_list_columns.smplrate);
575 freesound_list_view.append_column(_("License"), freesound_list_columns.license);
576 freesound_list_view.get_column(0)->set_alignment(0.5);
577 freesound_list_view.get_column(1)->set_expand(true);
578 freesound_list_view.get_column(2)->set_alignment(0.5);
579 freesound_list_view.get_column(3)->set_alignment(0.5);
580 freesound_list_view.get_column(4)->set_alignment(0.5);
581 freesound_list_view.get_column(5)->set_alignment(0.5);
583 freesound_list_view.get_selection()->signal_changed().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_list_view_selected));
585 freesound_list_view.get_selection()->set_mode (SELECTION_MULTIPLE);
586 freesound_list_view.signal_row_activated().connect (sigc::mem_fun (*this, &SoundFileBrowser::freesound_list_view_activated));
587 freesound_search_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_search_clicked));
588 freesound_entry.signal_activate().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_search_clicked));
589 freesound_stop_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_stop_clicked));
590 notebook.append_page (*vbox, _("Search Freesound"));
593 notebook.set_size_request (500, -1);
594 notebook.signal_switch_page().connect (sigc::hide_return (sigc::hide (sigc::hide (sigc::mem_fun (*this, &SoundFileBrowser::reset_options)))));
598 Gtk::HButtonBox* button_box = manage (new HButtonBox);
600 button_box->set_layout (BUTTONBOX_END);
601 button_box->pack_start (cancel_button, false, false);
602 cancel_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*this, &SoundFileBrowser::do_something), RESPONSE_CANCEL));
604 button_box->pack_start (apply_button, false, false);
605 apply_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*this, &SoundFileBrowser::do_something), RESPONSE_APPLY));
608 button_box->pack_start (ok_button, false, false);
609 ok_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*this, &SoundFileBrowser::do_something), RESPONSE_OK));
611 Gtkmm2ext::UI::instance()->set_tip (ok_button, _("Press to import selected files and close this window"));
612 Gtkmm2ext::UI::instance()->set_tip (apply_button, _("Press to import selected files and leave this window open"));
613 Gtkmm2ext::UI::instance()->set_tip (cancel_button, _("Press to close this window without importing any files"));
615 vpacker.pack_end (*button_box, false, false);
617 set_wmclass (X_("import"), PROGRAM_NAME);
620 SoundFileBrowser::~SoundFileBrowser ()
622 persistent_folder = chooser.get_current_folder();
626 SoundFileBrowser::run ()
635 gtk_main_iteration ();
642 SoundFileBrowser::set_action_sensitive (bool yn)
644 ok_button.set_sensitive (yn);
645 apply_button.set_sensitive (yn);
649 SoundFileBrowser::do_something (int action)
656 SoundFileBrowser::on_show ()
658 ArdourWindow::on_show ();
663 SoundFileBrowser::clear_selection ()
665 chooser.unselect_all ();
666 found_list_view.get_selection()->unselect_all ();
670 SoundFileBrowser::chooser_file_activated ()
676 SoundFileBrowser::found_list_view_activated (const TreeModel::Path&, TreeViewColumn*)
682 SoundFileBrowser::freesound_list_view_activated (const TreeModel::Path&, TreeViewColumn*)
688 SoundFileBrowser::set_session (Session* s)
690 ArdourWindow::set_session (s);
691 preview.set_session (s);
696 remove_gain_meter ();
701 SoundFileBrowser::add_gain_meter ()
705 gm = new GainMeter (_session, 250);
707 boost::shared_ptr<Route> r = _session->the_auditioner ();
709 gm->set_controls (r, r->shared_peak_meter(), r->amp());
710 gm->set_fader_name (X_("AudioTrackFader"));
712 meter_packer.set_border_width (12);
713 meter_packer.pack_start (*gm, false, true);
714 hpacker.pack_end (meter_packer, false, false);
715 meter_packer.show_all ();
720 SoundFileBrowser::remove_gain_meter ()
723 meter_packer.remove (*gm);
724 hpacker.remove (meter_packer);
731 SoundFileBrowser::start_metering ()
733 metering_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect (sigc::mem_fun(*this, &SoundFileBrowser::meter));
737 SoundFileBrowser::stop_metering ()
739 metering_connection.disconnect();
743 SoundFileBrowser::meter ()
745 if (is_mapped () && _session && gm) {
746 gm->update_meters ();
751 SoundFileBrowser::on_audio_filter (const FileFilter::Info& filter_info)
753 return AudioFileSource::safe_audio_file_extension (filter_info.filename);
757 SoundFileBrowser::on_midi_filter (const FileFilter::Info& filter_info)
759 return SMFSource::safe_midi_file_extension (filter_info.filename);
763 SoundFileBrowser::on_audio_and_midi_filter (const FileFilter::Info& filter_info)
765 return on_audio_filter (filter_info) || on_midi_filter (filter_info);
769 SoundFileBrowser::update_preview ()
771 if (preview.setup_labels (chooser.get_preview_filename())) {
772 if (preview.autoplay()) {
773 Glib::signal_idle().connect (sigc::mem_fun (preview, &SoundFileBox::audition_oneshot));
779 SoundFileBrowser::found_list_view_selected ()
781 if (!reset_options ()) {
782 set_action_sensitive (false);
786 TreeView::Selection::ListHandle_Path rows = found_list_view.get_selection()->get_selected_rows ();
789 TreeIter iter = found_list->get_iter(*rows.begin());
790 file = (*iter)[found_list_columns.pathname];
791 chooser.set_filename (file);
792 set_action_sensitive (true);
794 set_action_sensitive (false);
797 preview.setup_labels (file);
802 SoundFileBrowser::freesound_list_view_selected ()
804 freesound_download_cancel = false;
807 if (!reset_options ()) {
808 set_action_sensitive (false);
813 TreeView::Selection::ListHandle_Path rows = freesound_list_view.get_selection()->get_selected_rows ();
816 TreeIter iter = freesound_list->get_iter(*rows.begin());
818 string id = (*iter)[freesound_list_columns.id];
819 string uri = (*iter)[freesound_list_columns.uri];
820 string ofn = (*iter)[freesound_list_columns.filename];
822 // download the sound file
823 GdkCursor *prev_cursor;
824 prev_cursor = gdk_window_get_cursor (get_window()->gobj());
825 gdk_window_set_cursor (get_window()->gobj(), gdk_cursor_new(GDK_WATCH));
828 file = mootcher->getAudioFile(ofn, id, uri, this);
830 gdk_window_set_cursor (get_window()->gobj(), prev_cursor);
833 chooser.set_filename (file);
834 set_action_sensitive (true);
837 set_action_sensitive (false);
840 freesound_progress_bar.set_text(
841 string_compose(P_("found %1 match", "found %1 matches", matches), matches));
843 preview.setup_labels (file);
849 SoundFileBrowser::found_search_clicked ()
851 string tag_string = found_entry.get_text ();
855 if (!PBD::tokenize (tag_string, string(","), std::back_inserter (tags), true)) {
856 warning << _("SoundFileBrowser: Could not tokenize string: ") << tag_string << endmsg;
860 vector<string> results;
861 Library->search_members_and (results, tags);
864 for (vector<string>::iterator i = results.begin(); i != results.end(); ++i) {
865 TreeModel::iterator new_row = found_list->append();
866 TreeModel::Row row = *new_row;
867 string path = Glib::filename_from_uri (string ("file:") + *i);
868 row[found_list_columns.pathname] = path;
873 SoundFileBrowser::freesound_search_clicked ()
875 freesound_search_cancel = false;
880 SoundFileBrowser::freesound_stop_clicked ()
882 freesound_download_cancel = true;
883 freesound_search_cancel = true;
888 SoundFileBrowser::freesound_search()
891 freesound_list->clear();
892 freesound_list_view.get_column(1)->set_sizing(TREE_VIEW_COLUMN_GROW_ONLY);
895 string search_string = freesound_entry.get_text ();
896 enum sortMethod sort_method = (enum sortMethod) freesound_sort.get_active_row_number();
898 GdkCursor *prev_cursor;
899 prev_cursor = gdk_window_get_cursor (get_window()->gobj());
900 gdk_window_set_cursor (get_window()->gobj(), gdk_cursor_new(GDK_WATCH));
901 freesound_progress_bar.set_fraction(0.0);
904 int freesound_n_pages = 1;
905 for (int page = 1; page <= 99 && page <= freesound_n_pages; page++ ) {
908 if (freesound_n_pages > 1) {
909 freesound_progress_bar.set_fraction(page/(float)freesound_n_pages);
910 prog = string_compose (_("Searching Page %1 of %2, click Stop to cancel"), page, freesound_n_pages);
912 prog = _("Searching, click Stop to cancel");
914 freesound_progress_bar.set_text(prog);
915 while (Glib::MainContext::get_default()->iteration (false)) {
919 std::string theString = mootcher->searchText(
923 "", // OSX eats anything incl mp3
925 "type:wav OR type:aiff OR type:flac OR type:aif OR type:ogg OR type:oga",
931 doc.read_buffer( theString );
932 XMLNode *root = doc.root();
935 error << "no root XML node!" << endmsg;
939 if ( strcmp(root->name().c_str(), "response") != 0) {
940 error << string_compose ("root node name == %1 != \"response\"", root->name()) << endmsg;
944 //find out how many pages are available to search
945 XMLNode *res = root->child("num_pages");
947 string result = res->child("text")->content();
948 freesound_n_pages = atoi(result.c_str());
951 XMLNode *sounds_root = root->child("sounds");
954 error << "no child node \"sounds\" found!" << endmsg;
958 XMLNodeList sounds = sounds_root->children();
959 if (sounds.size() == 0) {
964 XMLNodeConstIterator niter;
966 for (niter = sounds.begin(); niter != sounds.end(); ++niter) {
968 if( strcmp( node->name().c_str(), "resource") != 0 ){
969 error << string_compose ("node->name()=%1 != \"resource\"", node->name()) << endmsg;
970 freesound_search_cancel = true;
974 // node->dump(cerr, "node:");
976 XMLNode *id_node = node->child ("id");
977 XMLNode *uri_node = node->child ("serve");
978 XMLNode *ofn_node = node->child ("original_filename");
979 XMLNode *dur_node = node->child ("duration");
980 XMLNode *siz_node = node->child ("filesize");
981 XMLNode *srt_node = node->child ("samplerate");
982 XMLNode *lic_node = node->child ("license");
984 if (id_node && uri_node && ofn_node && dur_node && siz_node && srt_node) {
986 std::string id = id_node->child("text")->content();
987 std::string uri = uri_node->child("text")->content();
988 std::string ofn = ofn_node->child("text")->content();
989 std::string dur = dur_node->child("text")->content();
990 std::string siz = siz_node->child("text")->content();
991 std::string srt = srt_node->child("text")->content();
992 std::string lic = lic_node->child("text")->content();
995 // cerr << "id=" << id << ",uri=" << uri << ",ofn=" << ofn << ",dur=" << dur << endl;
997 double duration_seconds = atof(dur.c_str());
999 char duration_hhmmss[16];
1000 if (duration_seconds >= 99 * 60 * 60) {
1001 strcpy(duration_hhmmss, ">99h");
1003 s = modf(duration_seconds/60, &m) * 60;
1004 m = modf(m/60, &h) * 60;
1005 sprintf(duration_hhmmss, "%02.fh:%02.fm:%04.1fs",
1010 double size_bytes = atof(siz.c_str());
1012 if (size_bytes < 1000) {
1013 sprintf(bsize, "%.0f %s", size_bytes, _("B"));
1014 } else if (size_bytes < 1000000 ) {
1015 sprintf(bsize, "%.1f %s", size_bytes / 1000.0, _("kB"));
1016 } else if (size_bytes < 10000000) {
1017 sprintf(bsize, "%.1f %s", size_bytes / 1000000.0, _("MB"));
1018 } else if (size_bytes < 1000000000) {
1019 sprintf(bsize, "%.2f %s", size_bytes / 1000000.0, _("MB"));
1021 sprintf(bsize, "%.2f %s", size_bytes / 1000000000.0, _("GB"));
1024 /* see http://www.freesound.org/help/faq/#licenses */
1025 char shortlicense[64];
1026 if(!lic.compare(0, 42, "http://creativecommons.org/licenses/by-nc/")){
1027 sprintf(shortlicense, "CC-BY-NC");
1028 } else if(!lic.compare(0, 39, "http://creativecommons.org/licenses/by/")) {
1029 sprintf(shortlicense, "CC-BY");
1030 } else if(!lic.compare("http://creativecommons.org/licenses/sampling+/1.0/")) {
1031 sprintf(shortlicense, "sampling+");
1032 } else if(!lic.compare(0, 40, "http://creativecommons.org/publicdomain/")) {
1033 sprintf(shortlicense, "PD");
1035 snprintf(shortlicense, 64, "%s", lic.c_str());
1036 shortlicense[63]= '\0';
1039 TreeModel::iterator new_row = freesound_list->append();
1040 TreeModel::Row row = *new_row;
1042 row[freesound_list_columns.id ] = id;
1043 row[freesound_list_columns.uri ] = uri;
1044 row[freesound_list_columns.filename] = ofn;
1045 row[freesound_list_columns.duration] = duration_hhmmss;
1046 row[freesound_list_columns.filesize] = bsize;
1047 row[freesound_list_columns.smplrate] = srt;
1048 row[freesound_list_columns.license ] = shortlicense;
1054 if (freesound_search_cancel)
1059 gdk_window_set_cursor (get_window()->gobj(), prev_cursor);
1061 freesound_progress_bar.set_fraction(0.0);
1063 freesound_progress_bar.set_text(_("Search returned no results."));
1065 freesound_progress_bar.set_text(string_compose(P_("Found %1 match", "Found %1 matches", matches), matches));
1067 freesound_list_view.get_column(1)->set_sizing(TREE_VIEW_COLUMN_AUTOSIZE);
1072 SoundFileBrowser::get_paths ()
1074 vector<string> results;
1076 int n = notebook.get_current_page ();
1079 vector<string> filenames = chooser.get_filenames();
1080 vector<string>::iterator i;
1082 for (i = filenames.begin(); i != filenames.end(); ++i) {
1084 if ((!stat((*i).c_str(), &buf)) && S_ISREG(buf.st_mode)) {
1085 results.push_back (*i);
1091 typedef TreeView::Selection::ListHandle_Path ListPath;
1093 ListPath rows = found_list_view.get_selection()->get_selected_rows ();
1094 for (ListPath::iterator i = rows.begin() ; i != rows.end(); ++i) {
1095 TreeIter iter = found_list->get_iter(*i);
1096 string str = (*iter)[found_list_columns.pathname];
1098 results.push_back (str);
1102 typedef TreeView::Selection::ListHandle_Path ListPath;
1104 ListPath rows = freesound_list_view.get_selection()->get_selected_rows ();
1105 for (ListPath::iterator i = rows.begin() ; i != rows.end(); ++i) {
1106 TreeIter iter = freesound_list->get_iter(*i);
1107 string id = (*iter)[freesound_list_columns.id];
1108 string uri = (*iter)[freesound_list_columns.uri];
1109 string ofn = (*iter)[freesound_list_columns.filename];
1111 GdkCursor *prev_cursor;
1112 prev_cursor = gdk_window_get_cursor (get_window()->gobj());
1113 gdk_window_set_cursor (get_window()->gobj(), gdk_cursor_new(GDK_WATCH));
1116 string str = mootcher->getAudioFile(ofn, id, uri, this);
1118 results.push_back (str);
1121 gdk_window_set_cursor (get_window()->gobj(), prev_cursor);
1131 SoundFileOmega::reset_options_noret ()
1133 if (!resetting_ourselves) {
1134 (void) reset_options ();
1139 SoundFileOmega::reset_options ()
1141 vector<string> paths = get_paths ();
1143 if (paths.empty()) {
1145 channel_combo.set_sensitive (false);
1146 action_combo.set_sensitive (false);
1147 where_combo.set_sensitive (false);
1148 copy_files_btn.set_active (true);
1149 copy_files_btn.set_sensitive (false);
1155 channel_combo.set_sensitive (true);
1156 action_combo.set_sensitive (true);
1157 where_combo.set_sensitive (true);
1159 /* if we get through this function successfully, this may be
1160 reset at the end, once we know if we can use hard links
1161 to do embedding (or if we are importing a MIDI file).
1164 if (Config->get_only_copy_imported_files()) {
1165 copy_files_btn.set_sensitive (false);
1167 copy_files_btn.set_sensitive (false);
1173 bool selection_includes_multichannel;
1174 bool selection_can_be_embedded_with_links = check_link_status (_session, paths);
1177 /* See if we are thinking about importing any MIDI files */
1178 vector<string>::iterator i = paths.begin ();
1179 while (i != paths.end() && SMFSource::safe_midi_file_extension (*i) == false) {
1182 bool const have_a_midi_file = (i != paths.end ());
1184 if (check_info (paths, same_size, src_needed, selection_includes_multichannel)) {
1185 Glib::signal_idle().connect (sigc::mem_fun (*this, &SoundFileOmega::bad_file_message));
1189 string existing_choice;
1190 vector<string> action_strings;
1192 resetting_ourselves = true;
1194 if (chooser.get_filter() == &audio_filter) {
1198 if (selected_audio_track_cnt > 0) {
1199 if (channel_combo.get_active_text().length()) {
1200 ImportDisposition id = get_channel_disposition();
1203 case Editing::ImportDistinctFiles:
1204 if (selected_audio_track_cnt == paths.size()) {
1205 action_strings.push_back (importmode2string (ImportToTrack));
1209 case Editing::ImportDistinctChannels:
1210 /* XXX it would be nice to allow channel-per-selected track
1211 but its too hard we don't want to deal with all the
1212 different per-file + per-track channel configurations.
1217 action_strings.push_back (importmode2string (ImportToTrack));
1227 if (selected_midi_track_cnt > 0) {
1228 action_strings.push_back (importmode2string (ImportToTrack));
1232 action_strings.push_back (importmode2string (ImportAsTrack));
1233 action_strings.push_back (importmode2string (ImportAsRegion));
1234 action_strings.push_back (importmode2string (ImportAsTapeTrack));
1236 existing_choice = action_combo.get_active_text();
1238 set_popdown_strings (action_combo, action_strings);
1240 /* preserve any existing choice, if possible */
1243 if (existing_choice.length()) {
1244 vector<string>::iterator x;
1245 for (x = action_strings.begin(); x != action_strings.end(); ++x) {
1246 if (*x == existing_choice) {
1247 action_combo.set_active_text (existing_choice);
1251 if (x == action_strings.end()) {
1252 action_combo.set_active_text (action_strings.front());
1255 action_combo.set_active_text (action_strings.front());
1258 resetting_ourselves = false;
1260 if ((mode = get_mode()) == ImportAsRegion) {
1261 where_combo.set_sensitive (false);
1263 where_combo.set_sensitive (true);
1266 vector<string> channel_strings;
1268 if (mode == ImportAsTrack || mode == ImportAsTapeTrack || mode == ImportToTrack) {
1269 channel_strings.push_back (_("one track per file"));
1271 if (selection_includes_multichannel) {
1272 channel_strings.push_back (_("one track per channel"));
1275 if (paths.size() > 1) {
1276 /* tape tracks are a single region per track, so we cannot
1277 sequence multiple files.
1279 if (mode != ImportAsTapeTrack) {
1280 channel_strings.push_back (_("sequence files"));
1283 channel_strings.push_back (_("all files in one track"));
1284 channel_strings.push_back (_("merge files"));
1290 channel_strings.push_back (_("one region per file"));
1292 if (selection_includes_multichannel) {
1293 channel_strings.push_back (_("one region per channel"));
1296 if (paths.size() > 1) {
1298 channel_strings.push_back (_("all files in one region"));
1303 resetting_ourselves = true;
1305 existing_choice = channel_combo.get_active_text();
1307 set_popdown_strings (channel_combo, channel_strings);
1309 /* preserve any existing choice, if possible */
1311 if (existing_choice.length()) {
1312 vector<string>::iterator x;
1313 for (x = channel_strings.begin(); x != channel_strings.end(); ++x) {
1314 if (*x == existing_choice) {
1315 channel_combo.set_active_text (existing_choice);
1319 if (x == channel_strings.end()) {
1320 channel_combo.set_active_text (channel_strings.front());
1323 channel_combo.set_active_text (channel_strings.front());
1326 resetting_ourselves = false;
1329 src_combo.set_sensitive (true);
1331 src_combo.set_sensitive (false);
1334 /* We must copy MIDI files or those from Freesound */
1335 bool const must_copy = have_a_midi_file || notebook.get_current_page() == 2;
1337 if (Config->get_only_copy_imported_files()) {
1339 if (selection_can_be_embedded_with_links && !must_copy) {
1340 copy_files_btn.set_sensitive (true);
1343 copy_files_btn.set_active (true);
1345 copy_files_btn.set_sensitive (false);
1351 copy_files_btn.set_active (true);
1353 copy_files_btn.set_sensitive (!must_copy);
1361 SoundFileOmega::bad_file_message()
1363 MessageDialog msg (*this,
1364 string_compose (_("One or more of the selected files\ncannot be used by %1"), PROGRAM_NAME),
1369 resetting_ourselves = true;
1370 chooser.unselect_uri (chooser.get_preview_uri());
1371 resetting_ourselves = false;
1377 SoundFileOmega::check_info (const vector<string>& paths, bool& same_size, bool& src_needed, bool& multichannel)
1386 multichannel = false;
1388 for (vector<string>::const_iterator i = paths.begin(); i != paths.end(); ++i) {
1390 if (AudioFileSource::get_soundfile_info (*i, info, errmsg)) {
1391 if (info.channels > 1) {
1392 multichannel = true;
1397 if (sz != info.length) {
1402 if (info.samplerate != _session->frame_rate()) {
1406 } else if (SMFSource::safe_midi_file_extension (*i)) {
1410 if (reader.num_tracks() > 1) {
1411 multichannel = true; // "channel" == track here...
1414 /* XXX we need err = true handling here in case
1415 we can't check the file
1428 SoundFileOmega::check_link_status (const Session* s, const vector<string>& paths)
1430 std::string tmpdir(Glib::build_filename (s->session_directory().sound_path(), "linktest"));
1433 if (mkdir (tmpdir.c_str(), 0744)) {
1434 if (errno != EEXIST) {
1439 for (vector<string>::const_iterator i = paths.begin(); i != paths.end(); ++i) {
1441 char tmpc[MAXPATHLEN+1];
1443 snprintf (tmpc, sizeof(tmpc), "%s/%s", tmpdir.c_str(), Glib::path_get_basename (*i).c_str());
1447 if (link ((*i).c_str(), tmpc)) {
1457 rmdir (tmpdir.c_str());
1461 SoundFileChooser::SoundFileChooser (string title, ARDOUR::Session* s)
1462 : SoundFileBrowser (title, s, false)
1464 chooser.set_select_multiple (false);
1465 found_list_view.get_selection()->set_mode (SELECTION_SINGLE);
1466 freesound_list_view.get_selection()->set_mode (SELECTION_SINGLE);
1470 SoundFileChooser::on_hide ()
1472 ArdourWindow::on_hide();
1476 _session->cancel_audition();
1481 SoundFileChooser::get_filename ()
1483 vector<string> paths;
1485 paths = get_paths ();
1487 if (paths.empty()) {
1491 if (!Glib::file_test (paths.front(), Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_REGULAR)) {
1495 return paths.front();
1498 SoundFileOmega::SoundFileOmega (string title, ARDOUR::Session* s,
1499 uint32_t selected_audio_tracks,
1500 uint32_t selected_midi_tracks,
1502 Editing::ImportMode mode_hint)
1503 : SoundFileBrowser (title, s, persistent)
1504 , copy_files_btn ( _("Copy files to session"))
1505 , selected_audio_track_cnt (selected_audio_tracks)
1506 , selected_midi_track_cnt (selected_midi_tracks)
1512 set_size_request (-1, 450);
1514 block_two.set_border_width (12);
1515 block_three.set_border_width (12);
1516 block_four.set_border_width (12);
1518 options.set_spacing (12);
1521 str.push_back (_("file timestamp"));
1522 str.push_back (_("edit point"));
1523 str.push_back (_("playhead"));
1524 str.push_back (_("session start"));
1525 set_popdown_strings (where_combo, str);
1526 where_combo.set_active_text (str.front());
1528 Label* l = manage (new Label);
1529 l->set_markup (_("<b>Add files as ...</b>"));
1531 vbox = manage (new VBox);
1532 vbox->set_border_width (12);
1533 vbox->set_spacing (6);
1534 vbox->pack_start (*l, false, false);
1535 vbox->pack_start (action_combo, false, false);
1536 hbox = manage (new HBox);
1537 hbox->pack_start (*vbox, false, false);
1538 options.pack_start (*hbox, false, false);
1540 /* dummy entry for action combo so that it doesn't look odd if we
1541 come up with no tracks selected.
1545 str.push_back (importmode2string (mode_hint));
1546 set_popdown_strings (action_combo, str);
1547 action_combo.set_active_text (str.front());
1548 action_combo.set_sensitive (false);
1550 l = manage (new Label);
1551 l->set_markup (_("<b>Insert at</b>"));
1553 vbox = manage (new VBox);
1554 vbox->set_border_width (12);
1555 vbox->set_spacing (6);
1556 vbox->pack_start (*l, false, false);
1557 vbox->pack_start (where_combo, false, false);
1558 hbox = manage (new HBox);
1559 hbox->pack_start (*vbox, false, false);
1560 options.pack_start (*hbox, false, false);
1563 l = manage (new Label);
1564 l->set_markup (_("<b>Mapping</b>"));
1566 vbox = manage (new VBox);
1567 vbox->set_border_width (12);
1568 vbox->set_spacing (6);
1569 vbox->pack_start (*l, false, false);
1570 vbox->pack_start (channel_combo, false, false);
1571 hbox = manage (new HBox);
1572 hbox->pack_start (*vbox, false, false);
1573 options.pack_start (*hbox, false, false);
1576 str.push_back (_("one track per file"));
1577 set_popdown_strings (channel_combo, str);
1578 channel_combo.set_active_text (str.front());
1579 channel_combo.set_sensitive (false);
1581 l = manage (new Label);
1582 l->set_markup (_("<b>Conversion quality</b>"));
1584 vbox = manage (new VBox);
1585 vbox->set_border_width (12);
1586 vbox->set_spacing (6);
1587 vbox->pack_start (*l, false, false);
1588 vbox->pack_start (src_combo, false, false);
1589 hbox = manage (new HBox);
1590 hbox->pack_start (*vbox, false, false);
1591 options.pack_start (*hbox, false, false);
1594 str.push_back (_("Best"));
1595 str.push_back (_("Good"));
1596 str.push_back (_("Quick"));
1597 str.push_back (_("Fast"));
1598 str.push_back (_("Fastest"));
1600 set_popdown_strings (src_combo, str);
1601 src_combo.set_active_text (str.front());
1602 src_combo.set_sensitive (false);
1606 action_combo.signal_changed().connect (sigc::mem_fun (*this, &SoundFileOmega::reset_options_noret));
1607 channel_combo.signal_changed().connect (sigc::mem_fun (*this, &SoundFileOmega::reset_options_noret));
1609 copy_files_btn.set_active (true);
1611 Gtk::Label* copy_label = dynamic_cast<Gtk::Label*>(copy_files_btn.get_child());
1614 copy_label->set_size_request (175, -1);
1615 copy_label->set_line_wrap (true);
1618 block_four.pack_start (copy_files_btn, false, false);
1620 options.pack_start (block_four, false, false);
1622 vpacker.pack_start (options, false, false);
1624 /* setup disposition map */
1626 disposition_map.insert (pair<string,ImportDisposition>(_("one track per file"), ImportDistinctFiles));
1627 disposition_map.insert (pair<string,ImportDisposition>(_("one track per channel"), ImportDistinctChannels));
1628 disposition_map.insert (pair<string,ImportDisposition>(_("merge files"), ImportMergeFiles));
1629 disposition_map.insert (pair<string,ImportDisposition>(_("sequence files"), ImportSerializeFiles));
1631 disposition_map.insert (pair<string,ImportDisposition>(_("one region per file"), ImportDistinctFiles));
1632 disposition_map.insert (pair<string,ImportDisposition>(_("one region per channel"), ImportDistinctChannels));
1633 disposition_map.insert (pair<string,ImportDisposition>(_("all files in one region"), ImportMergeFiles));
1634 disposition_map.insert (pair<string,ImportDisposition>(_("all files in one track"), ImportMergeFiles));
1636 chooser.signal_selection_changed().connect (sigc::mem_fun (*this, &SoundFileOmega::file_selection_changed));
1638 /* set size requests for a couple of combos to allow them to display the longest text
1639 they will ever be asked to display. This prevents them being resized when the user
1640 selects a file to import, which in turn prevents the size of the dialog from jumping
1644 t.push_back (_("one track per file"));
1645 t.push_back (_("one track per channel"));
1646 t.push_back (_("sequence files"));
1647 t.push_back (_("all files in one region"));
1648 set_popdown_strings (channel_combo, t);
1651 t.push_back (importmode2string (ImportAsTrack));
1652 t.push_back (importmode2string (ImportToTrack));
1653 t.push_back (importmode2string (ImportAsRegion));
1654 t.push_back (importmode2string (ImportAsTapeTrack));
1655 set_popdown_strings (action_combo, t);
1659 SoundFileOmega::set_mode (ImportMode mode)
1661 action_combo.set_active_text (importmode2string (mode));
1665 SoundFileOmega::get_mode () const
1667 return string2importmode (action_combo.get_active_text());
1671 SoundFileOmega::on_hide ()
1673 ArdourWindow::on_hide();
1675 _session->cancel_audition();
1680 SoundFileOmega::get_position() const
1682 string str = where_combo.get_active_text();
1684 if (str == _("file timestamp")) {
1685 return ImportAtTimestamp;
1686 } else if (str == _("edit point")) {
1687 return ImportAtEditPoint;
1688 } else if (str == _("playhead")) {
1689 return ImportAtPlayhead;
1691 return ImportAtStart;
1696 SoundFileOmega::get_src_quality() const
1698 string str = src_combo.get_active_text();
1700 if (str == _("Best")) {
1702 } else if (str == _("Good")) {
1704 } else if (str == _("Quick")) {
1706 } else if (str == _("Fast")) {
1714 SoundFileOmega::get_channel_disposition () const
1716 /* we use a map here because the channel combo can contain different strings
1717 depending on the state of the other combos. the map contains all possible strings
1718 and the ImportDisposition enum that corresponds to it.
1721 string str = channel_combo.get_active_text();
1722 DispositionMap::const_iterator x = disposition_map.find (str);
1724 if (x == disposition_map.end()) {
1725 fatal << string_compose (_("programming error: %1 (%2)"), "unknown string for import disposition", str) << endmsg;
1733 SoundFileOmega::reset (uint32_t selected_audio_tracks, uint32_t selected_midi_tracks)
1735 selected_audio_track_cnt = selected_audio_tracks;
1736 selected_midi_track_cnt = selected_midi_tracks;
1738 if (selected_audio_track_cnt == 0 && selected_midi_track_cnt > 0) {
1739 chooser.set_filter (midi_filter);
1740 } else if (selected_midi_track_cnt == 0 && selected_audio_track_cnt > 0) {
1741 chooser.set_filter (audio_filter);
1743 chooser.set_filter (audio_and_midi_filter);
1750 SoundFileOmega::file_selection_changed ()
1752 if (resetting_ourselves) {
1756 if (!reset_options ()) {
1757 set_action_sensitive (false);
1759 if (chooser.get_filenames().size() > 0) {
1760 set_action_sensitive (true);
1762 set_action_sensitive (false);
1768 SoundFileOmega::do_something (int action)
1770 SoundFileBrowser::do_something (action);
1772 if (action == RESPONSE_CANCEL) {
1779 vector<string> paths = get_paths ();
1780 ImportPosition pos = get_position ();
1781 ImportMode mode = get_mode ();
1782 ImportDisposition chns = get_channel_disposition ();
1786 case ImportAtEditPoint:
1787 where = PublicEditor::instance().get_preferred_edit_position ();
1789 case ImportAtTimestamp:
1792 case ImportAtPlayhead:
1793 where = _session->transport_frame();
1796 where = _session->current_start_frame();
1800 SrcQuality quality = get_src_quality();
1802 if (copy_files_btn.get_active()) {
1803 PublicEditor::instance().do_import (paths, chns, mode, quality, where);
1805 PublicEditor::instance().do_embed (paths, chns, mode, where);
1808 if (action == RESPONSE_OK) {