From 94e2bce740da8f6b53820ab2b4893846300d0c9e Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 30 Oct 2017 19:41:42 +0100 Subject: [PATCH] Add & implement PortEngine::externally_connected() API --- libs/ardour/ardour/port_engine.h | 8 ++++++ libs/backends/jack/jack_audiobackend.h | 1 + libs/backends/jack/jack_portengine.cc | 34 ++++++++++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/libs/ardour/ardour/port_engine.h b/libs/ardour/ardour/port_engine.h index 88935671a2..6db4bea24b 100644 --- a/libs/ardour/ardour/port_engine.h +++ b/libs/ardour/ardour/port_engine.h @@ -228,6 +228,14 @@ class LIBARDOUR_API PortEngine { */ virtual bool physically_connected (PortHandle port, bool process_callback_safe = true) = 0; + /** Return true if the port referred to by @param port has any connections + * to external, not-ardour owned, ports. + */ + virtual bool externally_connected (PortHandle port, bool process_callback_safe = true) { + /* only with JACK, provides client ports that are not physical */ + return physically_connected (port, process_callback_safe); + } + /** Place the names of all ports connected to the port named by @param * ports into @param names, and return the number of connections. */ diff --git a/libs/backends/jack/jack_audiobackend.h b/libs/backends/jack/jack_audiobackend.h index eb66f7ca3f..7d6d1bd977 100644 --- a/libs/backends/jack/jack_audiobackend.h +++ b/libs/backends/jack/jack_audiobackend.h @@ -145,6 +145,7 @@ class JACKAudioBackend : public AudioBackend { 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); + bool externally_connected (PortHandle, bool process_callback_safe); int get_connections (PortHandle, std::vector&, bool process_callback_safe); int connect (PortHandle, const std::string&); diff --git a/libs/backends/jack/jack_portengine.cc b/libs/backends/jack/jack_portengine.cc index dfa2bdad11..70dded77c4 100644 --- a/libs/backends/jack/jack_portengine.cc +++ b/libs/backends/jack/jack_portengine.cc @@ -275,6 +275,7 @@ JACKAudioBackend::physically_connected (PortHandle p, bool process_callback_safe jack_port_t* other = jack_port_by_name (_priv_jack, ports[i]); if (other && (jack_port_flags (other) & JackPortIsPhysical)) { + jack_free (ports); return true; } } @@ -284,6 +285,39 @@ JACKAudioBackend::physically_connected (PortHandle p, bool process_callback_safe return false; } +bool +JACKAudioBackend::externally_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; + + 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) { + jack_port_t* other = jack_port_by_name (_priv_jack, ports[i]); + + if (other && (jack_port_flags (other) & JackPortIsPhysical)) { + jack_free (ports); + return true; + } + if (other && !jack_port_is_mine (_priv_jack, other)) { + jack_free (ports); + return true; + } + } + jack_free (ports); + } + return false; +} + int JACKAudioBackend::get_connections (PortHandle port, vector& s, bool process_callback_safe) {