Platform SDK: DirectX

スタティック バッファの書き込みと再生

独立したサウンド全体を保持するセカンダリ バッファを、スタティック バッファという。同じバッファを異なるサウンドで再利用することもできるが、通常はデータを一度だけスタティック バッファに記述する。

 :  スタティック バッファは必ずしも、DSBCAPS_STATIC フラグをバッファ記述に設定することで作成されるわけではない。このフラグはサウンド カードのメモリの割り当てを要求するが、このメモリは利用不可能になっていることが多い。スタティック バッファはシステム メモリ内に置かれ、DSBCAPS_LOCHARDWARE または DSBCAPS_LOCSOFTWARE のどちらかのフラグで作成される。

[C++]

スタティック バッファへのデータのロードは、3 つのステップで行われる。

  1. IDirectSoundBuffer::Lock を使ってバッファ全体をロックする。記述を始めるバッファ内のオフセットを指定し (通常は 0)、その位置のメモリ アドレスを返す。
  2. 標準のメモリコピー ルーチンを使って、返されたアドレスにオーディオ データを書き込む。
  3. IDirectSoundBuffer::Unlock を使って、バッファをアンロックする。

これらのステップを次の例で示す。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 に対する呼び出しは、バッファが始めから開始することを保証するものである。

[Visual Basic]

スタティック バッファは、DirectSound.CreateSoundBufferFromFile または DirectSound.CreateSoundBufferFromResource のどちらかのメソッドの呼び出しを使って作成され、データが書き込まれる。

次のサンプル コードは、リソース ファイルで "bounce" として識別されるウェーブからスタティック バッファを作成する。m_dsDirectSound オブジェクトと仮定する。

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 メソッドを使ってメモリの他の位置からデータを書き込むこともできる。

セカンダリ バッファへの書き込みについての詳細は、「ストリーム バッファの使い方」を参照すること。