從無效的裝置錯誤復原
如果用戶端應用程式所使用的音訊端點裝置無效,WASAPI 中的許多方法都會傳回錯誤碼AUDCLNT_E_DEVICE_INVALIDATED。 這個錯誤碼表示端點裝置已取消移轉,或音訊硬體或相關聯的硬體資源已重新設定、停用、移除或無法使用。 應用程式通常會從此錯誤中復原。
注意
如需使用空間音訊 API 時從無效裝置錯誤中復原的資訊,請參閱 從無效裝置錯誤復原 (空間音效)
應用程式應該用來從AUDCLNT_E_DEVICE_INVALIDATED錯誤中復原的策略,取決於應用程式用來選取音訊端點裝置的下列哪一種技術:
- 一律選取預設音訊轉譯或擷取裝置。
- 選取特定的音訊端點裝置。
在後者的情況下,應用程式會根據內部需求自動選取特定裝置,或允許使用者從可用裝置清單中明確選取裝置。
使用預設裝置的應用程式可以嘗試從AUDCLNT_E_DEVICE_INVALIDATED錯誤中復原,如下所示:
- 釋放 IAudioClient 介面及其在裝置上取得的任何其他 WASAPI 介面。
- 呼叫 IMMDeviceEnumerator::GetDefaultAudioEndpoint 方法來取得目前的預設音訊裝置。
- 嘗試在預設音訊裝置上啟用IAudioClient。
依照上述步驟,應用程式通常會適當地回應,而不論AUDCLNT_E_DEVICE_INVALIDATED錯誤的原因為何。 如果重新設定預設裝置造成錯誤(例如,如果使用者變更裝置所使用的數據流格式),則這些步驟如果成功,請讓應用程式繼續使用相同的裝置。 如果使用者已停用或移除應用程式所使用的裝置,且有另一個裝置可以擔任預設裝置的角色,則應用程式可以使用新的預設裝置繼續。 不論是哪一種情況,應用程式都會自動調整,而不需要使用者介入。
選取特定裝置的應用程式可能會嘗試從AUDCLNT_E_DEVICE_INVALIDATED錯誤中復原,如下所示:
- 釋放 IAudioClient 介面及其在裝置上取得的任何其他 WASAPI 介面。
- 嘗試在相同的裝置上啟用 IAudioClient 介面。
- 如果步驟 2 失敗,則應用程式可以做為選項,提示使用者選取另一個裝置。
如果應用程式所使用的裝置已重新設定,但未停用或移除,則步驟 2 可能會成功。 如果成功,步驟 2 可讓應用程式自動繼續使用相同的裝置,而不需要使用者介入。 如果應用程式允許使用者在使用者停用或移除先前使用的裝置之後明確選取另一個裝置,則步驟 3 是適當的。
當會話失去裝置連線時,應用程式可以更精確地判斷無效裝置錯誤的原因,方法是註冊以接收通知。 若要啟用此通知,應用程式會實作 IAudioSessionEvents 介面,並呼叫 IAudioSessionControl::RegisterAudioSessionNotification 方法來註冊介面。 當無效的裝置錯誤導致會話中斷連線時,WASAPI 會在已註冊的介面中呼叫 IAudioSessionEvents::OnSessionDisconnected 方法。 透過此方法,WASAPI 會通知應用程式中斷連線的原因。 在 Windows Vista 中 ,OnSessionDisconnected 呼叫會識別下列原因:
- 使用者已移除音訊端點裝置。
- Windows 音訊服務已關閉。
- 音訊會話所連線之裝置的慣用數據流格式已變更。
- 用戶註銷音訊會話執行所在的 Windows 終端機 Services (WTS) 會話。 如需 WTS 工作階段的詳細資訊,請參閱 Windows SDK 檔。
- 音訊會話執行所在的 WTS 會話已中斷連線。
- [共用模式] 音訊會話已中斷連線,讓音訊端點裝置可供獨佔模式連線使用。
為了回應中斷連線事件,WASAPI 會關閉屬於會話的所有數據流。 如果應用程式隨後嘗試透過 IAudioClient::GetCurrentPadding 等 WASAPI 方法存取已關閉的數據流,則方法會失敗並傳回錯誤碼AUDCLNT_E_DEVICE_INVALIDATED。
透過 IAudioSessionEvents 介面接收通知的另一個優點是通知會以異步方式送達。 因此,即使數據流未執行,應用程式仍會收到無法執行數據流之無效裝置錯誤的及時通知。
相關主題