summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-11-03 20:23:40 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2016-11-03 20:24:09 +0000
commit8fb8e1bbde25f996533e345ba515a7411525916a (patch)
treedf9ad01ca60da96493d1a9ca36765687db3dd5ee
parent3abdef263741db533f9c0e37251ea4905bbf486b (diff)
make ControlProtocolManager actually handle control protocols that fail to activate
-rw-r--r--libs/ardour/ardour/control_protocol_manager.h2
-rw-r--r--libs/ardour/control_protocol_manager.cc20
2 files changed, 16 insertions, 6 deletions
diff --git a/libs/ardour/ardour/control_protocol_manager.h b/libs/ardour/ardour/control_protocol_manager.h
index c6ea045ce1..2dddc30aca 100644
--- a/libs/ardour/ardour/control_protocol_manager.h
+++ b/libs/ardour/ardour/control_protocol_manager.h
@@ -93,7 +93,7 @@ class LIBARDOUR_API ControlProtocolManager : public PBD::Stateful, public ARDOUR
ControlProtocolDescriptor* get_descriptor (std::string path);
ControlProtocolInfo* cpi_by_name (std::string);
ControlProtocol* instantiate (ControlProtocolInfo&);
- int teardown (ControlProtocolInfo&);
+ int teardown (ControlProtocolInfo&, bool lock_required);
};
} // namespace
diff --git a/libs/ardour/control_protocol_manager.cc b/libs/ardour/control_protocol_manager.cc
index 0a21ade1d8..ca8f21e879 100644
--- a/libs/ardour/control_protocol_manager.cc
+++ b/libs/ardour/control_protocol_manager.cc
@@ -127,7 +127,10 @@ ControlProtocolManager::activate (ControlProtocolInfo& cpi)
cp->set_state (XMLNode(""), Stateful::loading_state_version);
}
- cp->set_active (true);
+ if (cp->set_active (true)) {
+ error << string_compose (_("Control protocol support for %1 failed to activate"), cpi.name) << endmsg;
+ teardown (cpi, false);
+ }
return 0;
}
@@ -136,7 +139,7 @@ int
ControlProtocolManager::deactivate (ControlProtocolInfo& cpi)
{
cpi.requested = false;
- return teardown (cpi);
+ return teardown (cpi, true);
}
void
@@ -206,7 +209,7 @@ ControlProtocolManager::instantiate (ControlProtocolInfo& cpi)
}
int
-ControlProtocolManager::teardown (ControlProtocolInfo& cpi)
+ControlProtocolManager::teardown (ControlProtocolInfo& cpi, bool lock_required)
{
if (!cpi.protocol) {
@@ -240,7 +243,7 @@ ControlProtocolManager::teardown (ControlProtocolInfo& cpi)
cpi.descriptor->destroy (cpi.descriptor, cpi.protocol);
- {
+ if (lock_required) {
Glib::Threads::Mutex::Lock lm (protocols_lock);
list<ControlProtocol*>::iterator p = find (control_protocols.begin(), control_protocols.end(), cpi.protocol);
if (p != control_protocols.end()) {
@@ -248,6 +251,13 @@ ControlProtocolManager::teardown (ControlProtocolInfo& cpi)
} else {
cerr << "Programming error: ControlProtocolManager::teardown() called for " << cpi.name << ", but it was not found in control_protocols" << endl;
}
+ } else {
+ list<ControlProtocol*>::iterator p = find (control_protocols.begin(), control_protocols.end(), cpi.protocol);
+ if (p != control_protocols.end()) {
+ control_protocols.erase (p);
+ } else {
+ cerr << "Programming error: ControlProtocolManager::teardown() called for " << cpi.name << ", but it was not found in control_protocols" << endl;
+ }
}
cpi.protocol = 0;
@@ -462,7 +472,7 @@ ControlProtocolManager::set_state (const XMLNode& node, int /*version*/)
}
} else {
if (_session) {
- teardown (*cpi);
+ teardown (*cpi, true);
} else {
cpi->requested = false;
}