Hi, On Wed, Mar 29, 2017 at 12:14 PM, Vivek Das Mohapatra <vi...@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-disc...@lists.freedesktop.org ? This looks like something that should be fixed upstream. -- Saludos, Felipe Sateler