2012-05-17 27 views
5

iOS'ta bir VOIP projesi üzerinde çalışıyorum. Apple'ın belgelerinin önerdiği gibi, yankı iptali desteği almak için VoiceProcessingIO ses ünitesini kullanıyorum.iOS'ta çoklu ses işleme IO ses birimi kullanın

Uygulamam oluşturma ve yakalama kenarlarında (ör. Kapatma hoparlörü, ancak mikrofonun devam etmesini sağlayın) ayrılmış işlemler gerektirdiğinden, diğeri bağlantı noktası kapatma işlemi gerçekleştirirken, biri yakalama bağlantı noktası kapatma, iki ses birimi oluşturuyorum.

Geçerli kod, yankı iptali işlevinin nasıl çalıştığını öğrenene kadar iyi çalışır: hem mikrofon hem de hoparlörden gelen sinyalleri karşılaştırmayı gerektirir. Benim endişem şu: Benim yaklaşımım gibi iki ses işleme ses ünitesini kullanmak güvenli mi? Ayrıca, ses iptali çoğunlukla yakalama tarafından çalıştığı için, render etmek için bir RemoteIO ses birimi kullanmak mümkün mü?

Bu alana kısa bir süre için girdiğimden% 100 emin değilim. Developer.apple.com'dan da denedim, ancak developer.apple.com adresinden bulduğum tüm örnekler genellikle yalnızca bir ses birimi kullanıyor.

Herkes bazı ipuçları verebilir mi? Yaklaşımımın VoiceProcessingIO biriminin özellikleri üzerinde herhangi bir potansiyel etkisi var mı?

sayesinde Fuzhou

cevap

1

Öncelikle, VoiceProcessingIO (bu yazma bana itibariyle) sadece yankı bastırma değil, yankı iptal olduğunu. Çıktı çok yüksek olduğunda, aslında girişi kapatır. Bu, örn. Bir VOIP çağrısında, uzak uç konuşurken sizi duyamayacak. Tam eko ​​iptali, girişi açık tutar ancak çıkışın yankılarını çıkarmaya çalışır.

Sadece bir birim kullanmayı öneririm ve "kapatma hoparlörü" örneğini program aracılığıyla kendiniz halledebilirim. Çıktınız geri arama gibi görünebilir:

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

olumsuz bunu etkilememelidir bastırma yankı sessizliği vermek.

İlgili konular