summaryrefslogtreecommitdiff
path: root/src/print_volume.c
diff options
context:
space:
mode:
authorDmitrij D. Czarkoff <czarkoff@gmail.com>2015-07-31 01:51:40 +0200
committerDmitrij D. Czarkoff <czarkoff@gmail.com>2015-08-01 17:35:09 +0200
commit15f2279592032af1507de09ef31eba81aee53191 (patch)
treef57d24418d93ceea69e93b4327eb7819bb0f5a46 /src/print_volume.c
parent55a23712ade74836be11feb9602f90d360aea44a (diff)
Use SndIO for volume module on OpenBSD
* add audio(4) code by Robert Nagy * disable PulseAudio While at OpenBSD support, add "-pthread" to LIBS.
Diffstat (limited to 'src/print_volume.c')
-rw-r--r--src/print_volume.c70
1 files changed, 69 insertions, 1 deletions
diff --git a/src/print_volume.c b/src/print_volume.c
index b1a7e74..86b3505 100644
--- a/src/print_volume.c
+++ b/src/print_volume.c
@@ -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