make ControlProtocolManager actually handle control protocols that fail to activate
This commit is contained in:
parent
3abdef2637
commit
8fb8e1bbde
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user