In case there are two independent jacks for one port (e.g. Dock Headphone Jack and Headphone Jack), the availability ends up being incorrect if the first one was _NO (not plugged) and the second gets _YES (plugged). Also pulse complains about the state being inconsistent which isn't true. Fix this by preferring more precise states (yes/no) over unknown and yes over others. However in case a plugged jack makes the port unavailable let that overrule everything else. --- src/modules/alsa/module-alsa-card.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/modules/alsa/module-alsa-card.c b/src/modules/alsa/module-alsa-card.c index ed332e0..fc9a772 100644 --- a/src/modules/alsa/module-alsa-card.c +++ b/src/modules/alsa/module-alsa-card.c @@ -335,15 +335,26 @@ static void report_port_state(pa_device_port *p, struct userdata *u) { cpa = jack->plugged_in ? jack->state_plugged : jack->state_unplugged; - /* "Yes" and "no" trumphs "unknown" if we have more than one jack */ - if (cpa == PA_AVAILABLE_UNKNOWN) - continue; + if (cpa == PA_AVAILABLE_NO) { + /* If a plugged-in jack causes the availability to go to NO, it + * should override all other availability information (like a + * blacklist) so set and bail */ + if (jack->plugged_in) { + pa = cpa; + break; + } - if ((cpa == PA_AVAILABLE_NO && pa == PA_AVAILABLE_YES) || - (pa == PA_AVAILABLE_NO && cpa == PA_AVAILABLE_YES)) - pa_log_warn("Availability of port '%s' is inconsistent!", p->name); - else + /* If the current availablility is unknown go the more precise no, + * but otherwise don't change state */ + if (pa == PA_AVAILABLE_UNKNOWN) pa = cpa; + } else if (cpa == PA_AVAILABLE_YES) { + /* Output is available through at least one jack, so go to that + * level of availability. We still need to continue iterating through + * the jacks in case a jack is plugged in that forces the state to no + */ + pa = cpa; + } } pa_device_port_set_available(p, pa); -- 2.1.3