Microsoft DirectX 8.0 (C++) |
独立したサウンド全体を保持するセカンダリ バッファを、スタティック バッファという。同じバッファを異なるサウンドで再利用することもできるが、通常はデータを一度だけスタティック バッファに記述する。
スタティック バッファはストリーム バッファと同様に作成および管理される。違いはバッファの使い方だけである。スタティック バッファは一度書き込まれて演奏されるが、ストリーム バッファは演奏中に定期的にデータが更新される。
注 スタティック バッファは必ずしも、DSBCAPS_STATIC フラグをバッファ記述に設定することで作成されるわけではない。このフラグは、現在の多くのハードウェアでは使用できない、サウンド カード上でのメモリ割り当てを要求する。スタティック バッファはシステム メモリ内に置かれ、DSBCAPS_LOCHARDWARE または DSBCAPS_LOCSOFTWARE のどちらかのフラグで作成される。詳細については、「ISA および PCI カードでのボイス管理」を参照すること。
スタティック バッファへのデータのロードは、3 つのステップで行われる。
これらのステップを次の例で示す。lpdsbStatic は IDirectSoundBuffer8 インターフェイス ポインタであり、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 に対する呼び出しは、バッファが始めから開始することを保証するものである。