[pulseaudio-discuss] [PATCH] check if mixer is volume control before using it

Adel Gadllah adel.gadllah at gmail.com
Mon Dec 8 13:03:38 PST 2008


Hi,

On my system the "Master" mixer is just an odd switch, while "PCM" is
the real one. (discussion in #fedora-desktop)
PA tries to use "Master" because it does not check if it is useable,
which causes weird volume control bugs.
The attached patch fixes this by checking this in pa_alsa_find_elem().

-----------------------------

Check if a mixer offers volume control before attempting to use it.

Signed-off-by: Adel Gadllah <adel.gadllah at gmail.com>

diff --git a/src/modules/alsa-util.c b/src/modules/alsa-util.c
index 20dc400..7eacf72 100644
--- a/src/modules/alsa-util.c
+++ b/src/modules/alsa-util.c
@@ -740,6 +740,16 @@ int pa_alsa_prepare_mixer(snd_mixer_t *mixer,
const char *dev) {
     return 0;
 }

+static int pa_alsa_elem_has_volume(snd_mixer_elem_t *elem) {
+	pa_assert(elem);
+
+	if (snd_mixer_selem_has_playback_volume(elem))
+		return 1;
+	if (snd_mixer_selem_has_capture_volume(elem))
+		return 1;
+	return 0;
+}
+
 snd_mixer_elem_t *pa_alsa_find_elem(snd_mixer_t *mixer, const char
*name, const char *fallback) {
     snd_mixer_elem_t *elem;
     snd_mixer_selem_id_t *sid = NULL;
@@ -751,13 +761,13 @@ snd_mixer_elem_t *pa_alsa_find_elem(snd_mixer_t
*mixer, const char *name, const

     snd_mixer_selem_id_set_name(sid, name);

-    if (!(elem = snd_mixer_find_selem(mixer, sid))) {
+    if (!(elem = snd_mixer_find_selem(mixer, sid)) ||
!pa_alsa_elem_has_volume(elem)) {
         pa_log_info("Cannot find mixer control \"%s\".",
snd_mixer_selem_id_get_name(sid));

         if (fallback) {
             snd_mixer_selem_id_set_name(sid, fallback);

-            if (!(elem = snd_mixer_find_selem(mixer, sid)))
+            if (!(elem = snd_mixer_find_selem(mixer, sid)) ||
!pa_alsa_elem_has_volume(elem))
                 pa_log_warn("Cannot find fallback mixer control
\"%s\".", snd_mixer_selem_id_get_name(sid));
         }
     }



More information about the pulseaudio-discuss mailing list