summaryrefslogtreecommitdiffstats
path: root/audio/out/ao_alsa.c
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 /audio/out/ao_alsa.c
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.
Diffstat (limited to 'audio/out/ao_alsa.c')
-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);