次の方法で共有


セカンダリ バッファーの作成

バッファーを作成するには、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 メンバーを確認することで確定できます。どちらかは必ず指定されています。

バッファー オブジェクトは、これらを作成したデバイス オブジェクトが所有します。デバイス オブジェクトがリリースされると、そのオブジェクトによって作成されたバッファーもすべてリリースされ、参照されません。