共用方式為


預先擷取位移

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 緩衝區分成上半部和下半部,然後在應用程式和裝置之間來回交替這兩半。 當寫入游標第一次進入緩衝區的上半部或下半部時,它會將一半容量的緩衝區資料寫入該半部。 此方案假設播放游標總是位於緩衝區的另一半,也就是未被寫入的那一半。 請注意,如果預先提取位移超過緩衝區大小的一半,則此假設不正確。 在此情況下,當寫入游標到達 DirectSound 緩衝區的結尾並環繞到緩衝區的開頭時,它會位於與播放游標相同的緩衝區一半中。 當應用程式將一半緩衝區的資料寫入新的寫入游標位置時,最終會覆蓋播放游標位置,並刪除尚未播放的資料。

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

將預先提取偏移設定為較小的值,會將產生的寫入游標移近播放游標。 您應該將預取偏移設定為硬體的 FIFO 大小。 典型的預取偏移量約為 64 個樣本,具體取決於 DMA 引擎的硬件設計。

為了與某些較舊的 DirectSound 應用程式保持相容,DirectSound 目前會將硬體加速接腳的寫游標補足 10 毫秒。 請注意,填充量將來可能會變更。

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