/*
- Copyright (C) 2000-2007 Paul Davis
+ Copyright (C) 2000-2007 Paul Davis
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include <dlfcn.h>
-#include <pbd/compose.h>
-#include <pbd/file_utils.h>
-#include <pbd/error.h>
+#include "pbd/compose.h"
+#include "pbd/file_utils.h"
+#include "pbd/error.h"
-#include <control_protocol/control_protocol.h>
+#include "control_protocol/control_protocol.h"
-#include <ardour/session.h>
-#include <ardour/control_protocol_manager.h>
-#include <ardour/control_protocol_search_path.h>
+#include "ardour/session.h"
+#include "ardour/control_protocol_manager.h"
+#include "ardour/control_protocol_search_path.h"
using namespace ARDOUR;
using namespace std;
const string ControlProtocolManager::state_node_name = X_("ControlProtocols");
ControlProtocolManager::ControlProtocolManager ()
+ : _session (0)
{
- if (_instance == 0) {
- _instance = this;
- }
- _session = 0;
}
ControlProtocolManager::~ControlProtocolManager()
control_protocols.clear ();
-
+
for (list<ControlProtocolInfo*>::iterator p = control_protocol_info.begin(); p != control_protocol_info.end(); ++p) {
delete (*p);
}
(*i)->requested = false;
if ((*i)->protocol && (*i)->state) {
- (*i)->protocol->set_state (*(*i)->state);
+ (*i)->protocol->set_state (*(*i)->state, Stateful::loading_state_version);
}
}
}
delete *p;
}
control_protocols.clear ();
-
+
for (list<ControlProtocolInfo*>::iterator p = control_protocol_info.begin(); p != control_protocol_info.end(); ++p) {
// otherwise the ControlProtocol instances are not recreated in set_session
if ((*p)->protocol) {
}
cpi.descriptor->destroy (cpi.descriptor, cpi.protocol);
-
+
{
Glib::Mutex::Lock lm (protocols_lock);
list<ControlProtocol*>::iterator p = find (control_protocols.begin(), control_protocols.end(), cpi.protocol);
cerr << "Programming error: ControlProtocolManager::teardown() called for " << cpi.name << ", but it was not found in control_protocol_info" << endl;
}
}
-
+
cpi.protocol = 0;
dlclose (cpi.descriptor->module);
return 0;
cpi->mandatory = descriptor->mandatory;
cpi->supports_feedback = descriptor->supports_feedback;
cpi->state = 0;
-
+
control_protocol_info.push_back (cpi);
-
+
info << string_compose(_("Control surface protocol discovered: \"%1\""), cpi->name) << endmsg;
}
}
int
-ControlProtocolManager::set_state (const XMLNode& node)
+ControlProtocolManager::set_state (const XMLNode& node, int version)
{
XMLNodeList clist;
XMLNodeConstIterator citer;
prop = (*citer)->property (X_("active"));
- if (prop && prop->value() == X_("yes")) {
+ if (prop && string_is_affirmative (prop->value())) {
if ((prop = (*citer)->property (X_("name"))) != 0) {
ControlProtocolInfo* cpi = cpi_by_name (prop->value());
if (cpi) {
} else {
cpi->state = 0;
}
-
+
if (_session) {
instantiate (*cpi);
} else {
}
}
}
- }
+ }
}
return 0;
}
cpi->state = new XMLNode (*child);
}
}
+
+ControlProtocolManager&
+ControlProtocolManager::instance ()
+{
+ if (_instance == 0) {
+ _instance = new ControlProtocolManager ();
+ }
+
+ return *_instance;
+}