ALSA 驱动程序的 Proc 文件

Takashi Iwai <tiwai@suse.de>

通用

ALSA 有其自己的 proc 树,即 /proc/asound。在此树中可以找到许多有用的信息。当您遇到问题需要调试时,请检查以下各节中列出的文件。

每张声卡都有其子树 cardX,其中 X 的范围是 0 到 7。声卡特定的文件存储在 card* 子目录中。

全局信息

cards

显示当前配置的 ALSA 驱动程序列表、索引、id 字符串、简短和详细描述。

version

显示版本字符串和编译日期。

modules

列出每张声卡的模块

devices

列出 ALSA 原生设备映射。

meminfo

显示通过 ALSA 驱动程序分配的页面的状态。仅当 CONFIG_SND_DEBUG=y 时出现。

hwdep

列出当前可用的 hwdep 设备,格式为 <card>-<device>: <name>

pcm

列出当前可用的 PCM 设备,格式为 <card>-<device>: <id>: <name> : <sub-streams>

timer

列出当前可用的定时器设备

oss/devices

列出 OSS 设备映射。

oss/sndstat

提供与 /dev/sndstat 兼容的输出。您可以将其符号链接到 /dev/sndstat。

声卡特定文件

声卡特定文件位于 /proc/asound/card* 目录中。一些驱动程序(例如 cmipci)有自己的 proc 条目用于寄存器转储等(例如 /proc/asound/card*/cmipci 显示寄存器转储)。这些文件对于调试非常有帮助。

如果此声卡上有可用的 PCM 设备,您可以看到诸如 pcm0p 或 pcm1c 这样的目录。它们保存了每个 PCM 流的 PCM 信息。pcm 后面的数字是 PCM 设备编号,从 0 开始,最后的 pc 表示播放或捕获方向。此子树中的文件将在后面描述。

MIDI I/O 的状态可以在 midi* 文件中找到。它显示了设备名称以及通过 MIDI 设备接收/传输的字节数。

如果声卡配备了 AC97 编解码器,则存在 codec97#* 子目录(稍后描述)。

如果 OSS 混音器仿真已启用(并且模块已加载),oss_mixer 文件也会出现在这里。这显示了 OSS 混音器元素到 ALSA 控制元素的当前映射。您可以通过写入此设备来更改映射。详细信息请阅读 OSS-Emulation.txt。

PCM Proc 文件

card*/pcm*/info

此 PCM 设备的通用信息:声卡编号、设备编号、子流等。

card*/pcm*/xrun_debug

CONFIG_SND_DEBUG=yCONFIG_SND_PCM_XRUN_DEBUG=y 时,此文件出现。它显示了 ALSA PCM 中间层的 xrun(= 缓冲区溢出/xrun)和无效 PCM 位置调试/检查的状态。它接受一个整数值,可以通过写入此文件来更改,例如

# echo 5 > /proc/asound/card0/pcm0p/xrun_debug

该值由以下位标志组成

  • 位 0 = 启用 XRUN/jiffies 调试消息

  • 位 1 = 在 XRUN / jiffies 检查时显示堆栈跟踪

  • 位 2 = 启用额外的 jiffies 检查

当位 0 设置时,驱动程序在检测到 xrun 时会向内核日志显示消息。当在周期更新(通常从中断处理程序调用)中检测到无效的硬件指针时,也会显示调试消息。

当位 1 设置时,驱动程序将额外显示堆栈跟踪。这可能有助于调试。

自 2.6.30 起,此选项可以使用 jiffies 启用 hwptr 检查。这可以检测自发无效的指针回调值,但对于(大多数)有错误的硬件,如果它不提供平滑的指针更新,可能会导致过多的修正。此功能通过位 2 启用。

card*/pcm*/sub*/info

此 PCM 子流的通用信息。

card*/pcm*/sub*/status

此 PCM 子流的当前状态,已用时间,硬件位置等。

card*/pcm*/sub*/hw_params

为此子流设置的硬件参数。

card*/pcm*/sub*/sw_params

为此子流设置的软参数。

card*/pcm*/sub*/prealloc

缓冲区预分配信息。

card*/pcm*/sub*/xrun_injection

当任何值写入此 proc 文件时,会触发正在运行的流的 XRUN。用于故障注入。此条目是只写。

AC97 编解码器信息

card*/codec97#*/ac97#?-?

显示此 AC97 编解码器芯片的通用信息,例如名称、功能、设置。

card*/codec97#0/ac97#?-?+regs

显示 AC97 寄存器转储。对调试很有用。

当 CONFIG_SND_DEBUG 启用时,您可以写入此文件直接更改 AC97 寄存器。传递两个十六进制数字。例如,

# echo 02 9f1f > /proc/asound/card0/codec97#0/ac97#0-0+regs

USB 音频流

card*/stream*

显示给定声卡上每个音频流的分配和当前状态。此信息对于调试非常有用。

HD-Audio 编解码器

card*/codec#*

显示通用编解码器信息和每个小部件节点的属性。

card*/eld#*

适用于 HDMI 或 DisplayPort 接口。显示从连接的 HDMI 接收器检索到的 ELD(类似 EDID 的数据)信息,并描述其音频功能和配置。

可以通过执行 echo name hex_value > eld#* 来修改一些 ELD 字段。仅当您确定 HDMI 接收器提供的值错误时才这样做。如果这使您的 HDMI 音频正常工作,请向我们报告,以便我们可以在未来的内核版本中修复它。

音序器信息

seq/drivers

列出当前可用的 ALSA 音序器驱动程序。

seq/clients

显示当前可用的音序器客户端和端口列表。连接状态和运行状态也显示在此文件中。

seq/queues

列出当前已分配/正在运行的音序器队列。

seq/timer

列出当前已分配/正在运行的音序器定时器。

seq/oss

列出与 OSS 兼容的音序器内容。

调试帮助?

当问题与 PCM 相关时,首先尝试打开 xrun_debug 模式。这会在 xrun 发生时提供内核消息。

如果确实是 bug,请提供以下信息进行报告

  • 驱动程序/声卡名称,显示在 /proc/asound/cards

  • 寄存器转储(如果可用)(例如 card*/cmipci

如果是 PCM 问题,

  • PCM 设置,显示在 PCM 子流目录中的 hw_parms、sw_params 和 status 中

如果是混音器问题,

  • AC97 proc 文件,codec97#*/* 文件

对于 USB 音频/MIDI,

  • lsusb -v 的输出

  • 声卡目录中的 stream* 文件

ALSA bug 追踪系统位于:https://bugtrack.alsa-project.org/alsa-bug/