[pulseaudio-discuss] [PATCH] sink/source: Initialize port before fixate hook (fixes volume/mute not restored)

David Henningsson david.henningsson at canonical.com
Sat Mar 22 10:39:31 PDT 2014


On 03/21/2014 01:51 PM, Tanu Kaskinen wrote:
> On Fri, 2014-03-21 at 10:27 +0100, David Henningsson wrote:
>> In case a port has not yet been saved, which is e g often the case
>> if a sink/source has only one port, reading volume/mute will be done
>> without port, whereas writing volume/mute will be done with port.
>>
>> Work around this by setting a default port before the fixate hook,
>> so module-device-restore can read volume/mute for the correct port.
>>
>> BugLink: https://bugs.launchpad.net/bugs/1289515
>> Signed-off-by: David Henningsson <david.henningsson at canonical.com>
> 
> Thanks, this also fixes this bug:
> https://bugs.freedesktop.org/show_bug.cgi?id=55262
> 
> A couple of comments below.
> 
>> ---
>>  src/pulsecore/sink.c   |   11 +++++++++++
>>  src/pulsecore/source.c |   11 +++++++++++
>>  2 files changed, 22 insertions(+)
>>
>> diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
>> index 08143e9..9c4b0c3 100644
>> --- a/src/pulsecore/sink.c
>> +++ b/src/pulsecore/sink.c
>> @@ -235,6 +235,17 @@ pa_sink* pa_sink_new(
>>      pa_device_init_icon(data->proplist, true);
>>      pa_device_init_intended_roles(data->proplist);
>>  
>> +    if (!data->active_port && !data->save_port) {
> 
> How is data->save_port relevant here? If active_port is NULL, save_port
> should always be false (true wouldn't have any meaning).

It just means I haven't thought through the case where active_port is
NULL and save_port is true, so better avoid it.

I could have done:

if (!data->active_port) {
   assert(!data->save_port);

...but as you know, I prefer when PulseAudio is not crashing.

>> +        void *state;
>> +        pa_device_port *p, *p2 = NULL;
>> +
>> +        PA_HASHMAP_FOREACH(p, data->ports, state)
>> +            if (!p2 || p->priority > p2->priority) {
>> +                p2 = p;
>> +                pa_sink_new_data_set_port(data, p2->name);
> 
> I'd prefer calling pa_sink_new_data_set_port() only once, i.e. outside
> the loop.

Ok, makes sense.

> 
>> +            }
>> +    }
> 
> This partially duplicates the code that is run later:
> 
>     if (!s->active_port) {
>         void *state;
>         pa_device_port *p;
> 
>         PA_HASHMAP_FOREACH(p, s->ports, state) {
>             if (p->available == PA_AVAILABLE_NO)
>                 continue;
> 
>             if (!s->active_port || p->priority > s->active_port->priority)
>                 s->active_port = p;
>         }
>         if (!s->active_port) {
>             PA_HASHMAP_FOREACH(p, s->ports, state)
>                 if (!s->active_port || p->priority > s->active_port->priority)
>                     s->active_port = p;
>         }
>     }
> 
> I think we should do the fallback port initialization only once, in the
> location where you added the new code. We should use the full logic of
> the old fallback initialization code.
> 

How about I take the code above, make a function out of it, and call it
in both places? Maybe there's some module hook somewhere in between that
can set active port to null. (And I don't like PulseAudio crashing even
if a module hook does stupid things.)


-- 
David Henningsson, Canonical Ltd.
https://launchpad.net/~diwic


More information about the pulseaudio-discuss mailing list