X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fsfdb_ui.cc;h=e8db9d493925fddcaa7cb4fc78080a20289de715;hb=f80859f3bdcb5c3b982379481ae3999446f35e81;hp=55b6cc24071f6831f5d47ad3c0fcc87891397c49;hpb=105caf23daf5aed16c7ee8b904fcca2ddbd4f59f;p=ardour.git diff --git a/gtk2_ardour/sfdb_ui.cc b/gtk2_ardour/sfdb_ui.cc index 55b6cc2407..e8db9d4939 100644 --- a/gtk2_ardour/sfdb_ui.cc +++ b/gtk2_ardour/sfdb_ui.cc @@ -62,6 +62,7 @@ #include "utils.h" #include "gain_meter.h" #include "main_clock.h" +#include "public_editor.h" #ifdef FREESOUND #include "sfdb_freesound_mootcher.h" @@ -79,6 +80,7 @@ using namespace Editing; using std::string; string SoundFileBrowser::persistent_folder; +typedef TreeView::Selection::ListHandle_Path ListPath; static ImportMode string2importmode (string str) @@ -248,7 +250,7 @@ SoundFileBox::setup_labels (const string& filename) return false; } - preview_label.set_markup (string_compose ("%1", Glib::path_get_basename (filename))); + preview_label.set_markup (string_compose ("%1", Glib::Markup::escape_text (Glib::path_get_basename (filename)))); std::string n = sf_info.format_name; if (n.substr (0, 8) == X_("Format: ")) { n = n.substr (8); @@ -339,9 +341,9 @@ SoundFileBox::audition () for (int n = 0; n < sf_info.channels; ++n) { try { afs = boost::dynamic_pointer_cast ( - SourceFactory::createReadable (DataType::AUDIO, *_session, - path, n, Source::Flag (0), false)); - + SourceFactory::createExternal (DataType::AUDIO, *_session, + path, n, Source::Flag (0), false)); + srclist.push_back(afs); } catch (failed_constructor& err) { @@ -413,197 +415,251 @@ SoundFileBox::save_tags (const vector& tags) Library->save_changes (); } -SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::Session* s, bool persistent) - : ArdourDialog (parent, title, false, false), - found_list (ListStore::create(found_list_columns)), - freesound_list (ListStore::create(freesound_list_columns)), - chooser (FILE_CHOOSER_ACTION_OPEN), - preview (persistent), - found_search_btn (_("Search")), - found_list_view (found_list), - freesound_search_btn (_("Search")), - freesound_list_view (freesound_list) +SoundFileBrowser::SoundFileBrowser (string title, ARDOUR::Session* s, bool persistent) + : ArdourWindow (title) + , found_list (ListStore::create(found_list_columns)) + , freesound_list (ListStore::create(freesound_list_columns)) + , chooser (FILE_CHOOSER_ACTION_OPEN) + , preview (persistent) + , found_search_btn (_("Search")) + , found_list_view (found_list) + , freesound_search_btn (_("Search")) + , freesound_list_view (freesound_list) + , resetting_ourselves (false) + , matches (0) + , _status (0) + , _done (false) + , ok_button (Stock::OK) + , cancel_button (Stock::CANCEL) + , apply_button (Stock::APPLY) + , gm (0) { - resetting_ourselves = false; - gm = 0; - - resetting_ourselves = false; - gm = 0; #ifdef GTKOSX chooser.add_shortcut_folder_uri("file:///Library/GarageBand/Apple Loops"); chooser.add_shortcut_folder_uri("file:///Library/Audio/Apple Loops"); chooser.add_shortcut_folder_uri("file:///Library/Application Support/GarageBand/Instrument Library/Sampler/Sampler Files"); - chooser.add_shortcut_folder_uri("file:///Volumes"); #endif -#ifdef FREESOUND - mootcher = new Mootcher(); -#endif - //add the file chooser - { - chooser.set_border_width (12); - - audio_and_midi_filter.add_custom (FILE_FILTER_FILENAME, sigc::mem_fun (*this, &SoundFileBrowser::on_audio_and_midi_filter)); - audio_and_midi_filter.set_name (_("Audio and MIDI files")); - - audio_filter.add_custom (FILE_FILTER_FILENAME, sigc::mem_fun(*this, &SoundFileBrowser::on_audio_filter)); - audio_filter.set_name (_("Audio files")); - - midi_filter.add_custom (FILE_FILTER_FILENAME, sigc::mem_fun(*this, &SoundFileBrowser::on_midi_filter)); - midi_filter.set_name (_("MIDI files")); - matchall_filter.add_pattern ("*.*"); - matchall_filter.set_name (_("All files")); + chooser.set_border_width (12); + + audio_and_midi_filter.add_custom (FILE_FILTER_FILENAME, sigc::mem_fun (*this, &SoundFileBrowser::on_audio_and_midi_filter)); + audio_and_midi_filter.set_name (_("Audio and MIDI files")); + + audio_filter.add_custom (FILE_FILTER_FILENAME, sigc::mem_fun(*this, &SoundFileBrowser::on_audio_filter)); + audio_filter.set_name (_("Audio files")); + + midi_filter.add_custom (FILE_FILTER_FILENAME, sigc::mem_fun(*this, &SoundFileBrowser::on_midi_filter)); + midi_filter.set_name (_("MIDI files")); + + matchall_filter.add_pattern ("*.*"); + matchall_filter.set_name (_("All files")); + + chooser.add_filter (audio_and_midi_filter); + chooser.add_filter (audio_filter); + chooser.add_filter (midi_filter); + chooser.add_filter (matchall_filter); + chooser.set_select_multiple (true); + chooser.signal_update_preview().connect(sigc::mem_fun(*this, &SoundFileBrowser::update_preview)); + chooser.signal_file_activated().connect (sigc::mem_fun (*this, &SoundFileBrowser::chooser_file_activated)); - chooser.add_filter (audio_and_midi_filter); - chooser.add_filter (audio_filter); - chooser.add_filter (midi_filter); - chooser.add_filter (matchall_filter); - chooser.set_select_multiple (true); - chooser.signal_update_preview().connect(sigc::mem_fun(*this, &SoundFileBrowser::update_preview)); - chooser.signal_file_activated().connect (sigc::mem_fun (*this, &SoundFileBrowser::chooser_file_activated)); #ifdef GTKOSX - /* some broken redraw behaviour - this is a bandaid */ - chooser.signal_selection_changed().connect (mem_fun (chooser, &Widget::queue_draw)); + /* some broken redraw behaviour - this is a bandaid */ + chooser.signal_selection_changed().connect (mem_fun (chooser, &Widget::queue_draw)); #endif - - if (!persistent_folder.empty()) { - chooser.set_current_folder (persistent_folder); - } - notebook.append_page (chooser, _("Browse Files")); + + if (!persistent_folder.empty()) { + chooser.set_current_folder (persistent_folder); } + notebook.append_page (chooser, _("Browse Files")); + hpacker.set_spacing (6); hpacker.pack_start (notebook, true, true); hpacker.pack_start (preview, false, false); - get_vbox()->pack_start (hpacker, true, true); - - //add tag search - { - VBox* vbox; - HBox* hbox; + vpacker.set_spacing (6); + vpacker.pack_start (hpacker, true, true); + add (vpacker); - hbox = manage(new HBox); - hbox->pack_start (found_entry); - hbox->pack_start (found_search_btn); + //add tag search - Gtk::ScrolledWindow *scroll = manage(new ScrolledWindow); - scroll->add(found_list_view); - scroll->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); + VBox* vbox; + HBox* hbox; + + + hbox = manage(new HBox); + hbox->pack_start (found_entry); + hbox->pack_start (found_search_btn); + + Gtk::ScrolledWindow *scroll = manage(new ScrolledWindow); + scroll->add(found_list_view); + scroll->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); + + vbox = manage(new VBox); + vbox->pack_start (*hbox, PACK_SHRINK); + vbox->pack_start (*scroll); + + found_list_view.append_column(_("Paths"), found_list_columns.pathname); + + found_list_view.get_selection()->signal_changed().connect(sigc::mem_fun(*this, &SoundFileBrowser::found_list_view_selected)); + + found_list_view.signal_row_activated().connect (sigc::mem_fun (*this, &SoundFileBrowser::found_list_view_activated)); + + found_search_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::found_search_clicked)); + found_entry.signal_activate().connect(sigc::mem_fun(*this, &SoundFileBrowser::found_search_clicked)); + + notebook.append_page (*vbox, _("Search Tags")); - vbox = manage(new VBox); - vbox->pack_start (*hbox, PACK_SHRINK); - vbox->pack_start (*scroll); +#ifdef FREESOUND - found_list_view.append_column(_("Paths"), found_list_columns.pathname); + //add freesound search - found_list_view.get_selection()->signal_changed().connect(sigc::mem_fun(*this, &SoundFileBrowser::found_list_view_selected)); + HBox* passbox; + Label* label; + + passbox = manage(new HBox); + passbox->set_spacing (6); + + label = manage (new Label); + label->set_text (_("Tags:")); + passbox->pack_start (*label, false, false); + passbox->pack_start (freesound_entry, true, true); + + label = manage (new Label); + label->set_text (_("Sort:")); + passbox->pack_start (*label, false, false); + passbox->pack_start (freesound_sort, false, false); + freesound_sort.clear_items(); + + // Order of the following must correspond with enum sortMethod + // in sfdb_freesound_mootcher.h + freesound_sort.append_text(_("None")); + freesound_sort.append_text(_("Longest")); + freesound_sort.append_text(_("Shortest")); + freesound_sort.append_text(_("Newest")); + freesound_sort.append_text(_("Oldest")); + freesound_sort.append_text(_("Most downloaded")); + freesound_sort.append_text(_("Least downloaded")); + freesound_sort.append_text(_("Highest rated")); + freesound_sort.append_text(_("Lowest rated")); + freesound_sort.set_active(0); + + passbox->pack_start (freesound_search_btn, false, false); + passbox->pack_start (freesound_more_btn, false, false); + freesound_more_btn.set_label(_("More")); + freesound_more_btn.set_sensitive(false); + + passbox->pack_start (freesound_similar_btn, false, false); + freesound_similar_btn.set_label(_("Similar")); + freesound_similar_btn.set_sensitive(false); + + scroll = manage(new ScrolledWindow); + scroll->add(freesound_list_view); + scroll->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); + + vbox = manage(new VBox); + vbox->set_spacing (3); + vbox->pack_start (*passbox, PACK_SHRINK); + vbox->pack_start (*scroll); + + freesound_list_view.append_column(_("ID") , freesound_list_columns.id); + freesound_list_view.append_column(_("Filename"), freesound_list_columns.filename); + // freesound_list_view.append_column(_("URI") , freesound_list_columns.uri); + freesound_list_view.append_column(_("Duration"), freesound_list_columns.duration); + freesound_list_view.append_column(_("Size"), freesound_list_columns.filesize); + freesound_list_view.append_column(_("Samplerate"), freesound_list_columns.smplrate); + freesound_list_view.append_column(_("License"), freesound_list_columns.license); + freesound_list_view.get_column(0)->set_alignment(0.5); + freesound_list_view.get_column(1)->set_expand(true); // filename + freesound_list_view.get_column(1)->set_resizable(true); // filename + freesound_list_view.get_column(2)->set_alignment(0.5); + freesound_list_view.get_column(3)->set_alignment(0.5); + freesound_list_view.get_column(4)->set_alignment(0.5); + freesound_list_view.get_column(5)->set_alignment(0.5); + + freesound_list_view.get_selection()->signal_changed().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_list_view_selected)); + freesound_list_view.set_tooltip_column(1); + + freesound_list_view.get_selection()->set_mode (SELECTION_MULTIPLE); + freesound_list_view.signal_row_activated().connect (sigc::mem_fun (*this, &SoundFileBrowser::freesound_list_view_activated)); + freesound_search_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_search_clicked)); + freesound_entry.signal_activate().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_search_clicked)); + freesound_more_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_more_clicked)); + freesound_similar_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_similar_clicked)); + notebook.append_page (*vbox, _("Search Freesound")); +#endif - found_list_view.signal_row_activated().connect (sigc::mem_fun (*this, &SoundFileBrowser::found_list_view_activated)); + notebook.set_size_request (500, -1); + notebook.signal_switch_page().connect (sigc::hide_return (sigc::hide (sigc::hide (sigc::mem_fun (*this, &SoundFileBrowser::reset_options))))); - found_search_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::found_search_clicked)); - found_entry.signal_activate().connect(sigc::mem_fun(*this, &SoundFileBrowser::found_search_clicked)); + set_session (s); - freesound_stop_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_stop_clicked)); + Gtk::HButtonBox* button_box = manage (new HButtonBox); - notebook.append_page (*vbox, _("Search Tags")); + button_box->set_layout (BUTTONBOX_END); + button_box->pack_start (cancel_button, false, false); + cancel_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*this, &SoundFileBrowser::do_something), RESPONSE_CANCEL)); + if (persistent) { + button_box->pack_start (apply_button, false, false); + apply_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*this, &SoundFileBrowser::do_something), RESPONSE_APPLY)); } - //add freesound search -#ifdef FREESOUND - { - VBox* vbox; - HBox* passbox; - Label* label; - - passbox = manage(new HBox); - passbox->set_border_width (12); - passbox->set_spacing (6); - - label = manage (new Label); - label->set_text (_("Tags:")); - passbox->pack_start (*label, false, false); - passbox->pack_start (freesound_entry, false, false); - - label = manage (new Label); - label->set_text (_("Sort:")); - passbox->pack_start (*label, false, false); - passbox->pack_start (freesound_sort, false, false); - freesound_sort.clear_items(); - - // Order of the following must correspond with enum sortMethod - // in sfdb_freesound_mootcher.h - freesound_sort.append_text(_("None")); - freesound_sort.append_text(_("Longest")); - freesound_sort.append_text(_("Shortest")); - freesound_sort.append_text(_("Newest")); - freesound_sort.append_text(_("Oldest")); - freesound_sort.append_text(_("Most downloaded")); - freesound_sort.append_text(_("Least downloaded")); - freesound_sort.append_text(_("Highest rated")); - freesound_sort.append_text(_("Lowest rated")); - freesound_sort.set_active(0); - - passbox->pack_start (freesound_search_btn, false, false); - passbox->pack_start (freesound_progress_bar); - passbox->pack_end (freesound_stop_btn, false, false); - freesound_stop_btn.set_label(_("Stop")); - - Gtk::ScrolledWindow *scroll = manage(new ScrolledWindow); - scroll->add(freesound_list_view); - scroll->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); - - vbox = manage(new VBox); - vbox->pack_start (*passbox, PACK_SHRINK); - vbox->pack_start (*scroll); + button_box->pack_start (ok_button, false, false); + ok_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*this, &SoundFileBrowser::do_something), RESPONSE_OK)); - freesound_list_view.append_column(_("ID") , freesound_list_columns.id); - freesound_list_view.append_column(_("Filename"), freesound_list_columns.filename); - // freesound_list_view.append_column(_("URI") , freesound_list_columns.uri); - freesound_list_view.append_column(_("Duration"), freesound_list_columns.duration); - freesound_list_view.get_column(1)->set_expand(true); + Gtkmm2ext::UI::instance()->set_tip (ok_button, _("Press to import selected files and close this window")); + Gtkmm2ext::UI::instance()->set_tip (apply_button, _("Press to import selected files and leave this window open")); + Gtkmm2ext::UI::instance()->set_tip (cancel_button, _("Press to close this window without importing any files")); - freesound_list_view.get_selection()->signal_changed().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_list_view_selected)); - - freesound_list_view.get_selection()->set_mode (SELECTION_MULTIPLE); - freesound_list_view.signal_row_activated().connect (sigc::mem_fun (*this, &SoundFileBrowser::freesound_list_view_activated)); - freesound_search_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_search_clicked)); - freesound_entry.signal_activate().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_search_clicked)); - freesound_stop_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_stop_clicked)); - notebook.append_page (*vbox, _("Search Freesound")); - } + vpacker.pack_end (*button_box, false, false); -#endif + set_wmclass (X_("import"), PROGRAM_NAME); +} +SoundFileBrowser::~SoundFileBrowser () +{ + persistent_folder = chooser.get_current_folder(); +} - notebook.set_size_request (500, -1); - notebook.signal_switch_page().connect ( - sigc::hide_return (sigc::hide (sigc::hide (sigc::mem_fun (*this, &SoundFileBrowser::reset_options)))) - ); +int +SoundFileBrowser::run () +{ + set_modal (true); + show_all (); + present (); - set_session (s); + _done = false; - add_button (Stock::CANCEL, RESPONSE_CANCEL); - add_button (Stock::APPLY, RESPONSE_APPLY); - add_button (Stock::OK, RESPONSE_OK); + while (!_done) { + gtk_main_iteration (); + } + return _status; } -SoundFileBrowser::~SoundFileBrowser () +void +SoundFileBrowser::set_action_sensitive (bool yn) { - persistent_folder = chooser.get_current_folder(); + ok_button.set_sensitive (yn); + apply_button.set_sensitive (yn); } +void +SoundFileBrowser::do_something (int action) +{ + _done = true; + _status = action; +} void SoundFileBrowser::on_show () { - ArdourDialog::on_show (); + ArdourWindow::on_show (); start_metering (); } @@ -635,7 +691,7 @@ SoundFileBrowser::freesound_list_view_activated (const TreeModel::Path&, TreeVie void SoundFileBrowser::set_session (Session* s) { - ArdourDialog::set_session (s); + ArdourWindow::set_session (s); preview.set_session (s); if (_session) { @@ -655,6 +711,7 @@ SoundFileBrowser::add_gain_meter () boost::shared_ptr r = _session->the_auditioner (); gm->set_controls (r, r->shared_peak_meter(), r->amp()); + gm->set_fader_name (X_("AudioTrackFader")); meter_packer.set_border_width (12); meter_packer.pack_start (*gm, false, true); @@ -726,67 +783,23 @@ void SoundFileBrowser::found_list_view_selected () { if (!reset_options ()) { - set_response_sensitive (RESPONSE_OK, false); + set_action_sensitive (false); } else { string file; - TreeView::Selection::ListHandle_Path rows = found_list_view.get_selection()->get_selected_rows (); + ListPath 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); - } -} - -void -SoundFileBrowser::freesound_list_view_selected () -{ - freesound_download_cancel = false; - -#ifdef FREESOUND - if (!reset_options ()) { - set_response_sensitive (RESPONSE_OK, false); - } else { - - string file; - - TreeView::Selection::ListHandle_Path rows = freesound_list_view.get_selection()->get_selected_rows (); - - if (!rows.empty()) { - TreeIter iter = freesound_list->get_iter(*rows.begin()); - - string id = (*iter)[freesound_list_columns.id]; - string uri = (*iter)[freesound_list_columns.uri]; - string ofn = (*iter)[freesound_list_columns.filename]; - - // download the sound file - GdkCursor *prev_cursor; - prev_cursor = gdk_window_get_cursor (get_window()->gobj()); - gdk_window_set_cursor (get_window()->gobj(), gdk_cursor_new(GDK_WATCH)); - gdk_flush(); - - file = mootcher->getAudioFile(ofn, id, uri, this); - - gdk_window_set_cursor (get_window()->gobj(), prev_cursor); - - if (file != "") { - chooser.set_filename (file); - set_response_sensitive (RESPONSE_OK, true); - } + set_action_sensitive (true); } else { - set_response_sensitive (RESPONSE_OK, false); + set_action_sensitive (false); } preview.setup_labels (file); } -#endif } void @@ -813,26 +826,137 @@ SoundFileBrowser::found_search_clicked () } } + +std::string +SoundFileBrowser::freesound_get_audio_file(Gtk::TreeIter iter) +{ + + Mootcher *mootcher = new Mootcher; + std::string file; + + string id = (*iter)[freesound_list_columns.id]; + string uri = (*iter)[freesound_list_columns.uri]; + string ofn = (*iter)[freesound_list_columns.filename]; + + if (mootcher->checkAudioFile(ofn, id)) { + // file already exists, no need to download it again + file = mootcher->audioFileName; + delete mootcher; + (*iter)[freesound_list_columns.started] = false; + return file; + } + if (!(*iter)[freesound_list_columns.started]) { + // start downloading the sound file + (*iter)[freesound_list_columns.started] = true; + mootcher->fetchAudioFile(ofn, id, uri, this); + } + return ""; +} + +void +SoundFileBrowser::freesound_list_view_selected () +{ + + if (!reset_options ()) { + set_action_sensitive (false); + } else { + std::string file; + ListPath rows = freesound_list_view.get_selection()->get_selected_rows (); + for (ListPath::iterator i = rows.begin() ; i != rows.end(); ++i) { + file = freesound_get_audio_file (freesound_list->get_iter(*i)); + } + + switch (rows.size()) { + case 0: + // nothing selected + freesound_similar_btn.set_sensitive(false); + set_action_sensitive (false); + break; + case 1: + // exactly one item selected + if (file != "") { + // file exists on disk already + chooser.set_filename (file); + preview.setup_labels (file); + set_action_sensitive (true); + } + freesound_similar_btn.set_sensitive(true); + break; + default: + // multiple items selected + preview.setup_labels (""); + freesound_similar_btn.set_sensitive(false); + break; + } + + } +} + +void +SoundFileBrowser::refresh_display(std::string ID, std::string file) +{ + // called when the mootcher has finished downloading a file + ListPath rows = freesound_list_view.get_selection()->get_selected_rows (); + if (rows.size() == 1) { + // there's a single item selected in the freesound list + //XXX make a function to be used to construct the actual file name both here and in the mootcher + Gtk::TreeIter row = freesound_list->get_iter(*rows.begin()); + std::string selected_ID = (*row)[freesound_list_columns.id]; + if (ID == selected_ID) { + // the selected item in the freesound list is the item that has just finished downloading + chooser.set_filename(file); + preview.setup_labels (file); + set_action_sensitive (true); + } + } +} + void SoundFileBrowser::freesound_search_clicked () { - freesound_search_cancel = false; + freesound_page = 1; + freesound_list->clear(); + matches = 0; freesound_search(); } void -SoundFileBrowser::freesound_stop_clicked () +SoundFileBrowser::freesound_more_clicked () { - freesound_download_cancel = true; - freesound_search_cancel = true; + char row_path[21]; + freesound_page++; + freesound_search(); + snprintf(row_path, 21, "%d", (freesound_page - 1) * 100); + freesound_list_view.scroll_to_row(Gtk::TreePath(row_path), 0); } +void +SoundFileBrowser::freesound_similar_clicked () +{ + ListPath rows = freesound_list_view.get_selection()->get_selected_rows (); + if (rows.size() == 1) { + Mootcher mootcher; + string id; + Gtk::TreeIter iter = freesound_list->get_iter(*rows.begin()); + id = (*iter)[freesound_list_columns.id]; + freesound_list->clear(); + + GdkCursor *prev_cursor; + prev_cursor = gdk_window_get_cursor (get_window()->gobj()); + gdk_window_set_cursor (get_window()->gobj(), gdk_cursor_new(GDK_WATCH)); + gdk_flush(); + + std::string theString = mootcher.searchSimilar(id); + + gdk_window_set_cursor (get_window()->gobj(), prev_cursor); + handle_freesound_results(theString); + } +} void SoundFileBrowser::freesound_search() { -#ifdef FREESOUND - freesound_list->clear(); + Mootcher mootcher; string search_string = freesound_entry.get_text (); enum sortMethod sort_method = (enum sortMethod) freesound_sort.get_active_row_number(); @@ -841,105 +965,159 @@ SoundFileBrowser::freesound_search() prev_cursor = gdk_window_get_cursor (get_window()->gobj()); gdk_window_set_cursor (get_window()->gobj(), gdk_cursor_new(GDK_WATCH)); gdk_flush(); - for (int page = 1; page <= 99; page++ ) { - - std::string prog; - prog = string_compose (_("Page %1, [Stop]->"), page); - freesound_progress_bar.set_text(prog); - while (Glib::MainContext::get_default()->iteration (false)) { - /* do nothing */ - } - std::string theString = mootcher->searchText( + std::string theString = mootcher.searchText( search_string, - page, - "", // filter, could do, e.g. "type:wav" + freesound_page, +#ifdef GTKOSX + "", // OSX eats anything incl mp3 +#else + "type:wav OR type:aiff OR type:flac OR type:aif OR type:ogg OR type:oga", +#endif sort_method - ); + ); - XMLTree doc; - doc.read_buffer( theString ); - XMLNode *root = doc.root(); + gdk_window_set_cursor (get_window()->gobj(), prev_cursor); + handle_freesound_results(theString); +} - if (!root) { - cerr << "no root XML node!" << endl; - break; - } +void +SoundFileBrowser::handle_freesound_results(std::string theString) { + XMLTree doc; + doc.read_buffer( theString ); + XMLNode *root = doc.root(); - if ( strcmp(root->name().c_str(), "response") != 0) { - cerr << "root node name == " << root->name() << ", != \"response\"!" << endl; - break; - } + if (!root) { + error << "no root XML node!" << endmsg; + return; + } - XMLNode *sounds_root = root->child("sounds"); - - if (!sounds_root) { - cerr << "no child node \"sounds\" found!" << endl; + if ( strcmp(root->name().c_str(), "response") != 0) { + error << string_compose ("root node name == %1 != \"response\"", root->name()) << endmsg; + return; + } + + // find out how many pages are available to search + int freesound_n_pages = 1; + XMLNode *res = root->child("num_pages"); + if (res) { + string result = res->child("text")->content(); + freesound_n_pages = atoi(result); + } + + int more_pages = freesound_n_pages - freesound_page; + + if (more_pages > 0) { + freesound_more_btn.set_sensitive(true); + freesound_more_btn.set_tooltip_text(string_compose(P_( + "%1 more page of 100 results available", + "%1 more pages of 100 results available", + more_pages), more_pages)); + } else { + freesound_more_btn.set_sensitive(false); + freesound_more_btn.set_tooltip_text(_("No more results available")); + } + + XMLNode *sounds_root = root->child("sounds"); + if (!sounds_root) { + error << "no child node \"sounds\" found!" << endmsg; + return; + } + + XMLNodeList sounds = sounds_root->children(); + if (sounds.size() == 0) { + /* nothing found */ + return; + } + + XMLNodeConstIterator niter; + XMLNode *node; + for (niter = sounds.begin(); niter != sounds.end(); ++niter) { + node = *niter; + if( strcmp( node->name().c_str(), "resource") != 0 ) { + error << string_compose ("node->name()=%1 != \"resource\"", node->name()) << endmsg; break; } - - XMLNodeList sounds = sounds_root->children(); - XMLNodeConstIterator niter; - XMLNode *node; - for (niter = sounds.begin(); niter != sounds.end(); ++niter) { - node = *niter; - if( strcmp( node->name().c_str(), "resource") != 0 ){ - cerr << "node->name()=" << node->name() << ",!= \"resource\"!" << endl; - freesound_search_cancel = true; - break; - } - // node->dump(cerr, "node:"); - - XMLNode *id_node = node->child ("id"); - XMLNode *uri_node = node->child ("serve"); - XMLNode *ofn_node = node->child ("original_filename"); - XMLNode *dur_node = node->child ("duration"); + // node->dump(cerr, "node:"); - if (id_node && uri_node && ofn_node && dur_node) { - - std::string id = id_node->child("text")->content(); - std::string uri = uri_node->child("text")->content(); - std::string ofn = ofn_node->child("text")->content(); - std::string dur = dur_node->child("text")->content(); - std::string r; - // cerr << "id=" << id << ",uri=" << uri << ",ofn=" << ofn << ",dur=" << dur << endl; - - double duration_seconds = atof(dur.c_str()); - double h, m, s; - char duration_hhmmss[16]; - if (duration_seconds >= 99 * 60 * 60) { - strcpy(duration_hhmmss, ">99h"); - } else { - s = modf(duration_seconds/60, &m) * 60; - m = modf(m/60, &h) * 60; - sprintf(duration_hhmmss, "%02.fh:%02.fm:%04.1fs", - h, m, s - ); - } + XMLNode *id_node = node->child ("id"); + XMLNode *uri_node = node->child ("serve"); + XMLNode *ofn_node = node->child ("original_filename"); + XMLNode *dur_node = node->child ("duration"); + XMLNode *siz_node = node->child ("filesize"); + XMLNode *srt_node = node->child ("samplerate"); + XMLNode *lic_node = node->child ("license"); - TreeModel::iterator new_row = freesound_list->append(); - TreeModel::Row row = *new_row; - - row[freesound_list_columns.id ] = id; - row[freesound_list_columns.uri ] = uri; - row[freesound_list_columns.filename] = ofn; - row[freesound_list_columns.duration] = duration_hhmmss; + if (id_node && uri_node && ofn_node && dur_node && siz_node && srt_node) { - } - } - - if (freesound_search_cancel) - break; + std::string id = id_node->child("text")->content(); + std::string uri = uri_node->child("text")->content(); + std::string ofn = ofn_node->child("text")->content(); + std::string dur = dur_node->child("text")->content(); + std::string siz = siz_node->child("text")->content(); + std::string srt = srt_node->child("text")->content(); + std::string lic = lic_node->child("text")->content(); - } //page "for" loop + std::string r; + // cerr << "id=" << id << ",uri=" << uri << ",ofn=" << ofn << ",dur=" << dur << endl; - gdk_window_set_cursor (get_window()->gobj(), prev_cursor); + double duration_seconds = atof(dur); + double h, m, s; + char duration_hhmmss[16]; + if (duration_seconds >= 99 * 60 * 60) { + strcpy(duration_hhmmss, ">99h"); + } else { + s = modf(duration_seconds/60, &m) * 60; + m = modf(m/60, &h) * 60; + sprintf(duration_hhmmss, "%02.fh:%02.fm:%04.1fs", + h, m, s + ); + } - freesound_progress_bar.set_text(""); + double size_bytes = atof(siz); + char bsize[32]; + if (size_bytes < 1000) { + sprintf(bsize, "%.0f %s", size_bytes, _("B")); + } else if (size_bytes < 1000000 ) { + sprintf(bsize, "%.1f %s", size_bytes / 1000.0, _("kB")); + } else if (size_bytes < 10000000) { + sprintf(bsize, "%.1f %s", size_bytes / 1000000.0, _("MB")); + } else if (size_bytes < 1000000000) { + sprintf(bsize, "%.2f %s", size_bytes / 1000000.0, _("MB")); + } else { + sprintf(bsize, "%.2f %s", size_bytes / 1000000000.0, _("GB")); + } -#endif + /* see http://www.freesound.org/help/faq/#licenses */ + char shortlicense[64]; + if(!lic.compare(0, 42, "http://creativecommons.org/licenses/by-nc/")){ + sprintf(shortlicense, "CC-BY-NC"); + } else if(!lic.compare(0, 39, "http://creativecommons.org/licenses/by/")) { + sprintf(shortlicense, "CC-BY"); + } else if(!lic.compare("http://creativecommons.org/licenses/sampling+/1.0/")) { + sprintf(shortlicense, "sampling+"); + } else if(!lic.compare(0, 40, "http://creativecommons.org/publicdomain/")) { + sprintf(shortlicense, "PD"); + } else { + snprintf(shortlicense, 64, "%s", lic.c_str()); + shortlicense[63]= '\0'; + } + + TreeModel::iterator new_row = freesound_list->append(); + TreeModel::Row row = *new_row; + + row[freesound_list_columns.id ] = id; + row[freesound_list_columns.uri ] = uri; + row[freesound_list_columns.filename] = ofn; + row[freesound_list_columns.duration] = duration_hhmmss; + row[freesound_list_columns.filesize] = bsize; + row[freesound_list_columns.smplrate] = srt; + row[freesound_list_columns.license ] = shortlicense; + matches++; + } + } } vector @@ -960,9 +1138,7 @@ SoundFileBrowser::get_paths () } } - } else if (n==1){ - - typedef TreeView::Selection::ListHandle_Path ListPath; + } else if (n == 1) { ListPath rows = found_list_view.get_selection()->get_selected_rows (); for (ListPath::iterator i = rows.begin() ; i != rows.end(); ++i) { @@ -973,27 +1149,12 @@ SoundFileBrowser::get_paths () } } else { #ifdef FREESOUND - typedef TreeView::Selection::ListHandle_Path ListPath; - ListPath rows = freesound_list_view.get_selection()->get_selected_rows (); for (ListPath::iterator i = rows.begin() ; i != rows.end(); ++i) { - TreeIter iter = freesound_list->get_iter(*i); - string id = (*iter)[freesound_list_columns.id]; - string uri = (*iter)[freesound_list_columns.uri]; - string ofn = (*iter)[freesound_list_columns.filename]; - - GdkCursor *prev_cursor; - prev_cursor = gdk_window_get_cursor (get_window()->gobj()); - gdk_window_set_cursor (get_window()->gobj(), gdk_cursor_new(GDK_WATCH)); - gdk_flush(); - - string str = mootcher->getAudioFile(ofn, id, uri, this); + string str = freesound_get_audio_file (freesound_list->get_iter(*i)); if (str != "") { results.push_back (str); } - - gdk_window_set_cursor (get_window()->gobj(), prev_cursor); - } #endif } @@ -1205,8 +1366,9 @@ SoundFileOmega::reset_options () src_combo.set_sensitive (false); } - /* We must copy MIDI files or those from Freesound */ - bool const must_copy = have_a_midi_file || notebook.get_current_page() == 2; + /* We must copy MIDI files or those from Freesound + * or any file if we are under nsm control */ + bool const must_copy = _session->get_nsm_state() || have_a_midi_file || notebook.get_current_page() == 2; if (Config->get_only_copy_imported_files()) { @@ -1332,8 +1494,8 @@ SoundFileOmega::check_link_status (const Session* s, const vector& paths return ret; } -SoundFileChooser::SoundFileChooser (Gtk::Window& parent, string title, ARDOUR::Session* s) - : SoundFileBrowser (parent, title, s, false) +SoundFileChooser::SoundFileChooser (string title, ARDOUR::Session* s) + : SoundFileBrowser (title, s, false) { chooser.set_select_multiple (false); found_list_view.get_selection()->set_mode (SELECTION_SINGLE); @@ -1343,7 +1505,7 @@ SoundFileChooser::SoundFileChooser (Gtk::Window& parent, string title, ARDOUR::S void SoundFileChooser::on_hide () { - ArdourDialog::on_hide(); + ArdourWindow::on_hide(); stop_metering (); if (_session) { @@ -1369,12 +1531,12 @@ SoundFileChooser::get_filename () return paths.front(); } -SoundFileOmega::SoundFileOmega (Gtk::Window& parent, string title, ARDOUR::Session* s, +SoundFileOmega::SoundFileOmega (string title, ARDOUR::Session* s, uint32_t selected_audio_tracks, uint32_t selected_midi_tracks, bool persistent, Editing::ImportMode mode_hint) - : SoundFileBrowser (parent, title, s, persistent) + : SoundFileBrowser (title, s, persistent) , copy_files_btn ( _("Copy files to session")) , selected_audio_track_cnt (selected_audio_tracks) , selected_midi_track_cnt (selected_midi_tracks) @@ -1400,16 +1562,16 @@ SoundFileOmega::SoundFileOmega (Gtk::Window& parent, string title, ARDOUR::Sessi where_combo.set_active_text (str.front()); Label* l = manage (new Label); - l->set_text (_("Add files:")); + l->set_markup (_("Add files as ...")); - hbox = manage (new HBox); - hbox->set_border_width (12); - hbox->set_spacing (6); - hbox->pack_start (*l, false, false); - hbox->pack_start (action_combo, false, false); vbox = manage (new VBox); - vbox->pack_start (*hbox, false, false); - options.pack_start (*vbox, false, false); + vbox->set_border_width (12); + vbox->set_spacing (6); + vbox->pack_start (*l, false, false); + vbox->pack_start (action_combo, false, false); + hbox = manage (new HBox); + hbox->pack_start (*vbox, false, false); + options.pack_start (*hbox, false, false); /* dummy entry for action combo so that it doesn't look odd if we come up with no tracks selected. @@ -1422,29 +1584,29 @@ SoundFileOmega::SoundFileOmega (Gtk::Window& parent, string title, ARDOUR::Sessi action_combo.set_sensitive (false); l = manage (new Label); - l->set_text (_("Insert at:")); + l->set_markup (_("Insert at")); - hbox = manage (new HBox); - hbox->set_border_width (12); - hbox->set_spacing (6); - hbox->pack_start (*l, false, false); - hbox->pack_start (where_combo, false, false); vbox = manage (new VBox); - vbox->pack_start (*hbox, false, false); - options.pack_start (*vbox, false, false); + vbox->set_border_width (12); + vbox->set_spacing (6); + vbox->pack_start (*l, false, false); + vbox->pack_start (where_combo, false, false); + hbox = manage (new HBox); + hbox->pack_start (*vbox, false, false); + options.pack_start (*hbox, false, false); l = manage (new Label); - l->set_text (_("Mapping:")); + l->set_markup (_("Mapping")); - hbox = manage (new HBox); - hbox->set_border_width (12); - hbox->set_spacing (6); - hbox->pack_start (*l, false, false); - hbox->pack_start (channel_combo, false, false); vbox = manage (new VBox); - vbox->pack_start (*hbox, false, false); - options.pack_start (*vbox, false, false); + vbox->set_border_width (12); + vbox->set_spacing (6); + vbox->pack_start (*l, false, false); + vbox->pack_start (channel_combo, false, false); + hbox = manage (new HBox); + hbox->pack_start (*vbox, false, false); + options.pack_start (*hbox, false, false); str.clear (); str.push_back (_("one track per file")); @@ -1453,16 +1615,16 @@ SoundFileOmega::SoundFileOmega (Gtk::Window& parent, string title, ARDOUR::Sessi channel_combo.set_sensitive (false); l = manage (new Label); - l->set_text (_("Conversion quality:")); + l->set_markup (_("Conversion quality")); - hbox = manage (new HBox); - hbox->set_border_width (12); - hbox->set_spacing (6); - hbox->pack_start (*l, false, false); - hbox->pack_start (src_combo, false, false); vbox = manage (new VBox); - vbox->pack_start (*hbox, false, false); - options.pack_start (*vbox, false, false); + vbox->set_border_width (12); + vbox->set_spacing (6); + vbox->pack_start (*l, false, false); + vbox->pack_start (src_combo, false, false); + hbox = manage (new HBox); + hbox->pack_start (*vbox, false, false); + options.pack_start (*hbox, false, false); str.clear (); str.push_back (_("Best")); @@ -1482,11 +1644,18 @@ SoundFileOmega::SoundFileOmega (Gtk::Window& parent, string title, ARDOUR::Sessi copy_files_btn.set_active (true); + Gtk::Label* copy_label = dynamic_cast(copy_files_btn.get_child()); + + if (copy_label) { + copy_label->set_size_request (175, -1); + copy_label->set_line_wrap (true); + } + block_four.pack_start (copy_files_btn, false, false); options.pack_start (block_four, false, false); - get_vbox()->pack_start (options, false, false); + vpacker.pack_start (options, false, false); /* setup disposition map */ @@ -1537,7 +1706,7 @@ SoundFileOmega::get_mode () const void SoundFileOmega::on_hide () { - ArdourDialog::on_hide(); + ArdourWindow::on_hide(); if (_session) { _session->cancel_audition(); } @@ -1562,7 +1731,7 @@ SoundFileOmega::get_position() const SrcQuality SoundFileOmega::get_src_quality() const { - string str = where_combo.get_active_text(); + string str = src_combo.get_active_text(); if (str == _("Best")) { return SrcBest; @@ -1621,13 +1790,59 @@ SoundFileOmega::file_selection_changed () } if (!reset_options ()) { - set_response_sensitive (RESPONSE_OK, false); + set_action_sensitive (false); } else { if (chooser.get_filenames().size() > 0) { - set_response_sensitive (RESPONSE_OK, true); + set_action_sensitive (true); } else { - set_response_sensitive (RESPONSE_OK, false); + set_action_sensitive (false); } } } +void +SoundFileOmega::do_something (int action) +{ + SoundFileBrowser::do_something (action); + + if (action == RESPONSE_CANCEL) { + hide (); + return; + } + + /* lets do it */ + + vector paths = get_paths (); + ImportPosition pos = get_position (); + ImportMode mode = get_mode (); + ImportDisposition chns = get_channel_disposition (); + framepos_t where; + + switch (pos) { + case ImportAtEditPoint: + where = PublicEditor::instance().get_preferred_edit_position (); + break; + case ImportAtTimestamp: + where = -1; + break; + case ImportAtPlayhead: + where = _session->transport_frame(); + break; + case ImportAtStart: + where = _session->current_start_frame(); + break; + } + + SrcQuality quality = get_src_quality(); + + if (copy_files_btn.get_active()) { + PublicEditor::instance().do_import (paths, chns, mode, quality, where); + } else { + PublicEditor::instance().do_embed (paths, chns, mode, where); + } + + if (action == RESPONSE_OK) { + hide (); + } +} +