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