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>