2009-05-05 11 views
7

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.

+0

¿Por qué utiliza la API de bajo nivel de DirectSound? puedes escribir un efecto DMO que sea mucho más fácil. –

+0

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

+0

> ¿Por qué usa la API de bajo nivel de DirectSound? - Porque permite escribir código portátil. –

Respuesta

3

He hecho esto una vez. Pero mi enfoque fue el siguiente:

Nunca he usado el buffer primario directamente. En cambio, trabajé solo con un buffer secundario. Tenía dos hilos: hilo de reproducción e hilo de captura. Además, he usado otra función speex - speex_echo_cancellation.

Por lo tanto, en mi hilo de reproducción guardé el cuadro de reproducción actual en un búfer global y en el hilo de captura llamado función speex_echo_cancellation con el marco de captura actual y el cuadro de reproducción previamente almacenado.

DMO no era aplicable para mí porque tenía que admitir Windows XP también.

También puede consultar throug - speex mailing lists archive o mejor incluso subscribe here para obtener información más interesante.

Buena suerte,

Anthony

Cuestiones relacionadas