[pulseaudio-discuss] [PATCH v6 14/25] source.c, sink.c: Implement pa_{source, sink}_get_raw_latency_within_thread() calls
Tanu Kaskinen
tanuk at iki.fi
Mon Aug 15 21:40:19 UTC 2016
On Sun, 2016-06-05 at 21:05 +0200, Georg Chini wrote:
> In certain situations, the reported sink or source latency may become
> negative.
What are those certain situations?
> This does not indicate that the latency is indeed negative but can be considered
> merely an offset error. The current get_latency() calls truncate negative latencies
> because they do not make sense from a physical point of view.
> In the context of module loopback, negative source or sink latencies are acceptable
> because the overall latency never becomes negative. Truncating negative values leads
> to discontinuities in the latency reports, therefore this patch implements functions
> in source.c and sink.c which can return the raw value without truncation.
What's the practical problem with the discontinuities? A negative
latency report is always incorrect, so changing it to 0 can only make
the latency report closer to truth. The explanation isn't sufficient
for me to understand why that is such a big problem that it warrants
adding this stuff to the core.
If this stuff makes sense, there should be a comment somewhere
explaining what the "raw latency" means and why we care about it.
> The corresponding PA_SINK_MESSAGE_GET_RAW_LATENCY needs to be handled by the driver.
>
> ---
> src/pulsecore/sink.c | 30 ++++++++++++++++++++++++++++++
> src/pulsecore/sink.h | 2 ++
> src/pulsecore/source.c | 30 ++++++++++++++++++++++++++++++
> src/pulsecore/source.h | 2 ++
> 4 files changed, 64 insertions(+)
>
> diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
> index 3f1ef72..2b72279 100644
> --- a/src/pulsecore/sink.c
> +++ b/src/pulsecore/sink.c
> @@ -1550,6 +1550,35 @@ pa_usec_t pa_sink_get_latency_within_thread(pa_sink *s) {
> return usec;
> }
>
> +/* Called from IO thread */
> +int64_t pa_sink_get_raw_latency_within_thread(pa_sink *s) {
> + int64_t usec = 0;
> + pa_msgobject *o;
> +
> + pa_sink_assert_ref(s);
> + pa_sink_assert_io_context(s);
> + pa_assert(PA_SINK_IS_LINKED(s->thread_info.state));
> +
> + /* The returned value is supposed to be in the time domain of the sound card! */
> +
> + if (s->thread_info.state == PA_SINK_SUSPENDED)
> + return 0;
> +
> + if (!(s->flags & PA_SINK_LATENCY))
> + return 0;
> +
> + o = PA_MSGOBJECT(s);
> +
> + /* FIXME: We probably should make this a proper vtable callback instead of going through process_msg() */
> +
> + if (o->process_msg(o, PA_SINK_MESSAGE_GET_RAW_LATENCY, &usec, 0, NULL) < 0) {
> + if (o->process_msg(o, PA_SINK_MESSAGE_GET_LATENCY, &usec, 0, NULL) < 0)
> + return 0;
This code path ignores the latency offset. I don't think it makes sense
to return here, the failure can just be ignored.
--
Tanu
More information about the pulseaudio-discuss
mailing list