/proc/asound/pcm 是什么?
ALSA 有其自己的 proc 树,即 /proc/asound。
每张声卡都有其子树 cardX,其中 X 的范围是 0 到 7。声卡特定的文件存储在 card* 子目录中。
详解见:https://docs.linuxkernel.org.cn/sound/designs/procfile.html
声卡驱动上挂着多个逻辑子设备,有 pcm 音频数据流、control 混音器、midi 、timer 定时器等
+-----------+
| snd_card |
+-----------+
| | |
+-----------+ | +------------+
| | |
+-----------+ +-----------+ +-----------+
| snd_pcm | |snd_control| | snd_timer | ...
+-----------+ +-----------+ +-----------+
1. /proc/asound/pcm 是什么?
这个文件是 ALSA(Advanced Linux Sound Architecture)驱动框架在运行时动态生成的一个信息接口。它列出了当前内核中所有可用的PCM(脉冲编码调制,即数字音频流)设备,无论这些设备是物理的还是虚拟的。
关键点: 它显示的是ALSA 驱动 探测到并注册的“声卡”及其“设备”。
2. 查看声卡和PCM设备的信息相关指令
1.查看当前的声卡:
显示当前配置的 ALSA 驱动程序列表、索引、id 字符串、简短和详细描述。
cat /proc/asound/cards
0 [rockchipad82088]: rockchip-ad8208 - rockchip-ad82088
rockchip-ad82088
1 [rockchipes8316 ]: rockchip-es8316 - rockchip-es8316
rockchip-es8316
2 [rockchiphdmi0 ]: rockchip-hdmi0 - rockchip-hdmi0
rockchip-hdmi0
3 [Audio ]: PCIEE Audio - PCIEE Audio
PCIEE Audio 0
2.声卡设备
列出 ALSA 原生设备映射。
1|console:/proc/asound $ cat /proc/asound/devices
2: [ 0- 0]: digital audio playback
3: [ 0- 0]: digital audio capture
4: [ 0] : control
5: [ 1- 0]: digital audio playback
6: [ 1- 0]: digital audio capture
7: [ 1] : control
8: [ 2- 0]: digital audio playback
9: [ 2] : control
10: [ 3- 0]: digital audio playback
11: [ 3- 0]: digital audio capture
12: [ 3] : control
33: : timer
- [ 3- 0]: digital audio playback → 第3号声卡,第0号PCM播放设备
- [ 3- 0]: digital audio capture → 第3号声卡,第0号PCM采集设备
- [ 3] : control → 第3号声卡的控制设备(如混音器)
2.查看pcm设备列表:
console:/proc/asound $ cat /proc/asound/pcm
00-00: dailink-multicodecs multicodec-0 : dailink-multicodecs multicodec-0 : playback 1 : capture 1
01-00: dailink-multicodecs es8316.7-0011-0 : dailink-multicodecs es8316.7-0011-0 : playback 1 : capture 1
02-00: rockchip-hdmi0 i2s-hifi-0 : rockchip-hdmi0 i2s-hifi-0 : playback 1
03-00: PCIEE Audio : PCIEE Audio : playback 1 : capture 1
3.查看有哪些音频设备节点
console:/proc/asound $ ls -l /dev/snd
total 0
crw-rw---- 1 system audio 116, 4 1970-01-01 00:00 controlC0
crw-rw---- 1 system audio 116, 7 1970-01-01 00:00 controlC1
crw-rw---- 1 system audio 116, 9 1970-01-01 00:00 controlC2
crw-rw---- 1 system audio 116, 12 1970-01-01 00:00 controlC3
crw-rw---- 1 system audio 116, 3 1970-01-01 00:00 pcmC0D0c
crw-rw---- 1 system audio 116, 2 1970-01-01 00:00 pcmC0D0p
crw-rw---- 1 system audio 116, 6 1970-01-01 00:00 pcmC1D0c
crw-rw---- 1 system audio 116, 5 1970-01-01 00:00 pcmC1D0p
crw-rw---- 1 system audio 116, 8 1970-01-01 00:00 pcmC2D0p
crw-rw---- 1 system audio 116, 11 1970-01-01 00:00 pcmC3D0c
crw-rw---- 1 system audio 116, 10 1970-01-01 00:00 pcmC3D0p
crw-rw---- 1 system audio 116, 33 1970-01-01 00:00 timer
这些设备节点的 Major=116,Minor 则与 /proc/asound/devices 所列的对应起来,都是字符设备.
上层可以通过 open / close / read / write / ioctl 等系统调用来操作声卡设备,这和其他字符设备类似,但一般情况下我们会使用已封装好的用户接口库如 tinyalsa、alsa-lib。
4.查看当前有哪些进程占用了pcm设备节点
lsof |grep pcm
3.音频设备命名规则
命名规则:[device type]C[card index]D[device index][capture/playback],
名字中含有4部分的信息:
1.device type
设备类型,通常只有comtrol/pcm这2种。从音频设备节点可以看到声卡会管理很多设备,PCM设备只是其中的一种设备。
2.card index
声卡的id,代表第几块声卡。通常都是0,代表第一块声卡。手机上通常都只有一块声卡。
3.device index
设备的id,代表这个设备是声卡上的第几个设备。设备的ID只和驱动中配置的DAI link的次序有关。如果驱动没有改变,那么这些ID就是固定的。
4.capture/playback
只有PCM设备才有这部分,只有c和p两种。c代表capture,说明这是一个提供录音的设备,p代表palyback,说明这是一个提供播放的设备
系统会在/proc/asound/pcm文件中列出所有的音频设备的信息,可以用cat /proc/asound/pcm查看:
console:/proc/asound $ cat /proc/asound/pcm
00-00: dailink-multicodecs multicodec-0 : dailink-multicodecs multicodec-0 : playback 1 : capture 1
01-00: dailink-multicodecs es8316.7-0011-0 : dailink-multicodecs es8316.7-0011-0 : playback 1 : capture 1
02-00: rockchip-hdmi0 i2s-hifi-0 : rockchip-hdmi0 i2s-hifi-0 : playback 1
03-00: PCIEE Audio : PCIEE Audio : playback 1 : capture 1
以上面的左侧00-01为例来说明下:前面2位数字指的card index:00,后面2位是device index:01。
ARM&Linux科谱





