- Glib::Threads::RWLock::WriterLock lm (master_lock);
- (void) unassign_controls (v);
- _masters.erase (v->number());
+ {
+ Glib::Threads::RWLock::WriterLock lm (master_lock);
+
+ (void) unassign_controls (v);
+ if (v) {
+ _masters.erase (v->number());
+ } else {
+ _masters.clear ();
+ }
+ }
+ AssignmentChange (v, false);
+}
+
+int
+Slavable::assign_controls (boost::shared_ptr<VCA> vca, bool loading)
+{
+ boost::shared_ptr<SlavableAutomationControl> slave;
+ boost::shared_ptr<AutomationControl> master;
+
+ for (uint32_t n = 0; auto_slave_types[n] != NullAutomation; ++n) {
+
+ slave = boost::dynamic_pointer_cast<SlavableAutomationControl> (automation_control (auto_slave_types[n]));
+ master = vca->automation_control (auto_slave_types[n]);
+
+ if (slave && master) {
+ slave->add_master (master, loading);
+ }
+ }
+
+ return 0;
+}
+
+int
+Slavable::unassign_controls (boost::shared_ptr<VCA> vca)
+{
+ boost::shared_ptr<SlavableAutomationControl> slave;
+ boost::shared_ptr<AutomationControl> master;
+
+ for (uint32_t n = 0; auto_slave_types[n] != NullAutomation; ++n) {
+
+ slave = boost::dynamic_pointer_cast<SlavableAutomationControl> (automation_control (auto_slave_types[n]));
+
+ if (!vca) {
+ /* unassign from all */
+ if (slave) {
+ slave->clear_masters ();
+ }
+ } else {
+ master = vca->automation_control (auto_slave_types[n]);
+ if (slave && master) {
+ slave->remove_master (master);
+ }
+ }
+ }
+
+ return 0;