backgroundbackground

Windows 音频输出设备消失:一次 SoundWire / AudioEndpointBuilder 的排查

Windows 音频 / AudioEndpointBuilder / SoundWire / SDCA / Cirrus Logic / ASUS UX5406SA / PowerShell / PnP

教程

2026-05-18 08:29

电脑突然没有声音,最烦人的不是“没声音”本身,而是 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 输出端点

最终修复路径是:

  1. 确认服务、系统组件、驱动包都不是根因。
  2. 确认 SoundWire 底层设备存在,但 MMDevice render endpoint 被标为 NotPresent
  3. 尝试强改注册表无效,因为 AudioEndpointBuilder 会立刻改回去。
  4. 重新安装兼容的 ASUS / Microsoft SoundWire SDCA core 驱动 10.0.2406.1
  5. 重新扫描设备并重启 Intel Smart Sound BUS。
  6. 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 常见值可以这样理解:

含义
1Active
2Disabled
4NotPresent
8Unplugged

这次最有价值的发现是:内部扬声器相关 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 音频问题时,sfcDISM 还是值得跑一下。不是因为它们神奇,而是它们能帮你把“系统文件损坏”这个分支关掉。

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 XUCS35L56 ampSoundWire 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 音频问题就会从一团黑箱,变成一张可以逐层验证的设备图。