Speex 코덱 라이브러리로 음향 반향 제거 (AEC)를 수행하려고합니다.Speex 및 DirectSound를 사용한 음향 반향 제거 (AEC)
speex_echo_playback(echo_state, echo_frame);
오디오 프레임이 재생 될 때마다, 그리고 캡처 한 모든 프레임에 대한
speex_echo_capture(echo_state, input_frame, output_frame);
다음 Speex가 문서에 따르면, 나는이 호출을 수행해야합니다. 내가 DirectSound를 사용하고 있기 때문에
, 나는이 쓰기 전용 포인터이라는 것을 말하는가, 예를 들어, 내가 speex_echo_playback에 대한 호출에 echo_frame으로 차의 DirectSound 버퍼를 사용할 수
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);
대안, 그것은 speex_decode의 출력()를 사용하여 내 자신의 소프트웨어 믹싱을하는 것입니다 DirectSound의 버퍼 자체를 사용하여, 보인다.
Speex와 DirectSound를 함께 사용하기위한 지침이나 제안 사항이 있으십니까? 어떤 도움을 주셔서 감사합니다.
왜 당신의 DirectSound의 낮은 수준의 API를 사용하고 있습니까? 당신은 훨씬 쉽게 효과 DMO를 쓸 수 있습니다. –
감사합니다. DirectX Media Object (DMO)의 기본적인 사용 예가 있습니까? 나는 상당한 수준의 코드 인프라 스트럭처에서 작업하고 있으므로 DMO를 얼마나 쉽게 사용할 수 있는지 확신 할 수 없습니다. – user19480
> 왜 DirectSound의 저수준 API를 사용하고 있습니까? - 이식 가능한 코드를 작성할 수 있기 때문에. –