]> git.sur5r.net Git - i3/i3status/commitdiff
Use SndIO for volume module on OpenBSD 47/head
authorDmitrij D. Czarkoff <czarkoff@gmail.com>
Thu, 30 Jul 2015 23:51:40 +0000 (01:51 +0200)
committerDmitrij D. Czarkoff <czarkoff@gmail.com>
Sat, 1 Aug 2015 15:35:09 +0000 (17:35 +0200)
 * add audio(4) code by Robert Nagy
 * disable PulseAudio

While at OpenBSD support, add "-pthread" to LIBS.

Makefile
src/print_volume.c

index 1823f3d25bd812c7244b28d584d4bf64dfc657e6..edbdc441b60bce501f28a649c3316e90c2535bc0 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -43,10 +43,6 @@ CFLAGS+=-I/usr/local/include/
 LDFLAGS+=-L/usr/local/lib/
 endif
 
-ifeq ($(OS),OpenBSD)
-LIBS+=-lossaudio
-endif
-
 ifeq ($(OS),NetBSD)
 LIBS+=-lprop
 endif
@@ -72,6 +68,11 @@ CFLAGS += -idirafter yajl-fallback
 OBJS:=$(wildcard src/*.c *.c)
 OBJS:=$(OBJS:.c=.o)
 
+ifeq ($(OS),OpenBSD)
+OBJS:=$(filter-out src/pulse.o, $(OBJS))
+LIBS:=$(filter-out -lpulse, $(LIBS)) -lpthread
+endif
+
 src/%.o: src/%.c include/i3status.h
        $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
        @echo " CC $<"
index b1a7e7401e49fcf6e94a611a7851698919c7339a..86b3505713303d304d31bff1676c8cd6c20c0c1b 100644 (file)
@@ -21,7 +21,8 @@
 #ifdef __OpenBSD__
 #include <fcntl.h>
 #include <unistd.h>
-#include <soundcard.h>
+#include <sys/audioio.h>
+#include <sys/ioctl.h>
 #endif
 
 #include "i3status.h"
@@ -59,6 +60,7 @@ void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char *
         free(instance);
     }
 
+#ifndef __OpenBSD__
     /* Try PulseAudio first */
 
     /* If the device name has the format "pulse[:N]" where N is the
@@ -100,6 +102,7 @@ void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char *
     }
 /* If some other device was specified or PulseAudio is not detected,
  * proceed to ALSA / OSS */
+#endif
 
 #ifdef LINUX
     int err;
@@ -191,13 +194,77 @@ void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char *
         mixerpath = defaultmixer;
 
     if ((mixfd = open(mixerpath, O_RDWR)) < 0) {
+#if defined(__OpenBSD__)
+        warn("audioio: Cannot open mixer");
+#else
         warn("OSS: Cannot open mixer");
+#endif
         goto out;
     }
 
     if (mixer_idx > 0)
         free(mixerpath);
 
+#if defined(__OpenBSD__)
+    int oclass_idx = -1, master_idx = -1, master_mute_idx = -1;
+    mixer_devinfo_t devinfo, devinfo2;
+    mixer_ctrl_t vinfo;
+
+    devinfo.index = 0;
+    while (ioctl(mixfd, AUDIO_MIXER_DEVINFO, &devinfo) >= 0) {
+        if (devinfo.type != AUDIO_MIXER_CLASS) {
+            devinfo.index++;
+            continue;
+        }
+        if (strncmp(devinfo.label.name, AudioCoutputs, MAX_AUDIO_DEV_LEN) == 0)
+            oclass_idx = devinfo.index;
+
+        devinfo.index++;
+    }
+
+    devinfo2.index = 0;
+    while (ioctl(mixfd, AUDIO_MIXER_DEVINFO, &devinfo2) >= 0) {
+        if ((devinfo2.type == AUDIO_MIXER_VALUE) && (devinfo2.mixer_class == oclass_idx) && (strncmp(devinfo2.label.name, AudioNmaster, MAX_AUDIO_DEV_LEN) == 0))
+            master_idx = devinfo2.index;
+
+        if ((devinfo2.type == AUDIO_MIXER_ENUM) && (devinfo2.mixer_class == oclass_idx) && (strncmp(devinfo2.label.name, AudioNmute, MAX_AUDIO_DEV_LEN) == 0))
+            master_mute_idx = devinfo2.index;
+
+        devinfo2.index++;
+    }
+
+    if (master_idx == -1)
+        goto out;
+
+    devinfo.index = master_idx;
+    if (ioctl(mixfd, AUDIO_MIXER_DEVINFO, &devinfo) == -1)
+        goto out;
+
+    vinfo.dev = master_idx;
+    vinfo.type = AUDIO_MIXER_VALUE;
+    if (ioctl(mixfd, AUDIO_MIXER_READ, &vinfo) == -1)
+        goto out;
+
+    if (AUDIO_MAX_GAIN != 100) {
+        float avgf = ((float)vinfo.un.value.level[AUDIO_MIXER_LEVEL_MONO] / AUDIO_MAX_GAIN) * 100;
+        vol = (int)avgf;
+        vol = (avgf - vol < 0.5 ? vol : (vol + 1));
+    } else {
+        vol = (int)vinfo.un.value.level[AUDIO_MIXER_LEVEL_MONO];
+    }
+
+    vinfo.dev = master_mute_idx;
+    vinfo.type = AUDIO_MIXER_ENUM;
+    if (ioctl(mixfd, AUDIO_MIXER_READ, &vinfo) == -1)
+        goto out;
+
+    if (master_mute_idx != -1 && vinfo.un.ord) {
+        START_COLOR("color_degraded");
+        fmt = fmt_muted;
+        pbval = 0;
+    }
+
+#else
     if (ioctl(mixfd, SOUND_MIXER_READ_DEVMASK, &devmask) == -1) {
         warn("OSS: Cannot read mixer information");
         goto out;
@@ -212,6 +279,7 @@ void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char *
         pbval = 0;
     }
 
+#endif
     outwalk = apply_volume_format(fmt, outwalk, vol & 0x7f);
     close(mixfd);
 #endif