應用程式依賴使用者模式和核心模式元件的組合來擷取 (輸入) 和轉譯 (輸出) 波浪串流。 波浪資料流程是數位音訊資料流程,其資料格式是由 WAVEFORMATEX 或 WAVEFORMATEXTENSIBLE 結構描述。
應用程式可以使用下列任一軟體介面來進行波形轉譯和擷取:
Microsoft Windows 多媒體 waveOutXxx 和 waveInXxx 函數
DirectSound 和 DirectSoundCapture API
waveOutXxx 和 waveInXxx 函式的行為是以舊版 wave 驅動程式和裝置的功能為基礎。 從 Windows 98 開始, WDMAud 系統驅動程式 會將這些函式的呼叫轉譯成 WDM 音訊驅動程式的命令。 不過,藉由模擬舊版軟體和硬體的行為,waveOutXxx 函式會犧牲現在可透過 DirectSound API 取得的 3D 音效和硬體加速。 如需 DirectSound 和 Windows 多媒體波次函式的詳細資訊,請參閱 Microsoft Windows SDK 檔。
DirectSound 和 Windows 多媒體波形函式是 SysAudio 系統驅動程式的用戶端,它會建置處理波形和 DirectSound 音訊串流的音訊濾鏡圖。 圖形建置對使用這些軟體介面的應用程式是透明的。
波浪組件
下圖顯示音訊軟體用來播放或錄製包含波浪 PCM 數據的數位音訊串流的使用者模式和核心模式組件。
轉譯元件會顯示在上圖的左側,而擷取元件會顯示在右側。 代表波浪迷你埠驅動程式的方塊會變暗,以指出這些是廠商提供的元件。 圖中的其他元件是系統提供的。
在圖的左上方,波形轉譯應用程式(或稱 「波出」)透過 waveOutXxx 函式介接 WDM 音訊驅動程式,這些函式是在使用者模式的 WinMM 系統元件中實作的,Winmm.dll。 應用程式會從檔案讀取波形音訊範例區塊,並呼叫 waveOutWrite 函式來轉譯它們。
WDMAud 是由使用者模式和核心模式元件所組成, (Wdmaud.drv 和 Wdmaud.sys) ,緩衝來自 waveOutWrite 呼叫的波浪數據,並將波浪數據流輸出至 KMixer 系統驅動程式,顯示在圖中 WDMAud 下方。
KMixer 是一個系統元件,可從一或多個來源接收波形 PCM 流,並將它們混合在一起形成單一輸出流,該流也是波形 PCM 格式。
KMixer 會將波形音訊流輸出至 WaveCyclic 或 WavePci 裝置,而這些裝置的埠和小型埠驅動程式會在前面圖中的左側,在 KMixer 下方出現。 迷你埠驅動程式會將自身綁定至埠驅動程式,以形成代表基礎音訊轉譯裝置的波濾波器。 典型的轉譯裝置會輸出類比訊號,以驅動一組揚聲器或外部音訊單元。 轉譯裝置也可能透過 S/PDIF 連接器輸出數位音訊。 如需 WaveCyclic 和 WavePci 的詳細資訊,請參閱 波形篩選器。
或者,KMixer 可以將其輸出資料流程傳遞至 USB 音訊裝置,該裝置由 USBAudio 類別系統驅動程式 控制 (圖中未顯示) ,而不是 WaveCyclic 或 WavePci 裝置。
配接卡驅動程式會分別呼叫 PcNewPort,使用 GUID 值 CLSID_PortWaveCyclic 或 CLSID_PortWavePci,來建立 WaveCyclic 或 WavePci 埠驅動程式的實例。
上圖的右側顯示支援將波浪資料擷取至檔案的應用程式所需的元件。 波形擷取 (或「波形輸入」) 應用程式會透過 waveInXxx 函式與 WDM 音訊驅動程式通訊,這些函式會在 WinMM 系統元件中實作。
在圖的右下角,波形捕獲裝置是由波形迷你埠和埠驅動程式控制。 埠和迷你埠驅動程式 (可以是 WaveCyclic 或 WavePci 類型) 會系結在一起,形成代表擷取裝置的波形篩選。 此裝置通常會從麥克風或其他音訊來源擷取類比訊號,並將其轉換為波形 PCM 串流。 裝置也可能透過 S/PDIF 連接器輸入數位音訊訊號。
波埠驅動程式會將其聲波流輸出至 KMixer 或直接輸出至 WDMAud。 如果音訊串流需要在 WDMAud 收到之前進行取樣率轉換,則必須先通過 KMixer。 同時渲染和擷取音訊流的系統可能需要兩個 KMixer 實例,如圖所示。 請注意,SysAudio 會根據需要自動建立這些實例。
或者,擷取波流的來源可以是 USB 音訊裝置,而不是 WaveCyclic 或 WavePci 裝置。 在此情況下,USBAudio 驅動程式(圖中未顯示)會將串流傳遞至 KMixer。
不論波流是由 USB 裝置或 WaveCyclic 或 WavePci 裝置擷取,KMixer 都會視需要在數據流上執行取樣率轉換,但不會與其他數據流混合。 KMixer 會將產生的數據流輸出至 Wdmaud.sys,這是 WDMAud 系統驅動程式的核心模式一半。 使用者模式的一半 Wdmaud.drv 透過 waveInXxx 函數將波流輸出到應用程式,這些函數在 Winmm.dll中實現。 最後,在圖的頂部,波浪捕獲應用程序將波浪數據寫入文件。
當波形擷取應用程式呼叫 waveInOpen 函式來開啟擷取資料流程時,它會傳入其回呼常式的指標。 當音訊捕捉事件發生時,作業系統會呼叫回調函式,並使用包含來自擷取裝置的下一個波形樣本區塊的緩衝區。 為了回應回呼,應用程式會將下一個波浪資料區塊寫入檔案。
DirectSound 元件
下圖顯示 DirectSound 應用程式用來轉譯或擷取波形數據的使用者模式和核心模式元件。
轉譯元件顯示在上圖的左半部,而擷取元件則顯示在右邊。 波浪迷你埠驅動程式會顯示為深色方塊,指出它們是廠商提供的元件。 圖中的其他元件是系統提供的。
在圖的左上角,DirectSound 應用程式會將波形資料從檔案載入使用者模式 DirectSound 系統元件 (Dsound.dll) 所管理的聲音緩衝區。 此元件會將音訊資料串流傳送至 WaveCyclic 或 WavePci 裝置,這些裝置的埠和微型埠驅動程式會出現在圖中的左下角。 如果裝置上有可用的硬體混音器針腳,音訊流會直接傳遞至波埠驅動程式,略過 KMixer。 否則,音訊流會先通過 KMixer 軟體,該軟體會將它與任何其他同時播放的音訊流混合。 KMixer 將混合資料流輸出至埠驅動程式。
如同先前,迷你埠驅動程式會將自身系結至埠驅動程式,以形成代表基礎音訊轉譯裝置的波形篩選。 例如,此裝置可能會透過一組揚聲器播放串流。
或者,音訊串流可以由 USB 音訊裝置來呈現,而不是由 WaveCyclic 或 WavePci 裝置。 在此情況下,資料流程無法略過 KMixer;USBAudio 類別系統驅動程式 (圖中未顯示) 一律會將資料流程傳遞至 KMixer。
上圖的右側顯示支援 DirectSoundCapture 應用程式的元件。 應用程式會記錄從 WaveCyclic 或 WavePci 擷取裝置接收的波浪資料。 例如,該設備將來自麥克風的模擬信號轉換為波流。 裝置的波埠和迷你埠驅動程式會出現在圖的右下角。 如圖所示,埠驅動程式會接收來自迷你埠驅動程式的資料流作為輸入,然後直接輸出至使用者模式的 DirectSound 元件 Dsound.dll,或間接透過 KMixer 輸出。 這取決於擷取裝置是否有硬體擷取插腳可供使用。
或者,捕獲的波流的來源可以是 USB 音訊裝置。 在此情況下,資料流程無法略過 KMixer;USBAudio 驅動程式 (圖中未顯示) 一律會將資料流程傳遞至 KMixer。
如果 KMixer 插入擷取資料流程的路徑,它會視需要在資料流程上執行取樣率轉換,但不會與其他資料流程混合。
在上圖的右上角,應用程式會從 DirectSoundCapture 緩衝區讀取波浪數據,並將它寫入檔案。