セカンダリ バッファーの作成
バッファーを作成するには、IDirectSound8::CreateSoundBuffer メソッドを呼び出します。このメソッドは、IDirectSoundBuffer インターフェイスへのポインターを返します。このポインターからアプリケーションは IDirectSoundBuffer8 インターフェイスを取得できます。
次の関数例では、セカンダリ サウンド バッファーを作成して、IDirectSoundBuffer8 インターフェイスを返します。
HRESULT CreateBasicBuffer(LPDIRECTSOUND8 lpDirectSound, LPDIRECTSOUNDBUFFER8* ppDsb8)
{
WAVEFORMATEX wfx;
DSBUFFERDESC dsbdesc;
LPDIRECTSOUNDBUFFER pDsb = NULL;
HRESULT hr;
// Set up WAV format structure.
memset(&wfx, 0, sizeof(WAVEFORMATEX));
wfx.wFormatTag = WAVE_FORMAT_PCM;
wfx.nChannels = 2;
wfx.nSamplesPerSec = 22050;
wfx.nBlockAlign = 4;
wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
wfx.wBitsPerSample = 16;
// Set up DSBUFFERDESC structure.
memset(&dsbdesc, 0, sizeof(DSBUFFERDESC));
dsbdesc.dwSize = sizeof(DSBUFFERDESC);
dsbdesc.dwFlags =
DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY
| DSBCAPS_GLOBALFOCUS;
dsbdesc.dwBufferBytes = 3 * wfx.nAvgBytesPerSec;
dsbdesc.lpwfxFormat = &wfx;
// Create buffer.
hr = lpDirectSound->CreateSoundBuffer(&dsbdesc, &pDsb, NULL);
if (SUCCEEDED(hr))
{
hr = pDsb->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID*) ppDsb8);
pDsb->Release();
}
return hr;
}
次の関数例では、3 秒間のストリーミング データを保持できるほど大きなストリーミング バッファーを作成します。非ストリーミング バッファーは、サウンド全体を収容するだけの大きさにする必要があります。
この関数例の DSBCAPS_GLOBALFOCUS フラグは、アプリケーション ウィンドウがフォアグラウンドにない場合でもバッファーが再生を継続するように指定します。このフラグを設定しないと、別のアプリケーション、またはダイアログ ボックスが入力フォーカスを持つ場合に、バッファーはミュートされます。
バッファーの場所が指定されていない場合、DirectSound は可能であればバッファーをハードウェア制御のメモリーに配置します。ハードウェア バッファーはサウンド カード プロセッサーによってミキシングされるため、アプリケーションのパフォーマンスにはほとんど影響しません。
DirectSound にバッファーの位置を決めさせるのではなく、自身で指定したい場合は、DSBUFFERDESC 構造に DSBCAPS_LOCHARDWARE フラグまたは DSBCAPS_LOCSOFTWARE フラグを設定してください。DSBCAPS_LOCHARDWARE フラグが設定されていて、ハードウェア リソース不足している場合、バッファーの作成要求は失敗します。
DirectSound の音声管理機能を利用するには、バッファーの作成時に DSBCAPS_LOCDEFER フラグを指定してください。このフラグはバッファーが再生されるまでバッファーに対するリソースの割り当てを遅らせます。詳細については、「動的ボイス管理」を参照してください。
既存のバッファーの場所は、IDirectSoundBuffer8::GetCaps メソッドを使用して、DSBCAPS_LOCHARDWARE フラグと DSBCAPS_LOCSOFTWARE フラグのいずれかに対する DSBCAPS 構造体の dwFlags メンバーを確認することで確定できます。どちらかは必ず指定されています。
バッファー オブジェクトは、これらを作成したデバイス オブジェクトが所有します。デバイス オブジェクトがリリースされると、そのオブジェクトによって作成されたバッファーもすべてリリースされ、参照されません。