mirror of
https://github.com/mpv-player/mpv.git
synced 2025-12-28 05:33:14 +00:00
ao_alsa: handle XRUNs separately from other errors
According to ALSA doxy, EPIPE is a synonym to SND_PCM_STATE_XRUN, and that is a state that we should attempt to automatically recover from. In case recovery fails, log an error and return zero. A warning message will still be output for each XRUN since those are not something we should generally be receiving.
This commit is contained in:
@@ -947,10 +947,15 @@ static int get_space(struct ao *ao)
|
||||
|
||||
snd_pcm_sframes_t space = snd_pcm_avail(p->alsa);
|
||||
if (space < 0) {
|
||||
if (space == -EPIPE) {
|
||||
MP_WARN(ao, "ALSA XRUN hit, attempting to recover...\n");
|
||||
int err = snd_pcm_prepare(p->alsa);
|
||||
CHECK_ALSA_ERROR("Unable to recover from under/overrun!");
|
||||
return p->buffersize;
|
||||
}
|
||||
|
||||
MP_ERR(ao, "Error received from snd_pcm_avail (%ld, %s)!\n",
|
||||
space, snd_strerror(space));
|
||||
if (space == -EPIPE) // EOF
|
||||
return p->buffersize;
|
||||
|
||||
// request a reload of the AO if device is not present,
|
||||
// then error out.
|
||||
|
||||
Reference in New Issue
Block a user