[pulseaudio-discuss] [PATCH 6/8] pass pa_suspend_cause_t to SINK/SOURCE_SET_STATE handlers

Raman Shishniou rommer at ibuffed.com
Wed Feb 21 12:23:24 UTC 2018


On 02/19/2018 05:48 PM, Tanu Kaskinen wrote:
> The suspend cause isn't yet used by any of the handlers. The alsa sink
> and source will use it to sync the mixer when the SESSION suspend cause
> is removed. Currently the syncing is done in pa_sink/source_suspend(),
> and I want to change that, because pa_sink/source_suspend() shouldn't
> have any alsa specific code.
> ---
> @@ -2845,12 +2848,12 @@ int pa_sink_process_msg(pa_msgobject *o, int code, void *userdata, int64_t offse
>              return 0;
>  
>          case PA_SINK_MESSAGE_SET_STATE: {
> -
> +            pa_sink_state_t new_state = ((pa_sink_message_set_state *) userdata)->state;

I think we can save suspend_cause to thread_info too:

+            pa_suspend_cause_t suspend_cause = ((pa_sink_message_set_state *) userdata)->suspend_cause;

>              bool suspend_change =
> -                (s->thread_info.state == PA_SINK_SUSPENDED && PA_SINK_IS_OPENED(PA_PTR_TO_UINT(userdata))) ||
> -                (PA_SINK_IS_OPENED(s->thread_info.state) && PA_PTR_TO_UINT(userdata) == PA_SINK_SUSPENDED);
> +                (s->thread_info.state == PA_SINK_SUSPENDED && PA_SINK_IS_OPENED(new_state)) ||
> +                (PA_SINK_IS_OPENED(s->thread_info.state) && new_state == PA_SINK_SUSPENDED);
>  
> -            s->thread_info.state = PA_PTR_TO_UINT(userdata);
> +            s->thread_info.state = new_state;

+            s->thread_info.suspend_cause = suspend_cause;

>  
>              if (s->thread_info.state == PA_SINK_SUSPENDED) {
>                  s->thread_info.rewind_nbytes = 0;

...

> @@ -2219,12 +2222,12 @@ int pa_source_process_msg(pa_msgobject *object, int code, void *userdata, int64_
>              return 0;
>  
>          case PA_SOURCE_MESSAGE_SET_STATE: {
> -
> +            pa_source_state_t new_state = ((pa_source_message_set_state *) userdata)->state;

+            pa_source_state_t suspend_cause = ((pa_source_message_set_state *) userdata)->suspend_cause;

>              bool suspend_change =
> -                (s->thread_info.state == PA_SOURCE_SUSPENDED && PA_SOURCE_IS_OPENED(PA_PTR_TO_UINT(userdata))) ||
> -                (PA_SOURCE_IS_OPENED(s->thread_info.state) && PA_PTR_TO_UINT(userdata) == PA_SOURCE_SUSPENDED);
> +                (s->thread_info.state == PA_SOURCE_SUSPENDED && PA_SOURCE_IS_OPENED(new_state)) ||
> +                (PA_SOURCE_IS_OPENED(s->thread_info.state) && new_state == PA_SOURCE_SUSPENDED);
>  
> -            s->thread_info.state = PA_PTR_TO_UINT(userdata);
> +            s->thread_info.state = new_state;

+            s->thread_info.suspend_cause = suspend_cause;

>  
>              if (suspend_change) {
>                  pa_source_output *o;

And add suspend_cause to sink's and source's thread_info and init:

diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
index 7f5c37f..3904158 100644
--- a/src/pulsecore/sink.c
+++ b/src/pulsecore/sink.c
@@ -330,6 +330,7 @@ pa_sink* pa_sink_new(
     s->thread_info.soft_volume =  s->soft_volume;
     s->thread_info.soft_muted = s->muted;
     s->thread_info.state = s->state;
+    s->thread_info.suspend_cause = s->suspend_cause;
     s->thread_info.rewind_nbytes = 0;
     s->thread_info.rewind_requested = false;
     s->thread_info.max_rewind = 0;
diff --git a/src/pulsecore/sink.h b/src/pulsecore/sink.h
index 3fb2301..e897d69 100644
--- a/src/pulsecore/sink.h
+++ b/src/pulsecore/sink.h
@@ -252,6 +252,7 @@ struct pa_sink {
      * thread can work without access locking */
     struct {
         pa_sink_state_t state;
+        pa_suspend_cause_t suspend_cause;
         pa_hashmap *inputs;
 
         pa_rtpoll *rtpoll;
diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c
index 2a6b1f1..4eaa1a9 100644
--- a/src/pulsecore/source.c
+++ b/src/pulsecore/source.c
@@ -318,6 +318,7 @@ pa_source* pa_source_new(
     s->thread_info.soft_volume = s->soft_volume;
     s->thread_info.soft_muted = s->muted;
     s->thread_info.state = s->state;
+    s->thread_info.suspend_cause = s->suspend_cause;
     s->thread_info.max_rewind = 0;
     s->thread_info.requested_latency_valid = false;
     s->thread_info.requested_latency = 0;
diff --git a/src/pulsecore/source.h b/src/pulsecore/source.h
index 75ce241..cfe4306 100644
--- a/src/pulsecore/source.h
+++ b/src/pulsecore/source.h
@@ -210,6 +210,7 @@ struct pa_source {
      * thread can work without access locking */
     struct {
         pa_source_state_t state;
+        pa_suspend_cause_t suspend_cause;
         pa_hashmap *outputs;
 
         pa_rtpoll *rtpoll;

--
Raman


More information about the pulseaudio-discuss mailing list