自动流路由

本文介绍了如何更新 WASAPI 实现以利用自动流路由。

从 Windows 7 开始,只要更改默认音频设备,应用程序的音频播放流就会从以前的默认音频设备无缝传输到新的默认音频设备。 这种传输会自动进行,无需任何额外的应用程序代码。 但在 Windows 10 版本 1607 之前,使用低级别 Windows 音频会话 API (WASAPI) 的应用程序无法参与此自动流路由功能。 使用 WASAPI 的应用程序需要通过添加额外代码来实现自己的流路由形式,以检测音频设备的到达和删除,并根据需要将流切换到这些设备。 使用 WASAPI 的应用程序如果未在设备到达或删除时实施自己的流路由机制,其用户体验就有可能不太理想。

从 Windows 10 版本 1607 开始,使用 WASAPI 的应用程序可以利用自动流路由功能。 如果应用程序使用 WASAPI,强烈建议使用以下步骤来更新应用程序,以充分利用这一新功能:

  1. Windows 10 版本 1607 定义了两个新的 GUID,可用于激活具有自动流路由功能的音频呈现或捕获接口,即 DEVINTERFACE_AUDIO_RENDERDEVINTERFACE_AUDIO_CAPTURE。 调用 StringFromIID 可获取这些 GUID 的字符串表示形式。 以下示例显示了对音频呈现 GUID 的调用。

    PWSTR audioRenderGuidString;
    StringFromIID(DEVINTERFACE_AUDIO_RENDER, &audioRenderGuidString);
    
  2. 通过向 WASAPI ActivateAudioInterfaceAsync 函数传递标识符字符串来激活音频终结点。 以下示例传入了在步骤 1 中获取的音频呈现标识符:

    //Activate the default audio interface
    ActivateAudioInterfaceAsync(audioRenderGuidString
                                __uuidof(IAudioClient),
                                NULL,
                                completionHandler.Get(),
                                operation.GetAddressOf()));
    
  3. 释放为保存终结点标识符而分配的内存:

    CoTaskMemFree(audioRenderGuidString);  //free the string memory
    

按上述方式修改应用程序来激活音频接口后,它就会参与自动流路由功能。

要演示自动数据流路由,请使用配备内置扬声器的笔记本电脑或平板电脑来播放音频。 应该会听到设备内部扬声器播放的音频。 播放音频时,请连接一副耳机。 现在应该就能听到耳机里播放的音频。 然后拔下耳机,音频就会自动转回内置扬声器。

流路由

MediaDevice.GetDefaultAudioRenderId

MediaDevice.GetDefaultAudioCaptureId

ActivateAudioInterfaceAsync