]> code.delx.au - pulseaudio/commitdiff
sink, source: Really set the fixed latency in set_fixed_latency_within_thread(),...
authorTanu Kaskinen <tanu.kaskinen@jollamobile.com>
Thu, 28 Mar 2013 15:30:15 +0000 (17:30 +0200)
committerTanu Kaskinen <tanuk@iki.fi>
Wed, 10 Apr 2013 13:30:01 +0000 (16:30 +0300)
The old assumption seemed to be that if a sink or source has the
DYNAMIC_LATENCY flag set, it can never change, so the fixed latency
will always be zero. This assumption doesn't hold with filter sinks
and sources that are moved around.

This fixes a crash with two module-virtual-sink instances on top of
each other, when the bottom one is moved from a sink without dynamic
latency to a sink with dynamic latency. What happened was that first
the bottom virtual sink "updated" (due to this bug nothing was
actually updated) its fixed latency to match the master sink (zero
fixed latency), and then the top virtual sink updated its fixed
latency to match the master sink. The master sink was the bottom
virtual sink, whose fixed latency should have been set to zero, but it
was not, so the pa_sink_set_fixed_latency_within_thread() failed in
the assertion "latency == 0".

src/pulsecore/sink.c
src/pulsecore/source.c

index 2320359b3ba7eb46c45b5984a1cca34b27749c52..f5d4dbc6f30b2e14dce3eb38aadb7f3d2418d91c 100644 (file)
@@ -3268,6 +3268,11 @@ void pa_sink_set_fixed_latency_within_thread(pa_sink *s, pa_usec_t latency) {
 
     if (s->flags & PA_SINK_DYNAMIC_LATENCY) {
         pa_assert(latency == 0);
+        s->thread_info.fixed_latency = 0;
+
+        if (s->monitor_source)
+            pa_source_set_fixed_latency_within_thread(s->monitor_source, 0);
+
         return;
     }
 
index fb2e14b2cd7fb7e891265aad858ae33431c82501..6724c4bba64b6ef4a72a73e162ea693286deed5b 100644 (file)
@@ -2528,6 +2528,8 @@ void pa_source_set_fixed_latency_within_thread(pa_source *s, pa_usec_t latency)
 
     if (s->flags & PA_SOURCE_DYNAMIC_LATENCY) {
         pa_assert(latency == 0);
+        s->thread_info.fixed_latency = 0;
+
         return;
     }