summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--audio/out/ao_sdl.c1
-rw-r--r--audio/out/pull.c9
2 files changed, 8 insertions, 2 deletions
diff --git a/audio/out/ao_sdl.c b/audio/out/ao_sdl.c
index 6144918dfe..1390eb64d0 100644
--- a/audio/out/ao_sdl.c
+++ b/audio/out/ao_sdl.c
@@ -205,6 +205,7 @@ const struct ao_driver audio_out_sdl = {
.uninit = uninit,
.reset = reset,
.resume = resume,
+ .reports_underruns = true,
.priv_size = sizeof(struct priv),
.priv_defaults = &(const struct priv) {
.buflen = 0, // use SDL default
diff --git a/audio/out/pull.c b/audio/out/pull.c
index c6125bd8bc..985d6d9f67 100644
--- a/audio/out/pull.c
+++ b/audio/out/pull.c
@@ -153,8 +153,13 @@ int ao_read_data(struct ao *ao, void **data, int samples, int64_t out_time_us)
int buffered_bytes = mp_ring_buffered(p->buffers[0]);
bytes = MPMIN(buffered_bytes, full_bytes);
- if (full_bytes > bytes && !atomic_load(&p->draining))
- atomic_fetch_add(&p->underflow, (full_bytes - bytes) / ao->sstride);
+ if (full_bytes > bytes && !atomic_load(&p->draining)) {
+ if (ao->driver->reports_underruns) {
+ ao_underrun_event(ao);
+ } else {
+ atomic_fetch_add(&p->underflow, (full_bytes - bytes) / ao->sstride);
+ }
+ }
if (bytes > 0)
atomic_store(&p->end_time_us, out_time_us);