Revert "change return type of AutomationControl::actually_set_value() from void to...
[ardour.git] / libs / ardour / slavable_automation_control.cc
index 80da038afedfd50ac66088da14214cbca6f536a6..a80598439d3710100c9711a9ebac7df1bc2f83d6 100644 (file)
@@ -32,8 +32,9 @@ SlavableAutomationControl::SlavableAutomationControl(ARDOUR::Session& s,
                                                      const Evoral::Parameter&                  parameter,
                                                      const ParameterDescriptor&                desc,
                                                      boost::shared_ptr<ARDOUR::AutomationList> l,
-                                                     const std::string&                        name)
-       : AutomationControl (s, parameter, desc, l, name)
+                                                     const std::string&                        name,
+                                                     Controllable::Flag                        flags)
+       : AutomationControl (s, parameter, desc, l, name, flags)
 {
 }
 
@@ -127,9 +128,8 @@ SlavableAutomationControl::add_master (boost::shared_ptr<AutomationControl> m)
 
                /* ratio will be recomputed below */
 
-               PBD::ID id (m->id());
-
-               res = _masters.insert (make_pair<PBD::ID,MasterRecord> (id, MasterRecord (m, 1.0)));
+               pair<PBD::ID,MasterRecord> newpair (m->id(), MasterRecord (m, 1.0));
+               res = _masters.insert (newpair);
 
                if (res.second) {
 
@@ -140,10 +140,18 @@ SlavableAutomationControl::add_master (boost::shared_ptr<AutomationControl> m)
                           itself.
                        */
 
-                       m->DropReferences.connect_same_thread (masters_connections, boost::bind (&SlavableAutomationControl::master_going_away, this, m));
+                       m->DropReferences.connect_same_thread (masters_connections, boost::bind (&SlavableAutomationControl::master_going_away, this, boost::weak_ptr<AutomationControl>(m)));
+
+                       /* Store the connection inside the MasterRecord, so
+                          that when we destroy it, the connection is destroyed
+                          and we no longer hear about changes to the
+                          AutomationControl. 
 
-                       /* Store the connection inside the MasterRecord, so that when we destroy it, the connection is destroyed
-                          and we no longer hear about changes to the AutomationControl.
+                          Note that this also makes it safe to store a
+                          boost::shared_ptr<AutomationControl> in the functor,
+                          since we know we will destroy the functor when the 
+                          connection is destroyed, which happens when we
+                          disconnect from the master (for any reason).
 
                           Note that we fix the "from_self" argument that will
                           be given to our own Changed signal to "false",
@@ -247,13 +255,18 @@ SlavableAutomationControl::remove_master (boost::shared_ptr<AutomationControl> m
                Glib::Threads::RWLock::WriterLock lm (master_lock);
                current_value = get_value_locked ();
                erased = _masters.erase (m->id());
-               if (erased) {
+               if (erased && !_session.deletion_in_progress()) {
                        recompute_masters_ratios (current_value);
                }
                masters_left = _masters.size ();
                new_value = get_value_locked ();
        }
 
+       if (_session.deletion_in_progress()) {
+               /* no reason to care about new values or sending signals */
+               return;
+       }
+
        if (erased) {
                MasterStatusChange (); /* EMIT SIGNAL */
        }