| slstatus-alsa-4bd78c9.patch - sites - public wiki contents of suckless.org | |
| git clone git://git.suckless.org/sites | |
| Log | |
| Files | |
| Refs | |
| --- | |
| slstatus-alsa-4bd78c9.patch (2083B) | |
| --- | |
| 1 Author: Ivan Krylov <[email protected]> | |
| 2 Date: Sat May 4 11:59:58 2019 +0300 | |
| 3 | |
| 4 Add ALSA volume support | |
| 5 | |
| 6 To use, add -DALSA to CPPFLAGS, -lasound to LDFLAGS and pass the | |
| 7 control name (e.g. Master) as argument to vol_perc in config.h. | |
| 8 | |
| 9 diff --git a/components/volume.c b/components/volume.c | |
| 10 index 6cec556..15c5a39 100644 | |
| 11 --- a/components/volume.c | |
| 12 +++ b/components/volume.c | |
| 13 @@ -182,6 +182,61 @@ | |
| 14 | |
| 15 return bprintf("%d", value); | |
| 16 } | |
| 17 +#elif defined(ALSA) | |
| 18 + #include <alsa/asoundlib.h> | |
| 19 + | |
| 20 + static const char *devname = "default"; | |
| 21 + const char * | |
| 22 + vol_perc(const char *mixname) | |
| 23 + { | |
| 24 + snd_mixer_t *mixer = NULL; | |
| 25 + snd_mixer_selem_id_t *mixid = NULL; | |
| 26 + snd_mixer_elem_t *elem = NULL; | |
| 27 + long min = 0, max = 0, volume = -1; | |
| 28 + int err; | |
| 29 + | |
| 30 + if ((err = snd_mixer_open(&mixer, 0))) { | |
| 31 + warn("snd_mixer_open: %d", err); | |
| 32 + return NULL; | |
| 33 + } | |
| 34 + if ((err = snd_mixer_attach(mixer, devname))) { | |
| 35 + warn("snd_mixer_attach(mixer, \"%s\"): %d", dev… | |
| 36 + goto cleanup; | |
| 37 + } | |
| 38 + if ((err = snd_mixer_selem_register(mixer, NULL, NULL))… | |
| 39 + warn("snd_mixer_selem_register(mixer, NULL, NUL… | |
| 40 + goto cleanup; | |
| 41 + } | |
| 42 + if ((err = snd_mixer_load(mixer))) { | |
| 43 + warn("snd_mixer_load(mixer): %d", err); | |
| 44 + goto cleanup; | |
| 45 + } | |
| 46 + | |
| 47 + snd_mixer_selem_id_alloca(&mixid); | |
| 48 + snd_mixer_selem_id_set_name(mixid, mixname); | |
| 49 + snd_mixer_selem_id_set_index(mixid, 0); | |
| 50 + | |
| 51 + elem = snd_mixer_find_selem(mixer, mixid); | |
| 52 + if (!elem) { | |
| 53 + warn("snd_mixer_find_selem(mixer, \"%s\") == NU… | |
| 54 + goto cleanup; | |
| 55 + } | |
| 56 + | |
| 57 + if ((err = snd_mixer_selem_get_playback_volume_range(el… | |
| 58 + warn("snd_mixer_selem_get_playback_volume_range… | |
| 59 + goto cleanup; | |
| 60 + } | |
| 61 + if ((err = snd_mixer_selem_get_playback_volume(elem, SN… | |
| 62 + warn("snd_mixer_selem_get_playback_volume(): %d… | |
| 63 + } | |
| 64 + | |
| 65 + cleanup: | |
| 66 + snd_mixer_free(mixer); | |
| 67 + snd_mixer_detach(mixer, devname); | |
| 68 + snd_mixer_close(mixer); | |
| 69 + | |
| 70 + return volume == -1 ? NULL : bprintf("%.0f", (volume-mi… | |
| 71 + } | |
| 72 #else | |
| 73 #include <sys/soundcard.h> | |
| 74 |