[pulseaudio-discuss] [PATCH 1/2] core: Add an "internal" suspend cause

Arun Raghavan arun.raghavan at collabora.co.uk
Mon Jul 23 01:57:27 PDT 2012


This lets us suspend devices from within the core for short periods
without having to overload one of the existing suspend causes.
---
 src/pulsecore/core.h   |    1 +
 src/pulsecore/sink.c   |   12 +++++++++---
 src/pulsecore/source.c |   12 +++++++++---
 3 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/src/pulsecore/core.h b/src/pulsecore/core.h
index ba21fa9..6b97ae6 100644
--- a/src/pulsecore/core.h
+++ b/src/pulsecore/core.h
@@ -36,6 +36,7 @@ typedef enum pa_suspend_cause {
     PA_SUSPEND_IDLE = 4,         /* Used by module-suspend-on-idle */
     PA_SUSPEND_SESSION = 8,      /* Used by module-hal for mark inactive sessions */
     PA_SUSPEND_PASSTHROUGH = 16, /* Used to suspend monitor sources when the sink is in passthrough mode */
+    PA_SUSPEND_INTERNAL = 32,    /* This is used for short period server-internal suspends, such as for sample rate updates */
     PA_SUSPEND_ALL = 0xFFFF      /* Magic cause that can be used to resume forcibly */
 } pa_suspend_cause_t;
 
diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
index 3d72f55..b80f353 100644
--- a/src/pulsecore/sink.c
+++ b/src/pulsecore/sink.c
@@ -1337,6 +1337,8 @@ void pa_sink_render_full(pa_sink *s, size_t length, pa_memchunk *result) {
 /* Called from main thread */
 pa_bool_t pa_sink_update_rate(pa_sink *s, uint32_t rate, pa_bool_t passthrough)
 {
+    pa_bool_t ret = FALSE;
+
     if (s->update_rate) {
         uint32_t desired_rate = rate;
         uint32_t default_rate = s->default_sample_rate;
@@ -1392,7 +1394,8 @@ pa_bool_t pa_sink_update_rate(pa_sink *s, uint32_t rate, pa_bool_t passthrough)
         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 */
+        /* Needed before rate update, will be resumed automatically */
+        pa_sink_suspend(s, TRUE, PA_SUSPEND_IDLE | PA_SUSPEND_INTERNAL);
 
         if (s->update_rate(s, desired_rate) == TRUE) {
             /* update monitor source as well */
@@ -1405,10 +1408,13 @@ pa_bool_t pa_sink_update_rate(pa_sink *s, uint32_t rate, pa_bool_t passthrough)
                     pa_sink_input_update_rate(i);
             }
 
-            return TRUE;
+            ret = TRUE;
         }
+
+        pa_sink_suspend(s, FALSE, PA_SUSPEND_INTERNAL);
     }
-    return FALSE;
+
+    return ret ;
 }
 
 /* Called from main thread */
diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c
index cefddae..b5b80c0 100644
--- a/src/pulsecore/source.c
+++ b/src/pulsecore/source.c
@@ -952,6 +952,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 passthrough)
 {
+    pa_bool_t ret = FALSE;
+
     if (s->update_rate) {
         uint32_t desired_rate = rate;
         uint32_t default_rate = s->default_sample_rate;
@@ -1000,7 +1002,8 @@ pa_bool_t pa_source_update_rate(pa_source *s, uint32_t rate, pa_bool_t passthrou
         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 */
+        /* Needed before rate update, will be resumed automatically */
+        pa_source_suspend(s, TRUE, PA_SUSPEND_IDLE | PA_SUSPEND_INTERNAL);
 
         if (s->update_rate(s, desired_rate) == TRUE) {
             pa_log_info("Changed sampling rate successfully ");
@@ -1009,10 +1012,13 @@ pa_bool_t pa_source_update_rate(pa_source *s, uint32_t rate, pa_bool_t passthrou
                 if (o->state == PA_SOURCE_OUTPUT_CORKED)
                     pa_source_output_update_rate(o);
             }
-            return TRUE;
+            ret = TRUE;
         }
+
+        pa_source_suspend(s, FALSE, PA_SUSPEND_INTERNAL);
     }
-    return FALSE;
+
+    return ret;
 }
 
 /* Called from main thread */
-- 
1.7.8.6



More information about the pulseaudio-discuss mailing list