2012-05-17 31 views
5

Tôi đang làm việc trên một dự án VOIP trên iOS. Theo đề xuất của các tài liệu của Apple, tôi sử dụng đơn vị âm thanh VoiceProcessingIO để nhận hỗ trợ hủy bỏ tiếng vang. Khi ứng dụng của tôi yêu cầu các hoạt động tách biệt trên các mặt hiển thị và chụp (ví dụ, tắt loa nhưng để micrô tiếp tục), vì vậy tôi tạo hai đơn vị âm thanh, một thiết bị đã tắt cổng, trong khi ứng dụng kia đã tắt cổng.Sử dụng nhiều bộ xử lý âm thanh IO bằng giọng nói trong iOS

Mã hiện tại hoạt động tốt cho đến khi tôi tìm hiểu cách hoạt động của tính năng hủy tiếng vọng: nó yêu cầu so sánh tín hiệu từ cả micrô và loa. Vì vậy, mối quan tâm của tôi là: có an toàn khi sử dụng hai đơn vị xử lý âm thanh như cách tiếp cận của tôi không? Ngoài ra, vì việc hủy bỏ âm thanh hoạt động chủ yếu từ phía chụp, có thể sử dụng đơn vị âm thanh RemoteIO để kết xuất (kết nối với loa) không?

Tôi không tự tin 100% vì tôi chỉ cần nhập khu vực này trong một thời gian ngắn. Tôi cũng đã thử từ developer.apple.com, nhưng tất cả các ví dụ tôi tìm thấy từ developer.apple.com thường chỉ sử dụng một đơn vị âm thanh.

Có ai có thể đưa ra một số gợi ý không? Cách tiếp cận của tôi có bất kỳ ảnh hưởng tiềm năng nào đối với các tính năng của đơn vị VoiceProcessingIO không?

Cảm ơn, Fuzhou

Trả lời

1

Thứ nhất, VoiceProcessingIO là (như tôi viết thư này) chỉ ức chế tiếng vang, không echo hủy bỏ. Về cơ bản nó chỉ tắt đầu vào nếu đầu ra quá lớn. Điều này có nghĩa là ví dụ: trong một cuộc gọi VOIP, kết thúc xa sẽ không thể nghe thấy bạn trong khi họ đang nói chuyện. Hủy bỏ hoàn toàn echo sẽ giữ đầu vào được bật, nhưng cố gắng trừ đi các âm vang của đầu ra.

Tôi sẽ đề xuất chỉ sử dụng một đơn vị và xử lý trường hợp "tắt loa" theo cách lập trình. Cuộc gọi lại đầu ra của bạn có thể trông giống như sau:

OSStatus output_callback(
    void *inRefCon, 
    AudioUnitRenderActionFlags *ioActionFlags, 
    const AudioTimeStamp  *inTimeStamp, 
    UInt32      inInputBusNumber, 
    UInt32      inNumberFrames, 
    AudioBufferList    *ioData) 
{ 
    my_context_t *context = inRefCon; 
    audio_sample_t *dst = (audio_sample_t *)ioData->mBuffers[0].mData; 

    if (context->muted) { 
    memset(dst, 0, inNumberFrames * sizeof(audio_sample_t)); 
    } else { 
    get_output_samples(context, dst, inNumberFrames); 
    } 
    return noErr; 
} 

Cho phép im lặng để ngăn chặn tiếng vang không ảnh hưởng xấu đến nó.

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