diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2016-10-19 17:17:30 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2016-10-19 17:49:35 -0400 |
commit | f96b6982344dd390b3ee4882e96d1a7b83374b0f (patch) | |
tree | cb9c7413b2dbb4917b5cd82cc96b5661fc70c756 /libs/ardour | |
parent | 0a8ab08e5f02b47e82343554b20e317e1b21731d (diff) |
infrastructure for MIDI-input-follows-selection
Diffstat (limited to 'libs/ardour')
-rw-r--r-- | libs/ardour/ardour/port_manager.h | 4 | ||||
-rw-r--r-- | libs/ardour/ardour/session.h | 1 | ||||
-rw-r--r-- | libs/ardour/port_manager.cc | 47 | ||||
-rw-r--r-- | libs/ardour/session_midi.cc | 49 | ||||
-rw-r--r-- | libs/ardour/session_state.cc | 1 |
5 files changed, 85 insertions, 17 deletions
diff --git a/libs/ardour/ardour/port_manager.h b/libs/ardour/ardour/port_manager.h index 6433b1bd6d..7cc1125bcc 100644 --- a/libs/ardour/ardour/port_manager.h +++ b/libs/ardour/ardour/port_manager.h @@ -134,6 +134,10 @@ class LIBARDOUR_API PortManager void add_to_midi_selection_ports (std::string const&); void remove_from_midi_selection_ports (std::string const&); void clear_midi_selection_ports (); + bool port_is_for_midi_selection (std::string const&); + + /** Emitted if the list of ports to be used for MIDI selection tracking changes */ + PBD::Signal0<void> MidiSelectionPortsChanged; /** Emitted if the backend notifies us of a graph order event */ PBD::Signal0<void> GraphReordered; diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 4b17d7d855..6d05af8beb 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -2037,6 +2037,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop void midi_track_presentation_info_changed (PBD::PropertyChange const &, boost::weak_ptr<MidiTrack>); void rewire_selected_midi (boost::shared_ptr<MidiTrack>); + void rewire_midi_selection_ports (); boost::weak_ptr<MidiTrack> current_midi_target; }; diff --git a/libs/ardour/port_manager.cc b/libs/ardour/port_manager.cc index d24c929930..febef6aa4f 100644 --- a/libs/ardour/port_manager.cc +++ b/libs/ardour/port_manager.cc @@ -852,6 +852,13 @@ PortManager::port_is_control_only (std::string const& name) return regexec (&compiled_pattern, name.c_str(), 0, 0, 0) == 0; } +bool +PortManager::port_is_for_midi_selection (std::string const & name) +{ + Glib::Threads::Mutex::Lock lm (midi_selection_ports_mutex); + return find (_midi_selection_ports.begin(), _midi_selection_ports.end(), name) != _midi_selection_ports.end(); +} + void PortManager::get_midi_selection_ports (MidiSelectionPorts& copy) const { @@ -862,25 +869,47 @@ PortManager::get_midi_selection_ports (MidiSelectionPorts& copy) const void PortManager::add_to_midi_selection_ports (string const & port) { - Glib::Threads::Mutex::Lock lm (midi_selection_ports_mutex); - if (find (_midi_selection_ports.begin(), _midi_selection_ports.end(), port) == _midi_selection_ports.end()) { - _midi_selection_ports.push_back (port); + bool emit = false; + + { + Glib::Threads::Mutex::Lock lm (midi_selection_ports_mutex); + if (find (_midi_selection_ports.begin(), _midi_selection_ports.end(), port) == _midi_selection_ports.end()) { + _midi_selection_ports.push_back (port); + emit = true; + } + } + + if (emit) { + MidiSelectionPortsChanged (); /* EMIT SIGNAL */ } } void PortManager::remove_from_midi_selection_ports (string const & port) { - Glib::Threads::Mutex::Lock lm (midi_selection_ports_mutex); - MidiSelectionPorts::iterator x = find (_midi_selection_ports.begin(), _midi_selection_ports.end(), port); - if (x != _midi_selection_ports.end()) { - _midi_selection_ports.erase (x); + bool emit = false; + + { + Glib::Threads::Mutex::Lock lm (midi_selection_ports_mutex); + MidiSelectionPorts::iterator x = find (_midi_selection_ports.begin(), _midi_selection_ports.end(), port); + if (x != _midi_selection_ports.end()) { + _midi_selection_ports.erase (x); + emit = true; + } + } + + if (emit) { + MidiSelectionPortsChanged (); /* EMIT SIGNAL */ } } void PortManager::clear_midi_selection_ports () { - Glib::Threads::Mutex::Lock lm (midi_selection_ports_mutex); - _midi_selection_ports.clear (); + { + Glib::Threads::Mutex::Lock lm (midi_selection_ports_mutex); + _midi_selection_ports.clear (); + } + + MidiSelectionPortsChanged (); /* EMIT SIGNAL */ } diff --git a/libs/ardour/session_midi.cc b/libs/ardour/session_midi.cc index 5ed2b05e9a..671e919c6d 100644 --- a/libs/ardour/session_midi.cc +++ b/libs/ardour/session_midi.cc @@ -737,6 +737,7 @@ Session::midi_track_presentation_info_changed (PropertyChange const& what_change boost::shared_ptr<MidiTrack> new_midi_target (mt.lock ()); if (new_midi_target->presentation_info().selected()) { + cerr << "Rewiring " << new_midi_target->name() << endl; rewire_selected_midi (new_midi_target); } } @@ -755,22 +756,54 @@ Session::rewire_selected_midi (boost::shared_ptr<MidiTrack> new_midi_target) } PortManager::MidiSelectionPorts msp; + AudioEngine::instance()->get_midi_selection_ports (msp); + + if (!msp.empty()) { + if (old_midi_target) { + for (PortManager::MidiSelectionPorts::const_iterator p = msp.begin(); p != msp.end(); ++p) { + old_midi_target->input()->disconnect (old_midi_target->input()->nth (0), (*p), this); + } + } + + for (PortManager::MidiSelectionPorts::const_iterator p = msp.begin(); p != msp.end(); ++p) { + new_midi_target->input()->connect (new_midi_target->input()->nth(0), (*p), this); + } + } + current_midi_target = new_midi_target; +} + +void +Session::rewire_midi_selection_ports () +{ + cerr << "RMSP\n"; + + if (!Config->get_midi_input_follows_selection()) { + cerr << "nope\n"; + return; + } + + boost::shared_ptr<MidiTrack> target = current_midi_target.lock(); + + if (!target) { + cerr << "no target\n"; + return; + } + + PortManager::MidiSelectionPorts msp; AudioEngine::instance()->get_midi_selection_ports (msp); if (msp.empty()) { + cerr << "no MSP\n"; return; } - if (old_midi_target) { - for (PortManager::MidiSelectionPorts::const_iterator p = msp.begin(); p != msp.end(); ++p) { - old_midi_target->input()->disconnect (old_midi_target->input()->nth (0), (*p), this); - } - } + cerr << "2. Rewiring " << target->name() << endl; + + target->input()->disconnect (this); for (PortManager::MidiSelectionPorts::const_iterator p = msp.begin(); p != msp.end(); ++p) { - new_midi_target->input()->connect (new_midi_target->input()->nth(0), (*p), this); + cerr << "\tconnect to " << *p << endl; + target->input()->connect (target->input()->nth (0), (*p), this); } - - current_midi_target = new_midi_target; } diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index ba0474f741..66eba307cd 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -270,6 +270,7 @@ Session::post_engine_init () SndFileSource::setup_standard_crossfades (*this, frame_rate()); _engine.GraphReordered.connect_same_thread (*this, boost::bind (&Session::graph_reordered, this)); + _engine.MidiSelectionPortsChanged.connect_same_thread (*this, boost::bind (&Session::rewire_midi_selection_ports, this)); AudioDiskstream::allocate_working_buffers(); refresh_disk_space (); |