開發 WaveRT 迷你埠驅動程式
本主題提供當您決定開發自己的 WaveRT 迷你埠驅動程式時,必須考慮的軟體和硬體相關點。
Microsoft已針對 通用音訊架構 (UAA) 開發一組硬體設計指導方針,併入我們建議用於 WaveRT 音訊裝置的功能。 UAA 指導方針是以 Intel 開發的高定義(HD) 音訊規格為基礎。
Windows Vista 和更新版本的 Windows作系統提供適用於 UAA 相容音訊裝置的 HD 音訊驅動程式。 因此,如果您的音訊裝置符合UAA規範,您就不需要開發自己的WaveRT迷你埠驅動程式。 但是對於具有一些專屬、非UAA硬體功能的音訊裝置,您必須開發自己的WaveRT迷你埠驅動程式,以支援專屬功能。
為了協助您開發自己的 WaveRT 迷你埠驅動程式,建議您先檢閱範例配接器驅動程式,然後檢閱適用於 WaveRT 的 UAA 功能。
範例配接器驅動程式
如需範例驅動程式的詳細資訊,請參閱 範例音訊驅動程式。
WaveRT 相容的功能
檢閱範例配接器驅動程式並開始設計 WaveRT 迷你埠驅動程序之後,您必須確認它支援下列軟體和硬體功能。 因此,您建置的迷你埠驅動程式會與系統提供的 WaveRT 埠驅動程式相容,以及 Windows Vista 音訊引擎的作業模式。
低硬體延遲。 WaveRT 迷你埠驅動程序必須提供 IMiniportWaveRTStream::GetHWLatency 方法的完整功能實作。 這個方法必須支援 KSPROPERTY_RTAUDIO_HWLATENCY 屬性。
FIFO 中斷。 當 FIFO 滿溢和不足發生時,WaveRT 迷你埠驅動程式必須自動產生中斷。 當您在音訊裝置和驅動程式軟體上執行測試時,此功能可讓您偵測音訊數據流中的故障。 如果沒有硬體支援(換句話說,FIFO 中斷),就沒有方便且可靠的方法來取得故障資訊。
Scatter-Gather DMA 和緩衝區迴圈。 當您的迷你埠驅動程序支援具有散佈收集功能的 DMA 控制器時,它可讓數據移入和移出循環緩衝區,而不需要迷你埠驅動程式介入。
當您的小型埠驅動程式支援可執行緩衝區迴圈的 DMA 控制器時,DMA 控制器可以在讀取或寫入操作到達緩衝區結尾後,自動繞回到緩衝區的開頭。 它可以進行循環處理,而不需要您的迷你埠驅動程式介入。
請注意,WaveRT 埠驅動程式支援現有的硬體設計,這些硬體設計缺乏執行散佈收集傳輸或自動緩衝區迴圈的能力。
如果音訊裝置缺少散佈收集功能,WaveRT 迷你埠驅動程序必須先配置由記憶體中實際連續的頁面所組成的迴圈緩衝區。 迷你埠驅動程序接著會使用 WaveRT 埠驅動程式中的協助程式函式來執行數據傳輸和自動緩衝區迴圈。 缺點是,當系統的非分頁記憶體集區變得越來越分散時,配置大型連續物理記憶體區塊的要求更有可能失敗。 具有散佈收集功能的裝置不會受到記憶體片段的影響。
如果音訊裝置無法在 DMA 通道到達迴圈緩衝區結尾時自動執行緩衝區迴圈,WaveRT 迷你埠驅動程式必須介入並設定通道,才能在緩衝區開頭開始傳輸數據。
位置暫存器 針對新的設計,硬體實作者應為每個 DMA 通道包含一個位置暫存器。 位置暫存器表示目前緩衝區位置為從迴圈緩衝區開頭的位元組偏移量。 緩衝區開頭的位置暫存器讀數為零。 當位置暫存器到達迴圈緩衝區的結尾時,會自動回繞至緩衝區的開頭(重設為零),並在緩衝區位置前進時持續遞增。
位置暫存器可以對應至虛擬記憶體,讓客戶端可以直接讀取暫存器。
在理想情況下,位置暫存器應該指出目前在音訊裝置的數位對類比和模擬數位轉換器(DAC 和 ADC)中通過的樣本的緩衝區位置。
不過,此資訊可能無法直接從音訊晶元組取得,將數位和類比功能分割成不同的總線控制器和編碼器/譯碼器(編解碼器)晶元。 一般而言,位置緩存器位於總線控制器晶元中,而每個緩存器都會指出控制器正在寫入或讀取編解碼器的音頻數據位置。
從這種類型的位置緩存器取得讀取之後,用戶端可以藉由透過編解碼器新增或減去延遲,來估計正在透過 DAC 或 ADC 行動的樣本目前位置。 用戶端會從 KSPROPERTY_RTAUDIO_HWLATENCY 屬性要求取得編解碼器延遲。 基於這個理由,當埠驅動程式呼叫 IMiniportWaveRTStream::GetHardwareLatency 方法來回應這種類型的屬性要求時,WaveRT 迷你埠驅動程式必須準確地報告編解碼器延遲。
請注意,WaveRT 埠驅動程序支援缺少位置緩存器的現有硬體設計。 對於具有這項限制的裝置,WaveRT 迷你埠驅動程式必須在呼叫 IMiniportWaveRTStream::GetPositionRegister 方法時,透過傳回 STATUS_NOT_SUPPORTED 錯誤碼來使呼叫失敗,這將強制埠驅動程式在屬性請求 KSPROPERTY_RTAUDIO_POSITIONREGISTER 時失敗。 在此情況下,客戶端必須透過 KSPROPERTY_AUDIO_POSITION 屬性取得目前的位置,這會產生使用者模式與核心模式之間轉換的每個位置讀取的額外負荷。
時鐘暫存器。 時鐘暫存器是 WaveRT 相容音訊裝置的選擇性但實用的硬體功能。 音訊應用程式可以使用時鐘緩存器來同步處理兩個或多個獨立音訊裝置中的音訊串流,這些裝置具有個別和未同步處理的硬體時鐘。 如果沒有時鐘緩存器,應用程式就無法偵測並補償硬體時鐘之間的漂移。
音訊硬體使用的取樣時鐘用來透過數位轉類比或類比轉數位轉換器處理音訊數據,該時鐘應該衍生自遞增時鐘寄存器的內部時鐘。 不應公開以異步速率遞增的時鐘暫存器,因為相對於樣本時鐘,它無法用於同步化。
類似於位置暫存器,時鐘暫存器可以映射到虛擬記憶體,使客戶端能夠直接讀取暫存器。
音訊處理物件。 設計完善的 WaveRT 迷你埠驅動程式絕對不能觸碰音訊裝置循環緩衝區中的音訊數據。 硬體應該設計成讓音訊數據直接在用戶端和音訊硬體之間流動,而音訊驅動程式軟體不會介入。
API 僅適用於共用模式音訊串流。 針對獨佔模式數據流,應用程式會透過迴圈緩衝區直接與 WaveRT 硬體裝置交換數據,而其他元件則無法觸及緩衝區中的數據。
如需詳細資訊,請參閱 Windows 音訊處理物件。