mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-12-15 08:56:34 -05:00
simple: fix negative latency handling
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 commit is contained in:
parent
b0cd94233a
commit
5de4b652cb
1 changed files with 26 additions and 10 deletions
|
|
@ -463,18 +463,34 @@ pa_usec_t pa_simple_get_latency(pa_simple *p, int *rerror) {
|
||||||
CHECK_DEAD_GOTO(p, rerror, unlock_and_fail);
|
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) {
|
||||||
|
pa_usec_t already_read;
|
||||||
|
|
||||||
if (p->direction == PA_STREAM_RECORD)
|
/* pa_simple_read() calls pa_stream_peek() to get the next
|
||||||
extra = -pa_bytes_to_usec(p->read_index, pa_stream_get_sample_spec(p->stream));
|
* 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 (!negative) {
|
||||||
if (extra > t)
|
if (t > already_read)
|
||||||
t = extra - t;
|
t -= already_read;
|
||||||
else
|
else
|
||||||
t = 0;
|
t = 0;
|
||||||
} else
|
}
|
||||||
t += extra;
|
}
|
||||||
|
|
||||||
|
/* 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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue