diff options
Diffstat (limited to 'audio/out/ao_alsa.c')
-rw-r--r-- | audio/out/ao_alsa.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/audio/out/ao_alsa.c b/audio/out/ao_alsa.c index 6b755a6d5c..081f9efebf 100644 --- a/audio/out/ao_alsa.c +++ b/audio/out/ao_alsa.c @@ -712,14 +712,20 @@ static int audio_wait(struct ao *ao, pthread_mutex_t *lock) err = snd_pcm_poll_descriptors(p->alsa, fds, num_fds); CHECK_ALSA_ERROR("cannot get pollfds"); - int r = ao_wait_poll(ao, fds, num_fds, lock); - if (r < 0) - return r; - - unsigned short revents; - snd_pcm_poll_descriptors_revents(p->alsa, fds, num_fds, &revents); - CHECK_ALSA_ERROR("cannot read poll events"); - + while (1) { + int r = ao_wait_poll(ao, fds, num_fds, lock); + if (r) + return r; + + unsigned short revents; + snd_pcm_poll_descriptors_revents(p->alsa, fds, num_fds, &revents); + CHECK_ALSA_ERROR("cannot read poll events"); + + if (revents & POLLERR) + return -1; + if (revents & POLLOUT) + return 0; + } return 0; alsa_error: |