From 3177f41cb4ffde8631249ab76d87c36a6544e1a3 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Mon, 20 Mar 2023 13:19:51 +0100 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. Link: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/commit/def8eb074eb4a80836c39fa320c33fe89bce38d9 Signed-off-by: Jaroslav Kysela --- spa/plugins/alsa/acp/alsa-util.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/spa/plugins/alsa/acp/alsa-util.c b/spa/plugins/alsa/acp/alsa-util.c index c76cef3e2..38ae934eb 100644 --- a/spa/plugins/alsa/acp/alsa-util.c +++ b/spa/plugins/alsa/acp/alsa-util.c @@ -1648,12 +1648,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) {