summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-01-21 19:38:18 +0100
committerwm4 <wm4@nowhere>2015-01-21 19:38:18 +0100
commitc0077ac936da31e959c7c5cda1a758dc545e9443 (patch)
tree95c551db19c27cc22759e6582c6ccd2563d1d3b3
parenta0caadd512a6f531fd01638570883e629f9dc6e5 (diff)
downloadmpv-c0077ac936da31e959c7c5cda1a758dc545e9443.tar.bz2
mpv-c0077ac936da31e959c7c5cda1a758dc545e9443.tar.xz
ao_alsa: reinitialize if device got broken
Apparently, physically disconnecting the audio device (consider USB audio) breaks the ALSA device handle forever. It will signal ENODEV. Fortunately, it's easy for us to handle this, and we can just use existing mechanisms that will make the playback core close and reopen the AO. Whether the immediate reopening will actually succeeds really is ALSA's problem, though.
-rw-r--r--audio/out/ao_alsa.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/audio/out/ao_alsa.c b/audio/out/ao_alsa.c
index 014cd837af..dba6b19514 100644
--- a/audio/out/ao_alsa.c
+++ b/audio/out/ao_alsa.c
@@ -822,6 +822,9 @@ static int play(struct ao *ao, void **data, int samples, int flags)
if (res == -EINTR || res == -EAGAIN) { /* retry */
res = 0;
+ } else if (res == -ENODEV) {
+ MP_WARN(ao, "Device lost, trying to recover...\n");
+ ao_request_reload(ao);
} else if (res < 0) {
if (res == -ESTRPIPE) { /* suspend */
resume_device(ao);