summaryrefslogtreecommitdiff
path: root/components/volume.c
diff options
context:
space:
mode:
Diffstat (limited to 'components/volume.c')
-rw-r--r--components/volume.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/components/volume.c b/components/volume.c
new file mode 100644
index 0000000..f5aa18d
--- /dev/null
+++ b/components/volume.c
@@ -0,0 +1,43 @@
+/* See LICENSE file for copyright and license details. */
+#include <err.h>
+#include <fcntl.h>
+#include <sys/soundcard.h>
+#include <sys/ioctl.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "../util.h"
+
+const char *
+vol_perc(const char *card)
+{
+ unsigned int i;
+ int v, afd, devmask;
+ char *vnames[] = SOUND_DEVICE_NAMES;
+
+ afd = open(card, O_RDONLY | O_NONBLOCK);
+ if (afd == -1) {
+ warn("Cannot open %s", card);
+ return NULL;
+ }
+
+ if (ioctl(afd, SOUND_MIXER_READ_DEVMASK, &devmask) == -1) {
+ warn("Cannot get volume for %s", card);
+ close(afd);
+ return NULL;
+ }
+ for (i = 0; i < LEN(vnames); i++) {
+ if (devmask & (1 << i) && !strcmp("vol", vnames[i])) {
+ if (ioctl(afd, MIXER_READ(i), &v) == -1) {
+ warn("vol_perc: ioctl");
+ close(afd);
+ return NULL;
+ }
+ }
+ }
+
+ close(afd);
+
+ return bprintf("%d", v & 0xff);
+}