捕捉緩衝區建立需填寫 DSCBUFFERDESC 結構描述格式與大小,並指定 WAVEFORMATEX 定義音訊參數。
DSCBUFFERDESC dscbd = {};
dscbd.dwSize = sizeof(DSCBUFFERDESC);
dscbd.dwFlags = 0; // 無特殊旗標
dscbd.dwBufferBytes = buffer_bytes; // 緩衝區位元組大小
dscbd.dwReserved = 0;
dscbd.lpwfxFormat = &wfx; // 指向 WAVEFORMATEX
dscbd.dwFXCount = 0; // 特效數量 (第七篇使用)
dscbd.lpDSCFXDesc = nullptr;
WAVEFORMATEX wfx = {
WAVE_FORMAT_PCM, // wFormatTag
2, // nChannels
44100, // nSamplesPerSec
176400, // nAvgBytesPerSec = 44100 * 4
4, // nBlockAlign = 2 * (16/8)
16, // wBitsPerSample
0 // cbSize
};
HRESULT CreateCaptureBuffer(LPDIRECTSOUNDCAPTURE8 pDSC,
LPDIRECTSOUNDCAPTUREBUFFER8* ppDSCB8) {
HRESULT hr;
DSCBUFFERDESC dscbd = {};
LPDIRECTSOUNDCAPTUREBUFFER pDSCB = nullptr;
WAVEFORMATEX wfx = { WAVE_FORMAT_PCM, 2, 44100, 176400, 4, 16, 0 };
if (!pDSC || !ppDSCB8) return E_INVALIDARG;
dscbd.dwSize = sizeof(DSCBUFFERDESC);
dscbd.dwBufferBytes = wfx.nAvgBytesPerSec; // 1 秒資料量
dscbd.lpwfxFormat = &wfx;
if (SUCCEEDED(hr = pDSC->CreateCaptureBuffer(&dscbd, &pDSCB, nullptr))) {
hr = pDSCB->QueryInterface(IID_IDirectSoundCaptureBuffer8, (void**)ppDSCB8);
pDSCB->Release();
}
return hr;
}
若同時播放與捕捉,捕捉緩衝區格式必須與主要緩衝區 (Primary Buffer) 格式一致。部分聲卡只支援單一採樣率時鐘,格式不符會導致建立失敗。
DirectSoundCaptureCreate8 取得 IDirectSoundCapture8DirectSoundCaptureCreate 返回介面不支援 IDirectSoundCaptureBuffer8第四篇:建立緩衝區 ← 當前 | 第五篇:資訊查詢 | 第六篇:通知機制