AudioGraph输出设备断连重连后启动报错,除重建外有其他解决办法吗?
解决AudioGraph设备重连后AUDCLNT_E_RESOURCES_INVALIDATED错误的替代方案
针对你遇到的设备断开重连后启动AudioGraph抛出0x88890026(AUDCLNT_E_RESOURCES_INVALIDATED)错误的问题,除了重建整个AudioGraph,还有以下可行方案:
1. 提前监听设备断开事件,主动清理失效节点
设备断开时,原AudioDeviceOutputNode关联的硬件资源已经失效,此时要在设备断开的第一时间清理连接并释放节点,避免后续操作触发崩溃:
- 注册
AudioGraph.UnavailableDevicesChanged事件,在设备变为不可用时,先移除所有输入节点到该输出节点的连接,再释放输出节点资源(不要调用Close,直接Dispose):audioGraph.UnavailableDevicesChanged += (sender, args) => { if (audioDeviceOutputNode == null) return; // 移除所有输入节点到失效输出节点的连接 foreach (var inputNode in audioGraph.AllNodes.OfType<AudioInputNode>()) { inputNode.RemoveOutgoingConnection(audioDeviceOutputNode); } // 释放输出节点资源 audioDeviceOutputNode.Dispose(); audioDeviceOutputNode = null; };
2. 设备重连后重建输出节点与连接
用户返回设备重连后,重新创建输出节点并恢复输入节点的连接,再启动AudioGraph:
// 设备重连后执行此逻辑 var outputNodeResult = await audioGraph.CreateDeviceOutputNodeAsync(); if (outputNodeResult.Status == AudioGraphCreationStatus.Success) { audioDeviceOutputNode = outputNodeResult.DeviceOutputNode; // 重新建立输入节点到新输出节点的连接 foreach (var inputNode in audioGraph.AllNodes.OfType<AudioInputNode>()) { inputNode.AddOutgoingConnection(audioDeviceOutputNode); } audioGraph.Start(); }
3. 切换到共享模式创建输出节点(场景允许时)
如果你的音频场景不需要独占设备,创建输出节点时使用AudioSharingMode.Shared模式,这种模式下系统会自动处理设备重连后的资源适配,降低资源失效的概率:
var creationOptions = AudioDeviceOutputNodeCreationOptions.Create( sharingMode: AudioSharingMode.Shared); var outputNodeResult = await audioGraph.CreateDeviceOutputNodeAsync(creationOptions);
关于你之前尝试失败的原因
- 调用
AudioDeviceOutputNode.Close会终止整个AudioGraph的所有资源,因为输出节点是音频图的核心终端,Close操作会直接关闭整个图; - 设备重连后再调用
RemoveOutgoingConnection,原输出节点的资源已经完全失效,此时操作会触发内存访问错误导致崩溃,必须在设备断开时提前处理。
内容的提问来源于stack exchange,提问作者Tom Huntington
相关产品推荐
相关产品推荐

