Bug#859017: pulseaudio: switch-on-port-available picks unavailable device port

Felipe Sateler fsateler at debian.org
Wed Mar 29 16:24:04 UTC 2017


Hi,

On Wed, Mar 29, 2017 at 12:14 PM, Vivek Das Mohapatra
<vivek at collabora.com> wrote:
> Package: pulseaudio
> Version: 5.0-13
> Severity: normal
>
> Dear Maintainer,
>
>    * What led up to the situation?
>
>      Volume/Mute state was not restored on a laptop on reboot:
>      The speaker was always muted.
>
>    * What exactly did you do (or not do) that was effective (or
>      ineffective)?
>
>      Set the volume (in either gdm or gnome), rebooted (either from
>      within the gnome session or after logging out).
>
>    * What was the outcome of this action?
>
>      Sound (speaker) was always muted on reboot.
>
>    * What outcome did you expect instead?
>
>      Volume should have been restored to the value recorded
>      in the pulseaudio .tdb files.
>
> Eventually tracked this down to the wrong device port being selected by
> module-switch-on-port-available - the helper function new_sink_source
> iterates over the device ports and picks the one with the highest priority
> but then, just before returning, does this:
>
>     if (p->available != PA_AVAILABLE_NO)
>         return NULL;
>
> ie the selected port is returned _only_ if it is NOT available.
>
> This logic error appears to be in pulseaudio 10.x (the stretch version)
> also.
>
> This is used by (for example):
>
>   static pa_hook_result_t sink_new_hook_callback(pa_core *c,
> pa_sink_new_data *new_data, void *u) {
>
>       pa_device_port *p = new_sink_source(new_data->ports,
> new_data->active_port);
>
>       if (p) {
>           pa_log_debug("Switching initial port for sink '%s' to '%s'",
> new_data->name, p->name);
>           pa_sink_new_data_set_port(new_data, p->name);
>       }
>       return PA_HOOK_OK;
>   }
>
> So this module will never choose an available port.
>
> The p->available != PA_AVAILABLE_NO pattern appears all over the place in
> this module but I _think_ this is the only place where it's used the
> wrong way round.
>
> The following fixed the symptom here (and the pa -vvvv log indicated that
> a more sensible set of choices was being made with it applied):
>
> --- a/src/modules/module-switch-on-port-available.c
> +++ b/src/modules/module-switch-on-port-available.c
> @@ -256,7 +256,7 @@
>                  p = i;
>      if (!p)
>          return NULL;
> -    if (p->available != PA_AVAILABLE_NO)
> +    if (p->available == PA_AVAILABLE_NO)
>          return NULL;
>
>      pa_assert_se(p = find_best_port(ports));
>

Your analysis looks correct to me. Could you forward this issue
upstream to pulseaudio-discuss at lists.freedesktop.org ? This looks like
something that should be fixed upstream.


-- 

Saludos,
Felipe Sateler



More information about the pkg-pulseaudio-devel mailing list