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 |