次の方法で共有


キャプチャー バッファーの作成

キャプチャー バッファーを作成するには、IDirectSoundCapture8::CreateCaptureBuffer メソッドを呼び出します。

このメソッドに渡すパラメーターの 1 つは、作成するバッファーの特性を示す DSCBUFFERDESC 構造体です。この構造体の最後のメンバーは WAVEFORMATEX 構造体ですが、この構造体は目的の WAV フォーマットの詳細に従って初期化する必要があります。

アプリケーションでサウンドの再生だけでなくキャプチャーも行う場合は、キャプチャー バッファーのフォーマットがプライマリ バッファーのフォーマットと異なっていると、キャプチャー バッファーの作成に失敗する可能性があります。これは、クロックが 1 つしかないカードでは、キャプチャーと再生を 2 つの異なる周波数で実行できないためです。

次の関数例では、1 秒分のデータを保持するキャプチャー バッファーを作成します。パラメーターとして渡すキャプチャー デバイス オブジェクトへのインターフェイスは、古い DirectSoundCaptureCreate function 関数ではなく、DirectSoundCaptureCreate8 関数を使用して取得する必要があることに注意してください。そうしないと、IDirectSoundCaptureBuffer8 インターフェイスがバッファーでサポートされません。

HRESULT CreateCaptureBuffer(LPDIRECTSOUNDCAPTURE8 pDSC, 
                            LPDIRECTSOUNDCAPTUREBUFFER8* ppDSCB8)
{
  HRESULT hr;
  DSCBUFFERDESC               dscbd;
  LPDIRECTSOUNDCAPTUREBUFFER  pDSCB;
  WAVEFORMATEX                wfx =
    {WAVE_FORMAT_PCM, 2, 44100, 176400, 4, 16, 0};
    // wFormatTag, nChannels, nSamplesPerSec, mAvgBytesPerSec,
    // nBlockAlign, wBitsPerSample, cbSize
 
  if ((NULL == pDSC) || (NULL == ppDSCB8)) return E_INVALIDARG;
  dscbd.dwSize = sizeof(DSCBUFFERDESC);
  dscbd.dwFlags = 0;
  dscbd.dwBufferBytes = wfx.nAvgBytesPerSec;
  dscbd.dwReserved = 0;
  dscbd.lpwfxFormat = &wfx;
  dscbd.dwFXCount = 0;
  dscbd.lpDSCFXDesc = NULL;
 
  if (SUCCEEDED(hr = pDSC->CreateCaptureBuffer(&dscbd, &pDSCB, NULL)))
  {
    hr = pDSCB->QueryInterface(IID_IDirectSoundCaptureBuffer8, (LPVOID*)ppDSCB8);
    pDSCB->Release();  
  }
  return hr;
}