Persistent ctrl-surface state
authorRobin Gareus <robin@gareus.org>
Wed, 3 Oct 2018 23:36:51 +0000 (01:36 +0200)
committerRobin Gareus <robin@gareus.org>
Wed, 3 Oct 2018 23:36:51 +0000 (01:36 +0200)
Keep latest surface configuration, regardless if surface is active
or being deactivated. Current state after de-activation is retained.

Currently state loaded from a session overrides global state from
global preferences, if the surface is marked active in the session.
This is to allow midi-learn.

generic-midi and session-specific midi-learn will require additional
work.

libs/ardour/control_protocol_manager.cc

index c2929a396870a5dc1ba660812f70f97f51570832..c1c595ebb29ee6363e4b0dc9ce0e47a13a197db1 100644 (file)
@@ -266,6 +266,7 @@ ControlProtocolManager::teardown (ControlProtocolInfo& cpi, bool lock_required)
        cpi.descriptor->destroy (cpi.descriptor, cpi.protocol);
 
        if (lock_required) {
+               /* the lock is required when the protocol is torn down by a user from the GUI. */
                Glib::Threads::RWLock::WriterLock lm (protocols_lock);
                list<ControlProtocol*>::iterator p = find (control_protocols.begin(), control_protocols.end(), cpi.protocol);
                if (p != control_protocols.end()) {
@@ -284,14 +285,6 @@ ControlProtocolManager::teardown (ControlProtocolInfo& cpi, bool lock_required)
 
        cpi.protocol = 0;
 
-       if (lock_required) {
-               /* the lock is only required when the protocol is torn down from the GUI.
-                * If a user disables a protocol, we take this as indicator to forget the
-                * state.
-                */
-               delete cpi.state;
-               cpi.state = 0;
-       }
        delete (Glib::Module*) cpi.descriptor->module;
        /* cpi->descriptor is now inaccessible since dlclose() or equivalent
         * has been performed, and the descriptor is (or could be) a static
@@ -525,6 +518,8 @@ ControlProtocolManager::get_state ()
                if ((*i)->protocol) {
                        XMLNode& child_state ((*i)->protocol->get_state());
                        child_state.set_property (X_("active"), true);
+                       delete ((*i)->state);
+                       (*i)->state = new XMLNode (child_state);
                        root->add_child_nocopy (child_state);
                } else if ((*i)->state) {
                        XMLNode* child_state = new XMLNode (*(*i)->state);