2009-05-05 12 views
7

Próbuję wykonać anulowanie echa akustycznego (AEC) za pomocą biblioteki kodeków Speex. Zgodnie z dokumentacją Speex, muszę wykonać dwa połączenia:Eliminacja echa akustycznego (AEC) ze Speexem i DirectSound

każdym razem ramka audio jest odtwarzane i

speex_echo_capture(echo_state, input_frame, output_frame); 

dla każdej ramki przechwycone.

Ponieważ używam DirectSound, myślałem, że mogę korzystać z bufora DirectSound podstawową jako echo_frame w zaproszeniu do speex_echo_playback np

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); 

dokumentacja mówi, że są to tylko do zapisu wskaźniki , ale czy w ogóle nie ma możliwości korzystania z danych bufora?

Jest to w zasadzie jak tworzę bufor:

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); 

Alternatywą wydaje się, aby przy użyciu samego buforu DirectSound jest użycie wyjście speex_decode() i zrobić własne mieszanie oprogramowania.

Jakieś wskazówki lub sugestie dotyczące współpracy Speex i DirectSound? Dzięki za pomoc.

+0

Dlaczego używasz niski poziom API DirectSound? możesz napisać efekt DMO, który o wiele łatwiej. –

+0

Dziękuję za rekomendację. Czy masz podstawowy przykład użycia obiektu Media DirectX (DMO)? Pracuję nad dużą ilością infrastruktury kodu, więc nie jestem pewien, jak łatwo mogę korzystać z DMO. – user19480

+0

> Dlaczego korzystasz z API niskiego poziomu DirectSound? - Ponieważ pozwala pisać przenośny kod. –

Odpowiedz

3

Zrobiłem to raz. Ale moje podejście było następujące:

Nigdy nie stosowałem bezpośrednio bufora podstawowego. Zamiast tego pracowałem tylko z jednym dodatkowym buforem. Miałem dwa wątki - wątek odtwarzania i przechwytywanie wątku. Ponadto użyłem innej funkcji speex - speex_echo_cancellation.

Tak więc w moim wątku odtwarzania zapisałem bieżącą ramkę odtwarzania w globalnym buforze iw wątku przechwytywania o nazwie speex_echo_cancellation z odwróconą ramką przechwytywania i poprzednio zapisaną ramką odtwarzania.

DMO nie miało zastosowania, ponieważ musiałem obsługiwać system Windows XP.

Możesz również przejrzeć - speex mailing lists archive lub nawet subscribe here, aby uzyskać więcej interesujących informacji.

Powodzenia

Anthony

Powiązane problemy