X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fsfdb_ui.cc;h=699627365080a2a1e4c7867cea290db7aaf2f92d;hb=0038820f473664a9a4fb524537cd846a9e024661;hp=98df970e391a699f1e8e9574ea6cad596c9bab35;hpb=2ba2a50decb4b2f8b6b688dea495a2898124cc4f;p=ardour.git diff --git a/gtk2_ardour/sfdb_ui.cc b/gtk2_ardour/sfdb_ui.cc index 98df970e39..6996273650 100644 --- a/gtk2_ardour/sfdb_ui.cc +++ b/gtk2_ardour/sfdb_ui.cc @@ -21,6 +21,8 @@ #include "gtk2ardour-config.h" #endif +#include "i18n.h" + #include #include #include @@ -49,11 +51,13 @@ #include "ardour/auditioner.h" #include "ardour/audioregion.h" #include "ardour/audiofilesource.h" +#include "ardour/midi_region.h" #include "ardour/smf_source.h" #include "ardour/region_factory.h" #include "ardour/source_factory.h" #include "ardour/session.h" #include "ardour/session_directory.h" +#include "ardour/srcfilesource.h" #include "ardour_ui.h" #include "editing.h" @@ -61,15 +65,13 @@ #include "prompter.h" #include "sfdb_ui.h" #include "editing.h" -#include "utils.h" #include "gain_meter.h" #include "main_clock.h" #include "public_editor.h" +#include "timers.h" #include "sfdb_freesound_mootcher.h" -#include "i18n.h" - using namespace ARDOUR; using namespace PBD; using namespace std; @@ -113,16 +115,18 @@ importmode2string (ImportMode mode) case ImportAsTapeTrack: return _("as new tape tracks"); } - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return _("as new tracks"); } -SoundFileBox::SoundFileBox (bool persistent) +SoundFileBox::SoundFileBox (bool /*persistent*/) : table (6, 2), - length_clock ("sfboxLengthClock", !persistent, "", false, false, true, false), - timecode_clock ("sfboxTimecodeClock", !persistent, "", false, false, false, false), + length_clock ("sfboxLengthClock", true, "", false, false, true, false), + timecode_clock ("sfboxTimecodeClock", true, "", false, false, false, false), main_box (false, 6), - autoplay_btn (_("Auto-play")) + autoplay_btn (_("Auto-play")), + seek_slider(0,1000,1), + _seeking(false) { set_name (X_("SoundFileBox")); @@ -200,9 +204,18 @@ SoundFileBox::SoundFileBox (bool persistent) bottom_box.pack_start(stop_btn, true, true); bottom_box.pack_start(autoplay_btn, false, false); + seek_slider.set_draw_value(false); + + seek_slider.add_events(Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); + seek_slider.signal_button_press_event().connect(sigc::mem_fun(*this, &SoundFileBox::seek_button_press), false); + seek_slider.signal_button_release_event().connect(sigc::mem_fun(*this, &SoundFileBox::seek_button_release), false); + main_box.pack_start (seek_slider, false, false); + play_btn.signal_clicked().connect (sigc::mem_fun (*this, &SoundFileBox::audition)); stop_btn.signal_clicked().connect (sigc::mem_fun (*this, &SoundFileBox::stop_audition)); + stop_btn.set_sensitive (false); + channels_value.set_alignment (0.0f, 0.5f); samplerate_value.set_alignment (0.0f, 0.5f); } @@ -218,9 +231,45 @@ SoundFileBox::set_session(Session* s) if (!_session) { play_btn.set_sensitive (false); stop_btn.set_sensitive (false); + auditioner_connections.drop_connections(); + } else { + auditioner_connections.drop_connections(); + _session->AuditionActive.connect(auditioner_connections, invalidator (*this), boost::bind (&SoundFileBox::audition_active, this, _1), gui_context()); + _session->the_auditioner()->AuditionProgress.connect(auditioner_connections, invalidator (*this), boost::bind (&SoundFileBox::audition_progress, this, _1, _2), gui_context()); } } +void +SoundFileBox::audition_active(bool active) { + stop_btn.set_sensitive (active); + seek_slider.set_sensitive (active); + if (!active) { + seek_slider.set_value(0); + } +} + +void +SoundFileBox::audition_progress(ARDOUR::framecnt_t pos, ARDOUR::framecnt_t len) { + if (!_seeking) { + seek_slider.set_value( 1000.0 * pos / len); + seek_slider.set_sensitive (true); + } +} + +bool +SoundFileBox::seek_button_press(GdkEventButton*) { + _seeking = true; + return false; // pass on to slider +} + +bool +SoundFileBox::seek_button_release(GdkEventButton*) { + _seeking = false; + _session->the_auditioner()->seek_to_percent(seek_slider.get_value() / 10.0); + seek_slider.set_sensitive (false); + return false; // pass on to slider +} + bool SoundFileBox::setup_labels (const string& filename) { @@ -233,6 +282,43 @@ SoundFileBox::setup_labels (const string& filename) string error_msg; + if (SMFSource::valid_midi_file (path)) { + + boost::shared_ptr ms; + try { + ms = boost::dynamic_pointer_cast ( + SourceFactory::createExternal (DataType::MIDI, *_session, + path, 0, Source::Flag (0), false)); + } catch (const std::exception& e) { + error << string_compose(_("Could not read file: %1 (%2)."), + path, e.what()) << endmsg; + } + + preview_label.set_markup (_("Midi File Information")); + + format_text.set_text ("MIDI"); + samplerate_value.set_text ("-"); + tags_entry.get_buffer()->set_text (""); + timecode_clock.set (0); + tags_entry.set_sensitive (false); + + if (ms) { + channels_value.set_text (to_string(ms->num_tracks(), std::dec)); + length_clock.set (ms->length(ms->timeline_position())); + } else { + channels_value.set_text (""); + length_clock.set (0); + } + + if (_session && ms) { + play_btn.set_sensitive (true); + } else { + play_btn.set_sensitive (false); + } + + return true; + } + if(!AudioFileSource::get_soundfile_info (filename, sf_info, error_msg)) { preview_label.set_markup (_("Sound File Information")); @@ -317,11 +403,6 @@ SoundFileBox::audition () return; } - if (SMFSource::safe_midi_file_extension (path)) { - error << _("Auditioning of MIDI files is not yet supported") << endmsg; - return; - } - _session->cancel_audition(); if (!Glib::file_test (path, Glib::FILE_TEST_EXISTS)) { @@ -330,47 +411,91 @@ SoundFileBox::audition () } boost::shared_ptr r; - SourceList srclist; - boost::shared_ptr afs; - bool old_sbp = AudioSource::get_build_peakfiles (); - /* don't even think of building peakfiles for these files */ + if (SMFSource::valid_midi_file (path)) { - AudioSource::set_build_peakfiles (false); + boost::shared_ptr ms = + boost::dynamic_pointer_cast ( + SourceFactory::createExternal (DataType::MIDI, *_session, + path, 0, Source::Flag (0), false)); - for (int n = 0; n < sf_info.channels; ++n) { - try { - afs = boost::dynamic_pointer_cast ( - SourceFactory::createExternal (DataType::AUDIO, *_session, - path, n, - Source::Flag (0), false)); - - srclist.push_back(afs); - - } catch (failed_constructor& err) { - error << _("Could not access soundfile: ") << path << endmsg; - AudioSource::set_build_peakfiles (old_sbp); - return; + string rname = region_name_from_path (ms->path(), false); + + PropertyList plist; + + plist.add (ARDOUR::Properties::start, 0); + plist.add (ARDOUR::Properties::length, ms->length(ms->timeline_position())); + plist.add (ARDOUR::Properties::name, rname); + plist.add (ARDOUR::Properties::layer, 0); + + r = boost::dynamic_pointer_cast (RegionFactory::create (boost::dynamic_pointer_cast(ms), plist, false)); + assert(r); + + } else { + + SourceList srclist; + boost::shared_ptr afs; + bool old_sbp = AudioSource::get_build_peakfiles (); + + /* don't even think of building peakfiles for these files */ + + AudioSource::set_build_peakfiles (false); + + for (int n = 0; n < sf_info.channels; ++n) { + try { + afs = boost::dynamic_pointer_cast ( + SourceFactory::createExternal (DataType::AUDIO, *_session, + path, n, + Source::Flag (ARDOUR::AudioFileSource::NoPeakFile), false)); + if (afs->sample_rate() != _session->nominal_frame_rate()) { + boost::shared_ptr sfs (new SrcFileSource(*_session, afs, _src_quality)); + srclist.push_back(sfs); + } else { + srclist.push_back(afs); + } + + } catch (failed_constructor& err) { + error << _("Could not access soundfile: ") << path << endmsg; + AudioSource::set_build_peakfiles (old_sbp); + return; + } } - } - AudioSource::set_build_peakfiles (old_sbp); + AudioSource::set_build_peakfiles (old_sbp); - if (srclist.empty()) { - return; - } + if (srclist.empty()) { + return; + } - afs = boost::dynamic_pointer_cast (srclist[0]); - string rname = region_name_from_path (afs->path(), false); + afs = boost::dynamic_pointer_cast (srclist[0]); + string rname = region_name_from_path (afs->path(), false); - PropertyList plist; + PropertyList plist; - plist.add (ARDOUR::Properties::start, 0); - plist.add (ARDOUR::Properties::length, srclist[0]->length(srclist[0]->timeline_position())); - plist.add (ARDOUR::Properties::name, rname); - plist.add (ARDOUR::Properties::layer, 0); + plist.add (ARDOUR::Properties::start, 0); + plist.add (ARDOUR::Properties::length, srclist[0]->length(srclist[0]->timeline_position())); + plist.add (ARDOUR::Properties::name, rname); + plist.add (ARDOUR::Properties::layer, 0); - r = boost::dynamic_pointer_cast (RegionFactory::create (srclist, plist, false)); + r = boost::dynamic_pointer_cast (RegionFactory::create (srclist, plist, false)); + } + + frameoffset_t audition_position = 0; + switch(_import_position) { + case ImportAtTimestamp: + audition_position = 0; + break; + case ImportAtPlayhead: + audition_position = _session->transport_frame(); + break; + case ImportAtStart: + audition_position = _session->current_start_frame(); + break; + case ImportAtEditPoint: + audition_position = PublicEditor::instance().get_preferred_edit_position (); + break; + } + r->set_position(audition_position); _session->audition_region(r); } @@ -709,7 +834,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")); + gm->set_fader_name (X_("GainFader")); meter_packer.set_border_width (12); meter_packer.pack_start (*gm, false, true); @@ -732,7 +857,7 @@ SoundFileBrowser::remove_gain_meter () void SoundFileBrowser::start_metering () { - metering_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect (sigc::mem_fun(*this, &SoundFileBrowser::meter)); + metering_connection = Timers::super_rapid_connect (sigc::mem_fun(*this, &SoundFileBrowser::meter)); } void @@ -1192,7 +1317,7 @@ SoundFileOmega::reset_options () to do embedding (or if we are importing a MIDI file). */ - if (Config->get_only_copy_imported_files()) { + if (ARDOUR_UI::config()->get_only_copy_imported_files()) { copy_files_btn.set_sensitive (false); } else { copy_files_btn.set_sensitive (false); @@ -1207,7 +1332,7 @@ SoundFileOmega::reset_options () /* 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) { + while (i != paths.end() && SMFSource::valid_midi_file (*i) == false) { ++i; } bool const have_a_midi_file = (i != paths.end ()); @@ -1366,7 +1491,7 @@ SoundFileOmega::reset_options () * 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()) { + if (ARDOUR_UI::config()->get_only_copy_imported_files()) { if (selection_can_be_embedded_with_links && !must_copy) { copy_files_btn.set_sensitive (true); @@ -1435,7 +1560,7 @@ SoundFileOmega::check_info (const vector& paths, bool& same_size, bool& src_needed = true; } - } else if (SMFSource::safe_midi_file_extension (*i)) { + } else if (SMFSource::valid_midi_file (*i)) { Evoral::SMF reader; reader.open(*i); @@ -1459,7 +1584,7 @@ SoundFileOmega::check_info (const vector& paths, bool& same_size, bool& bool SoundFileOmega::check_link_status (const Session* s, const vector& paths) { -#ifdef WIN32 +#ifdef PLATFORM_WINDOWS return false; #else std::string tmpdir(Glib::build_filename (s->session_directory().sound_path(), "linktest")); @@ -1560,6 +1685,7 @@ SoundFileOmega::SoundFileOmega (string title, ARDOUR::Session* s, str.push_back (_("session start")); set_popdown_strings (where_combo, str); where_combo.set_active_text (str.front()); + where_combo.signal_changed().connect (sigc::mem_fun (*this, &SoundFileOmega::where_combo_changed)); Label* l = manage (new Label); l->set_markup (_("Add files as ...")); @@ -1626,6 +1752,18 @@ SoundFileOmega::SoundFileOmega (string title, ARDOUR::Session* s, hbox->pack_start (*vbox, false, false); options.pack_start (*hbox, false, false); + l = manage (new Label); + l->set_markup (_("Instrument")); + + vbox = manage (new VBox); + vbox->set_border_width (12); + vbox->set_spacing (6); + vbox->pack_start (*l, false, false); + vbox->pack_start (instrument_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")); str.push_back (_("Good")); @@ -1636,6 +1774,7 @@ SoundFileOmega::SoundFileOmega (string title, ARDOUR::Session* s, set_popdown_strings (src_combo, str); src_combo.set_active_text (str.front()); src_combo.set_sensitive (false); + src_combo.signal_changed().connect (sigc::mem_fun (*this, &SoundFileOmega::src_combo_changed)); reset_options (); @@ -1746,6 +1885,18 @@ SoundFileOmega::get_src_quality() const } } +void +SoundFileOmega::src_combo_changed() +{ + preview.set_src_quality(get_src_quality()); +} + +void +SoundFileOmega::where_combo_changed() +{ + preview.set_import_position(get_position()); +} + ImportDisposition SoundFileOmega::get_channel_disposition () const { @@ -1759,7 +1910,7 @@ SoundFileOmega::get_channel_disposition () const if (x == disposition_map.end()) { fatal << string_compose (_("programming error: %1 (%2)"), "unknown string for import disposition", str) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } return x->second; @@ -1816,6 +1967,7 @@ SoundFileOmega::do_something (int action) ImportPosition pos = get_position (); ImportMode mode = get_mode (); ImportDisposition chns = get_channel_disposition (); + PluginInfoPtr instrument = instrument_combo.selected_instrument(); framepos_t where; switch (pos) { @@ -1836,9 +1988,9 @@ SoundFileOmega::do_something (int action) SrcQuality quality = get_src_quality(); if (copy_files_btn.get_active()) { - PublicEditor::instance().do_import (paths, chns, mode, quality, where); + PublicEditor::instance().do_import (paths, chns, mode, quality, where, instrument); } else { - PublicEditor::instance().do_embed (paths, chns, mode, where); + PublicEditor::instance().do_embed (paths, chns, mode, where, instrument); } if (action == RESPONSE_OK) {