diff options
author | Julien "_FrnchFrgg_" RIVAUD <frnchfrgg@free.fr> | 2017-08-28 12:18:02 +0200 |
---|---|---|
committer | Julien "_FrnchFrgg_" RIVAUD <frnchfrgg@free.fr> | 2017-08-28 17:54:32 +0200 |
commit | 50c6a90d248f1cfe74c3cdbccfdc79e3e43a471f (patch) | |
tree | a6b8789e56ba534e088e666ff718ae8a3cf37266 /libs | |
parent | 6039b44c0a0dea471dd81c3bc2878fd6049de238 (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.h | 3 | ||||
-rw-r--r-- | libs/ardour/bundle.cc | 19 |
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; + } } } |