diff --git a/0004-alsa-ucm-create-idxsets-function.patch b/0004-alsa-ucm-create-idxsets-function.patch new file mode 100644 index 0000000000000000000000000000000000000000..85cac1531497f2f38fca93fd330a78257ccaf84f --- /dev/null +++ b/0004-alsa-ucm-create-idxsets-function.patch @@ -0,0 +1,130 @@ +commit 61bc64b161b82c9abcd61aa3525a80779bba7509 +Author: yuanzhiyuan +Date: Fri Nov 11 22:17:05 2022 +0800 + + From: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/commit/d8c89de24 + Author: Alper Nebi Yasak + alsa-ucm: Always create device conflicting/supported device idxsets + + This is intended to make the current and upcoming code a bit clearer, as + we won't need to constantly check for the existence of these idxsets + before using or operating on them. + +diff --git a/src/modules/alsa/alsa-ucm.c b/src/modules/alsa/alsa-ucm.c +index 08e36b5..3e23bc4 100644 +--- a/src/modules/alsa/alsa-ucm.c ++++ b/src/modules/alsa/alsa-ucm.c +@@ -523,10 +523,10 @@ static int ucm_get_device_property( + n_confdev = snd_use_case_get_list(uc_mgr, id, &devices); + pa_xfree(id); + ++ device->conflicting_devices = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + if (n_confdev <= 0) + pa_log_debug("No %s for device %s", "_conflictingdevs", device_name); + else { +- device->conflicting_devices = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + ucm_add_devices_to_idxset(device->conflicting_devices, device, verb->devices, devices, n_confdev); + snd_use_case_free_list(devices, n_confdev); + } +@@ -535,10 +535,10 @@ static int ucm_get_device_property( + n_suppdev = snd_use_case_get_list(uc_mgr, id, &devices); + pa_xfree(id); + ++ device->supported_devices = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + if (n_suppdev <= 0) + pa_log_debug("No %s for device %s", "_supporteddevs", device_name); + else { +- device->supported_devices = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + ucm_add_devices_to_idxset(device->supported_devices, device, verb->devices, devices, n_suppdev); + snd_use_case_free_list(devices, n_suppdev); + } +@@ -730,29 +730,17 @@ static void append_lost_relationship(pa_alsa_ucm_device *dev) { + uint32_t idx; + pa_alsa_ucm_device *d; + +- if (dev->conflicting_devices) { +- PA_IDXSET_FOREACH(d, dev->conflicting_devices, idx) { +- if (!d->conflicting_devices) +- d->conflicting_devices = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); ++ PA_IDXSET_FOREACH(d, dev->conflicting_devices, idx) ++ if (pa_idxset_put(d->conflicting_devices, dev, NULL) == 0) ++ pa_log_warn("Add lost conflicting device %s to %s", ++ pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_NAME), ++ pa_proplist_gets(d->proplist, PA_ALSA_PROP_UCM_NAME)); + +- if (pa_idxset_put(d->conflicting_devices, dev, NULL) == 0) +- pa_log_warn("Add lost conflicting device %s to %s", +- pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_NAME), +- pa_proplist_gets(d->proplist, PA_ALSA_PROP_UCM_NAME)); +- } +- } +- +- if (dev->supported_devices) { +- PA_IDXSET_FOREACH(d, dev->supported_devices, idx) { +- if (!d->supported_devices) +- d->supported_devices = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); +- +- if (pa_idxset_put(d->supported_devices, dev, NULL) == 0) +- pa_log_warn("Add lost supported device %s to %s", +- pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_NAME), +- pa_proplist_gets(d->proplist, PA_ALSA_PROP_UCM_NAME)); +- } +- } ++ PA_IDXSET_FOREACH(d, dev->supported_devices, idx) ++ if (pa_idxset_put(d->supported_devices, dev, NULL) == 0) ++ pa_log_warn("Add lost supported device %s to %s", ++ pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_NAME), ++ pa_proplist_gets(d->proplist, PA_ALSA_PROP_UCM_NAME)); + } + + int pa_alsa_ucm_query_profiles(pa_alsa_ucm_config *ucm, int card_index) { +@@ -1199,23 +1187,27 @@ static int ucm_check_conformance( + return 1; + } + +- if (dev->conflicting_devices) { /* the device defines conflicting devices */ +- PA_IDXSET_FOREACH(d, dev->conflicting_devices, idx) { +- for (i = 0; i < dev_num; i++) { +- if (pdevices[i] == d) { +- pa_log_debug("Conflicting device found"); +- return 0; +- } ++ PA_IDXSET_FOREACH(d, dev->conflicting_devices, idx) { ++ /* No conflicting device must already be selected */ ++ for (i = 0; i < dev_num; i++) { ++ if (pdevices[i] == d) { ++ pa_log_debug("Conflicting device found"); ++ return 0; + } + } +- } else if (dev->supported_devices) { /* the device defines supported devices */ ++ } ++ ++ if (!pa_idxset_isempty(dev->supported_devices)) { ++ /* No already selected device must be unsupported */ + for (i = 0; i < dev_num; i++) { + if (!ucm_device_exists(dev->supported_devices, pdevices[i])) { + pa_log_debug("Supported device not found"); + return 0; + } + } +- } else { /* not support any other devices */ ++ } ++ ++ if (pa_idxset_isempty(dev->conflicting_devices) && pa_idxset_isempty(dev->supported_devices)) { + pa_log_debug("Not support any other devices"); + return 0; + } +@@ -2113,10 +2105,8 @@ static void free_verb(pa_alsa_ucm_verb *verb) { + + pa_proplist_free(di->proplist); + +- if (di->conflicting_devices) +- pa_idxset_free(di->conflicting_devices, NULL); +- if (di->supported_devices) +- pa_idxset_free(di->supported_devices, NULL); ++ pa_idxset_free(di->conflicting_devices, NULL); ++ pa_idxset_free(di->supported_devices, NULL); + + pa_xfree(di->eld_mixer_device_name); + diff --git a/pulseaudio.spec b/pulseaudio.spec index 58d8522a9e80f2a5405dc09e83209dd35d5f5988..cdfb41da1a9621bdd2a0906aa6950501b6793d80 100644 --- a/pulseaudio.spec +++ b/pulseaudio.spec @@ -6,7 +6,7 @@ Name: pulseaudio Summary: Improved Linux Sound Server Version: 16.1 -Release: 7 +Release: 8 License: LGPLv2+ URL: https://www.freedesktop.org/wiki/Software/PulseAudio Source0: https://freedesktop.org/software/pulseaudio/releases/pulseaudio-%{version}.tar.xz @@ -20,6 +20,7 @@ Patch1003: 0001-alsa-mixer-allow-to-re-attach-the-mixer-control-elem.patch Patch1004: 0001-idxset-Add-set-contains-function.patch Patch1005: 0002-idxset-Add-set-comparison-operations.patch Patch1006: 0003-idxset-Add-reverse-iteration-functions.patch +Patch1007: 0004-alsa-ucm-create-idxsets-function.patch BuildRequires: meson BuildRequires: automake libtool gcc-c++ bash-completion @@ -247,6 +248,9 @@ exit 0 %{_mandir}/man*/* %changelog +* Fri Nov 11 2022 yuanzhiyuan - 16.1-8 +- alsa-ucm: Always create device conflicting/supported device idxsets + * Mon Dec 12 2022 wuxu - 16.1-7 - idxset: Add reverse iteration functions, set comparison operations adn set contains() function