再生カーソルと書き込みカーソル
DirectSound では、再生カーソルと書き込みカーソルの 2 つのポインターがバッファー内に保持されます。これらの位置はバッファーへのバイト オフセットであり、絶対メモリー アドレスではありません。
IDirectSoundBuffer8::Play メソッドは、常に再生カーソルの位置で再生を開始します。バッファーが作成されると、再生カーソルは 0 に設定されます。バッファーの再生とともにカーソルは移動し、常に再生される次のデータのバイトをポイントします。バッファーが停止されると、カーソルはその位置に残ります。
書き込みカーソルは、これより後にはバッファーにデータを安全に書き込めることを示すポイントです。再生カーソルと書き込みカーソルとの間のブロックは常に再生されることがコミットされ、安全に変更することができません。
バッファーは時計周りでデータが書き込まれる時計の文字盤にたとえることができます。再生カーソルと書き込みカーソルは、同じ速度で文字盤を円を描いて動く 2 つの時計の針に似ています。書き込みカーソルは常に再生カーソルの少し先を保ちます。再生カーソルが 1 を指し、書き込みカーソルが 2 を指す場合、2 より先へのデータの書き込みだけが安全です。1 と 2 との間のデータは、DirectSound によって再生のためのキューに格納されている可能性があり、触れないようにする必要があります。
書き込みカーソルは再生カーソルとともに移動しますが、バッファーに書き込まれるデータは伴いません。データをストリーミングする場合は、バッファーに独自のポインターを保持して、次のデータ ブロックが書き込まれる場所を示す必要があります。
アプリケーションでは、IDirectSoundBuffer8::GetCurrentPosition メソッドを呼び出すことで再生カーソルと書き込みカーソルを取得することができます。IDirectSoundBuffer8::SetCurrentPosition メソッドでは、再生カーソルを移動することができます。アプリケーションは書き込みカーソルの位置を制御しません。
再生カーソルが可能な限り正確にレポートされるようにするには、セカンダリ バッファーの作成時に必ず DSBCAPS_GETCURRENTPOSITION2 フラグを指定してください。詳細については、「DSBUFFERDESC」を参照してください。