On 2015-10-23 12:56, Tanu Kaskinen wrote: > The alsa card hasn't so far set any availability for profiles. That > caused an issue with some HDMI hardware: the sound card has two HDMI > outputs, but only the second of them is actually usable. The > unavailable port is marked as unavailable and the available port is > marked as available, but this information isn't propagated to the > profile availability. Without profile availability information, the > initial profile policy picks the unavailable one, since it has a > higher priority value. > > This patch adds simple logic for marking some profiles unavailable: > if the profile only contains unavailable ports, the profile is > unavailable too. This can be improved in the future so that if a > profile contains sinks or sources that only contain unavailable ports, > the profile should be marked as unavailable. Implementing that > requires adding more information about the sinks and sources to > pa_card_profile, however. In general ack for the idea; exposing profile availability information is certainly not bad, and might become useful for more things in future. > > BugLink: https://bugzilla.yoctoproject.org/show_bug.cgi?id=8448 > --- > src/modules/alsa/module-alsa-card.c | 24 ++++++++++++++++++++++++ > 1 file changed, 24 insertions(+) > > diff --git a/src/modules/alsa/module-alsa-card.c b/src/modules/alsa/module-alsa-card.c > index ad463ec..fd6b6aa 100644 > --- a/src/modules/alsa/module-alsa-card.c > +++ b/src/modules/alsa/module-alsa-card.c > @@ -364,6 +364,7 @@ static int report_jack_state(snd_mixer_elem_t *melem, unsigned int mask) { > void *state; > pa_alsa_jack *jack; > struct temp_port_avail *tp, *tports; > + pa_card_profile *profile; > > pa_assert(u); > > @@ -409,6 +410,29 @@ static int report_jack_state(snd_mixer_elem_t *melem, unsigned int mask) { > if (tp->avail == PA_AVAILABLE_NO) > pa_device_port_set_available(tp->port, tp->avail); > > + /* Update profile availabilities. The logic could be improved; for now we > + * only set obviously unavailable profiles (those that contain only > + * unavailable ports) to PA_AVAILABLE_NO and all others to > + * PA_AVAILABLE_UNKNOWN. */ I do have a comment about the implementation though. Shouldn't we follow the same "workaround" for profile availability as we do for profiles, i e, go to available first and unavailable later? I'm attaching an untested patch that shows what I mean (my editor might word wrap the patch if I copy-paste it). > + PA_HASHMAP_FOREACH(profile, u->card->profiles, state) { > + pa_device_port *port; > + void *state2; > + pa_available_t available = PA_AVAILABLE_NO; > + > + /* Don't touch the "off" profile. */ > + if (pa_hashmap_size(profile->ports) == 0) > + continue; > + > + PA_HASHMAP_FOREACH(port, profile->ports, state2) { > + if (port->available != PA_AVAILABLE_NO) { > + available = PA_AVAILABLE_UNKNOWN; > + break; > + } > + } > + > + pa_card_profile_set_available(profile, available); > + } > + > pa_xfree(tports); > return 0; > } > -- David Henningsson, Canonical Ltd. https://launchpad.net/~diwic -------------- next part -------------- A non-text attachment was scrubbed... Name: 0001-alsa-set-availability-for-some-unavailable-profiles.patch Type: text/x-diff Size: 2384 bytes Desc: not available URL: <http://lists.freedesktop.org/archives/pulseaudio-discuss/attachments/20151026/0f8ac281/attachment.patch>