diff --git a/src/pipewire/stream.c b/src/pipewire/stream.c index 02fd26e80..d99b33531 100644 --- a/src/pipewire/stream.c +++ b/src/pipewire/stream.c @@ -2134,7 +2134,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; + uint32_t buffered, quantum, index; do { seq1 = SEQ_READ(impl->seq); @@ -2153,8 +2153,12 @@ 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; - if (size >= sizeof(struct pw_time)) + 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); + if (size >= sizeof(struct pw_time)) + time->avail_buffers = spa_ringbuffer_get_read_index(&impl->dequeued.ring, &index); pw_log_trace_fp("%p: %"PRIi64" %"PRIi64" %"PRIu64" %d/%d %"PRIu64" %" PRIu64" %"PRIu64" %"PRIu64" %"PRIu64, stream, diff --git a/src/pipewire/stream.h b/src/pipewire/stream.h index e53220683..0665c5e2b 100644 --- a/src/pipewire/stream.h +++ b/src/pipewire/stream.h @@ -292,6 +292,8 @@ struct pw_time { uint64_t buffered; /**< for audio/raw streams, this contains the extra * number of samples buffered in the resampler. * Since 0.3.50. */ + uint32_t queued_buffers; /**< The number of buffers that are queued. Since 0.3.50 */ + uint32_t avail_buffers; /**< The number of buffers that can be dequeued. Since 0.3.50 */ }; #include diff --git a/src/tools/pw-cat.c b/src/tools/pw-cat.c index ba6a88be6..dc7fd64df 100644 --- a/src/tools/pw-cat.c +++ b/src/tools/pw-cat.c @@ -1026,10 +1026,11 @@ static void do_print_delay(void *userdata, uint64_t expirations) pw_stream_get_time_n(data->stream, &time, sizeof(time)); printf("stream time: now:%"PRIi64" rate:%u/%u ticks:%"PRIu64 " delay:%"PRIi64" queued:%"PRIu64 - " buffered:%"PRIi64" \n", + " buffered:%"PRIi64" buffers:%u avail:%u\n", time.now, time.rate.num, time.rate.denom, - time.ticks, time.delay, time.queued, time.buffered); + time.ticks, time.delay, time.queued, time.buffered, + time.queued_buffers, time.avail_buffers); } enum {