From 1c4953a467bb9ba84011eb5f57f66281b52a80d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 26 Jan 2025 21:03:27 +0800 Subject: [PATCH] Sound (NetBSD): use OSS instead of pulseaudio Fix #1527 --- CMakeLists.txt | 5 +++-- src/detection/sound/sound_bsd.c | 30 ++++++++++++++++++++++++------ 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 785b340f5..14b7f3c72 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -75,7 +75,7 @@ cmake_dependent_option(ENABLE_GLX "Enable glx" ON "LINUX OR FreeBSD OR OpenBSD O cmake_dependent_option(ENABLE_OSMESA "Enable osmesa" ON "LINUX OR FreeBSD OR OpenBSD OR NetBSD OR SunOS" OFF) cmake_dependent_option(ENABLE_OPENCL "Enable opencl" ON "LINUX OR FreeBSD OR OpenBSD OR NetBSD OR WIN32 OR ANDROID OR SunOS" OFF) cmake_dependent_option(ENABLE_FREETYPE "Enable freetype" ON "ANDROID" OFF) -cmake_dependent_option(ENABLE_PULSE "Enable pulse" ON "LINUX OR OpenBSD OR NetBSD OR SunOS" OFF) +cmake_dependent_option(ENABLE_PULSE "Enable pulse" ON "LINUX OR OpenBSD OR SunOS" OFF) cmake_dependent_option(ENABLE_DDCUTIL "Enable ddcutil" ON "LINUX" OFF) cmake_dependent_option(ENABLE_DIRECTX_HEADERS "Enable DirectX headers for WSL" ON "LINUX" OFF) cmake_dependent_option(ENABLE_ELF "Enable libelf" ON "LINUX OR ANDROID OR DragonFly" OFF) @@ -761,7 +761,7 @@ elseif(NetBSD) src/detection/poweradapter/poweradapter_nosupport.c src/detection/processes/processes_nbsd.c src/detection/gtk_qt/qt.c - src/detection/sound/sound_linux.c + src/detection/sound/sound_bsd.c src/detection/swap/swap_obsd.c src/detection/terminalfont/terminalfont_linux.c src/detection/terminalshell/terminalshell_linux.c @@ -1509,6 +1509,7 @@ elseif(NetBSD) target_link_libraries(libfastfetch PRIVATE "m" PRIVATE "prop" + PRIVATE "ossaudio" ) elseif(SunOS) target_link_libraries(libfastfetch diff --git a/src/detection/sound/sound_bsd.c b/src/detection/sound/sound_bsd.c index 5fccf896d..b3b813b27 100644 --- a/src/detection/sound/sound_bsd.c +++ b/src/detection/sound/sound_bsd.c @@ -4,14 +4,27 @@ #include #include +#include const char* ffDetectSound(FFlist* devices) { - char path[] = "/dev/mixer0"; + #ifndef __NetBSD__ int defaultDev = ffSysctlGetInt("hw.snd.default_unit", -1); - if (defaultDev == -1) return "sysctl(hw.snd.default_unit) failed"; + #else + int defaultDev; + { + char mixerp[8]; + if (readlink("/dev/mixer", mixerp, ARRAY_SIZE(mixerp)) != 6) + return "readlink(/dev/mixer) failed"; + defaultDev = mixerp[5] - '0'; + if (defaultDev < 0 || defaultDev > 9) + return "Invalid mixer device"; + } + #endif + + char path[] = "/dev/mixer0"; struct oss_sysinfo info = { .nummixers = 9 }; @@ -33,8 +46,11 @@ const char* ffDetectSound(FFlist* devices) if (!(devmask & SOUND_MASK_VOLUME)) continue; + #if defined(SOUND_MIXER_MUTE) && (SOUND_MIXER_MUTE != SOUND_MIXER_NONE) + #define FF_SOUND_HAVE_MIXER_MUTE 1 uint32_t mutemask = 0; - ioctl(fd, SOUND_MIXER_READ_MUTE, &mutemask); // doesn't seem to be available on DragonFly + ioctl(fd, SOUND_MIXER_READ_MUTE, &mutemask); + #endif struct oss_card_info ci = { .card = idev }; if (ioctl(fd, SNDCTL_CARDINFO, &ci) < 0) @@ -49,9 +65,11 @@ const char* ffDetectSound(FFlist* devices) ffStrbufInitF(&device->name, "%s %s", ci.longname, ci.hw_info); ffStrbufTrimRightSpace(&device->name); ffStrbufInitF(&device->platformApi, "%s %s", info.product, info.version); - device->volume = mutemask & SOUND_MASK_VOLUME - ? 0 - : ((uint8_t) volume /*left*/ + (uint8_t) (volume >> 8) /*right*/) / 2; + device->volume = + #ifdef FF_SOUND_HAVE_MIXER_MUTE + mutemask & SOUND_MASK_VOLUME ? 0 : + #endif + ((uint8_t) volume /*left*/ + (uint8_t) (volume >> 8) /*right*/) / 2; device->active = true; device->main = defaultDev == idev; }