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.
Dlaczego używasz niski poziom API DirectSound? możesz napisać efekt DMO, który o wiele łatwiej. –
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
> Dlaczego korzystasz z API niskiego poziomu DirectSound? - Ponieważ pozwala pisać przenośny kod. –