summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTanu Kaskinen <tanuk@iki.fi>2020-11-21 16:52:23 +0200
committerArun Raghavan <arun@arunraghavan.net>2020-11-23 02:07:22 +0000
commiteaa6d5d6c1a707aec2c24d28dc8a1f5fa5a4c426 (patch)
treecf454c6e8a7fbc4e8ef36371ecffb18567f99c9c
parent6ad2d207c5f56320a3573dd883c6d0400c145a77 (diff)
downloadpulseaudio-eaa6d5d6c1a707aec2c24d28dc8a1f5fa5a4c426.tar.gz
switch-on-port-available: Fix switching away from unplugged headphones
Commits 323195e305 ("switch-on-port-available: Switch to headphones on unknown availability") and d83ad6990e ("module-alsa-card: Drop availability groups with only one port") broke switching from headphones to speakers when headphones are unplugged. switch_from_port() selects speakers, whose availability is unknown and availability group is unset, and then calls switch_to_port(). The new logic in switch_on_port() unintentionally blocked that switch. This patch moves the problematic logic from switch_to_port() to port_available_hook_callback() where it doesn't interfere with switch_from_port(). Fixes: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/1043
-rw-r--r--src/modules/module-switch-on-port-available.c54
1 files changed, 28 insertions, 26 deletions
diff --git a/src/modules/module-switch-on-port-available.c b/src/modules/module-switch-on-port-available.c
index a7259cfad..84b856659 100644
--- a/src/modules/module-switch-on-port-available.c
+++ b/src/modules/module-switch-on-port-available.c
@@ -234,32 +234,6 @@ 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) {
- pa_log_debug("Not switching to port %s, its availability is unknown and it's not in any availability group.", port->name);
- return;
- }
-
- /* For no we only switch the headphone port */
- if (port->direction != PA_DIRECTION_OUTPUT) {
- pa_log_debug("Not switching to input port %s, its availability is unknown.", port->name);
- 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) {
@@ -330,6 +304,34 @@ static pa_hook_result_t port_available_hook_callback(pa_core *c, pa_device_port
switch (port->available) {
case PA_AVAILABLE_UNKNOWN:
+ /* 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. */
+
+ /* Not part of a group of ports, so likely not a combination port */
+ if (!port->availability_group) {
+ pa_log_debug("Not switching to port %s, its availability is unknown and it's not in any availability group.", port->name);
+ break;
+ }
+
+ /* For no we only switch the headphone port */
+ if (port->direction != PA_DIRECTION_OUTPUT) {
+ pa_log_debug("Not switching to input port %s, its availability is unknown.", port->name);
+ break;
+ }
+
+ switch_to_port(port);
+ break;
+
case PA_AVAILABLE_YES:
switch_to_port(port);
break;