From 90743a00211380390cf4f953956680624b3f32ec Mon Sep 17 00:00:00 2001
From: Jari Vetoniemi <mailroxas@gmail.com>
Date: Wed, 31 Oct 2018 09:41:48 +0200
Subject: make volume muting work

---
 src/mixer.c | 26 ++++++++++++++++++++++----
 src/stubs.h |  2 --
 2 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/src/mixer.c b/src/mixer.c
index 4738012..48b3882 100644
--- a/src/mixer.c
+++ b/src/mixer.c
@@ -10,7 +10,7 @@ struct _snd_mixer_elem {
    snd_mixer_elem_t *next;
    snd_mixer_t *mixer;
    char name[SYSEX_NAMELEN];
-   unsigned int index, vol;
+   unsigned int index, vol, muted_vol;
 };
 
 struct _snd_mixer {
@@ -94,7 +94,6 @@ get_controls(snd_mixer_t *mixer)
    };
 
    static snd_mixer_elem_t controls[MIXER_MAX_CHANNELS + 1];
-   memset(controls, 0, sizeof(controls));
 
    unsigned char buf[0x100];
    mio_write(mixer->hdl, dumpreq, sizeof(dumpreq));
@@ -310,8 +309,7 @@ snd_mixer_selem_get_playback_dB(snd_mixer_elem_t *elem, snd_mixer_selem_channel_
 int
 snd_mixer_selem_set_playback_dB(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, long value, int dir)
 {
-   setvol(elem->mixer, elem->index, value + 0x7f);
-   elem->vol = value + 0x7f;
+   setvol(elem->mixer, elem->index, (elem->vol = value + 0x7f));
    return 0;
 }
 
@@ -323,6 +321,26 @@ snd_mixer_selem_get_playback_dB_range(snd_mixer_elem_t *elem, long *min, long *m
    return 0;
 }
 
+int
+snd_mixer_selem_get_playback_switch(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, int *value)
+{
+   *value = (elem->vol > 0);
+   return 0;
+}
+
+int
+snd_mixer_selem_set_playback_switch(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, int value)
+{
+   if (value) {
+      elem->muted_vol = (elem->muted_vol ? elem->muted_vol : 10);
+      setvol(elem->mixer, elem->index, (elem->vol = elem->muted_vol));
+   } else {
+      elem->muted_vol = elem->vol;
+      setvol(elem->mixer, elem->index, (elem->vol = 0));
+   }
+   return 0;
+}
+
 int
 snd_mixer_selem_has_playback_volume(snd_mixer_elem_t *elem)
 {
diff --git a/src/stubs.h b/src/stubs.h
index 6e9391e..cf94ee8 100644
--- a/src/stubs.h
+++ b/src/stubs.h
@@ -410,7 +410,6 @@ int snd_mixer_selem_ask_playback_dB_vol(snd_mixer_elem_t *elem, long dBvalue, in
 int snd_mixer_selem_ask_capture_dB_vol(snd_mixer_elem_t *elem, long dBvalue, int dir, long *value) { WARNX1("stub"); return 0; }
 int snd_mixer_selem_get_capture_volume(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, long *value) { WARNX1("stub"); return 0; }
 int snd_mixer_selem_get_capture_dB(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, long *value) { WARNX1("stub"); return 0; }
-int snd_mixer_selem_get_playback_switch(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, int *value) { WARNX1("stub"); return 0; }
 int snd_mixer_selem_get_capture_switch(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, int *value) { WARNX1("stub"); return 0; }
 int snd_mixer_selem_set_playback_volume(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, long value) { WARNX1("stub"); return 0; }
 int snd_mixer_selem_set_capture_volume(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, long value) { WARNX1("stub"); return 0; }
@@ -419,7 +418,6 @@ int snd_mixer_selem_set_playback_volume_all(snd_mixer_elem_t *elem, long value)
 int snd_mixer_selem_set_capture_volume_all(snd_mixer_elem_t *elem, long value) { WARNX1("stub"); return 0; }
 int snd_mixer_selem_set_playback_dB_all(snd_mixer_elem_t *elem, long value, int dir) { WARNX1("stub"); return 0; }
 int snd_mixer_selem_set_capture_dB_all(snd_mixer_elem_t *elem, long value, int dir) { WARNX1("stub"); return 0; }
-int snd_mixer_selem_set_playback_switch(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, int value) { WARNX1("stub"); return 0; }
 int snd_mixer_selem_set_capture_switch(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, int value) { WARNX1("stub"); return 0; }
 int snd_mixer_selem_set_playback_switch_all(snd_mixer_elem_t *elem, int value) { WARNX1("stub"); return 0; }
 int snd_mixer_selem_set_capture_switch_all(snd_mixer_elem_t *elem, int value) { WARNX1("stub"); return 0; }
-- 
cgit v1.2.3-70-g09d2