我想用Speex編解碼器庫進行聲學回聲消除(AEC)。根據該文件的Speex,我需要執行兩個電話:聲學回聲消除(AEC)與Speex語音和DirectSound的
每一個音頻幀播放時間,並
speex_echo_capture(echo_state, input_frame, output_frame);
爲捕捉每一幀。
由於我使用的DirectSound,我在想,我可以使用主DirectSound的緩衝區爲echo_frame在調用speex_echo_playback,例如,
DWORD offset = 0;
DWORD length = 0;
LPVOID block1, block2;
DWORD length1, length2;
DWORD flags = DSBLOCK_ENTIREBUFFER;
HRESULT hr = primary_buffer->Lock(
offset
, length
, &block1
, &length1
, &block2
, &length2
, flags
);
// Would like to convert the buffer into a form that
// speex_echo_capture() can use.
// Why does length1 == length2 == 0 always?
hr = primary_buffer->Unlock(block1, length1, block2, length2);
文檔不說這些是隻寫指針,但是有沒有辦法自己使用緩衝區數據?
這基本上是我怎麼了創建緩衝區:
CComPtr<IDirectSoundBuffer> primary_buffer;
DSBUFFERDESC primarydesc = { sizeof(DSBUFFERDESC),
DSBCAPS_PRIMARYBUFFER | DSBCAPS_CTRL3D | DSBCAPS_LOCHARDWARE,
0, 0, NULL, DS3DALG_HRTF_LIGHT };
HRESULT hr = directsound_->CreateSoundBuffer(
&primarydesc, &primary_buffer, NULL);
另一種選擇,現在看來,使用DirectSound的緩衝區本身是使用speex_decode的輸出(),做自己的軟件混合。
用於獲取的Speex和DirectSound的共同努力,任何指針或建議嗎?謝謝你的幫助。
你爲什麼要使用的DirectSound的底層API?你可以寫一個更容易的效果DMO。 – 2009-05-05 19:39:58