summaryrefslogtreecommitdiff
path: root/libs/ardour/session_midi.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-10-19 15:13:32 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2016-10-19 17:49:35 -0400
commit0a8ab08e5f02b47e82343554b20e317e1b21731d (patch)
tree1d7c9acd5651ec2c4e02a0810f63430315483c81 /libs/ardour/session_midi.cc
parentd0b2767856f321d16888b69a02e69408cafcc3bf (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.cc52
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;
+}