Xinqi Bao's Git

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