預先擷取位移

WavePci 迷你埠驅動程式會呼叫 IPreFetchOffset::SetPreFetchOffset 方法來指定硬體加速 DirectSound 輸出資料流程的預先擷取位移。 此位移是資料位元組數目,可將寫入資料指標與音訊裝置硬體緩衝區中的播放資料指標分開。 寫入資料指標會指定 DirectSound 應用程式可以安全地寫入下一個聲音範例的緩衝區位置。 播放游標會指定音訊裝置目前播放之音效範例的緩衝區位置。

DirectSound 會藉由傳送 KSPROPERTY_AUDIO_POSITION 屬性要求來查詢 WavePci 埠驅動程式,以取得播放和寫入資料指標的目前位置。 為了回應此要求,埠驅動程式會呼叫 IMiniportWavePciStream::GetPosition,從迷你埠驅動程式取得目前的播放位置。 埠驅動程式如何判斷寫入位置取決於 是否已呼叫 SetPreFetchOffset

根據預設,埠驅動程式會將寫入資料指標放在迷你埠驅動程式所要求的最後一個對應中。 每次呼叫 IPortWavePciStream::GetMapping時,預設預先擷取位移就會變大。 如果 WavePci 迷你埠驅動程式取得大量的對應,則預設位移可能會成長非常大。

呼叫 SetPreFetchOffset 會覆寫預設值。 在此呼叫之後,埠驅動程式會將指定的預先擷取位移新增至播放位置,以計算寫入位置 (考慮 DirectSound 緩衝區結尾的包裝) 。

迷你埠驅動程式可能會基於幾個原因配置大量的對應。 其中一個是減少系統處理器上的音訊作業額外負荷。 使用更多對應時,驅動程式需要較少的中斷,才能讓音訊裝置持續提供資料。 另一個原因是配置更多對應,可降低音訊播放在系統短期內系結系統時,音訊播放可能會發生問題。

大型預先擷取位移的一個問題是,某些 DirectSound 應用程式可能會混淆播放和寫入資料指標的相對位置。 在 Windows 95/98 中,音訊 VxD 會維持相對較小的預先擷取位移,如果位移大於預期,則針對這些作業系統所撰寫的 DirectSound 應用程式可能無法正確執行。

例如,應用程式可能會將 DirectSound 緩衝區分成上半部和下半部,然後「ping pong」應用程式與裝置之間的兩半。 當寫入資料指標第一次進入緩衝區的上半部或下半部時,會將一半緩衝區的資料寫入至該一半緩衝區。 此配置假設播放資料指標一律位於緩衝區的另一半,也就是未寫入的一半。 請注意,如果預先擷取位移超過緩衝區大小的一半,則此假設不正確。 在此情況下,當寫入資料指標到達 DirectSound 緩衝區的結尾,並包裝到緩衝區的開頭時,它將會位於與播放游標相同的一半緩衝區中。 當應用程式將半緩衝區的資料寫入新的寫入資料指標位置時,最後會覆寫播放資料指標位置,並終結尚未播放的資料。

雖然應用程式本身當然可以針對這種類型的失敗而受到責指,但 WavePci 迷你埠驅動程式只要呼叫 SetPreFetchOffset 即可排除失敗模式,將預先擷取位移設定為較小的值。

將預先擷取位移設定為較小的值,會將產生的寫入資料指標移至播放資料指標更接近。 您應該將預先擷取位移設定為硬體的 FIFO 大小。 根據 DMA 引擎的硬體設計而定,典型的預先擷取位移大約是 64 個樣本。

為了與某些較舊的 DirectSound 應用程式保持相容,DirectSound 目前會填補硬體加速針腳的寫入資料指標 10 毫秒。 請注意,未來的填補量可能會變更。

如需在驅動程式層級管理寫入資料指標和播放資料指標的其他資訊,請參閱 音訊位置屬性