diff --git a/libs/backends/alsa/alsa_audiobackend.cc b/libs/backends/alsa/alsa_audiobackend.cc index 4a128efdd7..19f0b15588 100644 --- a/libs/backends/alsa/alsa_audiobackend.cc +++ b/libs/backends/alsa/alsa_audiobackend.cc @@ -646,7 +646,7 @@ AlsaAudioBackend::stop () delete m; } - unregister_system_ports(); + unregister_ports(); delete _pcmi; _pcmi = 0; release_device(); @@ -1064,7 +1064,7 @@ AlsaAudioBackend::register_system_midi_ports() } void -AlsaAudioBackend::unregister_system_ports() +AlsaAudioBackend::unregister_ports (bool system_only) { size_t i = 0; _system_inputs.clear(); @@ -1073,8 +1073,9 @@ AlsaAudioBackend::unregister_system_ports() _system_midi_out.clear(); while (i < _ports.size ()) { AlsaPort* port = _ports[i]; - if (port->is_physical () && port->is_terminal ()) { + if (! system_only || (port->is_physical () && port->is_terminal ())) { port->disconnect_all (); + delete port; _ports.erase (_ports.begin() + i); } else { ++i; diff --git a/libs/backends/alsa/alsa_audiobackend.h b/libs/backends/alsa/alsa_audiobackend.h index d9721d1ccd..a1081141a8 100644 --- a/libs/backends/alsa/alsa_audiobackend.h +++ b/libs/backends/alsa/alsa_audiobackend.h @@ -368,7 +368,7 @@ class AlsaAudioBackend : public AudioBackend { PortHandle add_port (const std::string& shortname, ARDOUR::DataType, ARDOUR::PortFlags); int register_system_audio_ports (); int register_system_midi_ports (); - void unregister_system_ports (); + void unregister_ports (bool system_only = false); std::vector _ports; std::vector _system_inputs; diff --git a/libs/backends/dummy/dummy_audiobackend.cc b/libs/backends/dummy/dummy_audiobackend.cc index b7b7f955ff..e8a21df292 100644 --- a/libs/backends/dummy/dummy_audiobackend.cc +++ b/libs/backends/dummy/dummy_audiobackend.cc @@ -317,6 +317,9 @@ DummyAudioBackend::_start (bool /*for_latency_measurement*/) if (_ports.size()) { PBD::warning << _("DummyAudioBackend: recovering from unclean shutdown, port registry is not empty.") << endmsg; + for (std::vector::const_iterator it = _ports.begin (); it != _ports.end (); ++it) { + PBD::info << _("DummyAudioBackend: port '") << (*it)->name () << "' exists." << endmsg; + } _system_inputs.clear(); _ports.clear(); } @@ -366,7 +369,7 @@ DummyAudioBackend::stop () PBD::error << _("DummyAudioBackend: failed to terminate.") << endmsg; return -1; } - unregister_system_ports(); + unregister_ports(); return 0; } @@ -709,14 +712,15 @@ DummyAudioBackend::register_system_ports() } void -DummyAudioBackend::unregister_system_ports() +DummyAudioBackend::unregister_ports (bool system_only) { size_t i = 0; _system_inputs.clear(); while (i < _ports.size ()) { DummyPort* port = _ports[i]; - if (port->is_physical () && port->is_terminal ()) { + if (! system_only || (port->is_physical () && port->is_terminal ())) { port->disconnect_all (); + delete port; _ports.erase (_ports.begin() + i); } else { ++i; diff --git a/libs/backends/dummy/dummy_audiobackend.h b/libs/backends/dummy/dummy_audiobackend.h index 149fba871d..b28a464e3c 100644 --- a/libs/backends/dummy/dummy_audiobackend.h +++ b/libs/backends/dummy/dummy_audiobackend.h @@ -370,7 +370,7 @@ class DummyAudioBackend : public AudioBackend { /* port engine */ PortHandle add_port (const std::string& shortname, ARDOUR::DataType, ARDOUR::PortFlags); int register_system_ports (); - void unregister_system_ports (); + void unregister_ports (bool system_only = false); std::vector _system_inputs; std::vector _ports;