共用方式為


波浪篩選器

波形過濾器代表渲染和/或捕獲波形格式數字音頻數據的設備。 應用程式通常會透過 DirectSound API 或透過 Microsoft Windows 多媒體 waveOutXxx 和 waveInXxx 函式來存取這些裝置的功能。 如需 WDM 音訊驅動程式可以支援之波形格式的相關資訊,請參閱 WAVEFORMATEXWAVEFORMATEXTENSIBLE

波浪渲染濾波器接收波浪數位音訊流作為輸入,並輸出類比音訊訊號(至一組喇叭或外部混音器)或數位音訊流(例如,數位音訊流可輸出至 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 篩選器。 如需詳細資訊,請參閱 A Wave Port Driver for Real-Time Audio Streaming 白皮書。

WaveRT 濾波器

WaveRT 濾波器實作為端口/小型端口驅動程式組。 在 Windows Vista 和更新版本中,WaveRT 篩選處理站會建立 WaveRT 篩選,如下所示:

  • 它會具現化 WaveRT 迷你埠驅動程式物件。

  • 它會藉由呼叫具有 GUID 值CLSID_PortWaveRTPcNewPort 來具現化 WaveRT 埠驅動程式物件。

  • 它會呼叫埠驅動程式的 IPort::Init 方法,將迷你埠驅動程式系結至埠驅動程式。

Subdevice Creation 中的程式碼範例會說明此程式。 埠和迷你埠驅動程式會透過其 IPortWaveRTIMiniportWaveRT 介面彼此通訊。

如需詳細資訊,請參閱 A Wave Port Driver for Real-Time Audio Streaming 白皮書。

舊版 Windows 的資訊

舊版 Windows 的 WaveCyclic 資訊

WaveCyclic 濾波器可以代表連接到系統匯流排的音訊裝置,例如 ISA、PCI、PCI Express 或 PCMCIA。 顧名思義,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_PortWavePciPcNewPort 來具現化 WavePci 埠驅動程式物件。

  • 它會呼叫埠驅動程式的 IPort::Init 方法,將迷你埠驅動程式系結至埠驅動程式。

Subdevice Creation 中的程式碼範例會說明此程式。 埠和迷你埠驅動程式會透過其 IPortWavePciIMiniportWavePci 介面彼此通訊。

如需詳細資訊,請參閱 WavePci 裝置的實作問題

WaveCyclic 濾波器

備註

Microsoft支持多樣化的包容性環境。 本文包含術語的參考,Microsoft樣式指南可辨識為排除。 本文中會使用單字或片語來保持一致性,因為它目前會出現在軟體中。 當軟體更新以移除該語言時,本文也將進行更新以保持一致。

附註: 舊版 Windows 的 WaveCyclic 資訊

WaveCyclic 篩選器實作為一對埠/迷你埠驅動程式。 WaveCyclic 篩選處理站會建立 WaveCyclic 篩選,如下所示:

  • 它會具現化 WaveCyclic 迷你埠驅動程式物件。

  • 它會藉由呼叫具有 GUID 值 CLSID_PortWaveCyclicPcNewPort 來具現化 WaveCyclic 埠驅動程式物件。

  • 它會呼叫埠驅動程式的 IPort::Init 方法,將迷你埠驅動程式系結至埠驅動程式。

Subdevice Creation 中的程式碼範例會說明此程式。 埠和迷你埠驅動程式會透過其 IPortWaveCyclicIMiniportWaveCyclic 介面彼此通訊。

WaveCyclic 篩選的循環緩衝區一律是由連續的虛擬記憶體區塊所組成。 埠驅動程式的 IDmaChannel::AllocateBuffer 方法實作一律會配置實體和虛擬記憶體位址空間中連續的緩衝區。 如先前所述,如果 WaveCyclic 裝置的 DMA 引擎對緩衝區記憶體施加額外的條件約束,迷你埠驅動程式可以自由實作自己的緩衝區配置方法來符合這些條件約束。

如果作業系統拒絕原始要求,要求大型緩衝區(例如,八個實體連續記憶體頁面)的 WaveCyclic 迷你埠驅動程式應該準備好接受較小的緩衝區大小。 音訊裝置可能會偶爾卸載並重新載入,以重新平衡系統資源 (請參閱 停止裝置以重新平衡資源)。

具有內建匯流排主控 DMA 硬體的 WaveCyclic 裝置稱為 主裝置。 或者,WaveCyclic 裝置可以是沒有內建 DMA 硬體功能的 次級裝置 。 次級裝置必須依賴系統 DMA 控制器來執行所需的任何數據傳輸。 如需主要和次級裝置的詳細資訊,請參閱 IDmaChannelIDmaChannelSlave

WaveCyclic 迷你埠驅動程式可以實作自己的 DMA 通道物件,而不是使用預設的 DMA 通道物件,這是由埠驅動程式的其中一個 NewXxxDmaChannel 方法所建立:

IPortWaveCyclic::NewMasterDmaChannel

IPortWaveCyclic::NewSlaveDmaChannel

配接卡驅動程式的自定義 IDmaChannel 實作可以執行數據的自定義處理,以符合特殊的硬體條件約束。 例如,Windows 多媒體函式會使用波形格式,其中 16 位樣本一律是帶正負號的值,但音訊轉譯硬體可能會改為使用未帶正負號的 16 位值。 在此情況下,可以撰寫驅動程式的自定義 IDmaChannel::CopyTo 方法,將已簽署的來源值轉換成硬體所需的未簽署目的地值。 雖然此技術可用於解決硬體設計缺陷,但它也可能會產生大量的軟體開銷成本。

如需實作自己的 DMA 通道物件的驅動程式範例,請參閱舊版 WDK 中的 Sb16 範例音訊配接器。 如果常數OVERRIDE_DMA_CHANNEL定義為 TRUE,原始程式碼中的條件式編譯陳述式會啟用專屬 IDmaChannel 物件的實作,驅動程式會使用該物件來取代 IPortWaveCyclic::NewXxxDmaChannel 呼叫中的預設 IDmaChannel 物件。