/* sound volume get/set code based on code from here: https://stackoverflow.com/a/7661176/5737011 https://stackoverflow.com/questions/7657624/get-master-sound-volume-in-c-in-linux/7661176#7661176 */ //#include #include #include #include #include #include "vol-alsa.h" #define card_name "default" #define mixer_name "Master" #define mixer_index 0 /* TODO: figure out what all this means */ extern int alsa_volume(int flags, unsigned int * volume, unsigned char * mute) { snd_mixer_t * handle; snd_mixer_elem_t * elem; snd_mixer_selem_id_t * sid; snd_mixer_selem_id_alloca(&sid); snd_mixer_selem_id_set_name(sid, mixer_name); snd_mixer_selem_id_set_index(sid, mixer_index); if(snd_mixer_open(&handle, 0)<0) return -1; if(snd_mixer_attach(handle, card_name)<0) { snd_mixer_close(handle); return -2; } if(snd_mixer_selem_register(handle, NULL, NULL)<0) { snd_mixer_close(handle); return -3; } if(snd_mixer_load(handle)<0) { snd_mixer_close(handle); return -4; } if(!(elem = snd_mixer_find_selem(handle, sid))) { snd_mixer_close(handle); return -5; } { long minv, maxv, vv; int i; snd_mixer_selem_get_playback_volume_range (elem, &minv, &maxv); // fprintf(stderr, "Volume range <%i,%i>\n", minv, maxv); if(flags & 1) { vv = *volume; if(vv>1000) vv = 1000; vv = (vv*(maxv-minv)+500)/1000 + minv; if(snd_mixer_selem_set_playback_volume(elem, 0, vv) < 0) { snd_mixer_close(handle); return -8; } if(snd_mixer_selem_set_playback_volume(elem, 1, vv) < 0) { snd_mixer_close(handle); return -9; } } if(flags & 4) { i = !*mute; if(snd_mixer_selem_set_playback_switch(elem, 0, i) < 0) { snd_mixer_close(handle); return -8; } if(snd_mixer_selem_set_playback_switch(elem, 1, i) < 0) { snd_mixer_close(handle); return -9; } } if(flags & 2) { if(snd_mixer_selem_get_playback_volume(elem, 0, &vv) < 0) { snd_mixer_close(handle); return -6; } if(vv<=minv) vv = 0; else if(vv>=maxv) vv = 1000; else vv = (1000*(vv-minv)+(maxv-minv)/2)/(maxv-minv); *volume = vv; } if(flags & 8) { if(snd_mixer_selem_get_playback_switch(elem, 0, &i) < 0) { snd_mixer_close(handle); return -6; } *mute = !i; } } snd_mixer_close(handle); return 0; }