From 9c9f23eee90f1df49098080dee0c10c7b9883ea6 Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 30 May 2014 23:54:11 +0200 Subject: ao_alsa: reduce spurious wakeups Apparently this can happen. So actually only return from waiting if ALSA excplicitly signals that new output is available, or if we are woken up externally. --- audio/out/ao_alsa.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) (limited to 'audio/out/ao_alsa.c') 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: -- cgit v1.2.3