From 3d8c7c40b5cc16eaf7bd1fb72c17783ce42e2d0e Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 20 Oct 2023 09:57:52 +0200 Subject: [PATCH] stream: improve queued_buffers reporting Also add the queued buffers in the converter to the pw_time.queued_buffers field. This means that queued_buffers + avail_buffers always equal the total amount of allocated buffers, which makes more sense. Fixes #3592 --- src/pipewire/stream.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/pipewire/stream.c b/src/pipewire/stream.c index 25051d64f..db2c3f7b7 100644 --- a/src/pipewire/stream.c +++ b/src/pipewire/stream.c @@ -2340,6 +2340,7 @@ int pw_stream_get_time_n(struct pw_stream *stream, struct pw_time *time, size_t struct stream *impl = SPA_CONTAINER_OF(stream, struct stream, this); uintptr_t seq1, seq2; uint32_t buffered, quantum, index; + int32_t avail_buffers; do { seq1 = SPA_SEQ_READ(impl->seq); @@ -2358,19 +2359,23 @@ int pw_stream_get_time_n(struct pw_stream *stream, struct pw_time *time, size_t time->delay += (impl->latency.min_rate + impl->latency.max_rate) / 2; time->delay += ((impl->latency.min_ns + impl->latency.max_ns) / 2) * time->rate.denom / SPA_NSEC_PER_SEC; + avail_buffers = spa_ringbuffer_get_read_index(&impl->dequeued.ring, &index); + avail_buffers = SPA_CLAMP(avail_buffers, 0, (int32_t)impl->n_buffers); + if (size >= offsetof(struct pw_time, queued_buffers)) time->buffered = buffered; if (size >= offsetof(struct pw_time, avail_buffers)) - time->queued_buffers = spa_ringbuffer_get_read_index(&impl->queued.ring, &index); + time->queued_buffers = impl->n_buffers - avail_buffers; if (size >= sizeof(struct pw_time)) - time->avail_buffers = spa_ringbuffer_get_read_index(&impl->dequeued.ring, &index); + time->avail_buffers = avail_buffers; pw_log_trace_fp("%p: %"PRIi64" %"PRIi64" %"PRIu64" %d/%d %"PRIu64" %" - PRIu64" %"PRIu64" %"PRIu64" %"PRIu64, stream, + PRIu64" %"PRIu64" %"PRIu64" %"PRIu64" %d/%d", stream, time->now, time->delay, time->ticks, time->rate.num, time->rate.denom, time->queued, impl->dequeued.outcount, impl->dequeued.incount, - impl->queued.outcount, impl->queued.incount); + impl->queued.outcount, impl->queued.incount, + avail_buffers, impl->n_buffers); return 0; }