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 | |
parent | afa6720288fce4513dc16c9cb53562c051172c52 (diff) |
Add Slavable::AssignmentChanged signal to notify when a slavable is assigned/unassigned to/from a master
-rw-r--r-- | libs/ardour/ardour/slavable.h | 2 | ||||
-rw-r--r-- | libs/ardour/slavable.cc | 40 |
2 files changed, 26 insertions, 16 deletions
diff --git a/libs/ardour/ardour/slavable.h b/libs/ardour/ardour/slavable.h index 83675f0e22..5af954d51c 100644 --- a/libs/ardour/ardour/slavable.h +++ b/libs/ardour/ardour/slavable.h @@ -52,6 +52,8 @@ class LIBARDOUR_API Slavable void assign (boost::shared_ptr<VCA>); void unassign (boost::shared_ptr<VCA>); + PBD::Signal2<void,boost::shared_ptr<VCA>,bool> AssignmentChange; + virtual boost::shared_ptr<AutomationControl> automation_control (const Evoral::Parameter& id) = 0; static std::string xml_node_name; 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 |