共用方式為


WaveCyclic 延遲

如果您的 WaveCyclic 迷你埠驅動程式提供音訊播放串流的硬體混合,DirectSound 會將 IRP 提交至 WaveCyclic 埠驅動程式,其中包含單一迴圈緩衝區中整個 DirectSound 波串流。 WaveCyclic 埠驅動程式會接收 IRP,並將波資料逐一饋送至驅動程式公開的 DMA 緩衝區。 WaveCyclic 會嘗試在讀取指標之前保留 DMA 緩衝區的寫入指標大約 40 毫秒。 即使您的驅動程式正在與 DirectSound 混合硬體,它仍預期 DMA 緩衝區中大約 40 毫秒的額外資料。

WaveCyclic 埠驅動程式嘗試在迴圈緩衝區中累積最多 40 毫秒的資料,並不表示 WaveCyclic 埠驅動程式會將 40 毫秒新增至資料流程的延遲。 事實上,埠驅動程式會增加非常少的延遲。 在新的資料流程開始播放之前,埠驅動程式仍在將初始資料寫入迴圈緩衝區的開頭,埠驅動程式會繼續寫入,直到沒有可用的資料或緩衝區包含完整的 40 毫秒資料為止。 不過,如果立即可用的資料量小於此數量,埠驅動程式將不會強制迷你埠驅動程式等候。 相反地,它可讓迷你埠驅動程式開始立即播放已緩衝的資料。 之後,當有更多資料可供使用時,埠驅動程式會繼續將資料寫入緩衝區,直到沒有可用的資料或讀取和寫入指標之間緩衝的資料量達到 40 毫秒為止。

在接近耗盡的一段時間之後,KMixer 資料流程可以包含無聲間隔。 如果 WaveCyclic 只收到來自 KMixer 的足夠波資料,以維護 DMA 緩衝區中額外資料的 30 毫秒,WaveCyclic 會開始在 KMixer 的有效資料結尾之後,將無聲寫入 DMA 緩衝區。 此原則可確保如果發生耗盡,且裝置讀取超過有效資料的結尾,音訊裝置會轉譯無聲,而不是過時或未初始化的資料。

寫入 DMA 緩衝區的無聲數量相當小,而且如果 KMixer 在播放無聲之前提供 WaveCyclic 埠驅動程式的額外資料,該資料就會覆寫緩衝區中的無聲。 在沒有耗盡的情況下,音訊裝置會收到混合資料的連續串流,而不需要間隔強制無聲。 不過,當您對驅動程式進行偵錯時,即使音訊轉譯器未耗盡,您還是會看到迷你埠驅動程式的 IMiniportWaveCyclicStream::Silence 方法被呼叫。