sink,source: Allow sample rate switching with corked streams
authorArun Raghavan <arun.raghavan@collabora.co.uk>
Mon, 7 Nov 2011 09:31:25 +0000 (15:01 +0530)
committerArun Raghavan <arun.raghavan@collabora.co.uk>
Mon, 7 Nov 2011 10:08:30 +0000 (15:38 +0530)
This updates corked streams' resamplers when switching sample rates on a
sink/source, which means the restriction of allowing sample rate updates
only when no streams are attached to a sink/source is now relaxed to
preventing updates only when there is a running stream attached.

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

index 99acb2f..9cad937 100644 (file)
@@ -1339,6 +1339,8 @@ pa_bool_t pa_sink_update_rate(pa_sink *s, uint32_t rate, pa_bool_t passthrough)
         uint32_t desired_rate = rate;
         uint32_t default_rate = s->default_sample_rate;
         uint32_t alternate_rate = s->alternate_sample_rate;
+        uint32_t idx;
+        pa_sink_input *i;
         pa_bool_t use_alternate = FALSE;
 
         if (PA_UNLIKELY(default_rate == alternate_rate)) {
@@ -1385,7 +1387,7 @@ pa_bool_t pa_sink_update_rate(pa_sink *s, uint32_t rate, pa_bool_t passthrough)
             desired_rate = rate; /* use stream sampling rate, discard default/alternate settings */
         }
 
-        if (!passthrough && pa_sink_linked_by(s) > 0)
+        if (!passthrough && pa_sink_used_by(s) > 0)
             return FALSE;
 
         pa_sink_suspend(s, TRUE, PA_SUSPEND_IDLE); /* needed before rate update, will be resumed automatically */
@@ -1395,6 +1397,12 @@ pa_bool_t pa_sink_update_rate(pa_sink *s, uint32_t rate, pa_bool_t passthrough)
             if (s->monitor_source && !passthrough)
                 pa_source_update_rate(s->monitor_source, desired_rate, FALSE);
             pa_log_info("Changed sampling rate successfully");
+
+            PA_IDXSET_FOREACH(i, s->inputs, idx) {
+                if (i->state == PA_SINK_INPUT_CORKED)
+                    pa_sink_input_update_rate(i);
+            }
+
             return TRUE;
         }
     }
index ac81492..33f4c73 100644 (file)
@@ -933,6 +933,8 @@ pa_bool_t pa_source_update_rate(pa_source *s, uint32_t rate, pa_bool_t passthrou
         uint32_t desired_rate = rate;
         uint32_t default_rate = s->default_sample_rate;
         uint32_t alternate_rate = s->alternate_sample_rate;
+        uint32_t idx;
+        pa_source_output *o;
         pa_bool_t use_alternate = FALSE;
 
         if (PA_UNLIKELY(default_rate == alternate_rate)) {
@@ -972,13 +974,18 @@ pa_bool_t pa_source_update_rate(pa_source *s, uint32_t rate, pa_bool_t passthrou
             desired_rate = rate; /* use stream sampling rate, discard default/alternate settings */
         }
 
-        if (!passthrough && pa_source_linked_by(s) > 0)
+        if (!passthrough && pa_source_used_by(s) > 0)
             return FALSE;
 
         pa_source_suspend(s, TRUE, PA_SUSPEND_IDLE); /* needed before rate update, will be resumed automatically */
 
         if (s->update_rate(s, desired_rate) == TRUE) {
             pa_log_info("Changed sampling rate successfully ");
+
+            PA_IDXSET_FOREACH(o, s->outputs, idx) {
+                if (o->state == PA_SOURCE_OUTPUT_CORKED)
+                    pa_source_output_update_rate(o);
+            }
             return TRUE;
         }
     }