summaryrefslogtreecommitdiffstats
path: root/audio/out/push.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-05-30 23:54:11 +0200
committerwm4 <wm4@nowhere>2014-05-30 23:54:11 +0200
commit9c9f23eee90f1df49098080dee0c10c7b9883ea6 (patch)
treee8fd06855ea72198a3672e9f131b9c503a820434 /audio/out/push.c
parent3053a68d2dffe79106e9515f5978de3e184f2594 (diff)
downloadmpv-9c9f23eee90f1df49098080dee0c10c7b9883ea6.tar.bz2
mpv-9c9f23eee90f1df49098080dee0c10c7b9883ea6.tar.xz
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.
Diffstat (limited to 'audio/out/push.c')
-rw-r--r--audio/out/push.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/audio/out/push.c b/audio/out/push.c
index 409a5f50e0..cd7b8dc329 100644
--- a/audio/out/push.c
+++ b/audio/out/push.c
@@ -410,7 +410,7 @@ int ao_play_silence(struct ao *ao, int samples)
// Call poll() for the given fds. This will extend the given fds with the
// wakeup pipe, so ao_wakeup_poll() will basically interrupt this function.
// Unlocks the lock temporarily.
-// Returns <0 on error, 0 on success.
+// Returns <0 on error, 0 on success, 1 if the caller should return immediately.
int ao_wait_poll(struct ao *ao, struct pollfd *fds, int num_fds,
pthread_mutex_t *lock)
{
@@ -434,13 +434,15 @@ int ao_wait_poll(struct ao *ao, struct pollfd *fds, int num_fds,
pthread_mutex_lock(&p->lock);
memcpy(fds, p_fds, num_fds * sizeof(fds[0]));
+ bool wakeup = false;
if (p_fds[num_fds].revents & POLLIN) {
+ wakeup = true;
// flush the wakeup pipe contents - might "drown" some wakeups, but
// that's ok for our use-case
char buf[100];
read(p->wakeup_pipe[0], buf, sizeof(buf));
}
- return (r >= 0 || r == -EINTR) ? 0 : -1;
+ return (r >= 0 || r == -EINTR) ? wakeup : -1;
}
void ao_wakeup_poll(struct ao *ao)