Introduction
Introduction Statistics Contact Development Disclaimer Help
Add native OpenBSD support for mute/volume - slstatus - status monitor
git clone git://git.suckless.org/slstatus
Log
Files
Refs
README
LICENSE
---
commit c1dc896c806693a4a368abf59e6890d32d520074
parent e724907cc37749907cb8c63031d9fb35ef46a657
Author: Ingo Feinerer <[email protected]>
Date: Fri, 8 Feb 2019 15:37:17 +0100
Add native OpenBSD support for mute/volume
Based on functionality in dstat by Joerg Jung.
Diffstat:
M LICENSE | 2 ++
M README | 2 +-
M components/volume.c | 118 ++++++++++++++++++++++++-----…
M config.mk | 1 -
4 files changed, 94 insertions(+), 29 deletions(-)
---
diff --git a/LICENSE b/LICENSE
@@ -18,6 +18,8 @@ Copyright 2018 Tobias Tschinkowitz <[email protected]>
Copyright 2018 David Demelier <[email protected]>
Copyright 2018-2019 Michael Buch <[email protected]>
Copyright 2018 Ian Remmler <[email protected]>
+Copyright 2016-2019 Joerg Jung <[email protected]>
+Copyright 2019 Ingo Feinerer <[email protected]>
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
diff --git a/README b/README
@@ -38,7 +38,7 @@ In order to build slstatus you need the Xlib header files.
Installation
------------
Edit config.mk to match your local setup (slstatus is installed into the
-/usr/local namespace by default). Uncomment OSSLIBS on OpenBSD.
+/usr/local namespace by default).
Afterwards enter the following command to build and install slstatus (if
necessary as root):
diff --git a/components/volume.c b/components/volume.c
@@ -2,44 +2,108 @@
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
-#if defined(__OpenBSD__)
- #include <soundcard.h>
-#else
- #include <sys/soundcard.h>
-#endif
#include <sys/ioctl.h>
#include <unistd.h>
#include "../util.h"
-const char *
-vol_perc(const char *card)
-{
- size_t i;
- int v, afd, devmask;
- char *vnames[] = SOUND_DEVICE_NAMES;
+#if defined(__OpenBSD__)
+ #include <sys/audioio.h>
- if ((afd = open(card, O_RDONLY | O_NONBLOCK)) < 0) {
- warn("open '%s':", card);
- return NULL;
- }
+ const char *
+ vol_perc(const char *card)
+ {
+ static int cls = -1;
+ mixer_devinfo_t mdi;
+ mixer_ctrl_t mc;
+ int afd = -1, m = -1, v = -1;
- if (ioctl(afd, (int)SOUND_MIXER_READ_DEVMASK, &devmask) < 0) {
- warn("ioctl 'SOUND_MIXER_READ_DEVMASK':");
- 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) < 0) {
- warn("ioctl 'MIXER_READ(%ld)':", i);
+ if ((afd = open(card, O_RDONLY)) < 0) {
+ warn("open '%s':", card);
+ return NULL;
+ }
+
+ for (mdi.index = 0; cls == -1; mdi.index++) {
+ if (ioctl(afd, AUDIO_MIXER_DEVINFO, &mdi) < 0) {
+ warn("ioctl 'AUDIO_MIXER_DEVINFO':");
close(afd);
return NULL;
}
+ if (mdi.type == AUDIO_MIXER_CLASS &&
+ !strncmp(mdi.label.name,
+ AudioCoutputs,
+ MAX_AUDIO_DEV_LEN))
+ cls = mdi.index;
+ }
+ for (mdi.index = 0; v == -1 || m == -1; mdi.index++) {
+ if (ioctl(afd, AUDIO_MIXER_DEVINFO, &mdi) < 0) {
+ warn("ioctl 'AUDIO_MIXER_DEVINFO':");
+ close(afd);
+ return NULL;
+ }
+ if (mdi.mixer_class == cls &&
+ ((mdi.type == AUDIO_MIXER_VALUE &&
+ !strncmp(mdi.label.name,
+ AudioNmaster,
+ MAX_AUDIO_DEV_LEN)) ||
+ (mdi.type == AUDIO_MIXER_ENUM &&
+ !strncmp(mdi.label.name,
+ AudioNmute,
+ MAX_AUDIO_DEV_LEN)))) {
+ mc.dev = mdi.index, mc.type = mdi.type;
+ if (ioctl(afd, AUDIO_MIXER_READ, &mc) < 0) {
+ warn("ioctl 'AUDIO_MIXER_READ':");
+ close(afd);
+ return NULL;
+ }
+ if (mc.type == AUDIO_MIXER_VALUE)
+ v = mc.un.value.num_channels == 1 ?
+ mc.un.value.level[AUDIO_MIXER_LEVE…
+ (mc.un.value.level[AUDIO_MIXER_LEV…
+ mc.un.value.level[AUDIO_MIXER_LEV…
+ mc.un.value.level[AUDIO_MIXER_LEV…
+ mc.un.value.level[AUDIO_MIXER_LEV…
+ else if (mc.type == AUDIO_MIXER_ENUM)
+ m = mc.un.ord;
+ }
}
+
+ close(afd);
+
+ return bprintf("%d", m ? 0 : v * 100 / 255);
}
+#else
+ #include <sys/soundcard.h>
+
+ const char *
+ vol_perc(const char *card)
+ {
+ size_t i;
+ int v, afd, devmask;
+ char *vnames[] = SOUND_DEVICE_NAMES;
- close(afd);
+ if ((afd = open(card, O_RDONLY | O_NONBLOCK)) < 0) {
+ warn("open '%s':", card);
+ return NULL;
+ }
- return bprintf("%d", v & 0xff);
-}
+ if (ioctl(afd, (int)SOUND_MIXER_READ_DEVMASK, &devmask) < 0) {
+ warn("ioctl 'SOUND_MIXER_READ_DEVMASK':");
+ 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) < 0) {
+ warn("ioctl 'MIXER_READ(%ld)':", i);
+ close(afd);
+ return NULL;
+ }
+ }
+ }
+
+ close(afd);
+
+ return bprintf("%d", v & 0xff);
+ }
+#endif
diff --git a/config.mk b/config.mk
@@ -14,7 +14,6 @@ X11LIB = /usr/X11R6/lib
CPPFLAGS = -I$(X11INC) -D_DEFAULT_SOURCE
CFLAGS = -std=c99 -pedantic -Wall -Wextra -Os
LDFLAGS = -L$(X11LIB) -s
-# OpenBSD: add -lossaudio
LDLIBS = -lX11
# compiler and linker
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.