波浪篩選器
波篩選代表轉譯和/或擷取波浪格式數位音訊資料的裝置。 應用程式通常會透過 DirectSound API 或 Microsoft Windows 多媒體 waveOutXxx 和 waveInXxx 函式來存取這些裝置的功能。 如需 WDM 音訊驅動程式可支援的波格式相關資訊,請參閱 WAVEATEX 和 WAVEATEXTENSIBLE。
波浪轉譯篩選會接收為輸入波數位音訊資料流程,並將類比音訊訊號 (輸出至一組喇叭或外部混音器) 或數位音訊串流 (至 S/PDIF 連接器,例如) 。
波浪擷取篩選會接收為來自麥克風或輸入插) 的類比音訊訊號 (輸入,或從 S/PDIF 連接器 (數位串流,例如) 。 相同的篩選會輸出包含數位音訊資料的波串流。
單一波篩選可以同時執行轉譯和擷取。 例如,這種類型的篩選可能代表可透過一組喇叭播放音訊的音訊裝置,並同時透過麥克風錄製音訊。 或者,波浪轉譯和波浪擷取硬體可能會以不同的波浪篩選來表示,如 動態音訊子裝置中所述。
音訊配接器驅動程式會藉由系結波迷你埠驅動程式來形成波篩選器,而硬體廠商會實作為介面卡驅動程式的一部分,並使用系統所實作的波埠驅動程式。 迷你埠驅動程式會處理波篩選器的所有硬體特定作業,而埠驅動程式會管理所有一般波浪篩選功能。
PortCls 系統驅動程式 (Portcls.sys) 會實作三個波浪埠驅動程式:WaveRT、WavePci 和 WaveCyclic。
這三種類型的波浪篩選器的運作方式如下:
WaveRT篩選準則會為波浪資料配置緩衝區,並讓該緩衝區直接可供使用者模式用戶端存取。 根據波浪裝置的硬體功能,緩衝區可以包含連續或非連續的記憶體區塊。 用戶端會以連續的虛擬記憶體區塊的形式存取緩衝區。 緩衝區是迴圈的,這表示當裝置的讀取 (轉譯) 或寫入 (擷取) 指標到達緩衝區結尾時,它會自動包裝到緩衝區的開頭。
WavePci篩選會直接存取用戶端的緩衝區。 雖然用戶端以單一連續虛擬記憶體區塊的形式存取緩衝區,但 WavePci 篩選準則必須以一系列可能不連續的記憶體區塊來存取緩衝區。 包含轉譯或擷取資料流程後續部分的區塊會在裝置上排入佇列。 當裝置的讀取或寫入指標到達一個區塊的結尾時,它會移至佇列中下一個區塊的開頭。
WaveCyclic篩選準則會配置包含單一連續記憶體區塊的緩衝區,以作為其輸出 (,用於轉譯) 或用於擷取) 緩衝區的輸入 (。 這個緩衝區是迴圈的。 因為無法直接存取用戶端的緩衝區,所以驅動程式必須在驅動程式的迴圈緩衝區與用戶端的使用者模式緩衝區之間複製資料。
WaveRT 優先于 WavePci 和 WaveCyclic。 WavePci 和 WaveCyclic 已搭配舊版 Windows 使用。
WaveRT 篩選器可以代表位於系統匯流排上的音訊裝置,例如 PCI 或 PCI Express。 WaveRT 篩選在 WaveCyclic 或 WavePci 篩選上的主要優點是 WaveRT 篩選準則可讓使用者模式用戶端直接與音訊硬體交換音訊資料。 相反地,WaveCyclic 和 WavePci 篩選兩者都需要驅動程式定期進行軟體介入,這會增加音訊資料流程的延遲。 此外,具有和不含散佈/收集 DMA 功能的音訊裝置都可以以 WaveRT 篩選來表示。 如需詳細資訊,請參閱 適用于 Real-Time音訊串流的 Wave 埠驅動程式 白皮書。
WaveRT 篩選準則
WaveRT 篩選器會實作為埠/迷你埠驅動程式配對。 在 Windows Vista 和更新版本中,WaveRT 篩選處理站會建立 WaveRT 篩選,如下所示:
它會具現化 WaveRT 迷你埠驅動程式物件。
它會呼叫具有 GUID 值CLSID_PortWaveRT的 PcNewPort,以具現化 WaveRT 埠驅動程式物件。
它會呼叫埠驅動程式的 IPort::Init 方法,將迷你埠驅動程式系結至埠驅動程式。
Subdevice Creation中的程式碼範例說明此程式。 埠和迷你埠驅動程式會透過其 IPortWaveRT 和 IMiniportWaveRT 介面彼此通訊。
如需詳細資訊,請參閱 適用于 Real-Time音訊串流的 Wave 埠驅動程式 白皮書。
舊版 Windows 的資訊
舊版 Windows 的 WaveCyclic 資訊
WaveCyclic 篩選準則可以代表連接到系統匯流排的音訊裝置,例如 ISA、PCI、PCI Express 或 PCMCIA。 如 「WavePci」 名稱所指,WavePci 篩選通常代表連線到 PCI 匯流排的裝置,但基本上,WavePci 裝置可能會改為連線到 ISA 匯流排。例如。 不同于 WaveCyclic 所支援的較簡單裝置,WavePci 支援的裝置必須具有散佈/收集 DMA 功能。 位於 PCI 匯流排但缺少散佈/收集 DMA 的音訊裝置可以表示為 WaveCyclic 篩選,但不能表示為 WavePci 篩選。
舊版 Windows 的 WavePci 資訊
WavePci 裝置能夠對位於任意記憶體位址的緩衝區執行散佈/收集 DMA 傳輸,且該緩衝區的開頭和結尾是任意位元組對齊方式。 相反地,WaveCyclic 裝置的 DMA 硬體只需要能夠將資料移至或移出裝置迷你埠驅動程式配置的單一緩衝區。 WaveCyclic 迷你埠驅動程式是免費的,可配置符合其 DMA 通道有限功能的迴圈緩衝區。 例如,一般 WaveCyclic 裝置的 DMA 通道可能需要符合下列限制的緩衝區:
緩衝區位於實體位址空間的特定區域中。
緩衝區在實體和虛擬位址空間中連續。
緩衝區會以偶數或八位元組界限開始和結束。
不過,為了簡單起見,WaveCyclic 裝置必須依賴軟體將資料複製到迴圈緩衝區或從迴圈緩衝區複製,而 WavePci 裝置依賴其 DMA 硬體的散佈/收集功能,以避免這類複製。 將波浪音訊資料傳遞至轉譯裝置或從擷取裝置擷取資料的 IRP 會伴隨資料緩衝區,而且每個緩衝區都包含轉譯或擷取的音訊資料流程一部分。 WavePci 裝置可以直接透過散佈/收集 DMA 引擎來存取這些緩衝區,而 WaveCyclic 裝置需要將資料從 IRP 複製到其迴圈緩衝區,反之亦然。
WavePci 篩選準則
注意:舊版 Windows 的 WavePci 資訊
WavePci 篩選器會實作為埠/迷你埠驅動程式配對。 WavePci 篩選處理站會建立 WavePci 篩選,如下所示:
它會具現化 WavePci 迷你埠驅動程式物件。
它會呼叫具有 GUID 值CLSID_PortWavePci的 PcNewPort,以具現化 WavePci 埠驅動程式物件。
它會呼叫埠驅動程式的 IPort::Init 方法,將迷你埠驅動程式系結至埠驅動程式。
Subdevice Creation中的程式碼範例說明此程式。 埠和迷你埠驅動程式會透過其 IPortWavePci 和 IMiniportWavePci 介面彼此通訊。
如需詳細資訊,請參閱 WavePci 裝置的實作問題。
WaveCyclic 篩選器
注意
Microsoft 支援多元且包容性的環境。 本文包含 Microsoft 適用于無偏差通訊 的術語參考,可辨識為排除。 本文中會使用單字或片語進行一致性,因為它目前會出現在軟體中。 當軟體更新為移除語言時,本文將會更新為一致。
注意:舊版 Windows 的 WaveCyclic 資訊
WaveCyclic 篩選器會實作為埠/迷你埠驅動程式配對。 WaveCyclic 篩選處理站會建立 WaveCyclic 篩選,如下所示:
它會具現化 WaveCyclic 迷你埠驅動程式物件。
它會呼叫具有 GUID 值CLSID_PortWaveCyclic的 PcNewPort,以具現化 WaveCyclic 埠驅動程式物件。
它會呼叫埠驅動程式的 IPort::Init 方法,將迷你埠驅動程式系結至埠驅動程式。
Subdevice Creation中的程式碼範例說明此程式。 埠和迷你埠驅動程式會透過其 IPortWaveCyclic 和 IMiniportWaveCyclic 介面彼此通訊。
WaveCyclic 篩選器的迴圈緩衝區一律是由連續的虛擬記憶體區塊所組成。 埠驅動程式的 IDmaChannel::AllocateBuffer 方法實作一律會配置實體和虛擬記憶體位址空間中連續的緩衝區。 如先前所述,WaveCyclic 裝置的 DMA 引擎會對緩衝區記憶體施加額外的條件約束,迷你埠驅動程式可以自由實作自己的緩衝區配置方法,以符合這些條件約束。
例如,要求大型緩衝區 (的 WaveCyclic 迷你埠驅動程式,如果作業系統拒絕原始要求,則應該準備八個實際連續的記憶體頁面) 來結算較小的緩衝區大小。 音訊裝置偶爾可能會卸載並重載以重新平衡系統資源 (請參閱 停止裝置以重新平衡資源) 。
具有內建匯流排主控 DMA 硬體的 WaveCyclic 裝置稱為 主要裝置。 或者,WaveCyclic 裝置可以是沒有內建 DMA 硬體功能的 次級裝置 。 附屬裝置必須依賴系統 DMA 控制器來執行它所需的任何資料傳輸。 如需主要和次級裝置的詳細資訊,請參閱 IDmaChannel 和 IDmaChannelSourcee。
WaveCyclic 迷你埠驅動程式可以實作自己的 DMA 通道物件,而不是使用預設的 DMA 通道物件,這是由其中一個埠驅動程式的新XxxDmaChannel 方法所建立:
IPortWaveCyclic::NewMasterDmaChannel
IPortWaveCyclic::NewSystemeDmaChannel
配接器驅動程式的自訂 IDmaChannel 實作可以執行資料的自訂處理,以符合特殊硬體條件約束。 例如,Windows 多媒體函式會使用波格式,其中 16 位樣本一律是帶正負號的值,但音訊轉譯硬體可能設計成改用不帶正負號的 16 位值。 在此情況下,可以寫入驅動程式的自訂 IDmaChannel::CopyTo 方法,將已簽署的來源值轉換為硬體所需的未簽署目的地值。 雖然這項技術對於解決硬體設計缺陷很有用,但也可能會對軟體額外負荷產生顯著的成本。
如需實作自己的 DMA 通道物件的驅動程式範例,請參閱舊版 WDK 中的 Sb16 範例音訊配接器。 如果常數OVERRIDE_DMA_CHANNEL定義為 TRUE,則原始程式碼中的條件式編譯語句會啟用專屬 IDmaChannel 物件的實作,驅動程式會用來取代 IPortWaveCyclic::NewXxxDmaChannel 呼叫的預設 IDmaChannel 物件。