[Re]-Implement Delayline flush.
[ardour.git] / libs / ardour / vca.cc
index 3eff1a6b4554512f1274a5ef99ada88dffda9927..b7b95d127137ed7832bc44b3d8ca840e8be9e213 100644 (file)
@@ -91,6 +91,12 @@ VCA::init ()
 VCA::~VCA ()
 {
        DEBUG_TRACE (DEBUG::Destruction, string_compose ("delete VCA %1\n", number()));
+       {
+               Glib::Threads::Mutex::Lock lm (_control_lock);
+               for (Controls::const_iterator li = _controls.begin(); li != _controls.end(); ++li) {
+                       boost::dynamic_pointer_cast<AutomationControl>(li->second)->drop_references ();
+               }
+       }
        {
                Glib::Threads::Mutex::Lock lm (number_lock);
                if (_number == next_number - 1) {
@@ -159,6 +165,8 @@ VCA::set_state (XMLNode const& node, int version)
                        }
                } else if ((*i)->name() == Slavable::xml_node_name) {
                        Slavable::set_state (**i, version);
+               } else if ((*i)->name() == Automatable::xml_node_name) {
+                       set_automation_xml_state (**i, Evoral::Parameter(NullAutomation));
                }
        }
 
@@ -199,3 +207,24 @@ VCA::slaved_to (boost::shared_ptr<VCA> vca) const
 
        return _gain_control->slaved_to (vca->gain_control());
 }
+
+void
+VCA::assign (boost::shared_ptr<VCA> v)
+{
+       /* prevent recursive assignments */
+       if (assigned_to (_session.vca_manager_ptr (), v)) {
+               warning << _("Master assignment inored to prevent recursion") << endmsg;
+               return;
+       }
+       Slavable::assign (v);
+}
+
+SlavableControlList
+VCA::slavables () const
+{
+       SlavableControlList rv;
+       rv.push_back (_gain_control);
+       rv.push_back (_mute_control);
+       rv.push_back (_solo_control);
+       return rv;
+}