source: Bring rate update code in sync with sink code
authorArun Raghavan <arun.raghavan@collabora.co.uk>
Mon, 10 Oct 2011 19:17:56 +0000 (00:47 +0530)
committerArun Raghavan <arun.raghavan@collabora.co.uk>
Mon, 17 Oct 2011 14:39:50 +0000 (20:09 +0530)
Basically adds code to handle passthrough sources. This isn't a tested
path at the moment, but in the future, when we do wish to support these,
it'll save us the trouble of having to sync all the code again.

src/pulsecore/sink.c
src/pulsecore/source-output.c
src/pulsecore/source.c
src/pulsecore/source.h

index 6b5a385..f3b78a5 100644 (file)
@@ -1380,8 +1380,8 @@ pa_bool_t pa_sink_update_rate(pa_sink *s, uint32_t rate, pa_bool_t passthrough)
 
         if (s->update_rate(s, desired_rate) == TRUE) {
             /* update monitor source as well */
-            if (s->monitor_source)
-                pa_source_update_rate(s->monitor_source, desired_rate);
+            if (s->monitor_source && !passthrough)
+                pa_source_update_rate(s->monitor_source, desired_rate, FALSE);
             pa_log_info("Changed sampling rate successfully");
             return TRUE;
         }
index 46a95a7..21e8da9 100644 (file)
@@ -354,7 +354,11 @@ int pa_source_output_new(
            module-suspend-on-idle can resume a source */
 
         pa_log_info("Trying to change sample rate");
-        pa_source_update_rate(data->source, data->sample_spec.rate);
+        if (pa_source_update_rate(data->source, data->sample_spec.rate, pa_source_output_new_data_is_passthrough(data)) == TRUE)
+            pa_log_info("Rate changed to %u kHz",
+                        data->source->sample_spec.rate);
+        else
+            pa_log_info("Resampling enabled to %u kHz", data->source->sample_spec.rate);
     }
 
     if (data->resample_method == PA_RESAMPLER_INVALID)
@@ -1401,7 +1405,7 @@ int pa_source_output_finish_move(pa_source_output *o, pa_source *dest, pa_bool_t
            SOURCE_OUTPUT_MOVE_FINISH hook */
 
         pa_log_info("Trying to change sample rate");
-        if (pa_source_update_rate(dest, o->sample_spec.rate) == TRUE)
+        if (pa_source_update_rate(dest, o->sample_spec.rate, pa_source_output_is_passthrough(o)) == TRUE)
             pa_log_info("Rate changed to %u kHz",
                         dest->sample_spec.rate);
         else
index 508fb4a..444d587 100644 (file)
@@ -921,9 +921,8 @@ void pa_source_post_direct(pa_source*s, pa_source_output *o, const pa_memchunk *
 }
 
 /* Called from main thread */
-pa_bool_t pa_source_update_rate(pa_source *s, uint32_t rate)
+pa_bool_t pa_source_update_rate(pa_source *s, uint32_t rate, pa_bool_t passthrough)
 {
-
     if (s->update_rate) {
         uint32_t desired_rate = rate;
         uint32_t default_rate = s->default_sample_rate;
@@ -933,30 +932,38 @@ pa_bool_t pa_source_update_rate(pa_source *s, uint32_t rate)
         if (PA_SOURCE_IS_RUNNING(s->state)) {
             pa_log_info("Cannot update rate, SOURCE_IS_RUNNING, will keep using %u kHz",
                         s->sample_spec.rate);
-            return FALSE; /* cannot reconfigure a RUNNING source without glitches */
+            return FALSE;
         }
 
         if (PA_UNLIKELY (desired_rate < 8000 ||
                          desired_rate > PA_RATE_MAX))
             return FALSE;
 
-        pa_assert(default_rate % 4000 || default_rate % 11025);
-        pa_assert(alternate_rate % 4000 || alternate_rate % 11025);
+        if (!passthrough) {
+            pa_assert(default_rate % 4000 || default_rate % 11025);
+            pa_assert(alternate_rate % 4000 || alternate_rate % 11025);
+
+            if (default_rate % 4000) {
+                /* default is a 11025 multiple */
+                if ((alternate_rate % 4000 == 0) && (desired_rate % 4000 == 0))
+                    use_alternate=TRUE;
+            } else {
+                /* default is 4000 multiple */
+                if ((alternate_rate % 11025 == 0) && (desired_rate % 11025 == 0))
+                    use_alternate=TRUE;
+            }
 
-        if (default_rate % 4000) {
-            /* default is a 11025 multiple */
-            if ((alternate_rate % 4000 == 0) && (desired_rate % 4000 == 0))
-                use_alternate=TRUE;
+            if (use_alternate)
+                desired_rate = alternate_rate;
+            else
+                desired_rate = default_rate;
         } else {
-            /* default is 4000 multiple */
-            if ((alternate_rate % 11025 == 0) && (desired_rate % 11025 == 0))
-                use_alternate=TRUE;
+            desired_rate = rate; /* use stream sampling rate, discard default/alternate settings */
         }
 
-        if (use_alternate)
-            desired_rate = alternate_rate;
-        else
-            desired_rate = default_rate;
+        if (passthrough || pa_source_used_by(s) == 0) {
+            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 ");
index 8adc5f1..c5cfb39 100644 (file)
@@ -367,7 +367,7 @@ pa_bool_t pa_source_get_mute(pa_source *source, pa_bool_t force_refresh);
 pa_bool_t pa_source_update_proplist(pa_source *s, pa_update_mode_t mode, pa_proplist *p);
 
 int pa_source_set_port(pa_source *s, const char *name, pa_bool_t save);
-pa_bool_t pa_source_update_rate(pa_source *s, uint32_t rate);
+pa_bool_t pa_source_update_rate(pa_source *s, uint32_t rate, pa_bool_t passthrough);
 
 unsigned pa_source_linked_by(pa_source *s); /* Number of connected streams */
 unsigned pa_source_used_by(pa_source *s); /* Number of connected streams that are not corked */