錄製期間串流延遲

當音訊記錄資料流程處於 [執行] 狀態時,WaveRT 埠驅動程式的角色很小。 如下圖所示,在錄製程式期間,音訊裝置會擷取音訊資料,並將它寫入迴圈緩衝區。 音訊引擎接著會從緩衝區讀取此資料。 此活動不需要端口驅動程式介入。 換句話說,音訊資料會直接在音訊硬體與使用者模式應用程式之間流動,而不會受到任何核心模式軟體元件觸控。

在下圖中,當資料流程流經緩衝區時,記錄和讀取位置會持續從左至右進行。 當記錄或讀取位置到達緩衝區的結尾時,它會包裝到緩衝區的開頭。

此圖顯示音訊錄製期間迴圈緩衝區中的記錄和讀取位置。

上圖將 記錄位置 識別為音訊裝置目前錄製的樣本緩衝區位置, (透過類比到數位轉換器或 ADC) 從麥克風擷取。 請注意,記錄位置是音訊裝置在通過 FIFO 之後寫入樣本的未來緩衝區位置。 讀取位置是音訊引擎讀取下一個範例的緩衝區位置。

音訊裝置在 ADC 中擷取音訊樣本的時間延遲,直到用戶端讀取它只是記錄與讀取位置之間的分隔。 此分隔是下列延遲來源的總和, (標示為 A 和 B 的圖表) :

延遲 A:從 ADC 擷取資料之後,音訊裝置會將資料儲存在硬體 FIFO 中,直到將資料寫入迴圈緩衝區為止。

延遲 B:音訊裝置將資料寫入迴圈緩衝區之後,資料會位於緩衝區中,直到用戶端讀取資料為止。

用戶端無法控制完全相依于硬體的延遲 A。 典型的 FIFO 可能會從 ADC 儲存大約 64 個樣本。 不過,用戶端會控制延遲 B。讓延遲 B 太大會導致不必要的延遲進入系統,但在音訊裝置寫入緩衝區之前,讓讀取資料的風險太小。

雖然用戶端可以設定計時器定期啟動其緩衝區讀取執行緒,但此方法不會達到最小的延遲。 為了進一步降低延遲,用戶端可以將音訊裝置設定為在每次裝置完成將擷取資料寫入緩衝區時產生硬體通知。 在此情況下,用戶端執行緒會由硬體通知啟動,而不是由計時器啟用。

藉由讓音訊裝置定期通知音訊引擎,用戶端可以讓延遲小於實際。

用戶端通常 (音訊引擎) 可以透過將 KSPROPERTY_RTAUDIO_HWLATENCY 要求傳送至 WaveRT 埠驅動程式,來取得音訊裝置對串流延遲造成串流延遲的摘要。

用戶端決定要在記錄與讀取位置之間維護的分隔量之後,用戶端會監視記錄位置中的變更,以判斷讀取位置應該延隔多少。 在 Windows Server 2008 和更新版本的作業系統中,用戶端會傳送 KSPROPERTY_AUDIO_POSITIONKSPROPERTY_RTAUDIO_POSITIONREGISTER 屬性要求來判斷記錄位置。 後者的要求方法更有效率,因為它可讓用戶端直接讀取記錄位置,而不需轉換至資訊的核心模式常式。