Microsoft DirectX 8.0 (C++)

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

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

スタティック バッファはストリーム バッファと同様に作成および管理される。違いはバッファの使い方だけである。スタティック バッファは一度書き込まれて演奏されるが、ストリーム バッファは演奏中に定期的にデータが更新される。

  スタティック バッファは必ずしも、DSBCAPS_STATIC フラグをバッファ記述に設定することで作成されるわけではない。このフラグは、現在の多くのハードウェアでは使用できない、サウンド カード上でのメモリ割り当てを要求する。スタティック バッファはシステム メモリ内に置かれ、DSBCAPS_LOCHARDWARE または DSBCAPS_LOCSOFTWARE のどちらかのフラグで作成される。詳細については、「ISA および PCI カードでのボイス管理」を参照すること。

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

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

これらのステップを次の例で示す。lpdsbStaticIDirectSoundBuffer8 インターフェイス ポインタであり、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);             // ラップアラウンド サイズはない。
}

バッファを再生するには、次の例のように IDirectSoundBuffer8::Play を呼び出す。

lpdsbStatic->SetCurrentPosition(0);
HRESULT hr = lpdsbStatic->Play(
        0,    // 未使用。
        0,    // ボイス管理の優先度。
        0);   // フラグ。

この例では DSBPLAY_LOOPING フラグを設定していないので、バッファは最後に到達すると自動的に停止する。また、IDirectSoundBuffer8::Stop を使うとバッファを早めに停止できる。バッファを早めに停止する場合は、再生カーソル位置がその場所にとどまる。したがって、例に示されている IDirectSoundBuffer8::SetCurrentPosition に対する呼び出しは、バッファが始めから開始することを保証するものである。