From c1ae62a03b27878750e3f3c35f7ea398895f9f77 Mon Sep 17 00:00:00 2001 From: Tanu Kaskinen Date: Wed, 9 Jul 2014 11:58:34 +0300 Subject: [PATCH] simple: Take locally buffered data into account in pa_simple_get_latency() BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=81075 --- src/pulse/simple.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/pulse/simple.c b/src/pulse/simple.c index 1891131..f005cf8 100644 --- a/src/pulse/simple.c +++ b/src/pulse/simple.c @@ -454,17 +454,32 @@ unlock_and_fail: pa_usec_t pa_simple_get_latency(pa_simple *p, int *rerror) { pa_usec_t t; - int negative; pa_assert(p); pa_threaded_mainloop_lock(p->mainloop); for (;;) { + int negative; + CHECK_DEAD_GOTO(p, rerror, unlock_and_fail); - if (pa_stream_get_latency(p->stream, &t, &negative) >= 0) + if (pa_stream_get_latency(p->stream, &t, &negative) >= 0) { + pa_usec_t extra = 0; + + if (p->direction == PA_STREAM_RECORD) + extra = pa_bytes_to_usec(p->read_length, pa_stream_get_sample_spec(p->stream)); + + if (negative) { + if (extra > t) + t = extra - t; + else + t = 0; + } else + t += extra; + break; + } CHECK_SUCCESS_GOTO(p, rerror, pa_context_errno(p->context) == PA_ERR_NODATA, unlock_and_fail); @@ -474,7 +489,7 @@ pa_usec_t pa_simple_get_latency(pa_simple *p, int *rerror) { pa_threaded_mainloop_unlock(p->mainloop); - return negative ? 0 : t; + return t; unlock_and_fail: -- 1.9.3