[pulseaudio-discuss] card: Only set active_profile with available profile

David Henningsson david.henningsson at canonical.com
Fri Nov 15 07:13:46 PST 2013


On 11/15/2013 09:31 AM, Colin Guthrie wrote:
> 'Twas brillig, and Tanu Kaskinen at 05/11/13 20:34 did gyre and gimble:
>>  src/pulsecore/card.c |    7 ++++++-
>>  1 file changed, 6 insertions(+), 1 deletion(-)
>>
>> New commits:
>> commit f434087e42bca15fae938f6cc01d2875c4c7728b
>> Author: Luiz Augusto von Dentz <luiz.von.dentz at intel.com>
>> Date:   Sun Nov 3 15:05:34 2013 +0200
>>
>>     card: Only set active_profile with available profile
>>     
>>     When a card is being created and no profile has been assigned
>>     pa_card_new will attempt to select one from the list but it does that
>>     without checking the available flag which can lead to select profiles
>>     not available.
>>
>> diff --git a/src/pulsecore/card.c b/src/pulsecore/card.c
>> index e6e0836..4ae16c2 100644
>> --- a/src/pulsecore/card.c
>> +++ b/src/pulsecore/card.c
>> @@ -195,9 +195,14 @@ pa_card *pa_card_new(pa_core *core, pa_card_new_data *data) {
>>              c->save_profile = data->save_profile;
>>  
>>      if (!c->active_profile) {
>> -        PA_HASHMAP_FOREACH(profile, c->profiles, state)
>> +        PA_HASHMAP_FOREACH(profile, c->profiles, state) {
>> +            if (profile->available == PA_AVAILABLE_NO)
>> +                continue;
>> +
>>              if (!c->active_profile || profile->priority > c->active_profile->priority)
>>                  c->active_profile = profile;
>> +        }
>> +        pa_assert(c->active_profile);
> 
> Doesn't this leave the possibility of a crash if no active profiles exist?
> 
> Wouldn't it make more sense to fall back to setting it to *something*
> even if it is unavailable?

I agree with you, but Luiz did not, and Tanu committed Luiz's version.

In practice, unavailable profiles only exists with bluetooth so far, so
I didn't bother screaming about it.

> As a side note, would it be better to prefer PA_AVAILABLE_YES profiles
> over PA_AVAILABLE_UNKNOWN ones?

For ports, in practice, I think not. There are fairly common cases where
they should be considered equal - the same card can have both internal
speaker, headphones, and an hdmi output, and whether the hdmi toggles
between yes and no, or stays at unknown, depends on how old your
graphics card is. At the same time the headphones always toggle, and
internal speaker toggles between "unknown" and "no"(!).

Btw, module-switch-on-port-available already has a find_best_port
function. Perhaps we can just move that one to a generic location and
use it from both places?

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


More information about the pulseaudio-discuss mailing list