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音频。
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个独立的音频流。嗯,这在多轨录音时特别有用。
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 音频驱动。
cat /proc/asound/modules 里没有它,最后发现是USB控制器驱动没装好。
2.4 实战:快速定位问题
假设你插了一个USB麦克风,但系统没声音。你会怎么做?
我的习惯是:
- 先
cat /proc/asound/cards,看看有没有新卡出现。 - 如果没有,
dmesg | tail -20看看内核有没有报错。 - 如果有新卡,但
arecord -l里没有,可能是 capture 设备没暴露。 - 最后
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 快速验证设备是否正常工作。