print_volume: Native NetBSD audio support

Avoid using the OSS emulation layer to fetch the master volume,
and instead share the audioio code with OpenBSD.

Avoid a failed read on the master control's mute enum if it can't
be found, because sometimes there isn't one.
This commit is contained in:
nia 2020-03-11 23:16:28 +00:00
parent 6eb70f10d2
commit 9b8403ac84
2 changed files with 14 additions and 13 deletions

View File

@ -101,7 +101,6 @@ case $host_os in
;;
netbsd*)
AC_SEARCH_LIBS([prop_string_create], [prop])
AC_SEARCH_LIBS([_oss_ioctl], [ossaudio])
;;
esac

View File

@ -15,13 +15,13 @@
#include <math.h>
#endif
#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__)
#if defined(__FreeBSD__) || defined(__DragonFly__)
#include <fcntl.h>
#include <unistd.h>
#include <sys/soundcard.h>
#endif
#if defined(__OpenBSD__)
#if defined(__NetBSD__) || defined(__OpenBSD__)
#include <fcntl.h>
#include <unistd.h>
#include <sys/audioio.h>
@ -261,7 +261,7 @@ 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__)
#if defined(__NetBSD__) || defined(__OpenBSD__)
warn("audioio: Cannot open mixer");
#else
warn("OSS: Cannot open mixer");
@ -272,7 +272,7 @@ void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char *
if (mixer_idx > 0)
free(mixerpath);
#if defined(__OpenBSD__)
#if defined(__NetBSD__) || defined(__OpenBSD__)
int oclass_idx = -1, master_idx = -1, master_mute_idx = -1;
int master_next = AUDIO_MIXER_LAST;
mixer_devinfo_t devinfo, devinfo2;
@ -327,16 +327,18 @@ void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char *
vol = (int)vinfo.un.value.level[AUDIO_MIXER_LEVEL_MONO];
}
if (master_mute_idx != -1) {
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) {
if (vinfo.un.ord) {
START_COLOR("color_degraded");
fmt = fmt_muted;
pbval = 0;
}
}
#else
if (ioctl(mixfd, SOUND_MIXER_READ_DEVMASK, &devmask) == -1) {