2、ALSA设备枚举与信息查看

好,咱们正式开始动手了。

这一节,我带你看看怎么把ALSA设备“揪出来”。说白了,就是搞清楚你的声卡长什么样、有几个、叫什么名字。

你可能会想:“这还不简单?插上就能用呗。”嗯,理想很丰满,现实嘛……我在项目中遇到过好几次,设备明明插着,系统就是认不出来。所以,学会枚举设备,是调试的第一步。

2.1 最常用的三板斧

我个人习惯,先敲这三个命令:

aplay -l
arecord -l
cat /proc/asound/cards

它们能告诉你系统里有哪些音频设备。

aplay -l 列出所有 playback(播放)设备。
arecord -l 列出所有 capture(录音)设备。
cat /proc/asound/cards 列出所有声卡。

举个例子,我在一台机器上跑了一下:

$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC892 Analog [ALC892 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 1: ALC892 Digital [ALC892 Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

看到了吗?card 0 是板载声卡,card 1 是显卡带的HDMI音频。

小提示: 如果 aplay -l 输出为空,别慌。先看看是不是没有 playback 设备,或者驱动没加载。我遇到过有人插了USB声卡,结果系统默认没装驱动,aplay -l 啥也不显示。

2.2 理解设备编号与子设备

这里有个关键概念:card、device、subdevice。

你可以把 card 想象成一块物理声卡。device 是这块卡上的一个功能单元,比如“模拟输出”、“数字输出”、“HDMI输出”。subdevice 呢?是同一个 device 下的多个独立通道。

举个例子:

card 0: PCH [HDA Intel PCH], device 0: ALC892 Analog
  Subdevices: 1/1
  Subdevice #0: subdevice #0

这里 card 0 有一个 device 0,它只有一个 subdevice(编号0)。

但有些专业声卡,一个 device 下面可能有多个 subdevice。比如:

card 2: USB [USB Audio], device 0: USB Audio [USB Audio]
  Subdevices: 4/4
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3

这意味着你可以同时打开4个独立的音频流。嗯,这在多轨录音时特别有用。

重点: ALSA 的设备引用格式是 hw:card,device,subdevice。比如 hw:0,0,0 表示 card 0、device 0、subdevice 0。

2.3 深入 /proc/asound/ 目录

除了上面三个命令,/proc/asound/ 目录下藏着更多细节。我经常进去翻翻。

$ ls /proc/asound/
card0  card1  cards  devices  hwdep  modules  oss  pcm  seq  timers  version

几个重要的文件:

  • cards:列出所有声卡,和 cat /proc/asound/cards 一样。
  • devices:列出所有设备类型(PCM、MIDI、定时器等)。
  • pcm:列出所有PCM设备,包括 playback 和 capture。
  • modules:显示每个声卡对应的内核驱动模块。
  • version:ALSA 版本号。

举个例子,看看 cat /proc/asound/modules:

 0 snd_hda_intel
 1 snd_hda_intel
 2 snd_usb_audio

这告诉我 card 0 和 card 1 都是 HDA Intel 驱动,card 2 是 USB 音频驱动。

注意: 如果你发现某个声卡没有对应的驱动模块,那它可能根本没被识别。我曾经调试一个USB声卡,插上后 cat /proc/asound/modules 里没有它,最后发现是USB控制器驱动没装好。

2.4 实战:快速定位问题

假设你插了一个USB麦克风,但系统没声音。你会怎么做?

我的习惯是:

  1. 先 cat /proc/asound/cards,看看有没有新卡出现。
  2. 如果没有,dmesg | tail -20 看看内核有没有报错。
  3. 如果有新卡,但 arecord -l 里没有,可能是 capture 设备没暴露。
  4. 最后 cat /proc/asound/pcm 确认一下。

你看,这一套下来,问题基本能定位到。

避坑指南: 我曾经遇到一个情况,aplay -l 和 arecord -l 都显示设备,但就是不出声。后来发现是 PulseAudio 把设备占用了。所以,调试时最好先停掉 PulseAudio:pulseaudio -k。

2.5 表格总结

为了方便你查阅,我把常用命令和用途整理了一下:

命令/文件 用途 示例输出
aplay -l 列出所有 playback 设备 card 0: PCH [HDA Intel PCH], device 0: ALC892 Analog
arecord -l 列出所有 capture 设备 card 0: PCH [HDA Intel PCH], device 0: ALC892 Analog
cat /proc/asound/cards 列出所有声卡 0 [PCH ]: HDA-Intel - HDA Intel PCH
cat /proc/asound/modules 查看声卡对应的驱动模块 0 snd_hda_intel
cat /proc/asound/pcm 列出所有PCM设备 00-00: ALC892 Analog : ALC892 Analog : playback 1 : capture 1

好了,这一节就到这里。你学会怎么枚举设备、理解编号和子设备了吗?下一节,我们聊聊如何用 speaker-test 和 arecord 快速验证设备是否正常工作。