+ if (!new_midi_target) {
+ return;
+ }
+
+ boost::shared_ptr<MidiTrack> old_midi_target = current_midi_target.lock ();
+
+ if (new_midi_target == old_midi_target) {
+ return;
+ }
+
+ vector<string> msp;
+ AudioEngine::instance()->get_midi_selection_ports (msp);
+
+ if (!msp.empty()) {
+
+ if (old_midi_target) {
+ old_midi_target->input()->disconnect (this);
+ }
+
+ for (vector<string>::const_iterator p = msp.begin(); p != msp.end(); ++p) {
+ /* disconnect the port from everything */
+ AudioEngine::instance()->disconnect (*p);
+ /* connect it to the new target */
+ 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 ()
+{
+ if (!Config->get_midi_input_follows_selection()) {
+ return;
+ }
+
+ boost::shared_ptr<MidiTrack> target = current_midi_target.lock();
+
+ if (!target) {
+ return;
+ }
+
+ vector<string> msp;
+ AudioEngine::instance()->get_midi_selection_ports (msp);
+
+ if (msp.empty()) {
+ return;
+ }
+
+ target->input()->disconnect (this);
+
+ for (vector<string>::const_iterator p = msp.begin(); p != msp.end(); ++p) {
+ AudioEngine::instance()->disconnect (*p);
+ target->input()->connect (target->input()->nth (0), (*p), this);
+ }