diff options
author | Robin Gareus <robin@gareus.org> | 2014-09-07 22:50:57 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2014-09-07 22:50:57 +0200 |
commit | dc318e6e74d17e03e92c28618d03703a4034a843 (patch) | |
tree | dd645b3aaab60817a13c6402ff9df5e5910ba54b | |
parent | 330f5fdf2e14b22e8b64c1c037224b636f5df783 (diff) |
ALSA|Dummy Backend: do as jack does:
when the backend is closed, unregister all ports.
-rw-r--r-- | libs/backends/alsa/alsa_audiobackend.cc | 7 | ||||
-rw-r--r-- | libs/backends/alsa/alsa_audiobackend.h | 2 | ||||
-rw-r--r-- | libs/backends/dummy/dummy_audiobackend.cc | 10 | ||||
-rw-r--r-- | libs/backends/dummy/dummy_audiobackend.h | 2 |
4 files changed, 13 insertions, 8 deletions
diff --git a/libs/backends/alsa/alsa_audiobackend.cc b/libs/backends/alsa/alsa_audiobackend.cc index 5afa637bba..834ea41e49 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(); @@ -1057,7 +1057,7 @@ AlsaAudioBackend::register_system_midi_ports() } void -AlsaAudioBackend::unregister_system_ports() +AlsaAudioBackend::unregister_ports (bool system_only) { size_t i = 0; _system_inputs.clear(); @@ -1066,8 +1066,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 6f54ba2f1c..29866ed4d5 100644 --- a/libs/backends/alsa/alsa_audiobackend.h +++ b/libs/backends/alsa/alsa_audiobackend.h @@ -366,7 +366,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<AlsaPort *> _ports; std::vector<AlsaPort *> _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<DummyPort*>::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<DummyAudioPort *> _system_inputs; std::vector<DummyPort *> _ports; |