Fixed midi controllable state saving/loading
authorJesse Chappell <jesse@essej.net>
Thu, 18 Jan 2007 06:39:22 +0000 (06:39 +0000)
committerJesse Chappell <jesse@essej.net>
Thu, 18 Jan 2007 06:39:22 +0000 (06:39 +0000)
git-svn-id: svn://localhost/ardour2/trunk@1356 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/ardour/session.h
libs/ardour/control_protocol_manager.cc
libs/ardour/io.cc
libs/ardour/panner.cc
libs/ardour/route.cc
libs/ardour/session_state.cc

index ae4a64802fbdaa926aa841c292bf7ca5c437ff61..92687c7dc0428fe2f443d3c4779869d4f21e1497 100644 (file)
@@ -1697,7 +1697,6 @@ class Session : public PBD::StatefulDestructible
 
        void config_changed (const char*);
 
-       void add_control_protocol (const ControlProtocolInfo* const, XMLNode*);
        XMLNode& get_control_protocol_state ();
        
 };
index de177d0e3d91c115e2a2854b94f3e6c0a7a9a337..72f56794d727bd17c0a2b44543456420953f9c75 100644 (file)
@@ -324,10 +324,25 @@ ControlProtocolManager::get_state (void)
        Glib::Mutex::Lock lm (protocols_lock);
 
        for (list<ControlProtocolInfo*>::iterator i = control_protocol_info.begin(); i != control_protocol_info.end(); ++i) {
-               XMLNode* child = new XMLNode (X_("Protocol"));
-               child->add_property (X_("name"), (*i)->name);
-               child->add_property (X_("active"), (*i)->protocol ? "yes" : "no");
-               root->add_child_nocopy (*child);
+
+               XMLNode * child;
+
+               if ((*i)->protocol) {
+                       child = &((*i)->protocol->get_state());
+                       child->add_property (X_("active"), "yes");
+                       // should we update (*i)->state here?  probably.
+                       root->add_child_nocopy (*child);
+               }
+               else if ((*i)->state) {
+                       // keep ownership clear
+                       root->add_child_copy (*(*i)->state);
+               }
+               else {
+                       child = new XMLNode (X_("Protocol"));
+                       child->add_property (X_("name"), (*i)->name);
+                       child->add_property (X_("active"), "no");
+                       root->add_child_nocopy (*child);
+               }
        }
 
        return *root;
index b4d9db97ebd8c2e5b27e2413c09d933830a60bca..5e99a14fada173e40b81e8d0c1d8da6304be3d03 100644 (file)
@@ -1634,8 +1634,10 @@ IO::set_state (const XMLNode& node)
                        set_automation_state (*(*iter)->children().front());
                }
 
-               if ((*iter)->name() == X_("gaincontrol")) {
-                       _gain_control.set_state (**iter);
+               if ((*iter)->name() == X_("controllable")) {
+                       if ((prop = (*iter)->property("name")) != 0 && prop->value() == "gaincontrol") {
+                               _gain_control.set_state (**iter);
+                       }
                }
        }
 
index 97646d99cd175a284aafde30a54f3b8ebfc626b6..09974a952903536b2fe93dc9a229292733346e8c 100644 (file)
@@ -534,9 +534,10 @@ EqualPowerStereoPanner::set_state (const XMLNode& node)
 
        for (XMLNodeConstIterator iter = node.children().begin(); iter != node.children().end(); ++iter) {
 
-               if ((*iter)->name() == X_("panner")) {
-
-                       _control.set_state (**iter);
+               if ((*iter)->name() == X_("controllable")) {
+                       if ((prop = (*iter)->property("name")) != 0 && prop->value() == "panner") {
+                               _control.set_state (**iter);
+                       }
 
                } else if ((*iter)->name() == X_("Automation")) {
 
index a322c10068bf81fd9719441440baed3691e5dc1b..d3097dd776120cdcdf00e68384e5bf52595373b7 100644 (file)
@@ -1687,13 +1687,19 @@ Route::_set_state (const XMLNode& node, bool call_base)
                        _comment = cmt->content();
 
                } else if (child->name() == X_("extra")) {
+
                        _extra_xml = new XMLNode (*child);
-               } else if (child->name() == X_("solo")) {
-                       _solo_control.set_state (*child);
-                       _session.add_controllable (&_solo_control);
-               } else if (child->name() == X_("mute")) {
-                       _mute_control.set_state (*child);
-                       _session.add_controllable (&_mute_control);
+
+               } else if (child->name() == X_("controllable") && (prop = child->property("name")) != 0) {
+                       
+                       if (prop->value() == "solo") {
+                               _solo_control.set_state (*child);
+                               _session.add_controllable (&_solo_control);
+                       }
+                       else if (prop->value() == "mute") {
+                               _mute_control.set_state (*child);
+                               _session.add_controllable (&_mute_control);
+                       }
                }
        }
 
index 1f8d20e16a952390ada6b91d28554365d1fdaf2a..3b66f65cecfd428a0c37a99fe0f8145eb2bd21be 100644 (file)
@@ -1040,19 +1040,7 @@ XMLNode&
 Session::get_control_protocol_state ()
 {
        ControlProtocolManager& cpm (ControlProtocolManager::instance());
-       XMLNode* node = new XMLNode (X_("ControlProtocols"));
-
-       cpm.foreach_known_protocol (bind (mem_fun (*this, &Session::add_control_protocol), node));
-       
-       return *node;
-}
-
-void
-Session::add_control_protocol (const ControlProtocolInfo* const cpi, XMLNode* node)
-{
-       if (cpi->protocol) {
-               node->add_child_nocopy (cpi->protocol->get_state());
-       }
+       return cpm.get_state();
 }
 
 int