diff --git a/Makefile b/Makefile index 2f93b87..41d5e9a 100644 --- a/Makefile +++ b/Makefile @@ -6,6 +6,7 @@ include config.mk REQ = util COM =\ + components/alsa_master_vol\ components/battery\ components/cpu\ components/datetime\ diff --git a/components/alsa_master_vol.c b/components/alsa_master_vol.c new file mode 100644 index 0000000..acc283b --- /dev/null +++ b/components/alsa_master_vol.c @@ -0,0 +1,64 @@ +/* Created by William Rabbermann */ +#include +#include +#include +#include "../util.h" + +#define TMP_BUF_SIZE 14 +#define VOL_BUF_SIZE 5 + +const char * +alsa_master_vol(void) +{ + bool MASTER_IS_MUTED = true; + char tmp_buf[TMP_BUF_SIZE]; + short b; + unsigned short i = 0; + + FILE *fp = popen("amixer get Master | tail -c13", "r"); + char ch; + while ((ch = fgetc(fp)) != EOF && i < TMP_BUF_SIZE) + tmp_buf[i++] = ch; + tmp_buf[i] = '\0'; + pclose(fp); + + b = i - 1; + while (b >= 0) + { + if ('[' == tmp_buf[b]) + { + if (tmp_buf[b+1] == 'o' && tmp_buf[b+2] == 'n') + MASTER_IS_MUTED = false; + b -= 3; + break; + } + b--; + } + + if (MASTER_IS_MUTED) return bprintf("MUTE"); + else + { + char vol_buf[VOL_BUF_SIZE]; + while (b >= 0) + { + if ('[' == tmp_buf[b]) + break; + b--; + } + + i = 0; + while (i < VOL_BUF_SIZE) + { + b++; + if (']' == tmp_buf[b]) + { + vol_buf[i] = '\0'; + break; + } + else + vol_buf[i++] = tmp_buf[b]; + } + + return bprintf("%s", vol_buf); + } +} diff --git a/config.def.h b/config.def.h index 93a875a..6074441 100644 --- a/config.def.h +++ b/config.def.h @@ -58,6 +58,7 @@ static const char unknown_str[] = "n/a"; * uid UID of current user NULL * uptime system uptime NULL * username username of current user NULL + * alsa_master_vol ALSA Master device volume NULL * vol_perc OSS/ALSA volume in percent mixer file (/dev/mixer) * NULL on OpenBSD * wifi_perc WiFi signal in percent interface name (wlan0) diff --git a/slstatus.h b/slstatus.h index b0f2564..415afc1 100644 --- a/slstatus.h +++ b/slstatus.h @@ -78,6 +78,7 @@ const char *uid(void); /* volume */ const char *vol_perc(const char *card); +const char *alsa_master_vol(void); /* wifi */ const char *wifi_perc(const char *interface);