summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHector Martin <marcan@marcan.st>2022-11-17 18:36:17 +0900
committerPulseAudio Marge Bot <pulseaudio-maintainers@lists.freedesktop.org>2023-03-19 21:22:32 +0000
commit3e038c6d88129feeb7deaac6d853b5451170d288 (patch)
treec1e17f7deb7b4d1c75a7bfd9a09f0cb76f743399
parent7005eafee305dfac5c314cee0d0109c2a472ffd1 (diff)
downloadpulseaudio-3e038c6d88129feeb7deaac6d853b5451170d288.tar.gz
alsa: ucm: Fix spurious mixer path removal on initial profile set
The code that removes the mixer path if probing fails can be called in the path that sets a non-off device profile on hotplug *before* card->active_profile is updated, which results in spuriously removing the mixer path. By this point, context->ucm->active_verb would be set to the same as the profile name, so we can use that instead to avoid the issue. On Apple Silicon machines with the UCM profiles in the Asahi Linux repo, this manifests as the headphones jack having hardware volume controls *only* if PA is started with headphones connected and until they are disconnected. Hotplugs end up triggering the bad codepath, and it falls back to software volume (which is particularly a problem when the hardware volume happens to be very low or 0 at that point). Fixes: a9cc1373e2a7 ("alsa: ucm - update the mixer path also after volume probe") Signed-off-by: Hector Martin <marcan@marcan.st> Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/752>
-rw-r--r--src/modules/alsa/alsa-ucm.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/modules/alsa/alsa-ucm.c b/src/modules/alsa/alsa-ucm.c
index 1cdd140c6..bb9438f79 100644
--- a/src/modules/alsa/alsa-ucm.c
+++ b/src/modules/alsa/alsa-ucm.c
@@ -1454,8 +1454,11 @@ void pa_alsa_ucm_add_ports(
* pa_alsa_ucm_port_data.path, which is not cleared by probe_volumes() if
* the path gets removed, so we have to call update_mixer_paths() here to
* unset the cached path if needed. */
- if (card->active_profile)
- update_mixer_paths(*p, card->active_profile->name);
+ if (context->ucm->active_verb) {
+ const char *verb_name;
+ verb_name = pa_proplist_gets(context->ucm->active_verb->proplist, PA_ALSA_PROP_UCM_NAME);
+ update_mixer_paths(*p, verb_name);
+ }
/* then set property PA_PROP_DEVICE_INTENDED_ROLES */
merged_roles = pa_xstrdup(pa_proplist_gets(proplist, PA_PROP_DEVICE_INTENDED_ROLES));