spa.alsa: front:2p: no format found (def:0) formats:S24_3LE
spa.alsa: front:2p: access:MMAP_INTERLEAVED RW_INTERLEAVED
mod.adapter: 0x...: can't get format: 没有那个文件或目录
wireplumber: Failed to create alsa_output.usb-SonicakeAudio...analog-stereo: PipeWire proxy destroyed
1.3 影响范围
设备侧:所有"播放 PCM 仅支持 >16bit 格式"的 USB 音频设备。典型为 UAC 1.0 全速设备
使用 24bit 打包格式(S24_3LE / S24_BE)、或仅支持 F32LE/S32LE 的 USB DAC。
方向:仅播放。录音不受影响。
范围:全局 /etc 规则,所有用户、所有 USB 声卡,与桌面环境无关(X11/Wayland 均受影响)。
* Migrate WirePlumber configuration snippets from os-config,
now installed to /etc/wireplumber/wireplumber.conf.d/:
- bluetooth-autoswitch-off.conf: disable Bluetooth profile auto-switching
- skip-before-s16.conf: skip formats before S16 on USB audio output
— anguoli, 2026-10-14
# 11:56:16 会话启动,首次失败
spa.alsa: front:2p: no format found (def:0) formats:S24_3LE
spa.alsa: front:2p: access:MMAP_INTERLEAVED RW_INTERLEAVED
mod.adapter: 0x...: can't get format: 没有那个文件或目录
wireplumber: Failed to create alsa_output.usb-SonicakeAudio...analog-stereo: PipeWire proxy destroyed
# 打开 log.level=4 后的枚举过程
I spa.alsa [alsa-pcm.c:1222:spa_alsa_open]: ALSA device open 'front:2' playback
D spa.alsa [alsa-pcm.c:1741:debug_hw_params]: enum_pcm_formats:
D spa.alsa [alsa-pcm.c:726:log_write]: FORMAT: S24_3LE
I spa.alsa [alsa-pcm.c:1762:enum_pcm_formats]: front:2p: skip audio formats before S16
I spa.alsa [alsa-pcm.c:1812:enum_pcm_formats]: front:2p: skip format F32LE
I spa.alsa [alsa-pcm.c:1812:enum_pcm_formats]: front:2p: skip format S32LE
I spa.alsa [alsa-pcm.c:1812:enum_pcm_formats]: front:2p: skip format S24_32LE
I spa.alsa [alsa-pcm.c:1812:enum_pcm_formats]: front:2p: skip format S24LE
I spa.alsa [alsa-pcm.c:1818:enum_pcm_formats]: front:2p: reached S16LE, stop skipping
W spa.alsa [alsa-pcm.c:1860:enum_pcm_formats]: front:2p: no format found (def:0) formats:S24_3LE
# DDE 侧
daemon/audio[3883]: audio.go:913: sink not found for card #52 and port "analog-output"
问题报告:Deepin 25 外置 USB 声卡播放节点(Sink)无法创建
报告日期:2026-11-13
问题等级:高(设备完全不可用于播放,用户侧无任何提示)
涉及组件:
pipewire/libspa-0.2-modules/wireplumber/dde-daemon受影响版本:
pipewire 1.6.4-1deepin10及以后 ×wireplumber 0.5.14-1deepin6及以后状态:已定位、已复现、已有可用规避方案、上游修复建议待提交
0. 摘要
Deepin 25 在
pipewire中新增了属性api.alsa.skip-formats-before-s16(默认关闭),并在
wireplumber中以/etc级全局规则对所有 USB 声卡的播放节点把它置为true。该属性能让格式枚举跳过所有位深高于 16bit 的候选格式。
当设备播放 PCM 只支持高于 16bit 的格式(本例仅
S24_3LE)时,枚举结果为空集,mod.adapter拿不到format,节点创建中止,Sink 从未存在。于是控制中心/
dde-daemon点击"启用外置声卡"时找不到对应 sink,表现为"点了没反应"。这不是硬件问题、不是驱动问题、不是权限问题,也不是用户配置问题。
录音方向不受影响,因为规则只匹配
alsa_output.*。1. 问题现象
1.1 用户可见现象
1.2 系统侧现象
dde-daemon的音频模块在日志中留下唯一一条直接线索:pipewire侧的真实错误链(每次会话启动、每次切换档案都会重现):1.3 影响范围
使用 24bit 打包格式(
S24_3LE/S24_BE)、或仅支持F32LE/S32LE的 USB DAC。/etc规则,所有用户、所有 USB 声卡,与桌面环境无关(X11/Wayland 均受影响)。2. 复现步骤
2.1 前置条件
先确认本机确实满足该条件(这一步是判断问题是否与你有关的关键):
若
Playback:段中Format:只出现S24_3LE/S24_BE/S32_LE/F32_LE等没有
S16_LE,则本问题必然命中。2.2 复现方法 A:观察法(无副作用)
判定:
pactl list sinks中没有alsa_output.usb-...,而
pactl list sources中有alsa_input.usb-...,即复现成功。2.3 复现方法 B:主动重建法(可逆,推荐)
强制切一次档案,触发节点重建,并观察日志:
判定:出现
no format found (def:0) formats:S24_3LE且 sink 依旧不出现,即复现成功。2.4 复现方法 C:最小代码级复现(可精确定位到属性)
创建两个临时节点,唯一差别是有无该属性。测试完毕必须销毁:
判定:C1 成功、C2 失败,即证明"该属性是唯一变量",与 PCM 名称、档案、端口、驱动均无关。
2.5 非复现路径(这些操作无效,不必再试)
pavucontrol手动路由3. 问题是如何产生的(时序链路)
关键点:失败在 ⑥ 之前。所有在 ⑦⑧ 层面做的操作(选默认、改端口、改档案)都治不了。
4. 由谁引入、在哪个版本/场景引入
4.1 两个独立变更,缺一不可
pipewire 1.6.4-1deepin10(含libspa-0.2-modules)api.alsa.skip-formats-before-s16,默认关闭changelog.Debian.gz;补丁debian/patches/Fix-Skip-audio-formats-before-S16.patchwireplumber 0.5.14-1deepin6true,匹配node.name=~alsa_output.*+alsa.driver_name=snd_usb_audiochangelog.Debian.gz首条;/etc/wireplumber/wireplumber.conf.d/skip-before-s16.confA 单独存在不会造成任何行为变化(属性位域默认 0)。只有 B 落地后问题才会显现。
因此问题的暴露起点是
wireplumber 0.5.14-1deepin6(2026-10-14)。4.2 该配置并非新写
wireplumber 0.5.14-1deepin6的变更说明是"从os-config迁移配置片段":对应 PR:
deepin-community/wireplumber#15,集成工单BUG-379319。即:这是一条历史遗留的现场 workaround,此前由
os-config包投递,2026-10 才搬进wireplumber 自己的
/etcconffile,从而对所有安装该版本的机器默认生效。4.3 触发场景(满足全部三条才会命中)
alsa.driver_name = snd_usb_audio);三者缺一,问题不会出现。这也解释了为什么绝大多数用户没有感知。
5. 根本原因分析
5.1 直接原因:格式枚举产生空集,且没有兜底
补丁
Fix-Skip-audio-formats-before-S16.patch的核心逻辑(原文摘录):其语义是"从格式表开头逐个跳过,直到遇见 S16 才停"。
设计假设是"设备至少支持 S16"。当这个假设不成立时(本例),整张表被跳空,
enum_pcm_formats()以j == 0结束,上层必然拿不到格式。代码中没有空集兜底——这是缺陷的核心:
5.2 策略层原因:命中面过宽
snd_usb_audio名下覆盖数千种设备,无 VID/PID 白名单;代价与收益严重不对称:可能出问题的设备是少数,但降级(乃至本例的完全不可用)
由所有 USB 声卡用户承担。24bit 理论动态范围约 120 dB,16bit 约 96 dB,
对正经外置解码器是可测量的倒退。
5.3 动机推断(官方未说明,按证据强度排序)
公开的 changelog、PR 描述、补丁注释均只写 what,未写 why。以下为基于代码形态与硬件特征的推断:
alsa_output+ USB → 投诉集中在放音;本机设备恰为bcdUSB 1.00+ 仅S24_3LE;Synch Type: None(无显式同步端点,靠隐式回馈),该组合在 24bit 打包格式下周期边界易出问题wMaxPacketSize 0x0120= 288 字节/帧,bInterval 1,即 288000 B/s,恰好等于 48k×2ch×3B,余量为 0;降到 16bit 后仅需 192000 B/s(降 33%)Fix-Optimize-the-volume-algorithm.patch时间相近5.4 已排除的其他原因(附判断依据)
aplay -l缺卡 /dmesg枚举失败snd_usb_audio未加载stream0可读/dev/snd不可访问pcm0p/sub0/status为RUNNINGclosed~/.config/pipewire*覆盖pro-audio均无效pw-cli直建节点可正常出声6. 解决办法
6.1 方案一:用户级覆盖(推荐,改动最小)
原理:
~/.config/wireplumber/wireplumber.conf.d/在/etc之后加载,同名数组
monitor.alsa.rules追加,后应用的规则覆盖前者,从而把该属性改回false。不要修改
/etc下那个文件本身——它是 dpkg conffile,改动会在升级时触发冲突提示。步骤 1:创建配置文件
写入
~/.config/wireplumber/wireplumber.conf.d/51-usb-soniccube.conf:步骤 2:重启会话管理器
步骤 3:验证
预期结果:sink 出现,格式为
s24le 2ch 48000Hz;默认输出自动指向该卡(若此前
~/.local/state/wireplumber/default-nodes中已设定,会自行恢复)。suspend状态是空闲挂起,有音频流即转running,不是故障。步骤 4(可选):若控制中心仍显示板载,重启托盘或面板以刷新缓存
回滚:
6.2 方案二:系统级覆盖(多用户环境)
在
/etc/wireplumber/wireplumber.conf.d/下新增一个文件(新增文件不会与包管理的conffile 冲突)。
文件名必须以排在
s之后的字符开头(如zz-)。同一目录内按文件名字典序加载、后加载的规则后应用;若命名为
99-*.conf会排在skip-before-s16.conf之前(
'9' < 's'),反而被后者覆盖,方案失效。6.3 方案三:对这张卡关闭 ACP(备用,非首选)
若方案一生效不稳定,可让 WirePlumber 不走 ACP、直接用原生 ALSA 建节点。
代价是设置中不再出现"声卡"条目(失去端口/档案抽象,只剩输出设备):
本机未采用(方案一已足够),仅作降级路径记录。
6.4 明确不建议的做法(避免误用)
/etc/wireplumber/wireplumber.conf.d/skip-before-s16.conf= false不加设备匹配)audio.format = "S16LE"强制指定ENOTSUP,症状不变wireplumber或pipewirepulseaudio替换 PipeWirealsa.driver_name判据的alsa.conf7. 相关硬件与软件参数(针对性依据)
7.1 整机
Jiaolong15K Series GM5BG5E(机械革命 蛟龙 15K)GM5BG5E[10de:28a1][1022:15e3][1022:15e2][10de:22be][1022:161e],PCI0000:06:00.47.2 外置声卡(问题设备)
84ef:0038bcdUSB 1.00(UAC 1.0)usb-0000:06:00.4-1,Bus 003 / Device 007Audio(USB-Audio - Sonic Cube USB Audio)pcm0p(播放)/pcm0c(录音),共享同一 PCM 设备 0S24_3LE,2ch,44100 / 48000 Hz,24 bitS24_3LE,2ch,44100 / 48000 Hz,24 bit0x02 (OUT),录音0x81 (IN),均 Isochronous / Synch Type: NonewMaxPacketSize 0x0120= 288 字节,bInterval 1usbmixer无任何控件(ctrlif=0, ctlerr=0)bSubframeSize 3、bBitResolution 24bNrChannels 27.3 软件版本
crimson,社区版,Buildbuild1)6.18.56-amd64-desktop-rolling(#25.01.01.40,2026-10-13)XDG_SESSION_TYPE=x11)pipewire/pipewire-bin/pipewire-pulse1.6.4-1deepin22deepin10起)libpipewire-0.3-01.6.4-1deepin22libspa-0.2-modules1.6.4-1deepin22spa/plugins/alsa)wireplumber0.5.14-1deepin6libasound2/libasound2-data1.2.15.3-1deepin7dde-daemon6.1.111audio.go:913)deepin-desktop-schemas6.0.137.4 对象命名(跨重启稳定,可用于配置匹配)
8. 是否适用于你的设备:三步判定
S16_LE/S16_BEno format found9. 附录
9.1 证据采集命令清单(可直接复跑)
9.2 关键日志原文(本机实测)
9.3 修复后验证记录(2026-11-13 13:11:32)
9.4 参考
deepin-skip-before-s16.patch(本目录,取自pipewire_1.6.4-1deepin22.debian.tar.xz)https://github.com/deepin-community/wireplumber/pull/15(工单BUG-379319)spa/plugins/alsa/alsa-pcm.c(PipeWire master 中不存在该属性,确认为发行版定制)外置声卡无法启用-排查报告.md10. 结论
can't get format→ Sink 未创建 →dde-daemon报sink not found。pipewire 1.6.4-1deepin10(2026-05-28,qaqland);策略来自
wireplumber 0.5.14-1deepin6(2026-10-14,anguoli,由os-config迁入)。暴露起点是后者。
api.alsa.skip-formats-before-s16假设"设备至少支持 S16",对仅高位深设备无空集兜底;下发规则以驱动名为判据,命中面过宽。
device.name精确匹配,把该属性对本设备置false,重启 wireplumber。已实测生效,播放恢复为
s24le 2ch 48000Hz。对正常设备使用会造成 24bit 能力白丢,属滥用。