summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-10-30 19:41:42 +0100
committerRobin Gareus <robin@gareus.org>2017-10-30 19:41:42 +0100
commit94e2bce740da8f6b53820ab2b4893846300d0c9e (patch)
treeb8311164e2677ef94a05436388002122ab282bdc /libs
parent16b45352817bce83a1e2de2ad9c1106c0b560a63 (diff)
Add & implement PortEngine::externally_connected() API
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/port_engine.h8
-rw-r--r--libs/backends/jack/jack_audiobackend.h1
-rw-r--r--libs/backends/jack/jack_portengine.cc34
3 files changed, 43 insertions, 0 deletions
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<std::string>&, 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<string>& s, bool process_callback_safe)
{