电脑突然没有声音,最烦人的不是“没声音”本身,而是 Windows 连输出设备都不让你选。
这次现场更典型:重启无效,音频服务正常,设备管理器里一堆 Intel Smart Sound、SoundWire、Cirrus Logic 设备看起来也没红叉;但系统设置里就是没有扬声器输出。最后修好以后,真正有效的动作不是调音量,也不是重装整个声卡驱动包,而是把一段被 Windows 更新弄乱的 SoundWire / SDCA 设备图 重新拉回兼容状态。
底层音频设备存在,不等于 Windows 已经生成可播放的 AudioEndpoint。
本次故障的核心,就是 SoundWire/Cirrus 硬件链路基本还在,但AudioEndpointBuilder没有给它生成 Active 的 render endpoint。
一、先给结论
我这台机器是 ASUS Zenbook S 14 UX5406SA_UX5406SA,音频链路大概是:
Intel Smart Sound Technology
-> SoundWire / SDCA core devices
-> Cirrus Logic codec / amplifier
-> AudioEndpointBuilder
-> 扬声器 AudioEndpoint
出问题时,前几层并没有完全坏掉。真正断在最后一层:
SoundWire/Cirrus 设备:Started / OK
Render AudioEndpoint:NotPresent,甚至没有 active 输出端点
最终修复路径是:
- 确认服务、系统组件、驱动包都不是根因。
- 确认 SoundWire 底层设备存在,但 MMDevice render endpoint 被标为
NotPresent。 - 尝试强改注册表无效,因为
AudioEndpointBuilder会立刻改回去。 - 重新安装兼容的 ASUS / Microsoft SoundWire SDCA core 驱动
10.0.2406.1。 - 重新扫描设备并重启 Intel Smart Sound BUS。
- Windows 重新生成
扬声器 (Cirrus Logic XU (with APO Extensions))输出端点。
这不是一个“音量为 0”的问题,也不是普通的“默认设备选错了”。它更像是 Windows 更新后,音频设备图的某一层和 OEM 驱动栈没有对上。
二、第一步:别急着卸载驱动,先看服务
Windows 音频至少要先确认这些服务:
Get-Service AudioEndpointBuilder,Audiosrv,DolbyDAXAPI,IntelAudioService,RtkAudioUniversalService |
Select-Object Name,Status,StartType
这次它们都正常:
AudioEndpointBuilder Running
Audiosrv Running
DolbyDAXAPI Running
IntelAudioService Running
RtkAudioUniversalService Running
这里有一个判断点:
如果
AudioEndpointBuilder没跑,确实可能导致输出设备消失;但如果它正常运行,问题就要往 PnP 设备图和 MMDevice 端点图查。
服务正常只能说明“生成端点的工人还活着”,不能说明它愿意给你的设备生成端点。
三、第二步:分清 Media 设备和 AudioEndpoint
Windows 里看到“音频设备正常”,有时只是在说底层 Media 设备正常,不代表用户态有可播放的输出端点。
先看底层音频设备:
pnputil /enum-devices /class Media /connected
再看系统真正暴露给用户选择的音频端点:
pnputil /enum-devices /class AudioEndpoint /connected
出问题时,这两个命令的差异非常关键。
Media 里能看到 SoundWire/Cirrus 设备:
SoundWire Audio
CS35L56 amp
CS42L43 UAJ
Cirrus Logic XU
Intel Smart Sound Technology
但 AudioEndpoint 里只有麦克风,没有扬声器:
SWD\MMDEVAPI\{0.0.1...} 麦克风阵列
注意 0.0.1 是 capture,输入设备;输出设备应该是 0.0.0 render。也就是说,系统能录音,但没有任何可用的播放端点。
这个瞬间基本可以排除一批常见误判:
| 现象 | 说明 |
|---|---|
| Media 设备 OK | 底层驱动链路不是完全缺失 |
| AudioEndpoint 没有 render | 用户态播放端点没有生成 |
| 麦克风还在 | 整个音频服务不是全挂 |
| 重启无效 | 不是单次服务状态卡住 |
四、第三步:看 MMDevice Render 状态
AudioEndpoint 的状态会落在这个注册表路径:
$render = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render'
Get-ChildItem $render | ForEach-Object {
$p = Get-ItemProperty -LiteralPath $_.PSPath
[pscustomobject]@{
Endpoint = $_.PSChildName
State = $p.DeviceState
}
}
DeviceState 常见值可以这样理解:
| 值 | 含义 |
|---|---|
1 | Active |
2 | Disabled |
4 | NotPresent |
8 | Unplugged |
这次最有价值的发现是:内部扬声器相关 endpoint 都存在记录,但全部是 State=4。
扬声器 / Cirrus Logic XU / SoundWire ... State=4
这说明不是“从来没装过”,而是 Windows 认为这些 render endpoint 当前不在场。
五、一个很容易踩的坑:强改注册表没用
看到 DeviceState=4,第一反应很自然:那我把它改成 1 不就好了?
实际测试结果是:可以改,但没用。
我用带最小权限的 Registry API 把 4 个当前 SoundWire speaker endpoint 从 4 改成 1,然后重启音频服务。结果 AudioEndpointBuilder 立刻把它们改回 4。
这一步反而证明了一件事:
DeviceState不是根因,它只是AudioEndpointBuilder判断结果的缓存。
强改缓存只是在改体温计,不是在退烧。真正要修的是它为什么判断这些 SoundWire render endpoint 不可用。
六、确认系统组件没坏
排查 Windows 音频问题时,sfc 和 DISM 还是值得跑一下。不是因为它们神奇,而是它们能帮你把“系统文件损坏”这个分支关掉。
sfc /scannow
DISM /Online /Cleanup-Image /ScanHealth
这次结果很干净:
SFC: Repairing 0 components
DISM: 未检测到组件存储损坏
所以继续往驱动栈和 Windows 更新兼容性查。
七、驱动栈里真正敏感的是 SDCA core
这台机器上官方 ASUS/Cirrus 音频扩展包都在:
Get-CimInstance Win32_PnPSignedDriver |
Where-Object {
$_.DeviceID -match 'INTELAUDIO|SOUNDWIRE|HDAUDIO' -or
$_.DeviceName -match 'Cirrus|SoundWire|Smart Sound|ACX|Display Audio'
} |
Select-Object DeviceName,DriverProviderName,DriverVersion,InfName,DeviceID
能看到 ASUS SoundWire Audio Driver、Cirrus 扩展、Dolby APO、Intel SST/ACX 这些都装着。真正值得盯的是这组 SoundWire / SDCA core INF:
sdcaaggregator.inf
sdcaclass.inf
sdcamfd.inf
sdcahid.inf
acpiaudiocompositor.inf
它们不是传统意义上“声卡控制面板”的驱动,而是 SoundWire / SDCA 设备枚举和聚合链路的基础。
这次机器上同时出现了两个版本线索:
兼容工作版本:10.0.2406.1
Windows 26H1 inbox 候选:10.0.28000.1896
直接切到新的 inbox SDCA core 并没有修好,反而让 SoundWire tree 变得更差:Aggregator 变成 Unknown/Stopped,Cirrus 子设备大量消失。这个动作必须立刻回滚。
这也是我这次最明确的经验:
不要因为 Windows inbox 驱动版本号更高,就默认它更适合 OEM SoundWire 音频栈。
对这类笔记本,OEM 扩展驱动和 SDCA core 的组合关系比“版本号新不新”更重要。
八、最终有效修复:重装兼容 SDCA core 并重新枚举
回滚时先前已经导出了旧 SDCA core 驱动,备份目录类似:
C:\Users\ShouC\audio-sdca-driver-backup-20260518-160453
恢复命令核心是这些:
$backup = "$env:USERPROFILE\audio-sdca-driver-backup-20260518-160453"
pnputil /add-driver "$backup\*.inf" /subdirs /install
pnputil /scan-devices
然后重启 Intel Smart Sound BUS。实例 ID 不要照抄,先用下面命令找自己机器上的 Intel 音频 BUS:
pnputil /enum-devices /connected |
Select-String -Pattern 'Intel|Smart Sound|A828|Audio' -Context 0,4
这台机器上对应的是:
pnputil /restart-device "PCI\VEN_8086&DEV_A828&SUBSYS_1E131043&REV_10\3&11583659&0&FB"
pnputil /scan-devices
最后重启音频相关服务:
Stop-Service Audiosrv -Force
Stop-Service AudioEndpointBuilder -Force
Start-Service AudioEndpointBuilder
Start-Service Audiosrv
Start-Service IntelAudioService
Start-Service RtkAudioUniversalService
Start-Service DolbyDAXAPI
执行后,Media 设备树恢复,关键是 AudioEndpoint 里重新出现了 render 端点:
SWD\MMDEVAPI\{0.0.0.00000000}.{914E45C9-43D5-4F08-8318-A19B1595522C}
扬声器 (Cirrus Logic XU (with APO Extensions))
Status: Started
MMDevice Render 里也能看到它已经是 State=1:
Endpoint: {914e45c9-43d5-4f08-8318-a19b1595522c}
State: 1
Name: 扬声器 / Cirrus Logic XU (with APO Extensions)
这一步才是真正的恢复点。
九、最后把它设为默认输出
设备恢复以后,系统通常会自动设默认。为了保险,我用 CoreAudio 枚举 active render endpoint,再把它设成三类默认输出:
eConsole
eMultimedia
eCommunications
确认结果:
ActiveRenderCount=1
DefaultRender eConsole {0.0.0.00000000}.{914e45c9-43d5-4f08-8318-a19b1595522c}
DefaultRender eMultimedia {0.0.0.00000000}.{914e45c9-43d5-4f08-8318-a19b1595522c}
DefaultRender eCommunications {0.0.0.00000000}.{914e45c9-43d5-4f08-8318-a19b1595522c}
Mute=False
Volume=0.67
如果只是想手动确认当前 AudioEndpoint 状态,PowerShell 这条就够用:
Get-PnpDevice -Class AudioEndpoint |
Select-Object FriendlyName,Status,Problem,InstanceId
修复后应该能看到:
扬声器 (Cirrus Logic XU (with APO Extensions)) OK CM_PROB_NONE
十、这次排查里最有价值的判断点
可以把 Windows 音频输出消失拆成三张图:
服务图:Audiosrv / AudioEndpointBuilder 是否运行
设备图:Intel SST / SoundWire / Cirrus 是否 Started
端点图:MMDEVAPI render endpoint 是否 Active
很多排查会卡住,是因为把这三张图混在一起看。
这次最迷惑的地方就是:设备图看起来没大问题,但端点图是坏的。
底层设备 Started
KS render interface 存在
MMDevice render endpoint NotPresent
AudioEndpointBuilder 强制覆盖注册表状态
这里的 aha 很简单:
Windows 声音设置里能不能选扬声器,最终看的是 MMDevice AudioEndpoint,不是你在设备管理器里看到了多少个音频相关设备。
设备管理器里的 Cirrus Logic XU、CS35L56 amp、SoundWire Audio 只是原材料。AudioEndpointBuilder 要把这些原材料拼成一个 render endpoint,应用程序才有东西可以播放。
十一、给下一次的排查清单
如果下次再遇到“输出设备消失”,我会按这个顺序走:
1. 看服务
Get-Service AudioEndpointBuilder,Audiosrv |
Select-Object Name,Status,StartType
2. 看底层 Media 设备
pnputil /enum-devices /class Media /connected
3. 看用户态 AudioEndpoint
pnputil /enum-devices /class AudioEndpoint /connected
4. 看 Render endpoint 状态
$render = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render'
Get-ChildItem $render | ForEach-Object {
$p = Get-ItemProperty -LiteralPath $_.PSPath
[pscustomobject]@{
Endpoint = $_.PSChildName
State = $p.DeviceState
}
}
5. 看驱动版本和 INF
Get-CimInstance Win32_PnPSignedDriver |
Where-Object {
$_.DeviceID -match 'INTELAUDIO|SOUNDWIRE|HDAUDIO' -or
$_.DeviceName -match 'Cirrus|SoundWire|Smart Sound|ACX'
} |
Select-Object DeviceName,DriverProviderName,DriverVersion,InfName
6. 再决定是否重装、回滚或切换驱动
别一上来就卸载所有音频设备。SoundWire 这类现代笔记本音频栈不是单个“声卡驱动”,而是一串 Intel + Microsoft + OEM + APO 扩展拼出来的设备图。拆错一层,设备会从“没有输出端点”变成“底层设备也不见了”。
十二、这次真正修好的不是“声音”,是设备图
最后能听到声音,只是结果。真正被修好的是这条链:
SDCA Aggregator
-> Cirrus Logic XU (with APO Extensions)
-> SoundWire ACX Streaming for SDW - Speaker
-> MMDEVAPI render endpoint
-> 默认扬声器
所以这类故障不要只盯着“声卡驱动有没有装”。更准确的问题应该是:
底层设备有没有枚举?
KS render interface 有没有暴露?
AudioEndpointBuilder 有没有生成 active render endpoint?
默认输出有没有指向这个 endpoint?
只要能把这几个问题分开,Windows 音频问题就会从一团黑箱,变成一张可以逐层验证的设备图。
