13.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 系统调用进行操作。
警告
FreeBSD Ports 中的 KDE 6 默认音频管理组件(plasma-pa)使用 PulseAudio 作为音频后端。PulseAudio 作为音频服务器会接管系统音频输出管理,形成全局音频路由。如果不充分了解配置细节,请勿手动切换到其他音频后端(如 PipeWire),以免造成音频系统工作异常。
13.1.1 加入音频组
普通用户还需要加入 audio 组以及 operator 组方有权限调用声卡。
# pw groupmod operator -m 用户名
# pw groupmod audio -m 用户名13.1.2 HDA 声卡驱动
snd_hda 是 FreeBSD 内核中用于支持 Intel High Definition Audio(HDA)规范声卡的驱动模块,适用于绝大多数现代集成声卡。该驱动通常会在系统启动时自动加载。可使用 kldstat 命令检查驱动是否已加载。
注意
仅当 FreeBSD 未能正确检测到声卡时,才需要加载声卡模块。
为确认系统识别的音频设备,使用以下命令查看当前声卡设备列表:
# 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 作为音频输出接口且输出设备设置为默认值,音频将从该设备输出。
如需获取更详细的声卡信息用于深度诊断,可通过调整内核参数提高调试输出等级:
# sysctl hw.snd.verbose=4 # 设置 FreeBSD 声卡驱动调试输出等级为 4该命令将声卡驱动的调试输出等级设置为 4。调试等级范围为 0 至 4,数值越高输出信息越详细,等级 4 会输出最完整的调试信息。此设置临时生效,系统重启后将恢复默认值。
FreeBSD 中大部分软件的音频输出接口为 OSS。部分软件默认使用 PulseAudio(如 Firefox 浏览器),相关设置参见后文说明。Firefox 可通过 about:support 页面查看当前使用的音频后端。Firefox 支持多种音频后端,其自动探测顺序为:pulse-rust(PulseAudio Rust 后端,需安装 PulseAudio)、JACK(需安装 jackit)、sndio(需安装 sndio)、ALSA(需安装 alsa-lib)、OSS(始终可用)。也可通过 about:config 中的 media.cubeb.backend 配置项手动指定。
以下命令可设置默认 OSS 音频设备单元号为 5,其中数字对应 pcm 后的设备编号:
# sysctl hw.snd.default_unit=5该设置临时生效,系统重启后将恢复默认值。要永久生效,须将配置写入 /etc/sysctl.conf 文件。
上文中的 pcm6: <Realtek ALC892 (Rear Digital)> (play) 为数字输出接口。集成声卡的模拟接口采样率通常为 48 kHz,部分 HDA 编解码器可支持 96 kHz 或更高;数字接口则绕过了板载 DAC 的采样率限制,可使用支持更高采样率的外部 DAC。S/PDIF 接口基于 IEC 60958 标准,可直接传输最高 192 kHz/24 bit 的 PCM 立体声信号;IEC 61937 标准用于在 IEC 60958 帧结构中封装压缩音频比特流(如 Dolby Digital、DTS 等)。部分 TOSLINK 光纤接口实现可能受带宽限制仅支持至 96 kHz。
如果存在数字输出但机箱面板无对应接口,而主板提供 S/PDIF(Sony/Philips Digital Interface Format,索尼/飞利浦数字接口格式)插针,可安装 S/PDIF 挡板(通常包含光纤接口和同轴接口),连接后即可使用。
13.1.3 自动切换到耳机
FreeBSD 可在 /boot/device.hints 中配置音频自动切换。
通过执行以下命令,识别系统枚举的音频输出:
% dmesg | grep pcm输出可能类似于以下内容:
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 文件:
hint.hdac.0.cad0.nid22.config="as=1 seq=15 device=Headphones"
hint.hdac.0.cad0.nid26.config="as=2 seq=0 device=speakers"注意
上述示例中的配置值仅适用于对应硬件环境,不同系统的节点编号可能存在差异,须根据实际情况调整。
13.1.4 配置文件示例
# cat /dev/sndstat
Installed devices:
pcm0: <Realtek ALC897 (Analog)> (play/rec) default
pcm1: <Realtek ALC897 (Rear Analog Line-in)> (rec)
No devices installed from userspace.该设备并非复合音频接口(Combo Jack,即非扬声器与麦克风的二合一接口),当前仅插入了一台音响。默认配置下,该设备不会输出声音。
# sysctl -a | grep hdaa.0.nid | grep config
dev.hdaa.0.nid31_config: 0x411111f0 as=15 seq=0 device=Speaker conn=None ctype=1/8 loc=Rear color=Black misc=1
dev.hdaa.0.nid30_config: 0x411111f0 as=15 seq=0 device=Speaker conn=None ctype=1/8 loc=Rear color=Black misc=1
dev.hdaa.0.nid29_config: 0x4024c601 as=0 seq=1 device=Headphones conn=None ctype=RCA loc=0x00 color=Res.C misc=6
dev.hdaa.0.nid28_config: 0x411111f0 as=15 seq=0 device=Speaker conn=None ctype=1/8 loc=Rear color=Black misc=1
dev.hdaa.0.nid27_config: 0x02214010 as=1 seq=0 device=Headphones conn=Jack ctype=1/8 loc=Front color=Green misc=0
dev.hdaa.0.nid26_config: 0x01813040 as=4 seq=0 device=Line-in conn=Jack ctype=1/8 loc=Rear color=Blue misc=0
dev.hdaa.0.nid25_config: 0x02a1903f as=3 seq=15 device=Mic conn=Jack ctype=1/8 loc=Front color=Pink misc=0
dev.hdaa.0.nid24_config: 0x01a19030 as=3 seq=0 device=Mic conn=Jack ctype=1/8 loc=Rear color=Pink misc=0
dev.hdaa.0.nid23_config: 0x411111f0 as=15 seq=0 device=Speaker conn=None ctype=1/8 loc=Rear color=Black misc=1
dev.hdaa.0.nid22_config: 0x411111f0 as=15 seq=0 device=Speaker conn=None ctype=1/8 loc=Rear color=Black misc=1
dev.hdaa.0.nid21_config: 0x411111f0 as=15 seq=0 device=Speaker conn=None ctype=1/8 loc=Rear color=Black misc=1
dev.hdaa.0.nid20_config: 0x01014020 as=2 seq=0 device=Line-out conn=Jack ctype=1/8 loc=Rear color=Green misc=0
dev.hdaa.0.nid18_config: 0x411111f0 as=15 seq=0 device=Speaker conn=None ctype=1/8 loc=Rear color=Black misc=1
dev.hdaa.0.nid17_config: 0x40000000 as=0 seq=0 device=Line-out conn=None ctype=Unknown loc=0x00 color=Unknown misc=0为解决此问题,可使用以下命令实时调试音频配置(命令立即生效,但在系统重启后失效):
# 1. 将背部绿色扬声器设为关联组 1 的主输出
# sysctl dev.hdaa.0.nid20_config="as=1 seq=0"
# 2. 将前面板耳机设为关联组 1 的次输出(插入时静音主输出)
# sysctl dev.hdaa.0.nid27_config="as=1 seq=15"
# 3. 强制音频驱动销毁并应用新配置重建音频树
# sysctl dev.hdaa.0.reconfig=1as=1:将两者归入同一关联组。seq=0:主输出(扬声器),优先级最高。seq=15:耳机,插入耳机时会自动静音扬声器。
此时音频输出已恢复正常,编辑 /boot/device.hints 文件,加入以下行,将其固化为永久设置:
hint.hdaa.0.nid20.config="as=1 seq=0" # 配置 HDA 声卡节点 20 的音频流为通道 1,序列号 0
hint.hdaa.0.nid27.config="as=1 seq=15" # 配置 HDA 声卡节点 27 的音频流为通道 1,序列号 1513.1.5 附录:音量调节
可使用系统自带的命令行工具 mixer 调整系统音量。
例如以下命令可将系统音量提高 5%:
$ mixer vol=+5% # 将音量增加 5%13.1.6 故障排除与未竟事宜
13.1.6.1 编译内核启用特殊声卡
部分特殊声卡需自行编译内核。详见 Open Sound System for BSD[EB/OL]. [2026-03-25]. http://www.opensound.com/bsd.html.
13.1.6.2 obs-studio
OSS 作为底层音频接口存在一定技术限制:其设计未提供音频流回环机制,因此在使用 obs-studio 等软件时无法直接录制 OSS 的输出音频。根据官方论坛说明,可使用 virtual_oss 工具模拟音频设备实现该功能(借助 virtual_oss 的 -M 参数完成声道路由,将 OSS 输出重定向到 OSS 输入)。
obs-studio 可录制 PulseAudio 的输出音频(默认的“桌面音频”输入源对应 PulseAudio 输出),因此部分软件可配置为使用 PulseAudio 作为音频输出接口。使用 PulseAudio 的软件,其音频输出不受上述 OSS 命令控制,需使用 PulseAudio 混音器管理设备。
13.1.6.3 AMD APU 显示驱动 mode 2 reset
由于驱动对空渲染上下文的初始化存在问题,在使用 AMD APU(加速处理单元,Accelerated Processing Unit)且配合 drm-kmod 图形驱动时,打开未加载媒体内容的空播放器窗口可能触发显示驱动的 mode 2 reset 报错(即驱动重置机制),严重时可能导致 Kernel Panic。
避免打开未加载任何媒体内容的播放器或音频播放器窗口,建议通过终端命令行播放音频文件。
13.1.7 参考文献
- FreeBSD Project. snd_hda -- Intel High Definition Audio driver[EB/OL]. [2026-04-17]. https://man.freebsd.org/cgi/man.cgi?query=snd_hda&sektion=4. Intel HDA 声卡驱动手册页。