summaryrefslogtreecommitdiff
path: root/libs/ardour/bundle.cc
diff options
context:
space:
mode:
authorJulien "_FrnchFrgg_" RIVAUD <frnchfrgg@free.fr>2017-08-28 12:18:02 +0200
committerJulien "_FrnchFrgg_" RIVAUD <frnchfrgg@free.fr>2017-08-28 17:54:32 +0200
commit50c6a90d248f1cfe74c3cdbccfdc79e3e43a471f (patch)
treea6b8789e56ba534e088e666ff718ae8a3cf37266 /libs/ardour/bundle.cc
parent6039b44c0a0dea471dd81c3bc2878fd6049de238 (diff)
Make Bundle::connected_to() optionally check for exclusivity
If the new optional argument is true, then the first bundle will also check if it has other connections than to the given bundle.
Diffstat (limited to 'libs/ardour/bundle.cc')
-rw-r--r--libs/ardour/bundle.cc19
1 files changed, 16 insertions, 3 deletions
diff --git a/libs/ardour/bundle.cc b/libs/ardour/bundle.cc
index 33f71dcecd..b12455b38b 100644
--- a/libs/ardour/bundle.cc
+++ b/libs/ardour/bundle.cc
@@ -434,8 +434,12 @@ Bundle::emit_changed (Change c)
}
}
-/* @return true if a Bundle is connected to another.
- * @param type: if not NIL, restrict the check to channels of that type. */
+/** This must not be called in code executed as a response to a backend event,
+ * as it may query the backend in the same thread where it's waiting for us.
+ * @return true if a Bundle is connected to another.
+ * @param type: if not NIL, restrict the check to channels of that type.
+ * @param exclusive: if true, additionally check if the bundle is connected
+ * only to |other|, and return false if not. */
bool
Bundle::connected_to (boost::shared_ptr<Bundle> other, AudioEngine & engine,
DataType type, bool exclusive)
@@ -446,7 +450,7 @@ Bundle::connected_to (boost::shared_ptr<Bundle> other, AudioEngine & engine,
if (type == DataType::NIL) {
for (DataType::iterator t = DataType::begin();
t != DataType::end(); ++t) {
- if (!connected_to(other, engine, *t))
+ if (!connected_to(other, engine, *t, exclusive))
return false;
}
return true;
@@ -456,6 +460,8 @@ Bundle::connected_to (boost::shared_ptr<Bundle> other, AudioEngine & engine,
if (other->nchannels().n(type) != N)
return false;
+ vector<string> port_connections;
+
for (uint32_t i = 0; i < N; ++i) {
Bundle::PortList const & our_ports =
channel_ports (type_channel_to_overall(type, i));
@@ -480,6 +486,13 @@ Bundle::connected_to (boost::shared_ptr<Bundle> other, AudioEngine & engine,
return false;
}
}
+
+ if (exclusive && p) {
+ port_connections.clear();
+ p->get_connections(port_connections);
+ if (port_connections.size() != other_ports.size())
+ return false;
+ }
}
}