diff --git a/src/modules/volume.c b/src/modules/volume.c new file mode 100644 index 0000000..39e5344 --- /dev/null +++ b/src/modules/volume.c @@ -0,0 +1,63 @@ +// Authored by xomf + +#include +#include +#include +#include +#include +#include + + +typedef struct plug_t { + char* name; + char* version; +} plug_t; + + +static plug_t* p = {0}; + +int get_alsa_volume(void) { + long min, max, volume; + snd_mixer_t* handle; + snd_mixer_selem_id_t* sid; + const char* card = "default"; + const char* selem_name = "Master"; + snd_mixer_open(&handle, 0); + snd_mixer_attach(handle, card); + snd_mixer_selem_register(handle, NULL, NULL); + snd_mixer_load(handle); + snd_mixer_selem_id_alloca(&sid); + snd_mixer_selem_id_set_index(sid, 0); + snd_mixer_selem_id_set_name(sid, selem_name); + snd_mixer_elem_t* elem = snd_mixer_find_selem(handle, sid); + snd_mixer_selem_get_playback_volume_range(elem, &min, &max); + snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_MONO, &volume); + snd_mixer_close(handle); + + int percentage = (volume - min) * 100 / (max - min); + return percentage; +} + + +void* plug_init(void) { + p = malloc(sizeof(plug_t)); + assert(p); + p->name = "Volume"; + p->version = "0.0.1"; + return p; +} + +void* plug_pre_reload(void) { + return p; +} + +void plug_post_reload(void* pp) { + p = pp; +} + +void plug_poll(char* buf, size_t len) { + int volume = get_alsa_volume(); + snprintf(buf, len, "Volume: %d%%", volume); +} + +void plug_free(void) {}