From: Carl Hetherington Date: Mon, 26 Sep 2011 22:22:21 +0000 (+0000) Subject: Update Mackie surface state when something is connected to its output port (#3887). X-Git-Tag: 3.0-beta1~426 X-Git-Url: https://main.carlh.net/gitweb/?a=commitdiff_plain;h=1145f1ff6c02369808b7853385cdab0ca5ff2f11;p=ardour.git Update Mackie surface state when something is connected to its output port (#3887). git-svn-id: svn://localhost/ardour2/branches/3.0@10135 d708f5d6-7413-0410-9779-e7cbd77b26cf --- diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index e4d9b4058a..7012ad61f5 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -334,7 +334,7 @@ MixerStrip::init () SwitchIO.connect (sigc::mem_fun (*this, &MixerStrip::switch_io)); AudioEngine::instance()->PortConnectedOrDisconnected.connect ( - *this, invalidator (*this), boost::bind (&MixerStrip::port_connected_or_disconnected, this, _1, _2), gui_context () + *this, invalidator (*this), boost::bind (&MixerStrip::port_connected_or_disconnected, this, _1, _3), gui_context () ); } diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h index ee2276a3bf..4d7d93510b 100644 --- a/libs/ardour/ardour/audioengine.h +++ b/libs/ardour/ardour/audioengine.h @@ -249,9 +249,10 @@ _ the regular process() call to session->process() is not made. /** Emitted if a JACK port is connected or disconnected. * The Port parameters are the ports being connected / disconnected, or 0 if they are not known to Ardour. + * The std::string parameters are the (long) port names. * The bool parameter is true if ports were connected, or false for disconnected. */ - PBD::Signal3 PortConnectedOrDisconnected; + PBD::Signal5 PortConnectedOrDisconnected; std::string make_port_name_relative (std::string) const; std::string make_port_name_non_relative (std::string) const; diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index 6420b9247d..47efcf5f71 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -402,7 +402,11 @@ AudioEngine::_connect_callback (jack_port_id_t id_a, jack_port_id_t id_b, int co ++i; } - ae->PortConnectedOrDisconnected (port_a, port_b, conn == 0 ? false : true); /* EMIT SIGNAL */ + ae->PortConnectedOrDisconnected ( + port_a, jack_port_name (jack_port_a), + port_b, jack_port_name (jack_port_b), + conn == 0 ? false : true + ); /* EMIT SIGNAL */ } void diff --git a/libs/surfaces/mackie/mackie_control_protocol.cc b/libs/surfaces/mackie/mackie_control_protocol.cc index 05d1fa3de2..d28dcc4f14 100644 --- a/libs/surfaces/mackie/mackie_control_protocol.cc +++ b/libs/surfaces/mackie/mackie_control_protocol.cc @@ -86,6 +86,11 @@ MackieControlProtocol::MackieControlProtocol (Session& session) , _gui (0) { DEBUG_TRACE (DEBUG::MackieControl, "MackieControlProtocol::MackieControlProtocol\n"); + + AudioEngine::instance()->PortConnectedOrDisconnected.connect ( + audio_engine_connections, MISSING_INVALIDATOR, ui_bind (&MackieControlProtocol::port_connected_or_disconnected, this, _2, _4, _5), + midi_ui_context () + ); } MackieControlProtocol::~MackieControlProtocol() @@ -1742,3 +1747,31 @@ MackieControlProtocol::bundles () b.push_back (_output_bundle); return b; } + +void +MackieControlProtocol::port_connected_or_disconnected (string a, string b, bool connected) +{ + /* If something is connected to one of our output ports, send MIDI to update the surface + to whatever state it should have. + */ + + if (!connected) { + return; + } + + MackiePorts::const_iterator i = _ports.begin(); + while (i != _ports.end()) { + + string const n = AudioEngine::instance()->make_port_name_non_relative ((*i)->output_port().name ()); + + if (a == n || b == n) { + break; + } + + ++i; + } + + if (i != _ports.end ()) { + update_surface (); + } +} diff --git a/libs/surfaces/mackie/mackie_control_protocol.h b/libs/surfaces/mackie/mackie_control_protocol.h index 05308dbd63..beae926518 100644 --- a/libs/surfaces/mackie/mackie_control_protocol.h +++ b/libs/surfaces/mackie/mackie_control_protocol.h @@ -307,6 +307,9 @@ class MackieControlProtocol Mackie::Strip & master_strip(); private: + + void port_connected_or_disconnected (std::string, std::string, bool); + boost::shared_ptr master_route_signal; static const char * default_port_name; @@ -323,7 +326,8 @@ class MackieControlProtocol /// protects the port list Glib::Mutex update_mutex; - + + PBD::ScopedConnectionList audio_engine_connections; PBD::ScopedConnectionList session_connections; PBD::ScopedConnectionList port_connections; PBD::ScopedConnectionList route_connections;