fixes for various bugs including dangling ref to route in session, opening sessions...
[ardour.git] / libs / ardour / control_protocol_manager.cc
index ca1eefc3feebd9df127e42b6607f962ce2e1727c..5c02936ba03acebb72e30c5599ff0092dd3d2519 100644 (file)
@@ -4,17 +4,14 @@
 #include <pbd/error.h>
 #include <pbd/pathscanner.h>
 
-#include "control_protocol.h"
+#include <control_protocol/control_protocol.h>
 
 #include <ardour/session.h>
 #include <ardour/control_protocol_manager.h>
 
-
-
-
 using namespace ARDOUR;
-using namespace PBD;
 using namespace std;
+using namespace PBD;
 
 #include "i18n.h"
 
@@ -32,7 +29,7 @@ ControlProtocolManager::ControlProtocolManager ()
 
 ControlProtocolManager::~ControlProtocolManager()
 {
-       LockMonitor lm (protocols_lock, __LINE__, __FILE__);
+       Glib::Mutex::Lock lm (protocols_lock);
 
        for (list<ControlProtocol*>::iterator i = control_protocols.begin(); i != control_protocols.end(); ++i) {
                delete (*i);
@@ -46,12 +43,16 @@ void
 ControlProtocolManager::set_session (Session& s)
 {
        _session = &s;
-       _session->going_away.connect (mem_fun (*this, &ControlProtocolManager::drop_session));
+       _session->GoingAway.connect (mem_fun (*this, &ControlProtocolManager::drop_session));
 
        for (list<ControlProtocolInfo*>::iterator i = control_protocol_info.begin(); i != control_protocol_info.end(); ++i) {
                if ((*i)->requested || (*i)->mandatory) {
                        instantiate (**i);
                        (*i)->requested = false;
+
+                       if ((*i)->state) {
+                               (*i)->protocol->set_state (*(*i)->state);
+                       }
                }
        }
 }
@@ -62,7 +63,7 @@ ControlProtocolManager::drop_session ()
        _session = 0;
 
        {
-               LockMonitor lm (protocols_lock, __LINE__, __FILE__);
+               Glib::Mutex::Lock lm (protocols_lock);
                for (list<ControlProtocol*>::iterator p = control_protocols.begin(); p != control_protocols.end(); ++p) {
                        delete *p;
                }
@@ -89,7 +90,7 @@ ControlProtocolManager::instantiate (ControlProtocolInfo& cpi)
                return 0;
        }
 
-       LockMonitor lm (protocols_lock, __LINE__, __FILE__);
+       Glib::Mutex::Lock lm (protocols_lock);
        control_protocols.push_back (cpi.protocol);
 
        return cpi.protocol;
@@ -113,7 +114,7 @@ ControlProtocolManager::teardown (ControlProtocolInfo& cpi)
        cpi.descriptor->destroy (cpi.descriptor, cpi.protocol);
        
        {
-               LockMonitor lm (protocols_lock, __LINE__, __FILE__);
+               Glib::Mutex::Lock lm (protocols_lock);
                list<ControlProtocol*>::iterator p = find (control_protocols.begin(), control_protocols.end(), cpi.protocol);
                if (p != control_protocols.end()) {
                        control_protocols.erase (p);
@@ -184,6 +185,7 @@ ControlProtocolManager::control_protocol_discover (string path)
                        cpi->protocol = 0;
                        cpi->requested = false;
                        cpi->mandatory = descriptor->mandatory;
+                       cpi->state = 0;
                        
                        control_protocol_info.push_back (cpi);
                        
@@ -281,7 +283,7 @@ XMLNode&
 ControlProtocolManager::get_state (void)
 {
        XMLNode* root = new XMLNode (state_node_name);
-       LockMonitor lm (protocols_lock, __LINE__, __FILE__);
+       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"));