Platform SDK: DirectX |
独立したサウンド全体を保持するセカンダリ バッファを、スタティック バッファという。同じバッファを異なるサウンドで再利用することもできるが、通常はデータを一度だけスタティック バッファに記述する。
注 : スタティック バッファは必ずしも、DSBCAPS_STATIC フラグをバッファ記述に設定することで作成されるわけではない。このフラグはサウンド カードのメモリの割り当てを要求するが、このメモリは利用不可能になっていることが多い。スタティック バッファはシステム メモリ内に置かれ、DSBCAPS_LOCHARDWARE または DSBCAPS_LOCSOFTWARE のどちらかのフラグで作成される。
スタティック バッファへのデータのロードは、3 つのステップで行われる。
これらのステップを次の例で示す。lpdsbStatic は IDirectSoundBuffer インターフェイス ポインタであり、pbData はデータ ソースのアドレスである。
LPVOID lpvWrite; DWORD dwLength; if (DS_OK == lpdsbStatic->Lock( 0, // ロックを開始する場所のオフセット。 0, // ロックのサイズ。フラグにより無視される。 &lpvWrite, // ロックの最初の部分のアドレスを取得する。 &dwLength, // ロックの最初の部分のサイズを取得する。 NULL, // ラップ アラウンドのアドレスは不要。 NULL, // ラップ アラウンドのサイズは不要。 DSBLOCK_ENTIREBUFFER)) // フラグ。 { memcpy(lpvWrite, pbData, dwLength); lpdsbStatic->Unlock( lpvWrite, // ロック開始のアドレス。 dwLength, // ロックのサイズ。 NULL, // ラップ アラウンド部分はなし。 0); // ラップ アラウンド サイズはなし。 }
次の例は、IDirectSoundBuffer::Play を呼び出してバッファを再生する。
lpdsbStatic->SetCurrentPosition(0); HRESULT hr = lpdsbStatic->Play( 0, // 未使用。 0, // ボイス管理用に優先。 0); // フラグ。
この例では DSBPLAY_LOOPING フラグを設定していないので、バッファは最後に到達すると自動的に停止する。また、IDirectSoundBuffer::Stop を使うとバッファを早めに停止できる。バッファを早めに停止する場合は、現在の読み込み位置がその場所にとどまる。したがって、例の IDirectSoundBuffer::SetCurrentPosition に対する呼び出しは、バッファが始めから開始することを保証するものである。
スタティック バッファは、DirectSound.CreateSoundBufferFromFile または DirectSound.CreateSoundBufferFromResource のどちらかのメソッドの呼び出しを使って作成され、データが書き込まれる。
次のサンプル コードは、リソース ファイルで "bounce" として識別されるウェーブからスタティック バッファを作成する。m_ds は DirectSound オブジェクトと仮定する。
Dim dsbd As DSBUFFERDESC Dim dsbResource As DirectSoundBuffer Dim waveFormat As WAVEFORMATEX dsbd.lFlags = DSBCAPS_CTRLVOLUME Set dsbResource = m_ds.CreateSoundBufferFromResource( _ "", "bounce", dsbd, waveFormat)
リソース ファイルは実行可能ファイルにコンパイルされているので、モジュール名を与える必要はない。同様に、メソッドがデータのサイズからバッファのサイズを決定するので、DSBUFFERDESC 型の lBufferBytes メンバの値も設定する必要はない。WAVEFORMATEX 型は、ファイルやリソースに格納されたヘッダーからウェーブ フォーマットについての情報を受け取る。
バッファを再生するには、次のように DirectSoundBuffer.Play を呼び出す。
dsbResource.SetCurrentPosition 0 dsbResource.Play 0
この例では DSBPLAY_LOOPING フラグを設定していないので、バッファは最後に到達すると自動的に停止する。また、DirectSoundBuffer.Stop を使うとバッファを早めに停止できる。バッファを早めに停止する場合は、現在の読み込み位置がその場所にとどまる。したがって、例の DirectSoundBuffer.SetCurrentPosition に対する呼び出しは、バッファが始めから開始することを保証するものである。
また、DirectSound.CreateSoundBuffer を使ってスタティック バッファを作成した後、DirectSoundBuffer.WriteBuffer メソッドを使ってメモリの他の位置からデータを書き込むこともできる。
セカンダリ バッファへの書き込みについての詳細は、「ストリーム バッファの使い方」を参照すること。