2009-05-05 14 views
7

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를 함께 사용하기위한 지침이나 제안 사항이 있으십니까? 어떤 도움을 주셔서 감사합니다.

+0

왜 당신의 DirectSound의 낮은 수준의 API를 사용하고 있습니까? 당신은 훨씬 쉽게 효과 DMO를 쓸 수 있습니다. –

+0

감사합니다. DirectX Media Object (DMO)의 기본적인 사용 예가 있습니까? 나는 상당한 수준의 코드 인프라 스트럭처에서 작업하고 있으므로 DMO를 얼마나 쉽게 사용할 수 있는지 확신 할 수 없습니다. – user19480

+0

> 왜 DirectSound의 저수준 API를 사용하고 있습니까? - 이식 가능한 코드를 작성할 수 있기 때문에. –

답변

3

나는 이것을 한 번했습니다. 하지만 내 접근 방식은 다음과 같습니다 :

필자는 Primary Buffer를 직접 사용하지 않았습니다. 대신, 나는 하나의 보조 버퍼로만 작업했다. 두 가지 스레드가 있습니다 - 재생 스레드 및 캡처 스레드. 또한 다른 speex 함수 인 speex_echo_cancellation을 사용했습니다.

따라서 재생 버퍼에서 현재 재생 프레임을 전역 버퍼에 저장했으며 sprect_echo_cancellation이라는 캡쳐 스레드에 커서 캡처 프레임과 이전에 저장된 재생 프레임을 저장했습니다.

Windows XP도 지원해야하기 때문에 DMO가 적용되지 않았습니다.

더 많은 흥미로운 정보를 얻으려면 speex mailing lists archive 이상을 subscribe here 이상으로 볼 수도 있습니다.

행운을 빌어 요,

앤서니