change API for GainControl, VCA and VCAManager
[ardour.git] / libs / ardour / vca_manager.cc
index 476cd02bdad48775bad9c843098f3b81f74a4ce9..420396bf0732609a803f4a81e605f67306b48ea5 100644 (file)
 #include "ardour/vca.h"
 #include "ardour/vca_manager.h"
 
+#include "i18n.h"
+
 using namespace ARDOUR;
 using namespace Glib::Threads;
 using std::string;
 
+string VCAManager::xml_node_name (X_("VCAManager"));
 
 VCAManager::VCAManager (Session& s)
        : SessionHandleRef (s)
@@ -35,9 +38,17 @@ VCAManager::VCAManager (Session& s)
 
 VCAManager::~VCAManager ()
 {
+       clear ();
 }
 
-VCAManager::VCAS
+void
+VCAManager::clear ()
+{
+       Mutex::Lock lm (lock);
+       _vcas.clear ();
+}
+
+VCAList
 VCAManager::vcas () const
 {
        Mutex::Lock lm (lock);
@@ -58,7 +69,7 @@ VCAManager::create_vca (uint32_t howmany, std::string const & name_template)
                        string name = name_template;
 
                        if (name.find ("%n")) {
-                               string sn = PBD::to_string (n, std::dec);
+                               string sn = PBD::to_string (num, std::dec);
                                replace_all (name, "%n", sn);
                        }
 
@@ -94,7 +105,7 @@ VCAManager::vca_by_number (uint32_t n) const
 {
        Mutex::Lock lm (lock);
 
-       for (VCAS::const_iterator i = _vcas.begin(); i != _vcas.end(); ++i) {
+       for (VCAList::const_iterator i = _vcas.begin(); i != _vcas.end(); ++i) {
                if ((*i)->number() == n) {
                        return *i;
                }
@@ -102,3 +113,47 @@ VCAManager::vca_by_number (uint32_t n) const
 
        return boost::shared_ptr<VCA>();
 }
+
+XMLNode&
+VCAManager::get_state ()
+{
+       XMLNode* node = new XMLNode (xml_node_name);
+
+       {
+               Mutex::Lock lm (lock);
+
+               for (VCAList::const_iterator i = _vcas.begin(); i != _vcas.end(); ++i) {
+                       node->add_child_nocopy ((*i)->get_state());
+               }
+       }
+
+       return *node;
+}
+
+int
+VCAManager::set_state (XMLNode const& node, int version)
+{
+       if (node.name() != xml_node_name) {
+               return -1;
+       }
+
+       XMLNodeList const & children = node.children();
+       VCAList vcal;
+
+       {
+
+               Mutex::Lock lm (lock);
+
+               for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
+                       if ((*i)->name() == VCA::xml_node_name) {
+                               boost::shared_ptr<VCA> vca = boost::shared_ptr<VCA> (new VCA (_session, **i, version));
+                               _vcas.push_back (vca);
+                               vcal.push_back (vca);
+                       }
+               }
+       }
+
+       VCAAdded (vcal); /* EMIT SIGNAL */
+
+       return 0;
+}