tmix: add TinyALSA support - spoon - dwm status utility (2f30 fork)
 (HTM) git clone git://src.adamsgaard.dk/spoon
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
 (DIR) commit bd6425ea89b3da5f3f9da693110db6e891b3c474
 (DIR) parent 27087e9c6c2e404ad71a440f2ddf7c76b36831e5
 (HTM) Author: Svyatoslav Mishyn <juef@openmailbox.org>
       Date:   Mon, 23 Oct 2017 23:37:12 +0300
       
       mix: add TinyALSA support
       
       Diffstat:
         M Makefile                            |       5 +++++
         M mix.c                               |      48 ++++++++++++++++++++++++++++++-
       
       2 files changed, 52 insertions(+), 1 deletion(-)
       ---
 (DIR) diff --git a/Makefile b/Makefile
       t@@ -25,7 +25,12 @@ LDLIBS = -lX11
        # comment out the following sections.  The stub implementations
        # from stub.c will be used instead.
        OBJ += mix.o
       +# if ALSA
        LDLIBS_Linux_mix = -lasound
       +CPPFLAGS += -DUSE_TINYALSA=0
       +# else TinyALSA
       +#LDLIBS_Linux_mix = -ltinyalsa
       +#CPPFLAGS += -DUSE_TINYALSA=1
        LDLIBS += $(LDLIBS_$(UNAME)_mix)
        
        OBJ += xkblayout.o
 (DIR) diff --git a/mix.c b/mix.c
       t@@ -66,7 +66,7 @@ out:
                close(fd);
                return ret;
        }
       -#elif __linux__
       +#elif __linux__ && !USE_TINYALSA
        #include <alsa/asoundlib.h>
        
        static int master;
       t@@ -166,4 +166,50 @@ out:
                mixerp = NULL;
                return -1;
        }
       +#elif __linux__ && USE_TINYALSA
       +#include <tinyalsa/asoundlib.h>
       +
       +int
       +mixread(void *arg, char *buf, size_t len)
       +{
       +        struct mixer                *mixer;
       +        struct mixer_ctl        *ctl;
       +        int                         vol, max;
       +        int                         rc = 0;
       +        (void)arg;
       +
       +        if ((mixer = mixer_open(0)) == NULL) {
       +                fprintf(stderr, "mixer_open() failed\n");
       +                return -1;
       +        }
       +
       +        /* Master Playback Switch, see `tinymix contents` */
       +        if ((ctl = mixer_get_ctl(mixer, 10)) == NULL) {
       +                fprintf(stderr, "mixer_get_ctl_by_name() failed\n");
       +                rc = -1;
       +                goto exit;
       +        }
       +        if (!mixer_ctl_get_value(ctl, 0)) {
       +                snprintf(buf, len, "mute");
       +                goto exit;
       +        }
       +
       +        /* Master Playback Volume, see `tinymix contents` */
       +        if ((ctl = mixer_get_ctl(mixer, 9)) == NULL) {
       +                fprintf(stderr, "mixer_get_ctl_by_name() failed\n");
       +                rc = -1;
       +                goto exit;
       +        }
       +        if (!(vol = mixer_ctl_get_value(ctl, 0))) {
       +                snprintf(buf, len, "0%%");
       +                goto exit;
       +        }
       +
       +        max = mixer_ctl_get_range_max(ctl);
       +        snprintf(buf, len, "%d%%", vol * 100 / max);
       +
       +exit:
       +        mixer_close(mixer);
       +        return rc;
       +}
        #endif