从Invalid-Device错误恢复

如果客户端应用程序使用的音频终结点设备无效,WASAPI 中的许多方法将返回错误代码AUDCLNT_E_DEVICE_INVALIDATED。 此错误代码指示终结点设备已被解拔,或者音频硬件或关联的硬件资源已重新配置、禁用、删除或未使用。 通常,应用程序可以从此错误中恢复。

注意

有关使用空间音频 API (ISAC) 时从无效设备错误恢复的信息,请参阅 从空间声音 (空间声音) Invalid-Device错误恢复

应用程序应用于从AUDCLNT_E_DEVICE_INVALIDATED错误中恢复的策略取决于应用程序用于选择音频终结点设备的以下技术之一:

  • 始终选择默认音频呈现或捕获设备。
  • 选择特定的音频终结点设备。

在后一种情况下,应用程序会根据内部要求自动选择特定设备,或者允许用户从可用设备列表中选择设备。

使用默认设备的应用程序可以尝试从AUDCLNT_E_DEVICE_INVALIDATED错误中恢复,如下所示:

  1. 释放 IAudioClient 接口及其在设备上获取的任何其他 WASAPI 接口。
  2. 调用 IMMDeviceEnumerator::GetDefaultAudioEndpoint 方法以获取当前的默认音频设备。
  3. 尝试在默认音频设备上激活 IAudioClient

按照上述步骤操作,无论AUDCLNT_E_DEVICE_INVALIDATED错误的原因如何,应用程序都会做出适当的响应。 例如,如果重新配置默认设备导致错误 (,如果用户更改了设备) 使用的流格式,则这些步骤(如果成功)使应用程序能够继续使用同一设备。 如果用户禁用或删除了应用程序正在使用的设备,并且另一台设备可用于承担默认设备的角色,则应用程序可以使用新的默认设备继续。 在任一情况下,应用程序都会自动调整,无需用户干预。

选择特定设备的应用程序可以尝试从AUDCLNT_E_DEVICE_INVALIDATED错误中恢复,如下所示:

  1. 释放 IAudioClient 接口及其在设备上获取的任何其他 WASAPI 接口。
  2. 尝试在同一设备上激活 IAudioClient 接口。
  3. 如果步骤 2 失败,应用程序可以按选项提示用户选择另一台设备。

如果应用程序正在使用的设备已重新配置但未禁用或删除,则步骤 2 可能会成功。 如果成功,步骤 2 使应用程序能够自动继续使用同一设备,而无需用户干预。 如果应用程序允许用户在用户禁用或删除以前使用的设备后显式选择其他设备,则步骤 3 是合适的。

当会话失去与设备的连接时,应用程序可以通过注册来接收通知,从而更准确地确定无效设备错误的原因。 若要启用此通知,应用程序实现 IAudioSessionEvents 接口,并调用 IAudioSessionControl::RegisterAudioSessionNotification 方法来注册接口。 当无效设备错误导致会话断开连接时,WASAPI 在已注册的接口中调用 IAudioSessionEvents::OnSessionDisconnected 方法。 通过此方法,WASAPI 告知应用程序断开连接的原因。 在 Windows Vista 中,OnSessionDisconnected 调用标识以下原因:

  • 用户删除了音频终结点设备。
  • Windows音频服务已关闭。
  • 音频会话连接到的设备的首选流格式已更改。
  • 用户注销了音频会话正在运行的 Windows 终端 Services (WTS) 会话。 有关WTS会话的详细信息,请参阅 Windows SDK 文档。
  • 音频会话正在运行的WTS会话已断开连接。
  • (共享模式) 音频会话断开连接,以使音频终结点设备可用于独占模式连接。

为了响应断开连接事件,WASAPI 关闭属于会话的所有流。 如果应用程序随后尝试通过 WASAPI 方法(如 IAudioClient::GetCurrentPadding)访问封闭流,该方法将失败并返回错误代码AUDCLNT_E_DEVICE_INVALIDATED。

通过 IAudioSessionEvents 接口接收通知的另一个好处是通知以异步方式到达。 因此,即使流未运行,应用程序仍会收到阻止流运行的无效设备错误的及时通知。

流管理