summaryrefslogtreecommitdiff
path: root/libs
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
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')
-rw-r--r--libs/ardour/ardour/bundle.h3
-rw-r--r--libs/ardour/bundle.cc19
2 files changed, 18 insertions, 4 deletions
diff --git a/libs/ardour/ardour/bundle.h b/libs/ardour/ardour/bundle.h
index 54d0e602b3..a84ae624f6 100644
--- a/libs/ardour/ardour/bundle.h
+++ b/libs/ardour/ardour/bundle.h
@@ -101,7 +101,8 @@ class LIBARDOUR_API Bundle : public PBD::ScopedConnectionList
bool allow_partial = false);
void disconnect (boost::shared_ptr<Bundle>, AudioEngine &);
bool connected_to (boost::shared_ptr<Bundle>, AudioEngine &,
- DataType type = DataType::NIL);
+ DataType type = DataType::NIL,
+ bool exclusive = false);
bool connected_to_anything (AudioEngine &);
bool has_same_ports (boost::shared_ptr<Bundle>) const;
uint32_t type_channel_to_overall (DataType, uint32_t) const;
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;
+ }
}
}