diff options
-rw-r--r-- | audio/out/pull.c | 11 | ||||
-rw-r--r-- | input/input.c | 6 | ||||
-rw-r--r-- | input/input.h | 2 |
3 files changed, 17 insertions, 2 deletions
diff --git a/audio/out/pull.c b/audio/out/pull.c index 01e581925d..4b0dc6e890 100644 --- a/audio/out/pull.c +++ b/audio/out/pull.c @@ -26,6 +26,8 @@ #include "common/msg.h" #include "common/common.h" +#include "input/input.h" + #include "osdep/timer.h" #include "osdep/threads.h" #include "compat/atomics.h" @@ -110,8 +112,8 @@ int ao_read_data(struct ao *ao, void **data, int samples, int64_t out_time_us) // Since the writer will write the first plane last, its buffered amount // of data is the minimum amount across all planes. - int bytes = mp_ring_buffered(p->buffers[0]); - bytes = MPMIN(bytes, full_bytes); + int buffered_bytes = mp_ring_buffered(p->buffers[0]); + int bytes = MPMIN(buffered_bytes, full_bytes); if (bytes > 0) p->end_time_us = out_time_us; @@ -128,6 +130,11 @@ int ao_read_data(struct ao *ao, void **data, int samples, int64_t out_time_us) if (silence) af_fill_silence((char *)data[n] + bytes, silence, ao->format); } + + // Half of the buffer played -> request more. + if (buffered_bytes - bytes <= mp_ring_size(p->buffers[0]) / 2) + mp_input_wakeup_nolock(ao->input_ctx); + return bytes / ao->sstride; } diff --git a/input/input.c b/input/input.c index cc36020af7..349803663e 100644 --- a/input/input.c +++ b/input/input.c @@ -1653,6 +1653,12 @@ void mp_input_wakeup(struct input_ctx *ictx) write(ictx->wakeup_pipe[1], &(char){0}, 1); } +void mp_input_wakeup_nolock(struct input_ctx *ictx) +{ + if (ictx->wakeup_pipe[1] >= 0) + write(ictx->wakeup_pipe[1], &(char){0}, 1); +} + static bool test_abort(struct input_ctx *ictx) { if (async_quit_request || queue_has_abort_cmds(&ictx->cmd_queue)) { diff --git a/input/input.h b/input/input.h index 6e2e0f7046..512d0457bf 100644 --- a/input/input.h +++ b/input/input.h @@ -206,6 +206,8 @@ void mp_input_uninit(struct input_ctx *ictx); // Wake up sleeping input loop from another thread. void mp_input_wakeup(struct input_ctx *ictx); +void mp_input_wakeup_nolock(struct input_ctx *ictx); + // Interruptible usleep: (used by demux) int mp_input_check_interrupt(struct input_ctx *ictx, int time); |