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);
|
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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user