在 Windows Vista 和更新版本的 Windows 中,AudioEndpointBuilder 是系統服務,可列舉、初始化和啟用系統中的音訊端點。 本主題提供 AudioEndpointBuilder 服務所用演算法的概觀。
AudioEndpointBuilder 服務會使用演算法來探索和列舉端點。 此演算法旨在簡化系統對多工 (MUXed) 擷取裝置的存取,並協助處理涉及多個主機引腳和多個橋接引腳或兩者兼而有之的拓撲。
在 Windows XP 中,音訊模型使用音訊裝置一詞來指代隨插即用 (PnP) 樹狀結構中的概念裝置。 在 Windows Vista 和更新版本的 Windows 中,音訊裝置的概念已重新設計,以更妥善地代表使用者實際互動的裝置。
使用 Windows Vista 中的兩個新 API, 即 MMDevice API 和 WASAPI,您可以存取和操作這些新的音訊裝置。 MMDevice API 將新的音訊裝置稱為端點。
AudioEndpointBuilder 服務會監視 KSCATEGORY_AUDIO 類別的裝置介面到來和移去。 當音訊裝置驅動程式註冊KSCATEGORY_AUDIO裝置介面類別的新實例時,AudioEndpointBuilder 服務會偵測裝置介面通知,並使用演算法來檢查系統中音訊裝置的拓撲,並採取適當的動作。
下列清單摘要說明 AudioEndpointBuilder 所使用的演算法運作方式:
尋找任何未連接的橋接引腳。
為任何未連接的橋接接腳建立端點。 例如,當 AudioEndpointBuilder 找到針腳類別 GUID 為 KSNODETYPE_SPEAKER 的未連線橋接器針腳時,它會為此橋接器針腳建立喇叭端點。 如需 KSNODETYPE_SPEAKER 和其他針腳類別 GUID 的詳細資訊,請參閱 WinDDK\<組建編號>\inc\api 中的 Ksmedia.h。
設定端點的預設屬性。 例如,AudioEndpointBuilder 會設定名稱、圖示和外形尺寸。
判斷是否存在一條路徑從端點至主機端腳,該路徑支援脈衝碼調變(PCM)、音訊編碼器3(AC3)或Windows媒體視訊(WMV)。 主機針腳是 KSPIN 結構,其通訊成員設定為 KSPIN_COMMUNICATION_SINK 或 KSPIN_COMMUNICATION_BOTH。 如需 KSPIN 結構的詳細資訊,請參閱 KSPIN。
使用音效设备接口的登錄機碼中的屬性資訊填充端點 PropertyStore。
設定端點的狀態。 端點的狀態可以是下列三個值之一:
使用中。 這表示路徑存在,如步驟4中所述。
斷電。 如果音訊裝置支援插孔偵測,此狀態表示端點的路徑存在,而且插孔已從音訊介面卡上的實體連接器拔除。
不在場。 此狀態表示在步驟4中找不到路徑,並且此終端不支援插孔檢測。
將此端點設定為預設端點,如果這是相關聯 INF 檔案中指定的端點。
列舉端點之後,音訊系統的用戶端可以使用新的 Windows Vista API 直接操作端點 (如先前所述) ,或使用更熟悉的 API,例如 Wave、 DirectShow 或 DirectSound 間接操作端點。 已提供新的 API 方法,讓音訊用戶端可以從端點的 MMDevice 識別碼開始,並存取相同端點的 Wave 或 DirectSound 識別碼。
當您使用端點時,您可以利用下列功能:
無論您重新啟動機器的頻率為何,都可使用相同的全域唯一識別碼 (GUID)。 擁有此持續性 GUID 比儲存端點的 waveOut 標識碼或易記名稱更可靠。
無論您重新啟動機器的頻率如何,都可以使用相同的 PropertyStore。 音訊裝置相關的後設資料會儲存在端點屬性存放區中。
多工(MUX)和解多工(DEMUX)引腳會自動管理,並由 AudioEndpointBuilder 服務列舉。
如果您開發自己的音訊裝置驅動程式和 INF 檔案來搭配音訊裝置,並開發音訊應用程式,或兩者兼而有之,最好注意下列問題和最佳做法。 當您在開發驅動程式和應用程式時,考慮到這些建議,您可以產生驅動程式、INF 檔案和音訊用戶端,以更有效地與 AudioEndpointBuilder 搭配使用。
命名慣例。 端點的命名規範是根據橋接器針腳的易記名稱制定的。 不過,在喇叭端點的情況下,名稱已硬式編碼為「喇叭」,您的驅動程式或協力廠商應用程式無法變更。
次優拓撲。 某些拓撲會被視為不理想,因為 AudioEndpointBuilder 所用來列舉端點的演算法。 例如,當您建立其中一個次優拓撲時,您會建立具有隱藏端點的主機針腳,這些端點無法被 AudioEndpointBuilder 看見,且無法與 AudioEndpointBuilder 連結至其相關聯的主機針腳或分割的端點。
隱藏端點
在下圖中,KS 濾波器顯示有兩個主機針,亦即宿主針,這些針連線到單一橋接針(喇叭)。
當 AudioEndpointBuilder 探索此橋接器針腳時,它會追蹤路徑回溯至其中一個主機針腳、設定橋接器針腳的預設值、建立並啟用喇叭端點,並繼續探索其他橋接器針腳。 另一個主機針腳因此會從 AudioEndpointBuilder 中隱藏。
在上圖中,有問題的拓撲結構已重新設計,使 AudioEndpointBuilder 能夠發現兩個主機引腳(PCM 和 AC-3/PCM),因為它現在可以看到兩個橋接引腳(喇叭和 SPDIF)。
分離器
當一個主機引腳連接到多個橋接引腳時,會建立另一種類型的次優拓撲。 下圖顯示 PCM 主機針腳連線到喇叭橋接針腳和 SPDIF 橋接針腳的拓撲。
在此情況下,AudioEndpointBuilder 會探索一個橋接器針腳,並追蹤回 PCM 主機針腳的路徑、設定預設值,然後建立並啟用喇叭端點。 當 AudioEndpointBuilder 探索下一個橋接器針腳時,它會追蹤路徑回溯至相同的 PCM 主機針腳、設定預設值,然後建立並啟用 SPDIF 端點。 不過,雖然兩個端點都已初始化並啟用,但串流至其中一個端點會無法同時串流至另一個端點;換句話說,它們是互斥的端點。
下圖顯示此拓撲的重新設計,其中存在個別連線。 此設計讓 AudioEndpointBuilder 能夠對每一個橋接針腳各自追跡回到 PCM 主機針腳的路徑。
端點格式。 當音訊引擎以共用模式執行時,端點的格式會假設安裝時 INF 檔案所指示的特定設定。 例如,音訊裝置的音訊驅動程式會使用其相關聯的 INF 檔案,將預設端點設定為 44.1 kHz、16 位、立體聲 PCM 格式。 安裝之後,您必須使用控制台或協力廠商應用程式來變更端點格式。
預設裝置。 設定為預設裝置的端點會在安裝時使用 INF 檔案中的資訊來選取。 安裝完成後,您必須使用控制台或第三方應用程式來選取另一個端點作為預設端點。
便條 如果您的 INF 檔案未在安裝期間選取要設定為預設值的端點,用戶端應用程式可以使用 MMDevice API 來選取端點。 API的選擇依據形態因素排名,以及端點是否為渲染端點或擷取端點。 下表顯示選取順序。
| 渲染排名 | 獲取排名 |
|---|---|
| 揚聲器 | 麥克風 |
| 線路輸出 | 線路輸入 |
| SPDIF | SPDIF |
如果您使用 MMDevice API 選取預設端點,且可用端點的排名相同,則 MMDevice API 會依字母順序排列端點 ID,以決定要選取的端點作為預設端點。 例如,如果音訊配接器同時具有線路輸出和線路輸入連接器,而且相關聯的 INF 檔案在安裝時未選取其中一個作為預設值,則 MMDevice API 會依字母順序識別哪些端點識別碼,並將該連接器設定為預設值。 重新啟動系統後,此選取項目會持續存在,因為端點 ID 是持續的。 不過,如果系統中出現較高等級的端點 (例如,具有麥克風連接器的第二個介面卡) ,則選取項目不會持續存在。