自动流路由

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

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

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

  1. Windows 10版本 1607 定义了两个新的 GUID,这些 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