summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2014-09-07 22:50:57 +0200
committerRobin Gareus <robin@gareus.org>2014-09-07 22:50:57 +0200
commitdc318e6e74d17e03e92c28618d03703a4034a843 (patch)
treedd645b3aaab60817a13c6402ff9df5e5910ba54b
parent330f5fdf2e14b22e8b64c1c037224b636f5df783 (diff)
ALSA|Dummy Backend: do as jack does:
when the backend is closed, unregister all ports.
-rw-r--r--libs/backends/alsa/alsa_audiobackend.cc7
-rw-r--r--libs/backends/alsa/alsa_audiobackend.h2
-rw-r--r--libs/backends/dummy/dummy_audiobackend.cc10
-rw-r--r--libs/backends/dummy/dummy_audiobackend.h2
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;