Skip to content

9.1 声卡

FreeBSD 默认自动检测系统使用的声卡。

FreeBSD 内核通过 snd_hda 模块支持 Intel HDA 规范声卡,本节说明声音设备检测与音量控制方法。回顾其发展历程,FreeBSD 的声音支持始于 1993 年,Jordan K. Hubbard 将通用 Linux 声卡驱动移植到 FreeBSD,该驱动后来被称为 VoxWare 声卡驱动。1997 年,Luigi Rizzo 构建了现代 FreeBSD 声音系统的基础。1999 年,Cameron Grant 为 FreeBSD 4.0 重写了声卡系统,利用 newbus 接口支持大量硬件。2005 年,Ariff Abdullah 接管了 FreeBSD 声音代码的维护工作,此后声音支持经历了重大变化和多项设备驱动重构。

FreeBSD 的声音 API 被称为 OSS,即“Open Sound System”(开放声音系统)。它曾是 Linux 的默认声音 API,后来被 ALSA 取代。FreeBSD 仍在使用 OSS,它通过标准设备文件提供了简单清晰的接口(/dev/dsp* 对应声卡,/dev/mixer* 对应混音器),并通过少量常用 POSIX 系统调用进行操作:

警告

KDE 6 桌面环境的 Ports 构建默认配置使用 PulseAudio(脉冲音频,PA)作为音频后端。PulseAudio 作为音频服务器会接管系统音频输出管理,形成全局音频路由。如果不充分了解配置细节,请勿手动切换到其他音频后端(如 PipeWire),以免造成音频系统工作异常。

9.1.1 显卡音频

snd_hda 是 FreeBSD 内核中用于支持 Intel High Definition Audio(HDA)规范声卡的驱动模块,适用于绝大多数现代集成声卡。该驱动通常会在系统启动时自动加载。可使用 kldstat 命令检查驱动是否已加载。

注意

仅当 FreeBSD 未能正确检测到声卡时,才需要加载声卡模块。

为确认系统识别的音频设备,使用以下命令查看当前声卡设备列表:

sh
$ cat /dev/sndstat
Installed devices:
pcm0: <NVIDIA (0x0083) (HDMI/DP 8ch)> (play)
pcm1: <NVIDIA (0x0083) (HDMI/DP 8ch)> (play)
pcm2: <NVIDIA (0x0083) (HDMI/DP 8ch)> (play)
pcm3: <NVIDIA (0x0083) (HDMI/DP 8ch)> (play)
pcm4: <Realtek ALC892 (Rear Analog 5.1/2.0)> (play/rec) default
pcm5: <Realtek ALC892 (Front Analog)> (play/rec)
pcm6: <Realtek ALC892 (Rear Digital)> (play)
No devices installed from userspace.

如果未列出任何 pcm 设备,请仔细检查是否加载了正确的设备驱动。

输出中标注为 default 的设备是 OSS(Open Sound System,开放声音系统)的默认音频设备。OSS 是 FreeBSD 原生的音频子系统,提供直接的音频设备访问接口。如果软件使用 OSS 作为音频输出接口且输出设备设置为默认值,音频将从该设备输出。

如需获取更详细的声卡信息用于深度诊断,可通过调整内核参数提高调试输出等级:

sh
# sysctl hw.snd.verbose=4  # 设置 FreeBSD 声卡驱动调试输出等级为 4

该命令将声卡驱动的调试输出等级设置为 4。调试等级范围为 0 至 4,数值越高输出信息越详细,等级 4 会输出最完整的调试信息。此设置临时生效,系统重启后将恢复默认值。

FreeBSD 中大部分软件的音频输出接口为 OSS。部分软件默认使用 PulseAudio(如 Firefox 浏览器),相关设置参见后文说明。Firefox 可通过 about:support 页面查看当前使用的音频后端。Firefox 支持多种音频后端,通常按 PulseAudio、OSS 的优先级顺序自动选择。也可通过配置手动指定。

以下命令可设置默认 OSS 音频设备单元号为 5,其中数字对应 pcm 后的设备编号:

sh
# sysctl hw.snd.default_unit=5

该设置临时生效,系统重启后将恢复默认值。要永久生效,需将配置写入 /etc/sysctl.conf 文件。

上文中的 pcm6: <Realtek ALC892 (Rear Digital)> (play) 为数字输出接口。集成声卡的模拟接口采样率通常为 48 kHz,部分 HDA 编解码器可支持 96 kHz 或更高;数字接口则绕过了板载 DAC 的采样率限制,可使用支持更高采样率的外部 DAC。标准 S/PDIF 可支持至 96 kHz,在特定配置下可达 192 kHz。

如果存在数字输出但机箱面板无对应接口,而主板提供 S/PDIF(Sony/Philips Digital Interface Format,索尼/飞利浦数字接口格式)插针,可安装 S/PDIF 挡板(通常包含光纤口和同轴口),连接后即可使用。

9.1.2 自动切换到耳机

FreeBSD 可在 /boot/device.hints 中配置音频自动切换。

通过执行以下命令,识别系统枚举的音频输出:

sh
% dmesg | grep pcm

输出可能类似于以下内容:

sh
pcm0: <Realtek ALC892 Analog> at nid 23 and 26 on hdaa0
pcm1: <Realtek ALC892 Right Analog Headphones> at nid 22 on hdaa0

将以下行添加到 /boot/device.hints 文件:

ini
hint.hdac.0.cad0.nid22.config="as=1 seq=15 device=Headphones"
hint.hdac.0.cad0.nid26.config="as=2 seq=0 device=speakers"

注意

切记,这些值适用于上面示例中的情况。这些值可能因系统而异。

9.1.3 配置文件示例

sh
# cat /dev/sndstat # 省略无用信息
pcm1: <Realtek ALC897 (Rear Analog Line-in)> at nid 26 on hdaa0
pcm0: <Realtek ALC897 (Analog)> at nid 27 and 26 on hdaa0

该设备并非 AUX 接口(即非扬声器与麦克风的二合一接口),当前仅插入了一台音响。默认配置下,该设备不会输出声音。

为解决此问题,可用以下命令实时调试音频配置(命令立即生效,但在系统重启后失效):

sh
# sysctl dev.hdaa.0.nid26_config="as=1 seq=0"   # 设置 HDA 声卡节点 26 的音频流为通道 1,序列号 0
# sysctl dev.hdaa.0.nid27_config="as=1 seq=15"  # 设置 HDA 声卡节点 27 的音频流为通道 1,序列号 15
  • as=1:将两者归入同一关联组。
  • seq=0:主输出(扬声器),优先级最高。
  • seq=15:耳机,插入耳机时会自动静音扬声器。

此时音频输出已恢复正常,编辑 /boot/device.hints 文件,加入以下行,将其固化为永久设置:

ini
hint.hdaa.0.nid26.config="as=1 seq=0"    # 配置 HDA 声卡节点 26 的音频流为通道 1,序列号 0
hint.hdaa.0.nid27.config="as=1 seq=15"   # 配置 HDA 声卡节点 27 的音频流为通道 1,序列号 15

9.1.4 附录:音量调节

可使用系统自带的命令行工具 mixer 调整系统音量。

例如以下命令可将系统音量提高 5%:

sh
$ mixer vol=+5%  # 将音量增加 5%

9.1.5 故障排除与未竟事宜

9.1.5.1 编译内核启用特殊声卡

部分特殊声卡需自行编译内核。详见 Open Sound System for BSD[EB/OL]. [2026-03-25]. http://www.opensound.com/bsd.html.

9.1.5.2 obs-studio

OSS 作为底层音频接口存在一定技术限制:其设计未提供音频流回环机制,因此在使用 obs-studio 等软件时无法直接录制 OSS 的输出音频。根据官方论坛说明,可使用 virtual_oss 工具模拟音频设备实现该功能(借助 virtual_oss-M 参数完成声道路由,将 OSS 输出重定向到 OSS 输入)。

obs-studio 可录制 PulseAudio 的输出音频(默认的“桌面音频”输入源对应 PulseAudio 输出),因此部分软件可配置为使用 PulseAudio 作为音频输出接口。使用 PulseAudio 的软件,其音频输出不受上述 OSS 命令控制,需使用 PulseAudio 混音器管理设备。

9.1.5.3 AMD CPU mode 2 reset

在使用 AMD APU(加速处理单元,Accelerated Processing Unit)且配合 drm-kmod 图形驱动时,打开未加载媒体内容的空播放器窗口可能触发显示驱动的 mode 2 reset 报错(即驱动重置机制),严重时可能导致 Kernel Panic。该问题与驱动对空渲染上下文的初始化有关。

避免打开未加载任何媒体内容的播放器或音频播放器窗口,建议通过终端命令行播放音频文件。

9.1.6 参考文献