音訊端點產生器演算法
在 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和其他針腳類別 GUIDS 的詳細資訊,請參閱 WinDDK\ < build number > \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。 音訊裝置相關的中繼資料會儲存在端點 PropertyStore 中。
多工 (MUX) 和取消多工處理 (DEMUX) 針腳會自動管理,並由 AudioEndpointBuilder 服務列舉。
如果您開發自己的音訊裝置磁碟機和 INF 檔案來使用音訊裝置,並開發音訊應用程式,或兩者,最好注意下列問題和最佳做法。 當您考慮到這些建議來開發驅動程式和應用程式時,會產生更有效地使用 AudioEndpointBuilder 的驅動程式、INF 檔案和音訊用戶端。
命名慣例。 用於端點的命名慣例是以橋接器接腳的易記名稱為基礎。 不過,在說話者端點的情況下,名稱已硬式編碼為「說話者」,且無法由驅動程式或協力廠商應用程式改變。
次佳拓撲。 某些拓撲會被視為次佳,因為 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 會根據其選取專案,以及端點是轉譯或擷取端點。 下表顯示選取順序。
轉譯排名 | 擷取 |
---|---|
Speakers | 麥克風 |
行出 | 行入 |
SPDIF | SPDIF |
如果您使用 MMDevice API 來選取預設端點,且可用的端點排名相同,MMDevice API 會依字母順序排列端點識別碼,以判斷要選取為預設值的端點。 例如,如果音訊配接器同時有行出和行入連接器,且相關聯的 INF 檔案不會在安裝時選取其中一個作為預設值,MMDevice API 會識別哪一個端點識別碼是依字母順序排列,並將該連接器設定為預設值。 因為端點識別碼是持續性的,所以重新開機系統之後,此選取範圍會持續存在。 不過,如果較高排名的端點 (,則選取範圍不會保存,例如,具有麥克風連接器的第二張介面卡) 會出現在系統中。