[v2,2/8] sink-input: add a new API pa_sink_input_set_preferred_sink

Submitted by Hui Wang on Jan. 17, 2019, 6:53 a.m.

Details

Message ID 20190117065340.18712-3-hui.wang@canonical.com
State New
Headers show
Series "Change the bool sink_save to char *preferred_sink" ( rev: 1 ) in PulseAudio

Not browsing as part of any series.

Commit Message

Hui Wang Jan. 17, 2019, 6:53 a.m.
If the sink here is NULL, that means users want to clear the
preferred_sink and move the sink-input to the default_sink, otherwise
set the preferred_sink to the sink->name and move the sink-input to
the sink. After that fire the sink_input_change event.

After adding this API, we can use this API to simplify the entry_apply
in the module-stream-restore.c.

Signed-off-by: Hui Wang <hui.wang@canonical.com>
---
 src/modules/module-stream-restore.c | 10 ++--------
 src/pulsecore/sink-input.c          | 14 ++++++++++++++
 src/pulsecore/sink-input.h          |  2 ++
 3 files changed, 18 insertions(+), 8 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/modules/module-stream-restore.c b/src/modules/module-stream-restore.c
index a8c6a42c5..366f1a5a8 100644
--- a/src/modules/module-stream-restore.c
+++ b/src/modules/module-stream-restore.c
@@ -1953,18 +1953,12 @@  static void entry_apply(struct userdata *u, const char *name, struct entry *e) {
                        preferred_sink is cleared as the user may have specifically
                        removed the sink element from the rule. */
                     pa_xfree(si->preferred_sink);
-                    si->preferred_sink = NULL;
-                    /* This is cheating a bit. The sink input itself has not changed
-                       but the rules governing its routing have, so we fire this event
-                       such that other routing modules (e.g. module-device-manager)
-                       will pick up the change and reapply their routing */
-                    pa_subscription_post(si->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, si->index);
+                    pa_sink_input_set_preferred_sink(si, NULL);
                 }
             } else if ((s = pa_namereg_get(u->core, e->device, PA_NAMEREG_SINK))) {
                 pa_log_info("Restoring device for stream %s.", name);
-                pa_sink_input_move_to(si, s, true);
                 pa_xfree(si->preferred_sink);
-                si->preferred_sink = pa_xstrdup(s->name);
+                pa_sink_input_set_preferred_sink(si, s);
             }
         }
     }
diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c
index f41eacf07..4dbc0cdef 100644
--- a/src/pulsecore/sink-input.c
+++ b/src/pulsecore/sink-input.c
@@ -2416,3 +2416,17 @@  void pa_sink_input_set_reference_ratio(pa_sink_input *i, const pa_cvolume *ratio
                  pa_cvolume_snprint_verbose(old_ratio_str, sizeof(old_ratio_str), &old_ratio, &i->channel_map, true),
                  pa_cvolume_snprint_verbose(new_ratio_str, sizeof(new_ratio_str), ratio, &i->channel_map, true));
 }
+
+/* Called from the main thread. */
+void pa_sink_input_set_preferred_sink(pa_sink_input *i, pa_sink *s) {
+    pa_assert(i);
+
+    if (s) {
+        i->preferred_sink = pa_xstrdup(s->name);
+        pa_sink_input_move_to(i, s, true);
+    } else {
+        i->preferred_sink = NULL;
+        pa_sink_input_move_to(i, i->core->default_sink, true);
+    }
+    pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
+}
diff --git a/src/pulsecore/sink-input.h b/src/pulsecore/sink-input.h
index 76140a2db..b67d3c1c3 100644
--- a/src/pulsecore/sink-input.h
+++ b/src/pulsecore/sink-input.h
@@ -460,6 +460,8 @@  void pa_sink_input_set_volume_direct(pa_sink_input *i, const pa_cvolume *volume)
  * i->reference_ratio and logs a message if the value changes. */
 void pa_sink_input_set_reference_ratio(pa_sink_input *i, const pa_cvolume *ratio);
 
+void pa_sink_input_set_preferred_sink(pa_sink_input *i, pa_sink *s);
+
 #define pa_sink_input_assert_io_context(s) \
     pa_assert(pa_thread_mq_get() || !PA_SINK_INPUT_IS_LINKED((s)->state))
 

Comments

Sorry for the late feedback.

On 17.01.19 07:53, Hui Wang wrote:
> If the sink here is NULL, that means users want to clear the
> preferred_sink and move the sink-input to the default_sink, otherwise
> set the preferred_sink to the sink->name and move the sink-input to
> the sink. After that fire the sink_input_change event.
>
> After adding this API, we can use this API to simplify the entry_apply
> in the module-stream-restore.c.
>
> Signed-off-by: Hui Wang <hui.wang@canonical.com>
> ---
>   src/modules/module-stream-restore.c | 10 ++--------
>   src/pulsecore/sink-input.c          | 14 ++++++++++++++
>   src/pulsecore/sink-input.h          |  2 ++
>   3 files changed, 18 insertions(+), 8 deletions(-)
>
> diff --git a/src/modules/module-stream-restore.c b/src/modules/module-stream-restore.c
> index a8c6a42c5..366f1a5a8 100644
> --- a/src/modules/module-stream-restore.c
> +++ b/src/modules/module-stream-restore.c
> @@ -1953,18 +1953,12 @@ static void entry_apply(struct userdata *u, const char *name, struct entry *e) {
>                          preferred_sink is cleared as the user may have specifically
>                          removed the sink element from the rule. */
>                       pa_xfree(si->preferred_sink);
> -                    si->preferred_sink = NULL;
> -                    /* This is cheating a bit. The sink input itself has not changed
> -                       but the rules governing its routing have, so we fire this event
> -                       such that other routing modules (e.g. module-device-manager)
> -                       will pick up the change and reapply their routing */
> -                    pa_subscription_post(si->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, si->index);
> +                    pa_sink_input_set_preferred_sink(si, NULL);
>                   }
>               } else if ((s = pa_namereg_get(u->core, e->device, PA_NAMEREG_SINK))) {
>                   pa_log_info("Restoring device for stream %s.", name);
> -                pa_sink_input_move_to(si, s, true);
>                   pa_xfree(si->preferred_sink);
> -                si->preferred_sink = pa_xstrdup(s->name);
> +                pa_sink_input_set_preferred_sink(si, s);
>               }
>           }
>       }
> diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c
> index f41eacf07..4dbc0cdef 100644
> --- a/src/pulsecore/sink-input.c
> +++ b/src/pulsecore/sink-input.c
> @@ -2416,3 +2416,17 @@ void pa_sink_input_set_reference_ratio(pa_sink_input *i, const pa_cvolume *ratio
>                    pa_cvolume_snprint_verbose(old_ratio_str, sizeof(old_ratio_str), &old_ratio, &i->channel_map, true),
>                    pa_cvolume_snprint_verbose(new_ratio_str, sizeof(new_ratio_str), ratio, &i->channel_map, true));
>   }
> +
> +/* Called from the main thread. */
> +void pa_sink_input_set_preferred_sink(pa_sink_input *i, pa_sink *s) {
> +    pa_assert(i);
> +
> +    if (s) {
> +        i->preferred_sink = pa_xstrdup(s->name);
> +        pa_sink_input_move_to(i, s, true);
> +    } else {
> +        i->preferred_sink = NULL;
> +        pa_sink_input_move_to(i, i->core->default_sink, true);
> +    }
> +    pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
> +}
You do not have to send the subscription event here, 
pa_sink_input_finish_move()
will already send the event.
On 2019/6/30 下午6:44, Georg Chini wrote:
> Sorry for the late feedback.
>
> On 17.01.19 07:53, Hui Wang wrote:
>> If the sink here is NULL, that means users want to clear the
>> preferred_sink and move the sink-input to the default_sink, otherwise
>> set the preferred_sink to the sink->name and move the sink-input to
>> the sink. After that fire the sink_input_change event.
>>
>> After adding this API, we can use this API to simplify the entry_apply
>> in the module-stream-restore.c.
>>
>> Signed-off-by: Hui Wang <hui.wang@canonical.com>
>> ---
>>   src/modules/module-stream-restore.c | 10 ++--------
>>   src/pulsecore/sink-input.c          | 14 ++++++++++++++
>>   src/pulsecore/sink-input.h          |  2 ++
>>   3 files changed, 18 insertions(+), 8 deletions(-)
>>
>> diff --git a/src/modules/module-stream-restore.c 
>> b/src/modules/module-stream-restore.c
>> index a8c6a42c5..366f1a5a8 100644
>> --- a/src/modules/module-stream-restore.c
>> +++ b/src/modules/module-stream-restore.c
>> @@ -1953,18 +1953,12 @@ static void entry_apply(struct userdata *u, 
>> const char *name, struct entry *e) {
>>                          preferred_sink is cleared as the user may 
>> have specifically
>>                          removed the sink element from the rule. */
>>                       pa_xfree(si->preferred_sink);
>> -                    si->preferred_sink = NULL;
>> -                    /* This is cheating a bit. The sink input itself 
>> has not changed
>> -                       but the rules governing its routing have, so 
>> we fire this event
>> -                       such that other routing modules (e.g. 
>> module-device-manager)
>> -                       will pick up the change and reapply their 
>> routing */
>> -                    pa_subscription_post(si->core, 
>> PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, 
>> si->index);
>> +                    pa_sink_input_set_preferred_sink(si, NULL);
>>                   }
>>               } else if ((s = pa_namereg_get(u->core, e->device, 
>> PA_NAMEREG_SINK))) {
>>                   pa_log_info("Restoring device for stream %s.", name);
>> -                pa_sink_input_move_to(si, s, true);
>>                   pa_xfree(si->preferred_sink);
>> -                si->preferred_sink = pa_xstrdup(s->name);
>> +                pa_sink_input_set_preferred_sink(si, s);
>>               }
>>           }
>>       }
>> diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c
>> index f41eacf07..4dbc0cdef 100644
>> --- a/src/pulsecore/sink-input.c
>> +++ b/src/pulsecore/sink-input.c
>> @@ -2416,3 +2416,17 @@ void 
>> pa_sink_input_set_reference_ratio(pa_sink_input *i, const pa_cvolume 
>> *ratio
>>                    pa_cvolume_snprint_verbose(old_ratio_str, 
>> sizeof(old_ratio_str), &old_ratio, &i->channel_map, true),
>>                    pa_cvolume_snprint_verbose(new_ratio_str, 
>> sizeof(new_ratio_str), ratio, &i->channel_map, true));
>>   }
>> +
>> +/* Called from the main thread. */
>> +void pa_sink_input_set_preferred_sink(pa_sink_input *i, pa_sink *s) {
>> +    pa_assert(i);
>> +
>> +    if (s) {
>> +        i->preferred_sink = pa_xstrdup(s->name);
>> +        pa_sink_input_move_to(i, s, true);
>> +    } else {
>> +        i->preferred_sink = NULL;
>> +        pa_sink_input_move_to(i, i->core->default_sink, true);
>> +    }
>> +    pa_subscription_post(i->core, 
>> PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, 
>> i->index);
>> +}
> You do not have to send the subscription event here, 
> pa_sink_input_finish_move()
> will already send the event.
>
OK, got it.

Thanks,