X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fsfdb_ui.cc;h=42d304e8f4cfae8d9a2ce78effd48b90bfa59806;hb=99766494f89a5a6aa5cffbff4612f4afe0868c9b;hp=492170d50638a91d03126e2b143fdbd2bbe3c7ea;hpb=1d984b7985ad6f717fe7de206a6189fbf019b9eb;p=ardour.git diff --git a/gtk2_ardour/sfdb_ui.cc b/gtk2_ardour/sfdb_ui.cc index 492170d506..42d304e8f4 100644 --- a/gtk2_ardour/sfdb_ui.cc +++ b/gtk2_ardour/sfdb_ui.cc @@ -43,7 +43,6 @@ #include "evoral/SMF.hpp" -#include "ardour/amp.h" #include "ardour/audio_library.h" #include "ardour/auditioner.h" #include "ardour/audioregion.h" @@ -53,7 +52,6 @@ #include "ardour/source_factory.h" #include "ardour/session.h" #include "ardour/session_directory.h" -#include "ardour/profile.h" #include "ardour_ui.h" #include "editing.h" @@ -63,6 +61,7 @@ #include "editing.h" #include "utils.h" #include "gain_meter.h" +#include "main_clock.h" #ifdef FREESOUND #include "sfdb_freesound_mootcher.h" @@ -118,8 +117,8 @@ importmode2string (ImportMode mode) SoundFileBox::SoundFileBox (bool persistent) : table (6, 2), - length_clock ("sfboxLengthClock", !persistent, "EditCursorClock", false, false, true, false), - timecode_clock ("sfboxTimecodeClock", !persistent, "EditCursorClock", false, false, false, false), + length_clock ("sfboxLengthClock", !persistent, "", false, false, true, false), + timecode_clock ("sfboxTimecodeClock", !persistent, "", false, false, false, false), main_box (false, 6), autoplay_btn (_("Auto-play")) @@ -177,6 +176,7 @@ SoundFileBox::SoundFileBox (bool persistent) main_box.pack_start (table, false, false); tags_entry.set_editable (true); + tags_entry.set_wrap_mode(Gtk::WRAP_WORD); tags_entry.signal_focus_out_event().connect (sigc::mem_fun (*this, &SoundFileBox::tags_entry_left)); Label* label = manage (new Label (_("Tags:"))); @@ -187,10 +187,10 @@ SoundFileBox::SoundFileBox (bool persistent) main_box.pack_start (bottom_box, false, false); play_btn.set_image (*(manage (new Image (Stock::MEDIA_PLAY, ICON_SIZE_BUTTON)))); - play_btn.set_label (_("Play")); +// play_btn.set_label (_("Play")); stop_btn.set_image (*(manage (new Image (Stock::MEDIA_STOP, ICON_SIZE_BUTTON)))); - stop_btn.set_label (_("Stop")); +// stop_btn.set_label (_("Stop")); bottom_box.set_homogeneous (false); bottom_box.set_spacing (6); @@ -248,7 +248,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); @@ -438,10 +438,17 @@ SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::S 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")); @@ -451,6 +458,7 @@ SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::S 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); @@ -501,6 +509,8 @@ SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::S 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)); + freesound_stop_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_stop_clicked)); + notebook.append_page (*vbox, _("Search Tags")); } @@ -539,15 +549,10 @@ SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::S freesound_sort.append_text(_("Lowest rated")); freesound_sort.set_active(0); - label = manage (new Label); - label->set_text (_("Page:")); - passbox->pack_start (*label, false, false); - passbox->pack_start (freesound_page, false, false); - freesound_page.set_range(1, 1000); - freesound_page.set_increments(1, 10); - passbox->pack_start (freesound_search_btn, false, false); - passbox->pack_start (progress_bar); + 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); @@ -559,19 +564,27 @@ SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::S 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(_("URI") , freesound_list_columns.uri); + freesound_list_view.append_column(_("Duration"), freesound_list_columns.duration); + freesound_list_view.get_column(1)->set_expand(true); + 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")); } + #endif 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)))) + ); set_session (s); @@ -693,10 +706,16 @@ SoundFileBrowser::on_midi_filter (const FileFilter::Info& filter_info) return SMFSource::safe_midi_file_extension (filter_info.filename); } +bool +SoundFileBrowser::on_audio_and_midi_filter (const FileFilter::Info& filter_info) +{ + return on_audio_filter (filter_info) || on_midi_filter (filter_info); +} + void SoundFileBrowser::update_preview () { - if (preview.setup_labels (chooser.get_filename())) { + if (preview.setup_labels (chooser.get_preview_filename())) { if (preview.autoplay()) { Glib::signal_idle().connect (sigc::mem_fun (preview, &SoundFileBox::audition_oneshot)); } @@ -729,15 +748,13 @@ SoundFileBrowser::found_list_view_selected () void SoundFileBrowser::freesound_list_view_selected () { + freesound_download_cancel = false; + +#ifdef FREESOUND if (!reset_options ()) { set_response_sensitive (RESPONSE_OK, false); } else { - string path; - path = Glib::get_home_dir(); - path += "/Freesound/"; - Mootcher theMootcher(path.c_str()); // XXX should be a member of SoundFileBrowser - string file; TreeView::Selection::ListHandle_Path rows = freesound_list_view.get_selection()->get_selected_rows (); @@ -755,18 +772,21 @@ SoundFileBrowser::freesound_list_view_selected () gdk_window_set_cursor (get_window()->gobj(), gdk_cursor_new(GDK_WATCH)); gdk_flush(); - file = theMootcher.getAudioFile(ofn, id, uri, &progress_bar); + file = mootcher->getAudioFile(ofn, id, uri, this); gdk_window_set_cursor (get_window()->gobj(), prev_cursor); - chooser.set_filename (file); - set_response_sensitive (RESPONSE_OK, true); + if (file != "") { + chooser.set_filename (file); + set_response_sensitive (RESPONSE_OK, true); + } } else { set_response_sensitive (RESPONSE_OK, false); } preview.setup_labels (file); } +#endif } void @@ -796,9 +816,17 @@ SoundFileBrowser::found_search_clicked () void SoundFileBrowser::freesound_search_clicked () { + freesound_search_cancel = false; freesound_search(); } +void +SoundFileBrowser::freesound_stop_clicked () +{ + freesound_download_cancel = true; + freesound_search_cancel = true; +} + void SoundFileBrowser::freesound_search() @@ -806,84 +834,111 @@ SoundFileBrowser::freesound_search() #ifdef FREESOUND freesound_list->clear(); - string path; - path = Glib::get_home_dir(); - path += "/Freesound/"; - Mootcher theMootcher(path.c_str()); - string search_string = freesound_entry.get_text (); enum sortMethod sort_method = (enum sortMethod) freesound_sort.get_active_row_number(); - int page = freesound_page.get_value_as_int(); 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(); + 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 */ + } - string theString = theMootcher.searchText( - search_string, - page, - "", // filter, could do, e.g. "type:wav" - sort_method - ); - - gdk_window_set_cursor (get_window()->gobj(), prev_cursor); - - XMLTree doc; - doc.read_buffer( theString ); - XMLNode *root = doc.root(); + std::string theString = mootcher->searchText( + search_string, + page, + "", // filter, could do, e.g. "type:wav" + sort_method + ); - if (!root) { - cerr << "no root XML node!" << endl; - return; - } + 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; - return; - } + if (!root) { + error << "no root XML node!" << endmsg; + break; + } - XMLNode *sounds_root = root->child("sounds"); - - if (!sounds_root) { - cerr << "no child node \"sounds\" found!" << endl; - return; - } - - 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; - continue; // return; + if ( strcmp(root->name().c_str(), "response") != 0) { + error << string_compose ("root node name == %1 != \"response\"", root->name()) << endmsg; + break; } - // node->dump(cerr, "node:"); + XMLNode *sounds_root = root->child("sounds"); - XMLNode *id_node = node->child ("id"); - XMLNode *uri_node = node->child ("serve"); - XMLNode *ofn_node = node->child ("original_filename"); + if (!sounds_root) { + error << "no child node \"sounds\" found!" << 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 ){ + error << string_compose ("node->name()=%1 != \"resource\"", node->name()) << endmsg; + freesound_search_cancel = true; + break; + } - if (id_node && uri_node && ofn_node) { + // node->dump(cerr, "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(); + 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"); + + 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 << endl; + 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 + ); + } - 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; + 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 (freesound_search_cancel) + break; + + } //page "for" loop + + gdk_window_set_cursor (get_window()->gobj(), prev_cursor); + + freesound_progress_bar.set_text(""); + #endif } @@ -917,15 +972,9 @@ SoundFileBrowser::get_paths () results.push_back (str); } } else { - +#ifdef FREESOUND typedef TreeView::Selection::ListHandle_Path ListPath; - string path; - path = Glib::get_home_dir(); - path += "/Freesound/"; - Mootcher theMootcher(path.c_str()); // XXX should be a member of SoundFileBrowser - - 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); @@ -938,12 +987,15 @@ SoundFileBrowser::get_paths () gdk_window_set_cursor (get_window()->gobj(), gdk_cursor_new(GDK_WATCH)); gdk_flush(); - string str = theMootcher.getAudioFile(ofn, id, uri, &progress_bar); - results.push_back (str); + string str = mootcher->getAudioFile(ofn, id, uri, this); + if (str != "") { + results.push_back (str); + } gdk_window_set_cursor (get_window()->gobj(), prev_cursor); } +#endif } return results; @@ -967,6 +1019,7 @@ SoundFileOmega::reset_options () channel_combo.set_sensitive (false); action_combo.set_sensitive (false); where_combo.set_sensitive (false); + copy_files_btn.set_active (true); copy_files_btn.set_sensitive (false); return false; @@ -979,7 +1032,7 @@ SoundFileOmega::reset_options () /* if we get through this function successfully, this may be reset at the end, once we know if we can use hard links - to do embedding + to do embedding (or if we are importing a MIDI file). */ if (Config->get_only_copy_imported_files()) { @@ -995,6 +1048,13 @@ SoundFileOmega::reset_options () bool selection_can_be_embedded_with_links = check_link_status (_session, paths); ImportMode mode; + /* See if we are thinking about importing any MIDI files */ + vector::iterator i = paths.begin (); + while (i != paths.end() && SMFSource::safe_midi_file_extension (*i) == false) { + ++i; + } + bool const have_a_midi_file = (i != paths.end ()); + if (check_info (paths, same_size, src_needed, selection_includes_multichannel)) { Glib::signal_idle().connect (sigc::mem_fun (*this, &SoundFileOmega::bad_file_message)); return false; @@ -1003,6 +1063,8 @@ SoundFileOmega::reset_options () string existing_choice; vector action_strings; + resetting_ourselves = true; + if (chooser.get_filter() == &audio_filter) { /* AUDIO */ @@ -1031,10 +1093,10 @@ SoundFileOmega::reset_options () } } } - + } else { - /* MIDI */ + /* MIDI ONLY */ if (selected_midi_track_cnt > 0) { action_strings.push_back (importmode2string (ImportToTrack)); @@ -1045,8 +1107,6 @@ SoundFileOmega::reset_options () action_strings.push_back (importmode2string (ImportAsRegion)); action_strings.push_back (importmode2string (ImportAsTapeTrack)); - resetting_ourselves = true; - existing_choice = action_combo.get_active_text(); set_popdown_strings (action_combo, action_strings); @@ -1145,17 +1205,26 @@ 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; + if (Config->get_only_copy_imported_files()) { - if (selection_can_be_embedded_with_links) { + if (selection_can_be_embedded_with_links && !must_copy) { copy_files_btn.set_sensitive (true); } else { + if (must_copy) { + copy_files_btn.set_active (true); + } copy_files_btn.set_sensitive (false); } } else { - copy_files_btn.set_sensitive (true); + if (must_copy) { + copy_files_btn.set_active (true); + } + copy_files_btn.set_sensitive (!must_copy); } return true; @@ -1232,8 +1301,7 @@ SoundFileOmega::check_info (const vector& paths, bool& same_size, bool& bool SoundFileOmega::check_link_status (const Session* s, const vector& paths) { - sys::path path = s->session_directory().sound_path() / "linktest"; - string tmpdir = path.to_string(); + std::string tmpdir(Glib::build_filename (s->session_directory().sound_path(), "linktest")); bool ret = false; if (mkdir (tmpdir.c_str(), 0744)) { @@ -1332,16 +1400,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. @@ -1354,29 +1422,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")); @@ -1385,16 +1453,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")); @@ -1414,6 +1482,13 @@ 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); @@ -1444,14 +1519,14 @@ SoundFileOmega::SoundFileOmega (Gtk::Window& parent, string title, ARDOUR::Sessi t.push_back (_("one track per channel")); t.push_back (_("sequence files")); t.push_back (_("all files in one region")); - set_size_request_to_display_given_text (channel_combo, t, COMBO_FUDGE + 10, 15); + set_popdown_strings (channel_combo, t); t.clear (); t.push_back (importmode2string (ImportAsTrack)); t.push_back (importmode2string (ImportToTrack)); t.push_back (importmode2string (ImportAsRegion)); t.push_back (importmode2string (ImportAsTapeTrack)); - set_size_request_to_display_given_text (action_combo, t, COMBO_FUDGE + 10, 15); + set_popdown_strings (action_combo, t); } void @@ -1533,6 +1608,15 @@ SoundFileOmega::reset (uint32_t selected_audio_tracks, uint32_t selected_midi_tr { selected_audio_track_cnt = selected_audio_tracks; selected_midi_track_cnt = selected_midi_tracks; + + if (selected_audio_track_cnt == 0 && selected_midi_track_cnt > 0) { + chooser.set_filter (midi_filter); + } else if (selected_midi_track_cnt == 0 && selected_audio_track_cnt > 0) { + chooser.set_filter (audio_filter); + } else { + chooser.set_filter (audio_and_midi_filter); + } + reset_options (); }