diff options
author | wm4 <wm4@nowhere> | 2015-01-21 19:38:18 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2015-01-21 19:38:18 +0100 |
commit | c0077ac936da31e959c7c5cda1a758dc545e9443 (patch) | |
tree | 95c551db19c27cc22759e6582c6ccd2563d1d3b3 | |
parent | a0caadd512a6f531fd01638570883e629f9dc6e5 (diff) | |
download | mpv-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.c | 3 |
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); |