再生カーソルと書き込みカーソル
DirectSound はバッファへのポインタを 2 つ保持している。再生カーソルと書き込みカーソルである。これらの位置はバッファのバイト オフセットであり、メモリの絶対アドレスではない。
IDirectSoundBuffer8::Play メソッドは、常に再生カーソルの位置から再生を開始する。バッファが作成されると、再生カーソル 0 に設定される。バッファが再生されるにつれ、再生カーソルは移動し、常に再生されるデータの次のバイトを指す。バッファが停止すると、カーソルはそのときの位置にとどまる。
書き込みカーソルより後のバッファには、データを安全に書き込むことができる。再生カーソルと書き込みカーソルの間にあるブロックは、既に再生がコミットされており、安全に変更することはできない。
バッファを時計の文字盤で表し、時計回りの方向にデータを書き込むと考える。再生カーソルと書き込みカーソルは、この文字盤上を同じ速度で回転する 2 本の針にたとえられ、書き込みカーソルは、常に再生カーソルの少し前方にある。再生カーソルが 1 を示し、書き込みカーソルが 2 を示している場合、データを書き込んでも安全なのは 2 より後だけである。1 と 2 の間のデータは DirectSound が既に再生キューに入れている可能性があるので、変更してはならない。
書き込みカーソルは、バッファに書き込まれたデータではなく再生カーソルに合わせて移動する。データをストリーミングする場合、次に書き込みを行うデータ ブロックの位置を示すために、アプリケーションで独自のポインタを維持する必要がある。
アプリケーションは、IDirectSoundBuffer8::GetCurrentPosition メソッドを呼び出すことにより、再生カーソルと書き込みカーソルを取得できる。IDirectSoundBuffer8::SetCurrentPosition メソッドを使うと、再生カーソルを移動できる。アプリケーションは、書き込みカーソルの位置を制御しない。
再生カーソルの位置の報告をできるだけ正確に受けるには、セカンダリ バッファを作成する際に DSBCAPS_GETCURRENTPOSITION2 フラグを指定しなければならない。詳細については、「DSBUFFERDESC」を参照すること。