[pulseaudio-discuss] [PATCH v2 2/2] switch-on-port-available: deactivate direction when the no ports are available for that direction

Georg Chini georg at chini.tk
Fri Dec 29 07:25:54 UTC 2017


On 28.12.2017 16:14, Tanu Kaskinen wrote:
> This ensures that streams are moved away from unavailable outputs or
> inputs. For example, sometimes HDMI is on a dedicated alsa card, and if
> all HDMI outputs become unavailable, then the card profile will be set
> to "off", and the streams will be moved somewhere else.
> ---

I am not sure if changing the profile is a good idea. There is no
code which restores the profile when the cable gets plugged again.
Can't you fire a hook when a sink or source is suspended due to
PA_SUSPEND_UNAVAILABLE and let module-rescue-stream handle
the case?

Further comment below.
>
> Changes in v2:
>   - Don't call deactivate_direction() unconditionally.
>
>
>   src/modules/module-switch-on-port-available.c | 40 ++++++++++++++++++++++++++-
>   1 file changed, 39 insertions(+), 1 deletion(-)
>
> diff --git a/src/modules/module-switch-on-port-available.c b/src/modules/module-switch-on-port-available.c
> index 8fd3c9e5f..c8e3d552b 100644
> --- a/src/modules/module-switch-on-port-available.c
> +++ b/src/modules/module-switch-on-port-available.c
> @@ -80,7 +80,7 @@ static bool profile_good_for_output(pa_card_profile *profile, pa_device_port *po
>       if (card->active_profile->max_source_channels != profile->max_source_channels)
>           return false;
>   
> -    if (port == card->preferred_output_port)
> +    if (port && port == card->preferred_output_port)
>           return true;
>   
>       PA_IDXSET_FOREACH(sink, card->sinks, idx) {
> @@ -251,6 +251,42 @@ static void switch_to_port(pa_device_port *port) {
>           pa_sink_set_port(pp.sink, port->name, false);
>   }
>   
> +static void deactivate_direction(pa_card *card, pa_direction_t direction) {
> +    pa_card_profile *profile;
> +    void *state;
> +    pa_card_profile *best_profile = NULL;
> +    const char *direction_str;
> +
> +    PA_HASHMAP_FOREACH(profile, card->profiles, state) {
> +        switch (direction) {
> +            case PA_DIRECTION_OUTPUT:
> +                if (profile->n_sinks != 0)
> +                    continue;
> +                if (!profile_good_for_output(profile, NULL))

Should this not be profile_good_for_input()?

> +                    continue;
> +                break;
> +
> +            case PA_DIRECTION_INPUT:
> +                if (profile->n_sources != 0)
> +                    continue;
> +                if (!profile_good_for_input(profile, NULL))

... and this one profile_good_for_output()?

> +                    continue;
> +                break;
> +        }
> +
> +        if (!best_profile || profile->priority > best_profile->priority)
> +            best_profile = profile;
> +    }
> +
> +    direction_str = direction == PA_DIRECTION_OUTPUT ? "output" : "input";
> +
> +    if (best_profile) {
> +        pa_log_debug("Deactivating %s on card %s.", direction_str, card->name);
> +        pa_card_set_profile(card, best_profile, false);
> +    } else
> +        pa_log_debug("Wanted to deactivate %s on card %s, but no suitable profile was found.", direction_str, card->name);
> +}
> +
>   /* Switches away from a port, switching profiles if necessary or preferred */
>   static void switch_from_port(pa_device_port *port) {
>       struct port_pointers pp = find_port_pointers(port);
> @@ -270,6 +306,8 @@ static void switch_from_port(pa_device_port *port) {
>   
>       if (best_port)
>           switch_to_port(best_port);
> +    else
> +        deactivate_direction(port->card, port->direction);
>   }
>   
>   




More information about the pulseaudio-discuss mailing list