Speex コーデック ライブラリでアコースティック エコー キャンセレーション (AEC) を実行しようとしています。Speex のドキュメントによると、次の 2 つの呼び出しを実行する必要があります。
speex_echo_playback(echo_state, echo_frame);
オーディオ フレームが再生されるたびに、
speex_echo_capture(echo_state, input_frame, output_frame);
キャプチャされたすべてのフレームに対して。
私は DirectSound を使用しているので、プライマリ DirectSound バッファを speex_echo_playback の呼び出しで echo_frame として使用できると考えていました。
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 を連携させるための指針や提案はありますか? 助けてくれてありがとう。