50 lines
2.4 KiB
Diff
50 lines
2.4 KiB
Diff
|
|
From def8eb074eb4a80836c39fa320c33fe89bce38d9 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Jaroslav Kysela <perex@perex.cz>
|
||
|
|
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 <perex@perex.cz>
|
||
|
|
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/729>
|
||
|
|
---
|
||
|
|
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
|
||
|
|
|