diff --git a/0001-alsa-mixer-allow-to-re-attach-the-mixer-control-elem.patch b/0001-alsa-mixer-allow-to-re-attach-the-mixer-control-elem.patch new file mode 100644 index 0000000000000000000000000000000000000000..bacdc6bc3022c1aaab86564148b4e325aa5a1999 --- /dev/null +++ b/0001-alsa-mixer-allow-to-re-attach-the-mixer-control-elem.patch @@ -0,0 +1,49 @@ +From def8eb074eb4a80836c39fa320c33fe89bce38d9 Mon Sep 17 00:00:00 2001 +From: Jaroslav Kysela +Date: Mon, 27 Jun 2022 10:32:07 +0200 +Subject: [PATCH] alsa-mixer: allow to re-attach the mixer control element + +It may be possible that the ALSA control element appears +again. Allow this combination by checking, if the pulseaudio +mixer element already exists. Do not create the duplicate +mixer element in this case. + +Signed-off-by: Jaroslav Kysela +Part-of: +--- + src/modules/alsa/alsa-util.c | 18 +++++++++++++----- + 1 file changed, 13 insertions(+), 5 deletions(-) + +diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c +index f4e838d37..81dc77cc3 100644 +--- a/src/modules/alsa/alsa-util.c ++++ b/src/modules/alsa/alsa-util.c +@@ -1663,12 +1663,20 @@ static int mixer_class_event(snd_mixer_class_t *class, unsigned int mask, + } else if (mask & SND_CTL_EVENT_MASK_ADD) { + snd_ctl_elem_iface_t iface = snd_hctl_elem_get_interface(helem); + if (iface == SND_CTL_ELEM_IFACE_CARD || iface == SND_CTL_ELEM_IFACE_PCM) { ++ snd_mixer_t *mixer = snd_mixer_class_get_mixer(class); ++ snd_ctl_elem_iface_t iface = snd_hctl_elem_get_interface(helem); ++ const char *name = snd_hctl_elem_get_name(helem); ++ const int index = snd_hctl_elem_get_index(helem); ++ const int device = snd_hctl_elem_get_device(helem); + snd_mixer_elem_t *new_melem; +- +- /* Put the hctl pointer as our private data - it will be useful for callbacks */ +- if ((err = snd_mixer_elem_new(&new_melem, SND_MIXER_ELEM_PULSEAUDIO, 0, helem, NULL)) < 0) { +- pa_log_warn("snd_mixer_elem_new failed: %s", pa_alsa_strerror(err)); +- return 0; ++ ++ new_melem = pa_alsa_mixer_find(mixer, iface, name, index, device); ++ if (!new_melem) { ++ /* Put the hctl pointer as our private data - it will be useful for callbacks */ ++ if ((err = snd_mixer_elem_new(&new_melem, SND_MIXER_ELEM_PULSEAUDIO, 0, helem, NULL)) < 0) { ++ pa_log_warn("snd_mixer_elem_new failed: %s", pa_alsa_strerror(err)); ++ return 0; ++ } + } + + if ((err = snd_mixer_elem_attach(new_melem, helem)) < 0) { +-- +2.33.0 + diff --git a/pulseaudio.spec b/pulseaudio.spec index bda7578c486e5383c9ff5c616733ac6d3aa7dcb3..3a38fcaeafc7dba7ba0c89f8ceca5f56c3954584 100644 --- a/pulseaudio.spec +++ b/pulseaudio.spec @@ -6,7 +6,7 @@ Name: pulseaudio Summary: Improved Linux Sound Server Version: 16.1 -Release: 4 +Release: 6 License: LGPLv2+ URL: https://www.freedesktop.org/wiki/Software/PulseAudio Source0: https://freedesktop.org/software/pulseaudio/releases/pulseaudio-%{version}.tar.xz @@ -16,6 +16,7 @@ Source5: default.pa-for-gdm Patch201: pulseaudio-autostart.patch Patch1001: 0001-Fix-the-problem-that-the-description-field-of-pa_als.patch Patch1002: 0001-alsa-mixer-avoid-assertion-at-alsa-lib-mixer-API-whe.patch +Patch1003: 0001-alsa-mixer-allow-to-re-attach-the-mixer-control-elem.patch BuildRequires: meson BuildRequires: automake libtool gcc-c++ bash-completion @@ -243,7 +244,10 @@ exit 0 %{_mandir}/man*/* %changelog -* Mon Dec 12 2022 wuxu - 16.1-4 +* Mon Dec 12 2022 wuxu - 16.1-6 +- alsa-mixer: allow to re-attach the mixer control element + +* Mon Dec 12 2022 wuxu - 16.1-5 - alsa-mixer: avoid assertion at alsa-lib mixer API when element removal * Tue Oct 18 2022 Liu Zixian - 16.1-4