セカンダリ バッファの作成
バッファを作成するには、IDirectSound8::CreateSoundBuffer メソッドを呼び出す。アプリケーションでは、このメソッドが返す IDirectSoundBuffer インターフェイスへのポインタを使って、IDirectSoundBuffer8 インターフェイスを取得できる。
次のサンプル関数では、セカンダリ サウンド バッファを作成し、IDirectSoundBuffer8 インターフェイスを返している。
HRESULT CreateBasicBuffer(LPDIRECTSOUND8 lpDirectSound, LPDIRECTSOUNDBUFFER8* ppDsb8)
{
WAVEFORMATEX wfx;
DSBUFFERDESC dsbdesc;
LPDIRECTSOUNDBUFFER pDsb = NULL;
HRESULT hr;
// WAV フォーマットの構造体をセットアップする。
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;
// DSBUFFERDESC 構造体をセットアップする。
memset(&dsbdesc, 0, sizeof(DSBUFFERDESC));
dsbdesc.dwSize = sizeof(DSBUFFERDESC);
dsbdesc.dwFlags =
DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY;
dsbdesc.dwBufferBytes = 3 * wfx.nAvgBytesPerSec;
dsbdesc.lpwfxFormat = &wfx;
// バッファを作成する。
hr = lpDirectSound->CreateSoundBuffer(&dsbdesc, &pDsb, NULL);
if (SUCCEEDED(hr))
{
hr = pDsb->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID*) ppDsb8);
pDsb->Release();
}
return hr;
}
このサンプル関数は、3 秒間のストリーミング データを保持するのに十分な大きさのストリーミング バッファを作成している。ストリーミング バッファ以外のバッファは、サウンド全体を保持するのに十分な大きさで作成しなければならない。
バッファの場所が指定されていない場合、DirectSound は、可能であれば、ハードウェアで制御されたメモリにバッファを配置する。ハードウェア バッファはサウンド カード プロセッサでミキシングされるので、アプリケーションの性能にほとんど影響を及ぼさない。
バッファの位置を DirectSound に決めさせずに自分で指定したい場合は、DSBUFFERDESC 構造体に DSBCAPS_LOCHARDWARE または DSBCAPS_LOCSOFTWARE のどちらかのフラグを設定する。DSBCAPS_LOCHARDWARE フラグを設定し、ハードウェア リソースが不足している場合、バッファの作成要求は失敗する。
DirectSound のボイス管理機能を利用するには、バッファの作成時に DSBCAPS_LOCDEFER フラグを指定する。このフラグは、バッファに対するリソースの割り当てを、バッファが再生されるまで遅延する。詳細については、「動的ボイス管理」を参照すること。
既存のバッファの位置を確認するには、IDirectSoundBuffer8::GetCaps メソッドを使い、DSBCAPS 構造体の dwFlags メンバが DSBCAPS_LOCHARDWARE フラグと DSBCAPS_LOCSOFTWARE フラグのどちらであるかを調べる。どちらかが必ず指定されている。
バッファ オブジェクトは、それを作成したデバイス オブジェクトが所有する。デバイス オブジェクトが解放されると、そのオブジェクトが作成したすべてのバッファも解放されるので、バッファを参照してはならない。