+ {
+ Glib::Threads::RWLock::WriterLock lm (master_lock);
+
+ unassign_controls (v);
+ if (v) {
+ _masters.erase (v->number());
+ } else {
+ _masters.clear ();
+ }
+ }
+ AssignmentChange (v, false);
+}
+
+bool
+Slavable::assign_controls (boost::shared_ptr<VCA> vca)
+{
+ bool rv = false;
+ SlavableControlList scl = slavables ();
+ for (SlavableControlList::iterator i = scl.begin(); i != scl.end(); ++i) {
+ rv |= assign_control (vca, *i);
+ }
+ return rv;
+}
+
+void
+Slavable::unassign_controls (boost::shared_ptr<VCA> vca)
+{
+ SlavableControlList scl = slavables ();
+ for (SlavableControlList::iterator i = scl.begin(); i != scl.end(); ++i) {
+ unassign_control (vca, *i);
+ }
+}
+
+bool
+Slavable::assign_control (boost::shared_ptr<VCA> vca, boost::shared_ptr<SlavableAutomationControl> slave)
+{
+ boost::shared_ptr<AutomationControl> master;
+ master = vca->automation_control (slave->parameter());
+ if (!master) {
+ return false;
+ }
+ slave->add_master (master);
+ return true;
+}
+
+void
+Slavable::unassign_control (boost::shared_ptr<VCA> vca, boost::shared_ptr<SlavableAutomationControl> slave)
+{
+ if (!vca) {
+ /* unassign from all */
+ slave->clear_masters ();
+ } else {
+ boost::shared_ptr<AutomationControl> master;
+ master = vca->automation_control (slave->parameter());
+ if (master) {
+ slave->remove_master (master);
+ }
+ }