串流路由的相關通知

在 Windows 7 中,使用核心音訊 API 的高階平臺 API,例如 Media Foundation、DirectSound 和 Wave 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

串流路由