開發 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 中斷。 WaveRT 迷你埠驅動程式必須在 FIFO 滿溢和不足發生時自動產生中斷。 當您在音訊裝置和驅動程式軟體上執行測試時,此功能可讓您偵測音訊資料流程中的問題。 如果沒有硬體支援, (換句話說,FIFO 會中斷) ,沒有方便且可靠的方法來取得問題資訊。

  • Scatter-Gather DMA 和緩衝區迴圈。 當您的迷你埠驅動程式支援具有散佈收集功能的 DMA 控制器時,它允許將資料移入和移出迴圈緩衝區,而不需要從迷你埠驅動程式介入。

    當您的迷你埠驅動程式支援可執行緩衝區迴圈的 DMA 控制器時,DMA 控制器可以在到達具有讀取或寫入作業的緩衝區結尾之後,自動包裝到緩衝區的開頭。 它可以執行包裝,而不需要您迷你埠驅動程式介入。

    請注意,WaveRT 埠驅動程式支援現有的硬體設計,但無法執行散佈收集傳輸或自動緩衝迴圈。

    如果音訊裝置缺少散佈收集功能,WaveRT 迷你埠驅動程式必須先配置迴圈緩衝區,其中包含實際連續記憶體中的頁面。 迷你埠驅動程式接著會使用 WaveRT 埠驅動程式中的協助程式函式來執行資料傳輸和自動緩衝迴圈。 缺點是,當系統的非分頁式記憶體集區逐漸分散時,配置大型連續實體記憶體區塊的要求比較可能失敗。 具有散佈收集功能的裝置不會受到記憶體片段的影響。

    如果音訊裝置無法在 DMA 通道到達迴圈緩衝區結尾時自動執行緩衝區迴圈,WaveRT 迷你埠驅動程式必須介入並設定通道,才能開始在緩衝區開頭傳輸資料。

  • 位置暫存器。 針對新的設計,硬體實作者應包含每個 DMA 通道的位置暫存器。 位置暫存器表示目前緩衝區位置,做為自迴圈緩衝區開頭的位元組位移。 位置暫存器讀取是緩衝區開頭的零。 當位置暫存器到達迴圈緩衝區的結尾時,它會自動包裝到緩衝區開頭, (重設為零) 並繼續遞增,因為緩衝區位置向前移動。

    位置暫存器可以對應至虛擬記憶體,讓用戶端可以直接讀取暫存器。

    在理想情況下,位置暫存器應該指出目前在音訊裝置 (DC 和 AD) C 中,透過數位到類比和類比數位轉換器移動的樣本緩衝區位置。

    不過,此資訊可能無法直接從將數位和類比函式分割成個別匯流排控制器和編碼器/解碼器 (編解碼器) 晶片的音訊晶片組取得。 一般而言,位置暫存器位於匯流排控制器晶片中,而每個暫存器會指出控制器正在寫入或讀取編解碼器的音訊資料位置。

    從這種類型的位置暫存器取得讀取之後,用戶端可以透過編解碼器新增或減去延遲,來估計正在透過 DAC 或 ADC 移動的樣本目前位置。 用戶端會從 KSPROPERTY_RTAUDIO_HWLATENCY 屬性要求取得編解碼器延遲。 基於這個理由,當埠驅動程式呼叫 IMiniportWaveRTStream::GetHardwareLatency 方法以回應這種類型的屬性要求時,WaveRT 迷你埠驅動程式必須正確地報告編解碼器延遲。

    請注意,WaveRT 埠驅動程式支援缺少位置暫存器的現有硬體設計。 對於具有這項限制的裝置,WaveRT 迷你埠驅動程式必須傳回STATUS_NOT_SUPPORTED錯誤碼,以強制埠驅動程式失敗KSPROPERTY_RTAUDIO_POSITIONREGISTER屬性要求,以失敗呼叫IMiniportWaveRTStream::GetPositionRegister方法。 在此情況下,用戶端必須透過 KSPROPERTY_AUDIO_POSITION 屬性取得目前的位置,這會產生使用者模式與每個位置讀取核心模式之間轉換的額外負荷。

  • 時鐘暫存器。 時鐘暫存器是 WaveRT 相容音訊裝置的選擇性但實用的硬體功能。 音訊應用程式可以使用時鐘暫存器,在具有個別和未同步處理硬體時鐘的兩部以上獨立音訊裝置中同步處理音訊串流。 如果沒有時鐘暫存器,應用程式就無法偵測並補償硬體時鐘之間的漂移。

    音訊硬體用來透過數位對類比或類比數位轉換器來時鐘音訊資料的範例時鐘,應該衍生自遞增時鐘暫存器的內部時鐘。 以非同步方式遞增的時鐘暫存器,與取樣時鐘相關的速率不會用於同步處理,而且不應該公開。

    類似于位置暫存器,時鐘暫存器可以對應至虛擬記憶體,讓用戶端可以直接讀取暫存器。

  • 音訊處理物件。 設計完善的 WaveRT 迷你埠驅動程式絕對不能觸碰音訊裝置迴圈緩衝區中的音訊資料。 硬體應該設計成讓音訊資料直接在用戶端與音訊硬體之間流動,而音訊驅動程式軟體不會介入。

ADO 僅適用于共用模式音訊串流。 針對獨佔模式資料流程,應用程式會透過迴圈緩衝區直接與 WaveRT 硬體裝置交換資料,而且沒有其他元件可以觸碰緩衝區中的資料。

如需詳細資訊,請參閱 Windows 音訊處理物件