調用 IDirectSoundCapture8::CreateCaptureBuffer 方法創建一個捕捉緩沖 區。
該方法的其中一個參數是一個 DSCBUFFERDESC 結構體,該結構體描述了你想 得到的緩沖區的特性。該結構體的最後一個成員是一個 WAVEFORMATEX 結構體。 這個結構體必須用具體的WAV格式來初始化。
注意:如果你的應用程序在播放聲音的同時捕捉這些聲音,當捕捉緩沖區的 格式和主緩沖區的不一樣,那麼捕捉緩沖區的創建將會失敗。其原因是有些聲卡 只有單一的時鐘頻率,不支持以兩種不同的頻率來捕捉和播放。
下面的函數創建了一個捕捉緩沖區,這個緩沖區將會容納1秒鐘的數據。注意 :捕捉設備對象的接口要作為一個參數傳入時,該接口必須通過 DirectSoundCaptureCreate8 函數得到,而不是使用以前的 DirectSoundCaptureCreate 函數;否則這個緩沖區將不支持 IDirectSoundCaptureBuffer8 接口。
Code
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;
}