summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-10-19 17:17:30 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2016-10-19 17:49:35 -0400
commitf96b6982344dd390b3ee4882e96d1a7b83374b0f (patch)
treecb9c7413b2dbb4917b5cd82cc96b5661fc70c756 /libs/ardour
parent0a8ab08e5f02b47e82343554b20e317e1b21731d (diff)
infrastructure for MIDI-input-follows-selection
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/port_manager.h4
-rw-r--r--libs/ardour/ardour/session.h1
-rw-r--r--libs/ardour/port_manager.cc47
-rw-r--r--libs/ardour/session_midi.cc49
-rw-r--r--libs/ardour/session_state.cc1
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 ();