Platform SDK: DirectX |
DirectSound はバッファに対し、カレント プレイ ポジション (再生カーソルとも呼ばれる) とカレント ライト ポジション (書き込みカーソルとも呼ばれる) という 2 つのポインタを維持している。これらの位置はバッファのバイト オフセットであり、メモリの絶対アドレスではない。
IDirectSoundBuffer::Play メソッドは、常にカレント プレイ ポジションからバッファの再生を開始する。バッファを作成した時点で、再生位置は 0 に設定される。サウンドが再生されるにつれ、再生位置は移動し、次に出力されるデータ バイトを示す。バッファが停止したときは、再生位置は次のデータ バイトにとどまる。
DirectSoundBuffer.Play メソッドは、常にカレント プレイ ポジションからバッファの再生を開始する。バッファを作成した時点で、再生位置は 0 に設定される。サウンドが再生されるにつれ、再生位置は移動し、次に出力されるデータ バイトを示す。バッファが停止したときは、再生位置は次のデータ バイトにとどまる。
バッファでカレント ライト ポジションより後の場所には、データを安全に書き込める。カレント プレイ ポジションとカレント ライト ポジションの間にあるブロックは、既に再生が確定していて、安全に変更することはできない。
バッファを時計の文字盤で表し、時計回りの方向にデータを書き込むと考える。再生位置と書き込み位置は、この文字盤上で同じ速度で回転する 2 本の針にたとえられ、書き込み位置は、常に再生位置の少し前方にある。再生位置が 1 を示し、書き込み位置が 2 を示している場合は、データを書き込んでも安全なのは 2 の後だけである。1 と 2 の間のデータは DirectSound が既に再生キューに入れている可能性もあるので、変更すべきではない。
書き込み位置は、バッファに書き込まれたデータではなく再生位置に合わせて移動する。データをストリーミングする場合、次に書き込みを行うデータ ブロックの位置を示すために、開発者は独自のポインタを維持する責任を負う。
IDirectSoundBuffer::Lock メソッドの dwWriteCursor パラメータが、カレント ライト ポジションではない点に注意すること。これはバッファ内で実際にデータを書き込むオフセットである。カレント ライト ポジションで書き込みを始めたい場合は、dwFlags パラメータに DSBLOCK_FROMWRITECURSOR を指定する。この場合、dwWriteCursor パラメータは無視される。
アプリケーションは、IDirectSoundBuffer::GetCurrentPosition メソッドを呼び出すことにより、カレント プレイ ポジションとカレント ライト ポジションを取得できる。IDirectSoundBuffer::SetCurrentPosition メソッドを使うと、カレント プレイ ポジションを設定できるが、カレント ライト ポジションは変更できない。
カレント プレイ ポジションをできるだけ正確に報告するには、セカンダリ バッファを作成する際に DSBCAPS_GETCURRENTPOSITION2 フラグを指定しなければならない。詳細については、DSBUFFERDESC を参照すること。
DirectSoundBuffer.WriteBuffer メソッドの start パラメータが、カレント ライト ポジションではない点に注意すること。これはバッファ内で実際にデータを書き込むオフセットである。カレント ライト ポジションで書き込みを始めたい場合は、flags パラメータに DSBLOCK_FROMWRITECURSOR を指定する。この場合、start パラメータは無視される。
アプリケーションは、DirectSoundBuffer.GetCurrentPosition メソッドを呼び出すことにより、カレント プレイ ポジションとカレント ライト ポジションを取得できる。DirectSoundBuffer.SetCurrentPosition メソッドを使うと、カレント プレイ ポジションを設定できるが、カレント ライト ポジションは変更できない。
カレント プレイ ポジションをできるだけ正確に報告するには、セカンダリ バッファを作成する際に DSBCAPS_GETCURRENTPOSITION2 フラグを指定しなければならない。詳細については、DSBUFFERDESC を参照すること。