Xinqi Bao's Git

Move components into dedicated subdirectory
[slstatus.git] / components / volume.c
1 /* See LICENSE file for copyright and license details. */
2 #include <err.h>
3 #include <fcntl.h>
4 #include <sys/soundcard.h>
5 #include <sys/ioctl.h>
6 #include <stdio.h>
7 #include <string.h>
8 #include <unistd.h>
9
10 #include "../util.h"
11
12 const char *
13 vol_perc(const char *card)
14 {
15 unsigned int i;
16 int v, afd, devmask;
17 char *vnames[] = SOUND_DEVICE_NAMES;
18
19 afd = open(card, O_RDONLY | O_NONBLOCK);
20 if (afd == -1) {
21 warn("Cannot open %s", card);
22 return NULL;
23 }
24
25 if (ioctl(afd, SOUND_MIXER_READ_DEVMASK, &devmask) == -1) {
26 warn("Cannot get volume for %s", card);
27 close(afd);
28 return NULL;
29 }
30 for (i = 0; i < LEN(vnames); i++) {
31 if (devmask & (1 << i) && !strcmp("vol", vnames[i])) {
32 if (ioctl(afd, MIXER_READ(i), &v) == -1) {
33 warn("vol_perc: ioctl");
34 close(afd);
35 return NULL;
36 }
37 }
38 }
39
40 close(afd);
41
42 return bprintf("%d", v & 0xff);
43 }