> For the complete documentation index, see [llms.txt](https://book.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://book.bsdcn.org/di-14-zhang-duo-mei-ti-he-wai-bu-she-bei/di-14.1-jie-sheng-ka.md).

# 14.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），以免造成音频系统工作异常。

## 加入音频组

普通用户还需要加入 audio 组以及 operator 组方有权限调用声卡。

```sh
# pw groupmod operator -m 用户名
# pw groupmod audio -m 用户名
```

## HDA 声卡驱动

`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 支持多种音频后端，其自动探测顺序为：pulse-rust（PulseAudio Rust 后端，需安装 PulseAudio）、JACK（需安装 jackit）、sndio（需安装 sndio）、ALSA（需安装 alsa-lib）、OSS（始终可用）。也可通过 `about:config` 中的 `media.cubeb.backend` 配置项手动指定。

以下命令可设置默认 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 接口基于 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 挡板（通常包含光纤接口和同轴接口），连接后即可使用。

## 自动切换到耳机

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"
```

> **注意**
>
> 上述示例中的配置值仅适用于对应硬件环境，不同系统的节点编号可能存在差异，须根据实际情况调整。

## 配置文件示例

```sh
# 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，即非扬声器与麦克风的二合一接口），当前仅插入了一台音响。默认配置下，该设备不会输出声音。

```sh
# 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
```

为解决此问题，可使用以下命令实时调试音频配置（命令立即生效，但在系统重启后失效）：

```sh
# 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=1
```

* `as=1`：将两者归入同一关联组。
* `seq=0`：主输出（扬声器），优先级最高。
* `seq=15`：耳机，插入耳机时会自动静音扬声器。

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

```ini
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，序列号 15
```

## 附录：音量调节

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

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

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

## 故障排除与未竟事宜

### 编译内核启用特殊声卡

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

### obs-studio

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

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

### AMD APU 显示驱动 mode 2 reset

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

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

## 参考文献

* 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 声卡驱动手册页。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://book.bsdcn.org/di-14-zhang-duo-mei-ti-he-wai-bu-she-bei/di-14.1-jie-sheng-ka.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
