[pulseaudio-discuss] [PATCH] simple: fix negative latency handling
Grzegorz Kołodziejczyk
grzegorz.kolodziejczyk at codecoup.pl
Wed Jul 12 07:57:44 UTC 2017
Hi Tanu,
I think you weren't rebased on master upstream with this patch or I have a
git problem :)
I can't find this negation of pa_bytes_to_usec "extra =
-pa_bytes_to_usec(p->read_index, pa_stream_get_sample_spec(p->stream));"
Last commit which touch this was made by Tanu Kaskinen - Sun Jul 13
17:48:59 2014.
Best regards,
Grzegorz
2017-07-11 20:21 GMT+02:00 Tanu Kaskinen <tanuk at iki.fi>:
> pa_usec_t is an unsigned type, but there were calculations that used it
> as if it were a signed type.
>
> If the latency is negative, pa_simple_get_latency() now reports 0.
>
> Added some comments too.
> ---
>
> This patch doesn't apply to the master branch, so if you want to apply
> the patch, use the next branch.
>
> src/pulse/simple.c | 40 ++++++++++++++++++++++++++++------------
> 1 file changed, 28 insertions(+), 12 deletions(-)
>
> diff --git a/src/pulse/simple.c b/src/pulse/simple.c
> index c8e89b09b..7b66f62d7 100644
> --- a/src/pulse/simple.c
> +++ b/src/pulse/simple.c
> @@ -463,18 +463,34 @@ pa_usec_t pa_simple_get_latency(pa_simple *p, int
> *rerror) {
> CHECK_DEAD_GOTO(p, rerror, unlock_and_fail);
>
> 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_index,
> pa_stream_get_sample_spec(p->stream));
> -
> - if (negative) {
> - if (extra > t)
> - t = extra - t;
> - else
> - t = 0;
> - } else
> - t += extra;
> + if (p->direction == PA_STREAM_RECORD) {
> + pa_usec_t already_read;
> +
> + /* pa_simple_read() calls pa_stream_peek() to get the next
> + * chunk of audio. If the next chunk is larger than what
> the
> + * pa_simple_read() caller wanted, the leftover data is
> stored
> + * in p->read_data until pa_simple_read() is called again.
> + * pa_stream_drop() won't be called until the whole chunk
> has
> + * been consumed, which means that
> pa_stream_get_latency() will
> + * return too large values, because the whole size of the
> + * partially read chunk is included in the latency.
> Therefore,
> + * we need to substract the already-read amount from the
> + * latency. */
> + already_read = pa_bytes_to_usec(p->read_index,
> pa_stream_get_sample_spec(p->stream));
> +
> + if (!negative) {
> + if (t > already_read)
> + t -= already_read;
> + else
> + t = 0;
> + }
> + }
> +
> + /* We don't have a way to report negative latencies from
> + * pa_simple_get_latency(). If the latency is negative, let's
> + * report zero. */
> + if (negative)
> + t = 0;
>
> break;
> }
> --
> 2.13.2
>
> _______________________________________________
> pulseaudio-discuss mailing list
> pulseaudio-discuss at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/pulseaudio-discuss/attachments/20170712/41c82225/attachment.html>
More information about the pulseaudio-discuss
mailing list