挪用 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;
}