当前位置:首页>Linux>Linux多媒体进阶之旅(八):module-udev-detect如何发现ALSA声卡?

Linux多媒体进阶之旅(八):module-udev-detect如何发现ALSA声卡?

  • 2026-10-11 13:56:00
Linux多媒体进阶之旅(八):module-udev-detect如何发现ALSA声卡?

点击下方👇关注 Android系统攻城狮

第201篇原创文章

持续迭代 | Android+Linux多媒体进阶体系

专栏·课程 知识体系持续更新


学习理念:一次理解一个知识点
所属系列:Linux多媒体进阶实战(第8篇)
源码环境:PulseAudio17
硬件平台:RK3588
主题内容:module-udev-detect模块
难度等级:★★★★☆
阅读时间:3.6分钟

1

前言

  Linux声卡驱动注册完成后,可以通过aplay -l看到ALSA声卡。

例如:

card 2: rockchipes8388 [rockchip-es8388]

  但是,ALSA已经识别到声卡,并不代表PulseAudio一定能够立即看到这张声卡。

有时会出现下面这种现象:

aplay -l:可以看到ALSA声卡pactl list short cards:没有对应的PulseAudio Card

  从ALSA声卡出现,到PulseAudio加载对应的声卡模块,中间需要经过一个重要模块:

module-udev-detect

module-udev-detect模块功能包括:

•ALSA驱动负责把声卡注册到Linux内核。
•udev负责整理声卡设备及其属性。
•module-udev-detect负责发现、筛选和跟踪这些声卡。
•为声卡加载module-alsa-card。

module-udev-detect并不直接创建Sink和Source,它的核心任务是:

发现系统中有哪些ALSA声卡,并为符合条件的声卡加载对应的驱动模块。

2

module-udev-detect启动问题

  如果没有启动module-udev-detect模块,开发者需要在default.pa中为每一张声卡手动加载设备模块。

例如:

load-module module-alsa-sink device=hw:0,0load-module module-alsa-source device=hw:0,0

这种方式存在几个问题:

•不知道系统启动后声卡编号是多少;
•USB声卡插入后无法自动加载;
•声卡拔出后无法自动卸载;
•不同硬件平台需要编写不同配置;
•一张声卡可能同时包含多个播放和录音设备。

module-udev-detect就是为了解决这些问题。

PulseAudio默认启动配置中通常会加载:

load-module module-udev-detect

  模块启动后,会自动寻找当前系统中的ALSA声卡,同时监听后续声卡变化,加载过程如下:

3

udev在何处识别声卡?

module-udev-detect通过udev扫描Linux的sound子系统。

当ALSA声卡驱动注册完成后,系统中通常会出现以下设备节点:

/sys/class/sound/card2/sys/class/sound/controlC2/sys/class/sound/pcmC2D0p/sys/class/sound/pcmC2D0c

对应的设备节点可能包括:

/dev/snd/controlC2/dev/snd/pcmC2D0p/dev/snd/pcmC2D0c

其中:

•card2表示第2号ALSA声卡;
•controlC2表示这张声卡的控制设备;
•pcmC2D0p表示第2号声卡的第0号播放PCM;
•pcmC2D0c表示第2号声卡的第0号录音PCM。

udev会根据sysfs信息和udev规则,为设备增加属性,sound子系统中不只有声卡,还包含Control、PCM、Timer等设备。

4

设备热插拔时:声卡如何被识别?

  启动时的全量扫描,只能找到PulseAudio启动前已经存在的声卡。

  对于运行过程中插入的USB声卡,module-udev-detect还需要持续监听udev事件,模块初始化时会创建:

udev monitor

并且只监控sound子系统,当声卡发生变化时,udev monitor的文件描述符会触发,热插拔处理过程:

PulseAudio17源码中的monitor_cb()接收udev事件,过滤非Card路径后交给process_device();remove事件进入remove_card(),初始化完成的change事件进入card_changed()。

5

调试部分

1.检查ALSA是否注册声卡

cat /proc/asound/cardsaplay -larecord -l

如果这里没有声卡,说明问题在ALSA驱动链路,还没有进入module-udev-detect模块。

2.检查udev是否识别声卡

udev识别目标声卡card2信息

udevadm info \    --query=property \    --path=/sys/class/sound/card2

监听sound设备变化:

udevadm monitor \    --kernel \    --udev \    --property \    --subsystem-match=sound

3.检查设备节点权限

ls -l /dev/snd/getfacl /dev/snd/controlC2

如果PulseAudio运行用户没有读写权限,声卡不会正常加载。

4.检查声卡占用状态

fuser -v /dev/snd/*

5.检查PulseAudio模块

pactl list short modules | grep -E 'module-udev-detect.discovered=1'

如果输出:

module-udev-detect.discovered = "1"

说明这张PulseAudio Card是由module-udev-detect发现并加载的。

6

ALSA、udev和module-udev-detect模块区别
关键项
ALSA驱动
udev
module-udev-detect
所在层级
Linux内核音频层
Linux设备管理层
PulseAudio设备检测
作用
注册声卡和PCM
设备属性和事件
过滤、查找声卡
监听热插拔
由内核产生设备变化
产生设备事件
监听并处理事件
检查PCM占用
否
否
是
关键入口
声卡驱动注册
udev规则
pa__init()

总结一下:

ALSA驱动:负责注册声卡。

udev模块:负责检测、识别声卡。

module-udev-detect模块:负责查找并交接声卡。

若读者朋友发现有错误、疑问的地方,或者好的建议,欢迎拍砖!!!

★★★★★★★★★< END >★★★★★★★★★

欢迎加入知识星球:Android+Linux多媒体进阶体系2.0
专栏推荐
☞ 【专栏一】 基础原理系列
☞ 【专栏二】 Android车载音频系列
☞ 【专栏三】 Android编解码系列
☞ 【专栏四】 Android相机系列
☞ 【专栏五】 Android图形系列
☞ 【专栏六】 Android系统系列
☞ 【专栏七】Linux车载多媒体系列
原创不易,谢谢支持~~

最新文章

随机文章