mirror of
https://github.com/mpv-player/mpv
synced 2024-12-21 14:22:17 +00:00
ao_alsa: fix resuming from suspend mode
snd_pcm_prepare() was not always called, which could result in an infinite loop. Whether snd_pcm_prepare() was actually called depended on whether the device was a hw device (or other characteristics; depending on snd_pcm_hw_params_can_pause()), and required real suspend (annoying for testing), so it was somewhat tricky to reproduce without knowing these things.
This commit is contained in:
parent
4cfd641f05
commit
d7b5484f51
@ -745,7 +745,7 @@ static void audio_pause(struct ao *ao)
|
|||||||
alsa_error: ;
|
alsa_error: ;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void audio_resume(struct ao *ao)
|
static void resume_device(struct ao *ao)
|
||||||
{
|
{
|
||||||
struct priv *p = ao->priv;
|
struct priv *p = ao->priv;
|
||||||
int err;
|
int err;
|
||||||
@ -756,6 +756,12 @@ static void audio_resume(struct ao *ao)
|
|||||||
while ((err = snd_pcm_resume(p->alsa)) == -EAGAIN)
|
while ((err = snd_pcm_resume(p->alsa)) == -EAGAIN)
|
||||||
sleep(1);
|
sleep(1);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void audio_resume(struct ao *ao)
|
||||||
|
{
|
||||||
|
struct priv *p = ao->priv;
|
||||||
|
int err;
|
||||||
|
|
||||||
if (p->can_pause) {
|
if (p->can_pause) {
|
||||||
if (snd_pcm_state(p->alsa) == SND_PCM_STATE_PAUSED) {
|
if (snd_pcm_state(p->alsa) == SND_PCM_STATE_PAUSED) {
|
||||||
@ -807,10 +813,12 @@ static int play(struct ao *ao, void **data, int samples, int flags)
|
|||||||
|
|
||||||
if (res == -EINTR || res == -EAGAIN) { /* retry */
|
if (res == -EINTR || res == -EAGAIN) { /* retry */
|
||||||
res = 0;
|
res = 0;
|
||||||
} else if (res == -ESTRPIPE) { /* suspend */
|
|
||||||
audio_resume(ao);
|
|
||||||
} else if (res < 0) {
|
} else if (res < 0) {
|
||||||
MP_ERR(ao, "Write error: %s\n", snd_strerror(res));
|
if (res == -ESTRPIPE) { /* suspend */
|
||||||
|
resume_device(ao);
|
||||||
|
} else {
|
||||||
|
MP_ERR(ao, "Write error: %s\n", snd_strerror(res));
|
||||||
|
}
|
||||||
res = snd_pcm_prepare(p->alsa);
|
res = snd_pcm_prepare(p->alsa);
|
||||||
int err = res;
|
int err = res;
|
||||||
CHECK_ALSA_ERROR("pcm prepare error");
|
CHECK_ALSA_ERROR("pcm prepare error");
|
||||||
|
Loading…
Reference in New Issue
Block a user