diff options
-rw-r--r-- | gtk2_ardour/global_port_matrix.cc | 9 | ||||
-rw-r--r-- | libs/ardour/ardour/jack_portengine.h | 9 | ||||
-rw-r--r-- | libs/ardour/ardour/port_engine.h | 8 | ||||
-rw-r--r-- | libs/ardour/jack_portengine.cc | 48 | ||||
-rw-r--r-- | libs/ardour/port_manager.cc | 22 |
5 files changed, 70 insertions, 26 deletions
diff --git a/gtk2_ardour/global_port_matrix.cc b/gtk2_ardour/global_port_matrix.cc index cdba7f5c27..80e2616bd8 100644 --- a/gtk2_ardour/global_port_matrix.cc +++ b/gtk2_ardour/global_port_matrix.cc @@ -19,6 +19,7 @@ #include <gtkmm/image.h> #include <gtkmm/stock.h> + #include "global_port_matrix.h" #include "utils.h" @@ -118,15 +119,17 @@ GlobalPortMatrix::get_state (BundleChannel c[2]) const if (!p && !q) { /* two non-Ardour ports; things are slightly more involved */ - /* XXX: is this the easiest way to do this? */ - /* XXX: isn't this very inefficient? */ + + /* get a port handle for one of them .. */ PortEngine::PortHandle ph = AudioEngine::instance()->port_engine().get_port_by_name (*i); if (!ph) { return PortMatrixNode::NOT_ASSOCIATED; } - if (AudioEngine::instance()->port_engine().connected (ph)) { + /* see if it is connected to the other one ... */ + + if (AudioEngine::instance()->port_engine().connected_to (ph, *j, false)) { return PortMatrixNode::ASSOCIATED; } diff --git a/libs/ardour/ardour/jack_portengine.h b/libs/ardour/ardour/jack_portengine.h index f8db0c6ec4..0e1eb48c5c 100644 --- a/libs/ardour/ardour/jack_portengine.h +++ b/libs/ardour/ardour/jack_portengine.h @@ -63,11 +63,12 @@ class JACKPortEngine : public PortEngine PortHandle register_port (const std::string& shortname, ARDOUR::DataType, ARDOUR::PortFlags); void unregister_port (PortHandle); - bool connected (PortHandle); - bool connected_to (PortHandle, const std::string&); - bool physically_connected (PortHandle); - int get_connections (PortHandle, std::vector<std::string>&); + bool connected (PortHandle, bool process_callback_safe); + bool connected_to (PortHandle, const std::string&, bool process_callback_safe); + bool physically_connected (PortHandle, bool process_callback_safe); + int get_connections (PortHandle, std::vector<std::string>&, bool process_callback_safe); int connect (PortHandle, const std::string&); + int disconnect (PortHandle, const std::string&); int disconnect_all (PortHandle); int connect (const std::string& src, const std::string& dst); diff --git a/libs/ardour/ardour/port_engine.h b/libs/ardour/ardour/port_engine.h index bb7ec5cb66..71f93ea05e 100644 --- a/libs/ardour/ardour/port_engine.h +++ b/libs/ardour/ardour/port_engine.h @@ -185,21 +185,21 @@ class PortEngine { /** Return true if the port referred to by @param port has any connections * to other ports. Return false otherwise. */ - virtual bool connected (PortHandle port) = 0; + virtual bool connected (PortHandle port, bool process_callback_safe = true) = 0; /** Return true if the port referred to by @param port is connected to * the port named by @param name. Return false otherwise. */ - virtual bool connected_to (PortHandle, const std::string& name) = 0; + virtual bool connected_to (PortHandle, const std::string& name, bool process_callback_safe = true) = 0; /** Return true if the port referred to by @param port has any connections * to ports marked with the PortFlag IsPhysical. Return false otherwise. */ - virtual bool physically_connected (PortHandle port) = 0; + virtual bool physically_connected (PortHandle port, bool process_callback_safe = true) = 0; /** Place the names of all ports connected to the port named by @param * ports into @param names, and return the number of connections. */ - virtual int get_connections (PortHandle port, std::vector<std::string>& names) = 0; + virtual int get_connections (PortHandle port, std::vector<std::string>& names, bool process_callback_safe = true) = 0; /* MIDI */ diff --git a/libs/ardour/jack_portengine.cc b/libs/ardour/jack_portengine.cc index b0597f8269..4595857175 100644 --- a/libs/ardour/jack_portengine.cc +++ b/libs/ardour/jack_portengine.cc @@ -183,11 +183,18 @@ JACKPortEngine::connect_callback (jack_port_id_t id_a, jack_port_id_t id_b, int } bool -JACKPortEngine::connected (PortHandle port) +JACKPortEngine::connected (PortHandle port, bool process_callback_safe) { bool ret = false; - const char** ports = jack_port_get_connections ((jack_port_t*) port); + const char** ports; + + if (process_callback_safe) { + ports = jack_port_get_connections ((jack_port_t*)port); + } else { + GET_PRIVATE_JACK_POINTER_RET (_priv_jack, false); + ports = jack_port_get_all_connections (_priv_jack, (jack_port_t*)port); + } if (ports) { ret = true; @@ -199,10 +206,17 @@ JACKPortEngine::connected (PortHandle port) } bool -JACKPortEngine::connected_to (PortHandle port, const std::string& other) +JACKPortEngine::connected_to (PortHandle port, const std::string& other, bool process_callback_safe) { bool ret = false; - const char** ports = jack_port_get_connections ((jack_port_t*) port); + const char** ports; + + if (process_callback_safe) { + ports = jack_port_get_connections ((jack_port_t*)port); + } else { + GET_PRIVATE_JACK_POINTER_RET (_priv_jack, false); + ports = jack_port_get_all_connections (_priv_jack, (jack_port_t*)port); + } if (ports) { for (int i = 0; ports[i]; ++i) { @@ -217,12 +231,19 @@ JACKPortEngine::connected_to (PortHandle port, const std::string& other) } bool -JACKPortEngine::physically_connected (PortHandle p) +JACKPortEngine::physically_connected (PortHandle p, bool process_callback_safe) { GET_PRIVATE_JACK_POINTER_RET (_priv_jack, false); jack_port_t* port = (jack_port_t*) p; - const char** ports = jack_port_get_connections (port); + const char** ports; + + if (process_callback_safe) { + ports = jack_port_get_connections ((jack_port_t*)port); + } else { + GET_PRIVATE_JACK_POINTER_RET (_priv_jack, false); + ports = jack_port_get_all_connections (_priv_jack, (jack_port_t*)port); + } if (ports) { for (int i = 0; ports[i]; ++i) { @@ -240,9 +261,16 @@ JACKPortEngine::physically_connected (PortHandle p) } int -JACKPortEngine::get_connections (PortHandle port, vector<string>& s) +JACKPortEngine::get_connections (PortHandle port, vector<string>& s, bool process_callback_safe) { - const char** ports = jack_port_get_connections ((jack_port_t*) port); + const char** ports; + + if (process_callback_safe) { + ports = jack_port_get_connections ((jack_port_t*)port); + } else { + GET_PRIVATE_JACK_POINTER_RET (_priv_jack, 0); + ports = jack_port_get_all_connections (_priv_jack, (jack_port_t*)port); + } if (ports) { for (int i = 0; ports[i]; ++i) { @@ -443,7 +471,9 @@ int JACKPortEngine::connect (const std::string& src, const std::string& dst) { GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1); - return jack_connect (_priv_jack, src.c_str(), dst.c_str()); + + int r = jack_connect (_priv_jack, src.c_str(), dst.c_str()); + return r; } int diff --git a/libs/ardour/port_manager.cc b/libs/ardour/port_manager.cc index 4e467e3008..1758ea4a3f 100644 --- a/libs/ardour/port_manager.cc +++ b/libs/ardour/port_manager.cc @@ -385,8 +385,13 @@ PortManager::connect (const string& source, const string& destination) } else if (dst) { ret = dst->connect (s); } else { - /* neither port is known to us, and this API isn't intended for use as a general patch bay */ - ret = -1; + /* neither port is known to us ...hand-off to the PortEngine + */ + if (_impl) { + ret = _impl->connect (s, d); + } else { + ret = -1; + } } if (ret > 0) { @@ -412,12 +417,17 @@ PortManager::disconnect (const string& source, const string& destination) boost::shared_ptr<Port> dst = get_port_by_name (d); if (src) { - ret = src->disconnect (d); + ret = src->disconnect (d); } else if (dst) { - ret = dst->disconnect (s); + ret = dst->disconnect (s); } else { - /* neither port is known to us, and this API isn't intended for use as a general patch bay */ - ret = -1; + /* neither port is known to us ...hand-off to the PortEngine + */ + if (_impl) { + ret = _impl->disconnect (s, d); + } else { + ret = -1; + } } return ret; } |