[pulseaudio-discuss] [PATCH v3] role-ducking: Add support for ducking group

Tanu Kaskinen tanuk at iki.fi
Tue Apr 12 18:38:05 UTC 2016


On Wed, 2016-03-30 at 22:20 +0900, Sangchul Lee wrote:
> +struct userdata {
> +    pa_core *core;
> +    const char *name;

userdata doesn't need the name field any more. It's only referenced
once in pa_stream_interaction_init(), and that function can equally
well use m->name in place of u->name.

> -static void uncork_or_unduck(struct userdata *u, pa_sink_input *i, const char *interaction_role, bool corked) {
> +static void uncork_or_unduck(struct userdata *u, pa_sink_input *i, const char *interaction_role, bool corked, struct group *g) {
>  
>      if (u->duck) {
> -       pa_log_debug("Found a '%s' stream that should be unducked", interaction_role);
> -       pa_sink_input_remove_volume_factor(i, u->name);
> +       pa_log_debug("Found a '%s' stream that should be unducked by '%s'", interaction_role, g->name);

Groups don't unduck streams, so the log message is not good language.
"In '%s', found a '%s' stream that should be unducked" would be better
(the first %s is the group name).

>  static pa_hook_result_t process(struct userdata *u, pa_sink_input *i, bool create, bool new_stream) {
>      const char *trigger_role;
> +    uint32_t j;
>  
>      pa_assert(u);
>      pa_sink_input_assert_ref(i);
>  
> -    if (!create)
> -        pa_hashmap_remove(u->interaction_state, i);
> -
>      if (!i->sink)
>          return PA_HOOK_OK;
>  
> -    trigger_role = find_global_trigger_stream(u, i->sink, create ? NULL : i);
> -    apply_interaction(u, i->sink, trigger_role, create ? NULL : i, new_stream);
> +    for (j = 0; j < u->n_groups; j++) {
> +        if (!create)
> +            pa_hashmap_remove(u->groups[j]->interaction_state, i);
> +        trigger_role = find_global_trigger_stream(u, i->sink, create ? NULL : i, u->groups[j]);
> +        apply_interaction(u, i->sink, trigger_role, create ? NULL : i, new_stream, u->groups[j]);
> +    }

The pa_hashmap_remove() call was moved after the if (!i->sink) check,
which means that if i->sink is not set, pa_hashmap_remove() doesn't any
more get called even if it should.

> +                    if (pa_parse_volume(n, &(u->groups[i++]->volume)) == -1) {

Use "< 0" instead of "== -1". Any negative number indicates a failure,
so comparing to only -1 makes it look like -1 would be somehow special.
The reader can't be expected to know that the function never returns
other error codes than -1.

-- 
Tanu


More information about the pulseaudio-discuss mailing list