diff --git a/src/modules/module-switch-on-port-available.c b/src/modules/module-switch-on-port-available.c index 2fa7e4d62..90a01c8fb 100644 --- a/src/modules/module-switch-on-port-available.c +++ b/src/modules/module-switch-on-port-available.c @@ -234,6 +234,28 @@ static void switch_to_port(pa_device_port *port) { if (pp.is_port_active) return; /* Already selected */ + /* If a port availability became unknown, let's see if it's part of some + * availability group. If it is, it is likely to be a headphone jack that + * does not have impedance sensing to detect whether what was plugged in + * was a headphone, headset or microphone. In desktop environments that + * support it, this will trigger a user choice to select what kind of + * device was plugged in. However, let's switch to the headphone port at + * least, so that we have don't break functionality for setups that can't + * trigger this kind of interaction. + * + * We should make this configurable so that users can optionally override + * the default to a headset or mic. + */ + if (port->available == PA_AVAILABLE_UNKNOWN) { + /* Not part of a group of ports, so likely not a combination port */ + if (!port->availability_group) + return; + + /* For no we only switch the headphone port */ + if (port->direction != PA_DIRECTION_OUTPUT) + return; + } + pa_log_debug("Trying to switch to port %s", port->name); if (!pp.is_preferred_profile_active) { if (try_to_switch_profile(port) < 0) { @@ -303,6 +325,7 @@ static pa_hook_result_t port_available_hook_callback(pa_core *c, pa_device_port return PA_HOOK_OK; switch (port->available) { + case PA_AVAILABLE_UNKNOWN: case PA_AVAILABLE_YES: switch_to_port(port); break;