2009-05-05 19 views
7

Je suis en train d'effectuer Acoustic Echo Cancellation (AEC) avec la bibliothèque codec Speex. Selon la documentation Speex, je dois effectuer deux appels:Acoustic Echo Cancellation (AEC) avec Speex et DirectSound

chaque fois qu'une trame audio est joué, et

speex_echo_capture(echo_state, input_frame, output_frame); 

pour chaque image capturée.

Depuis que je suis en utilisant DirectSound, je pensais que je pouvais utiliser le tampon primaire DirectSound comme echo_frame dans l'appel à speex_echo_playback, par exemple,

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 documentation ne dit que ce sont des pointeurs d'écriture seule , mais n'y a-t-il pas moyen d'utiliser moi-même les données du tampon?

C'est essentiellement la façon dont je suis en train de créer le tampon:

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

L'alternative, il semble, d'utiliser le tampon DirectSound lui-même est d'utiliser la sortie de speex_decode() et faire mon propre mélange de logiciels.

Les pointeurs ou suggestions pour obtenir Speex et DirectSound travailler ensemble? Merci pour toute aide.

+0

Pourquoi vous utilisez l'API de bas niveau de DirectSound? vous pouvez écrire un effet DMO qui est beaucoup plus facile. –

+0

Merci pour la recommandation. Avez-vous un exemple d'utilisation de base d'un objet média DirectX (DMO)? Je travaille sur une bonne partie de l'infrastructure de code, donc je ne suis pas sûr de la facilité avec laquelle je peux utiliser un DMO. – user19480

+0

> Pourquoi utilisez-vous l'API de bas niveau de DirectSound? - Parce qu'il permet d'écrire du code portable. –

Répondre

3

Je l'ai fait une fois. Mais mon approche était la suivante:

Je n'ai jamais utilisé de tampon primaire directement. Au lieu de cela, j'ai travaillé uniquement avec un tampon secondaire. J'avais deux fils - le fil de lecture et le fil de capture. En outre, j'ai utilisé une autre fonction speex - speex_echo_cancellation. Ainsi, dans mon fil de lecture, j'ai sauvegardé le cadre de lecture actuel dans un tampon global et dans le fil de capture appelé fonction speex_echo_cancellation avec le cadre de capture de programme et le cadre de lecture précédemment mémorisé.

DMO ne s'appliquait pas pour moi parce que je devais aussi supporter Windows XP.

Vous pouvez également regarder à travers speex mailing lists archive ou mieux encore subscribe here pour obtenir plus d'informations intéressantes.

Bonne chance,

Anthony