PulseAudio 的 ALSA 模块(主要是 module-udev-detect + module-alsa-card)决定加载哪些 card 是有一套清晰的机制的,并且 完全由系统的 ALSA 声卡信息 + udev 规则决定,不取决于 asound.conf 或 plughw/hw 设置。
PulseAudio 加载 ALSA 声卡(Card)的核心流程
由 udev 探测可用的 ALSA 硬件卡
PulseAudio 在启动时会加载:
module-udev-detect这个模块会监视:
/dev/snd/controlC*只要某个 ALSA 卡在系统中出现了 control 节点,例如:
/dev/snd/controlC0 /dev/snd/controlC1PulseAudio 就认定它是一个可用的硬件 sound card。
对每一个 /dev/snd/controlC,PulseAudio 自动加载 module-alsa-card*
监测到 card 后,PulseAudio 会为其创建一个卡对象(card object),并自动加载:
module-alsa-card即:
发现 controlC0 → 加载 card0 → 加载 sinks/sources
发现 controlC1 → 加载 card1 → 同理
这一步不依赖用户配置。
PulseAudio 根据卡支持的 “Profiles” 决定创建哪些 sink/source
每个 ALSA card 的 UCM(Use Case Manager)或 fallback profile 定义了可用的 Profiles。例如:
analog-stereo analog-surround-5.1 hdmi-stereo offPulseAudio 会扫描以下目录:
/usr/share/pulseaudio/alsa-mixer/profile-sets/使用里面的 profile 配置文件,确定:
这个 ALSA card 应该创建哪些 sink(输出)
这个 ALSA card 应该创建哪些 source(输入)
UCM 配置存在时优先使用 UCM
如果声卡有:
/usr/share/alsa/ucm/<card name>/PulseAudio 会优先使用 UCM 定义的:
PlaybackPCM
CapturePCM
Jack 切换逻辑
Devices/Modifiers
这是为什么 Jetson 或某些嵌入式平台会出现:
alsa_output.platform-sound.analog-stereo这样的 sink 名称。
总结
PulseAudio 的 ALSA 模块决定加载哪些卡,核心依赖以下三点:
/dev/snd/controlC* 是否存在(由内核 + udev 决定)
是否能加载 module-udev-detect(PulseAudio 自动处理)
是否能为该卡加载 module-alsa-card(PulseAudio 自动处理)
而不是由以下决定:
不是 asound.conf
不是 plughw/hw 设置
不是 aplay -L 的显示顺序
真正决定加载的只有 硬件卡是否被内核注册 + udev 是否报告给 PulseAudio。
我们要注意alsa的配置文件在pulseaudio默认是不产生效果的。
可以通过下面的命令查看所有pulseaudio已经加载的声卡。
pactl list cards short