播放期間串流延遲
當音訊播放資料流程處於 [執行] 狀態時,WaveRT 埠驅動程式的角色很小。 如下圖所示,在播放期間,WaveRT 埠驅動程式的用戶端會將資料寫入迴圈緩衝區,然後音訊裝置會從緩衝區讀取此資料。 此活動不需要端口驅動程式介入。 換句話說,音訊資料會直接在使用者模式應用程式與音訊硬體之間流動,而不會受到任何核心模式軟體元件的觸控。
在圖表中,寫入和播放位置會持續從左至右進行,因為音訊資料流程會流經迴圈緩衝區。 緩衝區會描述為迴圈,因為當播放位置或寫入位置到達緩衝區結尾時,它會自動包裝到緩衝區的開頭。
播放期間的串流延遲有兩個主要來源,在下圖中指定為 A 和 B。
在上圖中, 寫入位置 是用戶端寫入緩衝區的最後一個範例之後的位置。 播放位置是音訊裝置目前正在透過喇叭播放的範例。
從用戶端將音訊範例寫入緩衝區到緩衝區的延遲,直到音訊裝置播放它只是寫入和播放位置之間的分隔。 此分隔是下列兩個延遲來源的總和, (標示為 A 和 B 的圖表) :
延遲 A:音訊裝置從緩衝區讀取資料之後,資料會位於硬體「先出先出」 (FIFO) 緩衝區,直到音訊裝置透過數位到類比轉換器 (DAC) 時鐘資料為止。
延遲 B:用戶端將資料寫入迴圈緩衝區之後,資料會位於緩衝區中,直到音訊裝置讀取資料為止。
用戶端無法控制完全相依于硬體的延遲 A。 典型的 FIFO 可能會儲存足夠的樣本,以便為 DAC 提供大約 64 個樣本時鐘的刻度。 不過,用戶端會控制延遲 B。讓延遲 B 太大會導致不必要的延遲進入系統;不過,使其太小的風險會耗盡音訊裝置。
雖然用戶端可以設定計時器定期啟動其緩衝區寫入執行緒,但此方法不會達到最小的延遲。 為了進一步降低延遲,用戶端可以設定裝置在每次裝置完成讀取緩衝區播放資料的新區塊時產生硬體通知。 在此情況下,用戶端執行緒會由硬體通知啟動,而不是由計時器啟用。
藉由讓音訊裝置在每次從緩衝區讀取資料區塊時通知用戶端,用戶端可以讓延遲小於否則可行。
用戶端可以藉由將 KSPROPERTY_RTAUDIO_HWLATENCY 要求傳送至 WaveRT 埠驅動程式,以取得造成串流延遲的延遲摘要。
用戶端決定在寫入和播放位置之間維護的區隔量之後,用戶端會監視播放位置中的變更,以判斷寫入位置的進階程度。 在 Windows Server 2008 和更新版本的作業系統中,用戶端會傳送 KSPROPERTY_RTAUDIO_POSITIONREGISTER 屬性要求來判斷播放位置。 這項功能的支援是由 PortCls 系統驅動程式的改善所提供。
如果音訊裝置的位置暫存器如上圖所示,屬性要求會將暫存器對應至使用者模式用戶端可存取的虛擬記憶體位址。 對應位置暫存器之後,用戶端就可以讀取記憶體位址的內容,以判斷目前的播放位置。