WavePci ミニポート ドライバーは 、IPreFetchOffset::SetPreFetchOffset メソッドを呼び出して、ハードウェアアクセラレータ DirectSound 出力ストリームのプリフェッチ オフセットを指定します。 このオフセットは、オーディオ デバイスのハードウェア バッファー内の再生カーソルから書き込みカーソルを分離するデータのバイト数です。 書き込みカーソルは、DirectSound アプリケーションが次のサウンド サンプルを安全に書き込むことができるバッファー位置を指定します。 再生カーソルは、オーディオ デバイスによって現在再生されているサウンド サンプルのバッファー位置を指定します。
DirectSound は、wavePci ポート ドライバーに対してプレイの現在位置を照会し、 KSPROPERTY_AUDIO_POSITION プロパティ要求を送信してカーソルを書き込みます。 この要求に応答して、ポート ドライバー は 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 ミリ秒の余裕を持たせています。 パディングの量は将来変更される可能性があることに注意してください。
ドライバー レベルでの書き込みカーソルと再生カーソルの管理の詳細については、「 Audio Position プロパティ」を参照してください。