[3/6] combine-sink: Improve initial latency reports

Submitted by Georg Chini on April 9, 2018, 4:33 p.m.

Details

Message ID 20180409163321.17279-4-georg@chini.tk
State New
Series "combine-sink, tunnel-sink: Latency fixes"
Headers show

Commit Message

Georg Chini April 9, 2018, 4:33 p.m.
Currently, it takes one adjust time before the smoother is updated after an
unsuspend. Before the first update, the smoother will not be aware of the
slave sink latencies, leading to incorrect latency reports.

This patch moves the first smoother update to one latency time after the
sink was unsuspended, thereby improving initial latency reports. This
only partially resolves the problem because the smoother takes multiple
updates to adapt to the slave sink latencies.
---
 src/modules/module-combine-sink.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/modules/module-combine-sink.c b/src/modules/module-combine-sink.c
index 7c111246..559f6575 100644
--- a/src/modules/module-combine-sink.c
+++ b/src/modules/module-combine-sink.c
@@ -788,9 +788,6 @@  static void unsuspend(struct userdata *u) {
     PA_IDXSET_FOREACH(o, u->outputs, idx)
         output_enable(o);
 
-    if (!u->time_event && u->adjust_time > 0)
-        u->time_event = pa_core_rttime_new(u->core, pa_rtclock_now() + u->adjust_time, time_callback, u);
-
     pa_log_info("Resumed successfully...");
 }
 
@@ -822,6 +819,13 @@  static int sink_set_state_in_main_thread_cb(pa_sink *sink, pa_sink_state_t state
             if (pa_sink_get_state(u->sink) == PA_SINK_SUSPENDED)
                 unsuspend(u);
 
+            /* The first smoother update should be done early, otherwise the smoother will
+             * not be aware of the slave sink latencies and report far too small values.
+             * This is especially important if after an unsuspend the sink runs on a different
+             * latency than before. */
+            if (state == PA_SINK_RUNNING && !u->time_event && u->adjust_time > 0)
+                u->time_event = pa_core_rttime_new(u->core, pa_rtclock_now() + pa_sink_get_requested_latency(u->sink), time_callback, u);
+
             break;
 
         case PA_SINK_UNLINKED: