首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

DirectSound 波形捕捉系列(四):建立捕捉緩衝區

     編輯:關於C++

使用 IDirectSoundCapture8::CreateCaptureBuffer 建立捕捉緩衝區

捕捉緩衝區建立需填寫 DSCBUFFERDESC 結構描述格式與大小,並指定 WAVEFORMATEX 定義音訊參數。

DSCBUFFERDESC 關鍵欄位

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 初始化範例 (1 秒 44.1kHz 16-bit 立體聲)

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 取得 IDirectSoundCapture8
  • 舊版 DirectSoundCaptureCreate 返回介面不支援 IDirectSoundCaptureBuffer8

完整系列導覽

第四篇:建立緩衝區 ← 當前 | 第五篇:資訊查詢 | 第六篇:通知機制

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved