流路由的相关通知

在 Windows 7 中,使用核心音频 API(如 Media Foundation、DirectSound 和 Wave API)的高级平台 API 通过处理从现有设备切换到新的默认音频终结点的流来实现流路由功能。 使用这些 API 的媒体应用程序使用流路由行为,而无需对源进行任何修改。 直接 WASAPI 客户端可以使用核心音频组件发送的通知并实现流路由功能。

若要实现流路由功能,客户端必须侦听两种类型的事件:设备更改通知和会话断开连接通知。 在高级 API 提供的实现中,针对通过调用 IMMDeviceEnumerator::GetDefaultAudioEndpoint 创建的默认设备终结点发送这些事件。 有关详细信息,请参阅获取流路由的设备终结点

核心音频组件 MMDeviceAPI 在添加、删除或修改音频设备时提供通知回调。 格式和音频会话更改通过 WASAPI 报告为事件。

设备更改通知

当添加、删除或修改音频设备时,MMDeviceAPI 将引发事件。 如果客户端要提供流路由功能,则必须实现 IMMNotificationClient 接口并使用 MMDeviceAPI 注册其实现。

若要获取设备更改通知,客户端必须执行以下任务:

注册这些接口的客户端实现后,客户端将通过这些接口的方法以回调形式接收通知。 引发终结点级别事件(终结点状态更改、新的终结点到达、终结点删除、默认终结点更改和终结点属性更改)时,MMDeviceAPI 会调用 IMMNotificationClient 方法。

如果客户端想要为默认设备提供流路由,客户端必须在通过 IMMNotificationClient::OnDefaultDeviceChanged 回调接收通知时实现设备更改行为。

音频会话更改通知

音频会话更改和格式更改通过 WASAPI 报告为音频会话事件。 WASAPI 客户端实现 IAudioSessionEvents 接口,并使用 WASAPI 注册实现。

若要获取音频会话更改通知,客户端必须执行以下任务:

发生音频会话更改时,WASAPI 调用 IAudioSessionEvents 方法。 当会话的显示名称、图标路径、音量、分组参数或状态更改时,将引发这些事件。

若要实现流路由功能,客户端必须等待会话断开连接通知。 当音频会话断开连接或设备的格式发生更改时,WASAPI 通过 IAudioSessionEvents::OnSessionDisconnected 以回调形式发送客户端通知。 使用断开连接通知时,WASAPI 还会发送一个值,该值指示会话断开连接的原因。 可能会出于多种原因(例如设备已删除、服务器停止等)发生这种情况。 有关原因的完整列表,请参阅 AudioPolicy.h 中定义的 AudioSessionDisconnectReason 枚举。 如果默认设备发生更改,则客户端必须等待通知(如果尚未收到)并返回 DisconnectReasonDeviceRemoval 值。 为了响应此类通知,客户端可能会在新的默认设备上重新打开流。

所有这些操作都是异步操作,因此应用程序接收通知的顺序无法预测。 但是,应用程序通常在默认设备更改通知前收到 AudioSessionDisconnect 值。

格式更改通知

当流的格式更改时,会发生音频格式更改。 当用户在声音控制面板中选择新格式或新的默认设备支持新格式(例如 HDMI 或具有手动采样率调整的某些专业音频接口)时,可能会发生这种情况。 若要通知客户端这些类型的格式更改,WASAPI 通过注册的 IAudioSessionEvents::OnSessionDisconnected 实现发送会话通知,其断开连接原因为 DisconnectReasonFormatChanged。 客户端可以通过以新格式重新打开流来处理通知。

关于 MMDevice API

关于 WASAPI

流路由