从无效设备错误中恢复

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

注意

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

应用程序应用于从 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 终端服务 (WTS) 会话。 有关 WTS 会话的详细信息,请参阅 Windows SDK 文档。
  • 正在运行音频会话的 WTS 会话已断开连接。
  • (共享模式)音频会话已断开连接,使音频终结点设备可用于独占模式连接。

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

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

流管理