格式交涉
應用程式起始音訊處理之後,圖形產生器會將 sAPO 設定為音訊圖形,並初始化 SAPO。 音訊服務接著會與 LFX sAPO 交涉,以在 sAPO 的輸入和輸出建立音訊資料的格式。 此交涉程式稱為格式交涉。
所有提供 Windows Vista 音訊系統效果的 SAPO 都必須具有特定的介面和方法。 sAPO 和音訊引擎用來交涉資料格式的方法包括:IAudioProcessingObject 介面的IsInputFormatSupported方法,以及IAudioProcessingObjectConfiguration介面的LockForProcess和UnlockForProcess方法。
若要起始格式交涉,音訊服務會先將 LFX sAPO 的輸出設定為預設 float32 格式。 音訊服務接著會呼叫 LFX sAPO 的 IAudioProcessingObject::IsInputFormatSupported 方法、建議預設格式,以及監視此方法的 HRESULT 回應。 如果 LFX sAPO 可以支援建議的格式,它會傳回S_OK,並參考支援的格式。 如果 LFX sAPO 不支援建議的格式,它會傳回S_FALSE以及最符合建議格式的格式參考。 如果 LFX sAPO 不支援建議的格式,而且沒有相符的格式,則會傳回APOERR_FORMAT_NOT_SUPPORTED。 GFX sAPO 適用于 LFX sAPO 的輸出格式。 因此 GFX sAPO 並未涉及格式交涉程式。
選取資料格式來處理音訊資料之後,音訊處理圖形產生器會呼叫 SAPO 的 IAudioProcessingObjectConfiguration::LockForProcess 方法,導致格式選取完成。
如果 Windows Vista sAPO 將錯誤傳回包裝自訂 sAPO 以回應 LockForProcess 方法的呼叫,自訂 sAPO 必須以嘗試具現化 sAPO 失敗時處理 CoCreateInstance 錯誤的方式處理錯誤。 如需如何覆寫系統提供的 LockForProcess 方法的詳細資訊,請參閱 Spkrfill.cpp 檔案。
由於音訊服務的運作方式,LFX 和 GFX sAPOs 必須能夠彼此獨立回應音訊服務中有關資料格式的查詢。
重要 當您實作包裝 Windows Vista LFX sAPO 的自訂 sAPO 時,請勿在自訂 sAPO 的註冊屬性中指定APO_FLAG_FRAMESPERSECOND_MUST_MATCH旗標。 如果您指定此旗標,Windows Vista LFX sAPO 將無法執行喇叭填滿、耳機虛擬化或虛擬環繞。 此外,您的自訂 sAPO 將無法向下混用任何音訊串流。 例如,您的自訂 sAPO 將無法將 5.1 音訊串流向下混合到雙通道身歷聲音訊串流。