--- components/volume.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/components/volume.c b/components/volume.c index 61cec90..f0b572e 100644 --- a/components/volume.c +++ b/components/volume.c _AT_@ -72,6 +72,61 @@ return bprintf("%d", m ? 0 : v * 100 / 255); } +#elif defined(ALSA) + #include <alsa/asoundlib.h> + + static const char *devname = "default"; + const char * + vol_perc(const char *mixname) + { + snd_mixer_t *mixer = NULL; + snd_mixer_selem_id_t *mixid = NULL; + snd_mixer_elem_t *elem = NULL; + long min = 0, max = 0, volume = -1; + int err; + + if ((err = snd_mixer_open(&mixer, 0))) { + warn("snd_mixer_open: %d", err); + return NULL; + } + if ((err = snd_mixer_attach(mixer, devname))) { + warn("snd_mixer_attach(mixer, \"%s\"): %d", devname, err); + goto cleanup; + } + if ((err = snd_mixer_selem_register(mixer, NULL, NULL))) { + warn("snd_mixer_selem_register(mixer, NULL, NULL): %d", err); + goto cleanup; + } + if ((err = snd_mixer_load(mixer))) { + warn("snd_mixer_load(mixer): %d", err); + goto cleanup; + } + + snd_mixer_selem_id_alloca(&mixid); + snd_mixer_selem_id_set_name(mixid, mixname); + snd_mixer_selem_id_set_index(mixid, 0); + + elem = snd_mixer_find_selem(mixer, mixid); + if (!elem) { + warn("snd_mixer_find_selem(mixer, \"%s\") == NULL", mixname); + goto cleanup; + } + + if ((err = snd_mixer_selem_get_playback_volume_range(elem, &min, &max))) { + warn("snd_mixer_selem_get_playback_volume_range(): %d", err); + goto cleanup; + } + if ((err = snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_MONO, &volume))) { + warn("snd_mixer_selem_get_playback_volume(): %d", err); + } + + cleanup: + snd_mixer_free(mixer); + snd_mixer_detach(mixer, devname); + snd_mixer_close(mixer); + + return volume == -1 ? NULL : bprintf("%.0f", (volume-min)*100./(max-min)); + } #else #include <sys/soundcard.h> -- Best regards, IvanReceived on Sat May 04 2019 - 10:59:58 CEST
This archive was generated by hypermail 2.3.0 : Sat May 04 2019 - 13:00:24 CEST