diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2016-12-12 18:43:47 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2016-12-12 18:43:55 +0000 |
commit | e37bfffca5692509ede7481b7cadda7606cc3e17 (patch) | |
tree | dc62d7340f94ce918c1f4ee020d7f810bf3bf2da /libs/ardour/slavable.cc | |
parent | afa6720288fce4513dc16c9cb53562c051172c52 (diff) |
Add Slavable::AssignmentChanged signal to notify when a slavable is assigned/unassigned to/from a master
Diffstat (limited to 'libs/ardour/slavable.cc')
-rw-r--r-- | libs/ardour/slavable.cc | 40 |
1 files changed, 24 insertions, 16 deletions
diff --git a/libs/ardour/slavable.cc b/libs/ardour/slavable.cc index 10eb084372..61a11f257d 100644 --- a/libs/ardour/slavable.cc +++ b/libs/ardour/slavable.cc @@ -117,19 +117,23 @@ 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()); - } + { + Glib::Threads::RWLock::WriterLock lm (master_lock); + if (assign_controls (v) == 0) { + _masters.insert (v->number()); + } + + /* Do NOT use ::unassign() because it will store a + * boost::shared_ptr<VCA> in the functor, leaving a dangling ref to the + * VCA. + */ - /* Do NOT use ::unassign() because it will store a - * boost::shared_ptr<VCA> in the functor, leaving a dangling ref to the - * VCA. - */ + v->Drop.connect_same_thread (unassign_connections, boost::bind (&Slavable::weak_unassign, this, boost::weak_ptr<VCA>(v))); + v->DropReferences.connect_same_thread (unassign_connections, boost::bind (&Slavable::weak_unassign, this, boost::weak_ptr<VCA>(v))); + } - v->Drop.connect_same_thread (unassign_connections, boost::bind (&Slavable::weak_unassign, this, boost::weak_ptr<VCA>(v))); - v->DropReferences.connect_same_thread (unassign_connections, boost::bind (&Slavable::weak_unassign, this, boost::weak_ptr<VCA>(v))); + AssignmentChange (v, true); } void @@ -144,13 +148,17 @@ Slavable::weak_unassign (boost::weak_ptr<VCA> v) void Slavable::unassign (boost::shared_ptr<VCA> v) { - Glib::Threads::RWLock::WriterLock lm (master_lock); - (void) unassign_controls (v); - if (v) { - _masters.erase (v->number()); - } else { - _masters.clear (); + { + Glib::Threads::RWLock::WriterLock lm (master_lock); + + (void) unassign_controls (v); + if (v) { + _masters.erase (v->number()); + } else { + _masters.clear (); + } } + AssignmentChange (v, false); } /* Gain, solo & mute are currently the only controls that are |