Xinqi Bao's Git
1 /* See LICENSE file for copyright and license details. */
10 #if defined(__OpenBSD__)
11 #include <sys/audioio.h>
14 vol_perc(const char *card
)
19 int afd
= -1, m
= -1, v
= -1;
21 if ((afd
= open(card
, O_RDONLY
)) < 0) {
22 warn("open '%s':", card
);
26 for (mdi
.index
= 0; cls
== -1; mdi
.index
++) {
27 if (ioctl(afd
, AUDIO_MIXER_DEVINFO
, &mdi
) < 0) {
28 warn("ioctl 'AUDIO_MIXER_DEVINFO':");
32 if (mdi
.type
== AUDIO_MIXER_CLASS
&&
33 !strncmp(mdi
.label
.name
,
38 for (mdi
.index
= 0; v
== -1 || m
== -1; mdi
.index
++) {
39 if (ioctl(afd
, AUDIO_MIXER_DEVINFO
, &mdi
) < 0) {
40 warn("ioctl 'AUDIO_MIXER_DEVINFO':");
44 if (mdi
.mixer_class
== cls
&&
45 ((mdi
.type
== AUDIO_MIXER_VALUE
&&
46 !strncmp(mdi
.label
.name
,
48 MAX_AUDIO_DEV_LEN
)) ||
49 (mdi
.type
== AUDIO_MIXER_ENUM
&&
50 !strncmp(mdi
.label
.name
,
52 MAX_AUDIO_DEV_LEN
)))) {
53 mc
.dev
= mdi
.index
, mc
.type
= mdi
.type
;
54 if (ioctl(afd
, AUDIO_MIXER_READ
, &mc
) < 0) {
55 warn("ioctl 'AUDIO_MIXER_READ':");
59 if (mc
.type
== AUDIO_MIXER_VALUE
)
60 v
= mc
.un
.value
.num_channels
== 1 ?
61 mc
.un
.value
.level
[AUDIO_MIXER_LEVEL_MONO
] :
62 (mc
.un
.value
.level
[AUDIO_MIXER_LEVEL_LEFT
] >
63 mc
.un
.value
.level
[AUDIO_MIXER_LEVEL_RIGHT
] ?
64 mc
.un
.value
.level
[AUDIO_MIXER_LEVEL_LEFT
] :
65 mc
.un
.value
.level
[AUDIO_MIXER_LEVEL_RIGHT
]);
66 else if (mc
.type
== AUDIO_MIXER_ENUM
)
73 return bprintf("%d", m
? 0 : v
* 100 / 255);
76 #include <sys/soundcard.h>
79 vol_perc(const char *card
)
83 char *vnames
[] = SOUND_DEVICE_NAMES
;
85 if ((afd
= open(card
, O_RDONLY
| O_NONBLOCK
)) < 0) {
86 warn("open '%s':", card
);
90 if (ioctl(afd
, (int)SOUND_MIXER_READ_DEVMASK
, &devmask
) < 0) {
91 warn("ioctl 'SOUND_MIXER_READ_DEVMASK':");
95 for (i
= 0; i
< LEN(vnames
); i
++) {
96 if (devmask
& (1 << i
) && !strcmp("vol", vnames
[i
])) {
97 if (ioctl(afd
, MIXER_READ(i
), &v
) < 0) {
98 warn("ioctl 'MIXER_READ(%ld)':", i
);
107 return bprintf("%d", v
& 0xff);