プリフェッチ オフセット
WavePci ミニポート ドライバーは、IPreFetchOffset::SetPreFetchOffset 方式を呼び出して、ハードウェア アクセラレーションによる DirectSound 出力ストリームのプリフェッチ オフセットを指定します。 このオフセットは、オーディオ デバイスのハードウェア バッファー内で書き込みカーソルと再生カーソルを隔てるデータのバイト数です。 書き込みカーソルは、DirectSound アプリケーションが次の音サンプルを安全に書き込むことができるバッファー位置を指定します。 再生カーソルは、オーディオ デバイスによって現在再生されている音サンプルのバッファ位置を指定します。
DirectSound は、KSPROPERTY_AUDIO_POSITION プロパティ要求を送信することにより、WavePci ポート ドライバーに再生カーソルと書き込みカーソルの現在の位置をクエリします。 この要求に応答して、ポート ドライバーは IMiniportWavePciStream::GetPosition を呼び出して、ミニポート ドライバーから現在の再生位置を取得します。 ポート ドライバーが書き込み位置を決定する方法は、SetPreFetchOffset が呼び出されているかどうかによって異なります。
デフォルトにより、ポートドライバーは、ミニポートドライバーによって要求された最後のマッピングに書き込みカーソルを配置します。 IPortWavePciStream::GetMapping を呼び出すたびに、デフォルトのプリフェッチ オフセットが大きくなります。 WavePci ミニポート ドライバーが多数のマッピングを取得する場合、デフォルトのオフセットが非常に大きくなる可能性があります。
SetPreFetchOffset を呼び出すと、デフォルトがオーバーライドされます。 この呼び出しに続いて、ポート ドライバーは、指定されたプリフェッチ オフセットを再生位置に追加することによって書き込み位置を計算します (DirectSound バッファーの最後でのラップアラウンドを考慮に入れます)。
ミニポート ドライバーは、いくつかの理由から多数のマッピングを割り当てる場合があります。 1 つは、システム プロセッサ上のオーディオ操作のオーバーヘッドを削減することです。 マッピングが増えると、ドライバーがオーディオ デバイスに継続的にデータを供給し続けるために必要な割り込みが少なくなります。 もう 1 つの理由は、より多くのマッピングを割り当てると、動作の悪いデバイス ドライバーが短期間システムを停止させたときにオーディオ再生に不具合が発生する可能性が低くなるためです。
プリフェッチ オフセットが大きい場合の問題の 1 つは、一部の DirectSound アプリケーションが再生カーソルと書き込みカーソルの相対位置について混乱する可能性があることです。 Windows 95/98 では、オーディオ VxD は比較的小さなプリフェッチ オフセットを維持するため、これらのオペレーティング システム用に作成された DirectSound アプリケーションは、オフセットが予想よりも大きい場合、正しく動作しない可能性があります。
たとえば、アプリケーションは DirectSound バッファを上半分と下半分に分割し、アプリケーションとデバイス間で 2 つの半分を「ピンポン」する場合があります。 書き込みカーソルが最初にバッファの上半分または下半分に入ると、バッファの半分に相当するデータがバッファのその半分に書き込まれます。 このスキームは、再生カーソルが常にバッファの残りの半分、つまり書き込まれていない半分に位置していることを前提としています。 プリフェッチ オフセットがバッファ サイズの半分を超える場合、この前提は正しくないことに注意してください。 その場合、書き込みカーソルが DirectSound バッファーの最後に到達し、バッファーの先頭にラップアラウンドすると、バッファーの再生カーソルと同じ半分に配置されます。 アプリケーションがバッファの半分に相当するデータを新しい書き込みカーソル位置に書き込む時、最終的に再生カーソル位置が上書きされ、まだ再生されていないデータが破壊されます。
この故障形の原因は確かにアプリケーション自体にありますが、WavePci ミニポート ドライバーは SetPreFetchOffset を呼び出してプリフェッチ オフセットをより小さい値に設定するだけで障害モードを取り除くことができます。
プリフェッチ オフセットをより小さい値に設定することは、結果の書き込みカーソルが再生カーソルにより近づきます。 プリフェッチ オフセットをハードウェアの FIFO サイズに設定する必要があります。 DMA エンジンのハードウェア設計に応じて、一般的なプリフェッチ オフセットは約 64 サンプルです。
特定の古い DirectSound アプリケーションとの互換性を維持するために、DirectSound は現在、ハードウェア アクセラレーションされたピンの書き込みカーソルを 10 ミリ秒だけパディングします。 パディングの量は将来変更される可能性があることに注意してください。
ドライバー レベルでの書き込みカーソルと再生カーソルの管理の詳細情報は、オーディオ位置プロパティを参照してください。