キャプチャー バッファーの作成
キャプチャー バッファーを作成するには、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;
}