[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