fix a bad transition in the transportFSM.
[ardour.git] / libs / ardour / vca.cc
index 3eff1a6b4554512f1274a5ef99ada88dffda9927..f867da48c8c1b50cf2cc50996fb74e1639f32984 100644 (file)
@@ -1,20 +1,21 @@
 /*
-  Copyright (C) 2016 Paul Davis
-
-  This program is free software; you can redistribute it and/or modify it
-  under the terms of the GNU General Public License as published by the Free
-  Software Foundation; either version 2 of the License, or (at your option)
-  any later version.
-
-  This program is distributed in the hope that it will be useful, but WITHOUT
-  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-  for more details.
-
-  You should have received a copy of the GNU General Public License along
-  with this program; if not, write to the Free Software Foundation, Inc.,
-  675 Mass Ave, Cambridge, MA 02139, USA.
-*/
+ * Copyright (C) 2016-2017 Paul Davis <paul@linuxaudiosystems.com>
+ * Copyright (C) 2017 Robin Gareus <robin@gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
 
 #include "pbd/convert.h"
 
@@ -91,6 +92,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 +166,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 +208,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;
+}