diff options
Diffstat (limited to 'media-sound/pulseaudio-daemon/files/pulseaudio-17.0-pr802.patch')
-rw-r--r-- | media-sound/pulseaudio-daemon/files/pulseaudio-17.0-pr802.patch | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/media-sound/pulseaudio-daemon/files/pulseaudio-17.0-pr802.patch b/media-sound/pulseaudio-daemon/files/pulseaudio-17.0-pr802.patch new file mode 100644 index 000000000000..3fd2adc0cff4 --- /dev/null +++ b/media-sound/pulseaudio-daemon/files/pulseaudio-17.0-pr802.patch @@ -0,0 +1,64 @@ +From ed3d4f0837f670e5e5afb1afa5bcfc8ff05d3407 Mon Sep 17 00:00:00 2001 +From: Alper Nebi Yasak <alpernebiyasak@gmail.com> +Date: Fri, 1 Dec 2023 13:28:05 +0300 +Subject: [PATCH] alsa-ucm: Replace port device UCM context assertion with an + error + +The pa_alsa_ucm_set_port() function is passed both a mapping context and +a device port, and both of these refer to their respective UCM device. +While switching over to having one port per mapping per UCM device, I +expected both of these to be the same device struct, so added an assert +checking so. + +This assertion gets triggered when we have multiple UCM verbs declaring +the same UCM device name. The root cause here is that the ports' UCM +device references are set once while creating the ports for the card, so +they happen to be those of a specific verb and may not match those from +a different UCM verb's profiles' mappings. + +Solving the root cause necessitates a larger refactor. What we actually +assume here is that name of the UCM device is same for both the port and +the UCM context, which ends up always true in practice. For now, replace +the assert with a check and error. + +Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com> +Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/802> +--- + src/modules/alsa/alsa-ucm.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +diff --git a/src/modules/alsa/alsa-ucm.c b/src/modules/alsa/alsa-ucm.c +index 7f5136249..018c01739 100644 +--- a/src/modules/alsa/alsa-ucm.c ++++ b/src/modules/alsa/alsa-ucm.c +@@ -1581,6 +1581,7 @@ int pa_alsa_ucm_set_port(pa_alsa_ucm_mapping_context *context, pa_device_port *p + pa_alsa_ucm_config *ucm; + pa_alsa_ucm_device *dev; + pa_alsa_ucm_port_data *data; ++ const char *dev_name, *ucm_dev_name; + + pa_assert(context && context->ucm); + +@@ -1588,8 +1589,17 @@ int pa_alsa_ucm_set_port(pa_alsa_ucm_mapping_context *context, pa_device_port *p + pa_assert(ucm->ucm_mgr); + + data = PA_DEVICE_PORT_DATA(port); +- dev = context->ucm_device; +- pa_assert(dev == data->device); ++ dev = data->device; ++ pa_assert(dev); ++ ++ if (context->ucm_device) { ++ dev_name = pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_NAME); ++ ucm_dev_name = pa_proplist_gets(context->ucm_device->proplist, PA_ALSA_PROP_UCM_NAME); ++ if (!pa_streq(dev_name, ucm_dev_name)) { ++ pa_log_error("Failed to set port %s with wrong UCM context: %s", dev_name, ucm_dev_name); ++ return -1; ++ } ++ } + + return ucm_device_enable(ucm, dev); + } +-- +GitLab + |