76 lines
1.4 KiB
C
76 lines
1.4 KiB
C
/* see LICENSE file for details on license */
|
|
#include <unistd.h>
|
|
#include <fcntl.h>
|
|
#include <time.h>
|
|
#include <alsa/asoundlib.h>
|
|
#include <alloca.h>
|
|
|
|
#include "module.h"
|
|
|
|
int audio_volume(long *outvol) {
|
|
int ret = 0;
|
|
snd_mixer_t *handle;
|
|
snd_mixer_elem_t *elem;
|
|
snd_mixer_selem_id_t *sid;
|
|
|
|
static const char *mix_name = "Master";
|
|
static const char *card = "default";
|
|
static int mix_index = 0;
|
|
|
|
long minv, maxv;
|
|
|
|
snd_mixer_selem_id_alloca(&sid);
|
|
|
|
snd_mixer_selem_id_set_index(sid, mix_index);
|
|
snd_mixer_selem_id_set_name(sid, mix_name);
|
|
|
|
if((snd_mixer_open(&handle, 0)) < 0)
|
|
return -1;
|
|
|
|
if((snd_mixer_attach(handle, card)) < 0) {
|
|
snd_mixer_close(handle);
|
|
return -1;
|
|
}
|
|
|
|
if((snd_mixer_selem_register(handle, NULL, NULL)) < 0) {
|
|
snd_mixer_close(handle);
|
|
return -1;
|
|
}
|
|
|
|
ret = snd_mixer_load(handle);
|
|
if(ret < 0) {
|
|
snd_mixer_close(handle);
|
|
return -1;
|
|
}
|
|
|
|
elem = snd_mixer_find_selem(handle, sid);
|
|
if(!elem) {
|
|
snd_mixer_close(handle);
|
|
return -1;
|
|
}
|
|
|
|
snd_mixer_selem_get_playback_volume_range (elem, &minv, &maxv);
|
|
|
|
if(snd_mixer_selem_get_playback_volume(elem, 0, outvol) < 0) {
|
|
snd_mixer_close(handle);
|
|
return -1;
|
|
}
|
|
|
|
/* make the value bound to 100 */
|
|
*outvol -= minv;
|
|
maxv -= minv;
|
|
minv = 0;
|
|
*outvol = 100 * (*outvol) / maxv;
|
|
|
|
snd_mixer_close(handle);
|
|
return 0;
|
|
}
|
|
|
|
int alsa_update(struct module *module) {
|
|
long vol = -1;
|
|
audio_volume(&vol);
|
|
snprintf((char *)&module->buffer, MODULE_BUFFER_LEN, "%li", vol);
|
|
|
|
return 0;
|
|
}
|