tags 1021179 + patch
thanks

Hi Dylan

Jaroslav Kysela prepared a MR [1] that solves the issue. The patch is attached here unchanged: it applies cleanly to the source tree of pipewire v0.3.59-1, I could simply add it to the series and rebuild the binaries.

Thanks

[1] https://gitlab.freedesktop.org/pipewire/pipewire/-/merge_requests/1429
From a2278a5f70fcc03ee72173c44896928d4c6b88d5 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <pe...@perex.cz>
Date: Sat, 29 Oct 2022 20:22:06 +0200
Subject: [PATCH] spa: support the speakers (output) only case in
 report_jack_state()

The Realtek ALC4080 USB audio device (integrated in the
motherboards) can detect the presence on all I/O jacks.

If user connects only speakers, it's a valid case.

BugLink: https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/2744
---
 spa/plugins/alsa/acp/acp.c | 29 +++++++++++++++++++++++++++--
 1 file changed, 27 insertions(+), 2 deletions(-)

diff --git a/spa/plugins/alsa/acp/acp.c b/spa/plugins/alsa/acp/acp.c
index f23232ed3..c49c9e088 100644
--- a/spa/plugins/alsa/acp/acp.c
+++ b/spa/plugins/alsa/acp/acp.c
@@ -624,7 +624,7 @@ static int report_jack_state(snd_mixer_elem_t *melem, unsigned int mask)
 	pa_card *impl = snd_mixer_elem_get_callback_private(melem);
 	snd_hctl_elem_t *elem = snd_mixer_elem_get_private(melem);
 	snd_ctl_elem_value_t *elem_value;
-	bool plugged_in;
+	bool plugged_in, any_input_port_available;
 	void *state;
 	pa_alsa_jack *jack;
 	struct temp_port_avail *tp, *tports;
@@ -735,6 +735,31 @@ static int report_jack_state(snd_mixer_elem_t *melem, unsigned int mask)
 	if (impl->card.active_profile_index != ACP_INVALID_INDEX)
 		active_available = impl->card.profiles[impl->card.active_profile_index]->available;
 
+	/* First round - detect, if we have any input port available.
+	   If the hardware can report the state for all I/O jacks, only speakers
+	   may be plugged in. */
+	any_input_port_available = false;
+	PA_HASHMAP_FOREACH(profile, impl->profiles, state) {
+		pa_device_port *port;
+		void *state2;
+
+		if (profile->profile.flags & ACP_PROFILE_OFF)
+			continue;
+
+		PA_HASHMAP_FOREACH(port, impl->ports, state2) {
+			if (!pa_hashmap_get(port->profiles, profile->profile.name))
+				continue;
+
+			if (port->port.direction == ACP_DIRECTION_CAPTURE &&
+			    port->port.available != ACP_AVAILABLE_NO) {
+				any_input_port_available = true;
+				goto input_port_found;
+			}
+		}
+	}
+input_port_found:
+
+	/* Second round */
 	PA_HASHMAP_FOREACH(profile, impl->profiles, state) {
 		pa_device_port *port;
 		void *state2;
@@ -768,7 +793,7 @@ static int report_jack_state(snd_mixer_elem_t *melem, unsigned int mask)
 
 		if (has_input_port && !has_output_port && found_available_input_port)
 			available = ACP_AVAILABLE_YES;
-		if (has_output_port && !has_input_port && found_available_output_port)
+		if (has_output_port && (!has_input_port || !any_input_port_available) && found_available_output_port)
 			available = ACP_AVAILABLE_YES;
 		if (has_output_port && has_input_port && found_available_output_port && found_available_input_port)
 			available = ACP_AVAILABLE_YES;
-- 
GitLab

Reply via email to