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

## 显卡音频

`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 挡板（通常包含光纤口和同轴口），连接后即可使用。

## 自动切换到耳机

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 # 省略无用信息
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
```

## 附录：音量调节

可使用系统自带的命令行工具 `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 CPU 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: 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:

```
GET https://book.bsdcn.org/di-9-zhang-duo-mei-ti-he-wai-bu-she-bei/di-9.1-jie-yin-pin-she-bei-pei-zhi.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
