您的位置:首页 > 其它

波形捕捉:(4)创建一个“捕捉缓冲区”

2009-04-26 12:24 260 查看
创建一个“捕捉缓冲区

调用 IDirectSoundCapture8::CreateCaptureBuffer 方法创建一个捕捉缓冲区。
该方法的其中一个参数是一个 DSCBUFFERDESC 结构体,该结构体描述了你想得到的缓冲区的特性。该结构体的最后一个成员是一个 WAVEFORMATEX 结构体。这个结构体必须用具体的WAV格式来初始化。

注意:如果你的应用程序在播放声音的同时捕捉这些声音,当捕捉缓冲区的格式和主缓冲区的不一样,那么捕捉缓冲区的创建将会失败。其原因是有些声卡只有单一的时钟频率,不支持以两种不同的频率来捕捉和播放。

下面的函数创建了一个捕捉缓冲区,这个缓冲区将会容纳1秒钟的数据。注意:捕捉设备对象的接口要作为一个参数传入时,该接口必须通过DirectSoundCaptureCreate8 函数得到,而不是使用以前的 DirectSoundCaptureCreate 函数;否则这个缓冲区将不支持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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: