diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2016-10-19 15:13:32 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2016-10-19 17:49:35 -0400 |
commit | 0a8ab08e5f02b47e82343554b20e317e1b21731d (patch) | |
tree | 1d7c9acd5651ec2c4e02a0810f63430315483c81 /libs/ardour/session_midi.cc | |
parent | d0b2767856f321d16888b69a02e69408cafcc3bf (diff) |
basics of following MIDI track selection and rewiring input
Diffstat (limited to 'libs/ardour/session_midi.cc')
-rw-r--r-- | libs/ardour/session_midi.cc | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/libs/ardour/session_midi.cc b/libs/ardour/session_midi.cc index fa23880b87..5ed2b05e9a 100644 --- a/libs/ardour/session_midi.cc +++ b/libs/ardour/session_midi.cc @@ -722,3 +722,55 @@ Session::mtc_input_port () const { return _midi_ports->mtc_input_port (); } + +void +Session::midi_track_presentation_info_changed (PropertyChange const& what_changed, boost::weak_ptr<MidiTrack> mt) +{ + if (!Config->get_midi_input_follows_selection()) { + return; + } + + if (!what_changed.contains (Properties::selected)) { + return; + } + + boost::shared_ptr<MidiTrack> new_midi_target (mt.lock ()); + + if (new_midi_target->presentation_info().selected()) { + rewire_selected_midi (new_midi_target); + } +} + +void +Session::rewire_selected_midi (boost::shared_ptr<MidiTrack> new_midi_target) +{ + if (!new_midi_target) { + return; + } + + boost::shared_ptr<MidiTrack> old_midi_target = current_midi_target.lock (); + + if (new_midi_target == old_midi_target) { + return; + } + + PortManager::MidiSelectionPorts msp; + + AudioEngine::instance()->get_midi_selection_ports (msp); + + if (msp.empty()) { + 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); + } + } + + 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; +} |