X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fcontrol_protocol_manager.cc;h=ca8f21e87959aa812cccb8831f8799e4edb9088c;hb=66163305317e8acf20c4a16b9709fc809d6a0ff9;hp=b2c91539913211ef369c6a54e8b69e1938565176;hpb=4991bf5a1a72720e2f91e2b9e91cfc034c384436;p=ardour.git diff --git a/libs/ardour/control_protocol_manager.cc b/libs/ardour/control_protocol_manager.cc index b2c9153991..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::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::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; @@ -346,8 +356,7 @@ ControlProtocolManager::control_protocol_discover (string path) if ((descriptor = get_descriptor (path)) != 0) { if (!descriptor->probe (descriptor)) { - DEBUG_TRACE (DEBUG::ControlProtocols, - string_compose (_("Control protocol %1 not usable"), descriptor->name)); + warning << string_compose (_("Control protocol %1 not usable"), descriptor->name) << endmsg; } else { ControlProtocolInfo* cpi = new ControlProtocolInfo (); @@ -463,7 +472,7 @@ ControlProtocolManager::set_state (const XMLNode& node, int /*version*/) } } else { if (_session) { - teardown (*cpi); + teardown (*cpi, true); } else { cpi->requested = false; }