2009-05-05 16 views
7

Tôi đang cố gắng thực hiện hủy bỏ âm thanh tiếng vọng (AEC) với thư viện codec Speex. Theo tài liệu Speex, tôi cần phải thực hiện hai cuộc gọi:Hủy bỏ âm thanh tiếng vọng (AEC) với Speex và DirectSound

mỗi khi một khung âm thanh được chơi, và

speex_echo_capture(echo_state, input_frame, output_frame); 

cho mỗi khung đã chụp.

Kể từ khi tôi đang sử dụng DirectSound, tôi đã suy nghĩ rằng tôi có thể sử dụng bộ đệm DirectSound chính là echo_frame trong cuộc gọi đến speex_echo_playback, ví dụ:

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

Các tài liệu nào nói rằng đây là những chỉ ghi con trỏ , nhưng không phải là anyway để sử dụng dữ liệu bộ đệm bản thân mình?

này về cơ bản là làm thế nào tôi đang tạo ra bộ đệm:

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

Việc thay thế, có vẻ như, việc sử dụng bộ đệm DirectSound chính nó là sử dụng đầu ra của speex_decode() và làm trộn phần mềm của riêng tôi.

Bất kỳ gợi ý hay gợi ý nào để Speex và DirectSound hợp tác với nhau? Cảm ơn vì bất kì sự giúp đỡ.

+0

Tại sao bạn đang sử dụng các API cấp thấp của DirectSound? bạn có thể viết một hiệu ứng DMO dễ dàng hơn rất nhiều. –

+0

Cảm ơn bạn đã đề xuất. Bạn có một ví dụ sử dụng cơ bản của một đối tượng truyền thông DirectX (DMO)? Tôi đang làm việc trên đầu trang của một số lượng hợp lý của cơ sở hạ tầng mã, vì vậy tôi không chắc chắn như thế nào dễ dàng tôi có thể sử dụng một DMO. – user19480

+0

> Tại sao bạn sử dụng API cấp thấp của DirectSound? - Bởi vì nó cho phép viết mã di động. –

Trả lời

3

Tôi đã thực hiện việc này một lần. Nhưng cách tiếp cận của tôi là như sau:

Tôi chưa bao giờ sử dụng bộ đệm Chính trực tiếp. Thay vào đó, tôi chỉ làm việc với một bộ đệm thứ cấp. Tôi đã có hai chủ đề - phát lại chủ đề và nắm bắt chủ đề. Ngoài ra, tôi đã sử dụng một hàm speex khác - speex_echo_cancellation. Vì vậy, trong chủ đề phát lại của tôi, tôi đã lưu khung phát lại hiện tại trong bộ đệm toàn cục và trong chuỗi chụp được gọi là chức năng speex_echo_cancellation với khung chụp dòng thu và khung phát lại được lưu trước đó.

DMO không áp dụng được cho tôi vì tôi cũng phải hỗ trợ Windows XP.

Bạn cũng có thể tìm kiếm throug - speex mailing lists archive hoặc tốt hơn thậm chí subscribe here để nhận thêm thông tin thú vị.

Chúc may mắn,

Anthony

Các vấn đề liên quan