Estoy tratando de realizar la cancelación de eco acústico (AEC) con la biblioteca de códec Speex. De acuerdo con la documentación Speex, necesito realizar dos llamadas:Cancelación de eco acústica (AEC) con Speex y DirectSound
cada vez que se reproduce una trama de audio, y
speex_echo_capture(echo_state, input_frame, output_frame);
para cada fotograma capturado.
Desde que estoy usando DirectSound, estaba pensando que podría utilizar el búfer DirectSound primaria como el echo_frame en la llamada a speex_echo_playback, por ejemplo,
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);
La documentación no dicen que estos son indicadores de sólo escritura , pero ¿de todos modos no hay nada para usar los datos del buffer?
Esta es básicamente la forma en que estoy creando el buffer:
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);
La alternativa, según parece, a la utilización de la propia búfer DirectSound es utilizar la salida de speex_decode() y hacer mi propia mezcla de software.
¿Alguna sugerencia o sugerencias para hacer que Speex y DirectSound trabajen juntos? Gracias por cualquier ayuda.
¿Por qué utiliza la API de bajo nivel de DirectSound? puedes escribir un efecto DMO que sea mucho más fácil. –
Gracias por la recomendación. ¿Tiene un ejemplo de uso básico de un objeto de medios DirectX (DMO)? Estoy trabajando en una buena cantidad de infraestructura de código, así que no estoy seguro de lo fácil que puedo usar un DMO. – user19480
> ¿Por qué usa la API de bajo nivel de DirectSound? - Porque permite escribir código portátil. –