summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-12-12 18:43:47 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2016-12-12 18:43:55 +0000
commite37bfffca5692509ede7481b7cadda7606cc3e17 (patch)
treedc62d7340f94ce918c1f4ee020d7f810bf3bf2da
parentafa6720288fce4513dc16c9cb53562c051172c52 (diff)
Add Slavable::AssignmentChanged signal to notify when a slavable is assigned/unassigned to/from a master
-rw-r--r--libs/ardour/ardour/slavable.h2
-rw-r--r--libs/ardour/slavable.cc40
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