make ControlProtocolManager actually handle control protocols that fail to activate

This commit is contained in:
Paul Davis 2016-11-03 20:23:40 +00:00
parent 3abdef2637
commit 8fb8e1bbde
2 changed files with 16 additions and 6 deletions

View File

@ -93,7 +93,7 @@ class LIBARDOUR_API ControlProtocolManager : public PBD::Stateful, public ARDOUR
ControlProtocolDescriptor* get_descriptor (std::string path); ControlProtocolDescriptor* get_descriptor (std::string path);
ControlProtocolInfo* cpi_by_name (std::string); ControlProtocolInfo* cpi_by_name (std::string);
ControlProtocol* instantiate (ControlProtocolInfo&); ControlProtocol* instantiate (ControlProtocolInfo&);
int teardown (ControlProtocolInfo&); int teardown (ControlProtocolInfo&, bool lock_required);
}; };
} // namespace } // namespace

View File

@ -127,7 +127,10 @@ ControlProtocolManager::activate (ControlProtocolInfo& cpi)
cp->set_state (XMLNode(""), Stateful::loading_state_version); 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; return 0;
} }
@ -136,7 +139,7 @@ int
ControlProtocolManager::deactivate (ControlProtocolInfo& cpi) ControlProtocolManager::deactivate (ControlProtocolInfo& cpi)
{ {
cpi.requested = false; cpi.requested = false;
return teardown (cpi); return teardown (cpi, true);
} }
void void
@ -206,7 +209,7 @@ ControlProtocolManager::instantiate (ControlProtocolInfo& cpi)
} }
int int
ControlProtocolManager::teardown (ControlProtocolInfo& cpi) ControlProtocolManager::teardown (ControlProtocolInfo& cpi, bool lock_required)
{ {
if (!cpi.protocol) { if (!cpi.protocol) {
@ -240,7 +243,7 @@ ControlProtocolManager::teardown (ControlProtocolInfo& cpi)
cpi.descriptor->destroy (cpi.descriptor, cpi.protocol); cpi.descriptor->destroy (cpi.descriptor, cpi.protocol);
{ if (lock_required) {
Glib::Threads::Mutex::Lock lm (protocols_lock); Glib::Threads::Mutex::Lock lm (protocols_lock);
list<ControlProtocol*>::iterator p = find (control_protocols.begin(), control_protocols.end(), cpi.protocol); list<ControlProtocol*>::iterator p = find (control_protocols.begin(), control_protocols.end(), cpi.protocol);
if (p != control_protocols.end()) { if (p != control_protocols.end()) {
@ -248,6 +251,13 @@ ControlProtocolManager::teardown (ControlProtocolInfo& cpi)
} else { } else {
cerr << "Programming error: ControlProtocolManager::teardown() called for " << cpi.name << ", but it was not found in control_protocols" << endl; 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; cpi.protocol = 0;
@ -462,7 +472,7 @@ ControlProtocolManager::set_state (const XMLNode& node, int /*version*/)
} }
} else { } else {
if (_session) { if (_session) {
teardown (*cpi); teardown (*cpi, true);
} else { } else {
cpi->requested = false; cpi->requested = false;
} }