Allow -ve framepos handling in TempoMap::framepos_plus_beats()
[ardour.git] / libs / ardour / control_protocol_manager.cc
index 7423d3b5c6a4c82ac464b1fd2d4b26c56d254369..a0a36c17dd2150480e4262d4caea12dd51a8fa14 100644 (file)
@@ -38,11 +38,27 @@ using namespace ARDOUR;
 using namespace std;
 using namespace PBD;
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 ControlProtocolManager* ControlProtocolManager::_instance = 0;
 const string ControlProtocolManager::state_node_name = X_("ControlProtocols");
 
+
+ControlProtocolInfo::~ControlProtocolInfo ()
+{
+       if (protocol && descriptor) {
+               descriptor->destroy (descriptor, protocol);
+               protocol = 0;
+       }
+
+       delete state; state = 0;
+
+       if (descriptor) {
+               delete (Glib::Module*) descriptor->module;
+               descriptor = 0;
+       }
+}
+
 ControlProtocolManager::ControlProtocolManager ()
 {
 }
@@ -168,7 +184,7 @@ ControlProtocolManager::instantiate (ControlProtocolInfo& cpi)
 
        cpi.descriptor = get_descriptor (cpi.path);
 
-       DEBUG_TRACE (DEBUG::ControlProtocols, string_compose ("instantiating %1\n", cpi.name));
+       DEBUG_TRACE (DEBUG::ControlProtocols, string_compose ("instantiating %1\n", cpi.name));
 
        if (cpi.descriptor == 0) {
                error << string_compose (_("control protocol name \"%1\" has no descriptor"), cpi.name) << endmsg;
@@ -410,28 +426,31 @@ ControlProtocolManager::set_state (const XMLNode& node, int /*version*/)
 {
        XMLNodeList clist;
        XMLNodeConstIterator citer;
-       XMLProperty* prop;
+       XMLProperty const * prop;
 
        Glib::Threads::Mutex::Lock lm (protocols_lock);
 
        clist = node.children();
 
        for (citer = clist.begin(); citer != clist.end(); ++citer) {
-               if ((*citer)->name() == X_("Protocol")) {
+               XMLNode const * child = *citer;
+
+               if (child->name() == X_("Protocol")) {
 
-                       if ((prop = (*citer)->property (X_("active"))) == 0) {
+                       if ((prop = child->property (X_("active"))) == 0) {
                                continue;
                        }
 
                        bool active = string_is_affirmative (prop->value());
 
-                       if ((prop = (*citer)->property (X_("name"))) == 0) {
+                       if ((prop = child->property (X_("name"))) == 0) {
                                continue;
                        }
 
                        ControlProtocolInfo* cpi = cpi_by_name (prop->value());
 
                        if (cpi) {
+                               delete cpi->state;
                                cpi->state = new XMLNode (**citer);
 
                                if (active) {