diff options
-rw-r--r-- | libs/ardour/ardour/slavable.h | 2 | ||||
-rw-r--r-- | libs/ardour/ardour/vca.h | 2 | ||||
-rw-r--r-- | libs/ardour/slavable.cc | 3 |
3 files changed, 7 insertions, 0 deletions
diff --git a/libs/ardour/ardour/slavable.h b/libs/ardour/ardour/slavable.h index 147f90fda0..e5c8688df1 100644 --- a/libs/ardour/ardour/slavable.h +++ b/libs/ardour/ardour/slavable.h @@ -67,8 +67,10 @@ class LIBARDOUR_API Slavable mutable Glib::Threads::RWLock master_lock; std::set<uint32_t> _masters; PBD::ScopedConnection assign_connection; + PBD::ScopedConnectionList unassign_connections; int do_assign (VCAManager* s); + }; } // namespace ARDOUR diff --git a/libs/ardour/ardour/vca.h b/libs/ardour/ardour/vca.h index 2814cb68b4..eddfd628b4 100644 --- a/libs/ardour/ardour/vca.h +++ b/libs/ardour/ardour/vca.h @@ -60,6 +60,8 @@ class LIBARDOUR_API VCA : public Stripable, XMLNode& get_state(); int set_state (XMLNode const&, int version); + PBD::Signal0<void> Drop; /* signal to slaves to drop control by this VCA */ + /* Slavable API */ bool slaved_to (boost::shared_ptr<VCA>) const; diff --git a/libs/ardour/slavable.cc b/libs/ardour/slavable.cc index e3af33becf..b6921c55c1 100644 --- a/libs/ardour/slavable.cc +++ b/libs/ardour/slavable.cc @@ -115,10 +115,13 @@ Slavable::do_assign (VCAManager* manager) void Slavable::assign (boost::shared_ptr<VCA> v) { + assert (v); Glib::Threads::RWLock::WriterLock lm (master_lock); if (assign_controls (v) == 0) { _masters.insert (v->number()); } + + v->Drop.connect_same_thread (unassign_connections, boost::bind (&Slavable::unassign, this, v)); } void |