diff options
author | Robin Gareus <robin@gareus.org> | 2017-10-20 02:13:23 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-10-20 02:54:28 +0200 |
commit | 5dc54c91c76b02f8de9c5af4641667882a27b254 (patch) | |
tree | 81d0706682ba6a45843e26e01b3f78512138fdb9 /libs/ardour/slavable.cc | |
parent | b83e011a4084d5d94a67affcd65ec3cbc460f550 (diff) |
Prevent recursive VCA assignments
The GUI so far only prevents direct connections VCA 1 > VCA 2 > VCA 1,
but does not recurse VCA 1 > VCA 2 > VCA 3 > VCA 1
Diffstat (limited to 'libs/ardour/slavable.cc')
-rw-r--r-- | libs/ardour/slavable.cc | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/libs/ardour/slavable.cc b/libs/ardour/slavable.cc index 7d8109eac6..155fd4f736 100644 --- a/libs/ardour/slavable.cc +++ b/libs/ardour/slavable.cc @@ -60,6 +60,32 @@ Slavable::get_state () const return *node; } +std::vector<boost::shared_ptr<VCA> > +Slavable::masters (VCAManager* manager) const +{ + std::vector<boost::shared_ptr<VCA> > rv; + Glib::Threads::RWLock::ReaderLock lm (master_lock); + for (std::set<uint32_t>::const_iterator i = _masters.begin(); i != _masters.end(); ++i) { + rv.push_back (manager->vca_by_number (*i)); + } + return rv; +} + +bool +Slavable::assigned_to (VCAManager* manager, boost::shared_ptr<VCA> mst) const +{ + if (mst.get () == this) { + return true; + } + std::vector<boost::shared_ptr<VCA> > ml = mst->masters (manager); + for (std::vector<boost::shared_ptr<VCA> >::const_iterator i = ml.begin (); i != ml.end(); ++i) { + if (assigned_to (manager, *i)) { + return true; + } + } + return false; +} + int Slavable::set_state (XMLNode const& node, int version) { |