2016-01-26 8 views
9

için Eşleşen Giriş ve Çıkış Donanımı Ayarları iOS için Core Audio kullanılarak çok basit bir ses efektleri zinciri oluşturmaya çalışıyorum. Şimdiye kadar simülatörde gayet iyi çalışan bir EQ - Sıkıştırma - Sınırlayıcı zincir uyguladık. Ancak, aygıtta, giriş ve çıkış donanım biçimlerindeki görünür uyumsuzluk nedeniyle düğümleri AVAudioEngine'a bağlarken uygulama çöküyor.AVAudioEngine

'com.apple.coreaudio.avfaudio', reason: 'required condition is false: 
IsFormatSampleRateAndChannelCountValid(outputHWFormat)' 

Temel bir örnek olarak Ses Grafiğim şu şekildedir.

Mic -> Limiter -> Main Mixer (and Output) 

ve grafik üzerinde haricinde çöker

engine.connect(engine.inputNode!, to: limiter, format: engine.inputNode!.outputFormatForBus(0)) 
engine.connect(limiter, to: engine.mainMixerNode, format: engine.inputNode!.outputFormatForBus(0)) 

kullanılarak doldurulur. motorda, ses düğümleri bağlayan önce bir kAudioUnitErr_FormatNotSupported hata

'com.apple.coreaudio.avfaudio', reason: 'error -10868' 

karıştırıcıya

engine.connect(engine.inputNode!, to: limiter, format: engine.inputNode!.outputFormatForBus(0)) 
engine.connect(limiter, to: engine.mainMixerNode, format: limiter.outputFormatForBus(0)) 

uygulama çöker bağlanırken yerine sınırlayıcı biçimini kullanmak için, inputNode 1 kanalı ve bir yer alır 44.100Hz'lik örnekleme hızı, outputNode'un 0 kanalı ve 0Hz'lik bir örnek oranı vardır (outputFormatForBus (0) özelliği kullanılarak çıkarılır). Ancak bunun nedeni, çıkış karıştırıcısına henüz bağlanmış bir düğüm olmadığı için olabilir. tercih edilen örnekleme oranını AVAudioSession olarak ayarlamak fark yaratmamıştır.

Burada eksik olduğum bir şey var mı? Ben (. RecordPermission()AVAudioSession.sharedInstance() kullanılarak doğrulandı) Mikrofon erişimi var ve kaydetmek için AVAudioSession modunu ayarladıktan (AVAudioSession.sharedInstance(). SetCategory (AVAudioSessionCategoryRecord)).

let limiter = AVAudioUnitEffect(audioComponentDescription: 
       AudioComponentDescription(
        componentType: kAudioUnitType_Effect, 
        componentSubType: kAudioUnitSubType_PeakLimiter, 
        componentManufacturer: kAudioUnitManufacturer_Apple, 
        componentFlags: 0, 
        componentFlagsMask: 0)) 
engine.attachNode(limiter) 

ve motor

var engine = AVAudioEngine() 

Dediğim gibi değişken bir küresel, sınıftır bu simülatörü kullanarak mükemmel çalışıyor, (ve:

sınırlayıcı şöyle başlatıldı bir AVAudioUnitEffect olduğunu Mac'in varsayılan donanımı), ancak iOS8 & iOS9'daki çeşitli iPad'lerde sürekli olarak çöküyor. Sadece çıkış mikser Burada

do { 
    file = try AVAudioFile(forWriting: NSURL.URLToDocumentsFolderForName(name: "test", WithType type: "caf")!, settings: engine.inputNode!.outputFormatForBus(0).settings) 
} catch {} 
engine.connect(player, to: engine.mainMixerNode, format: file.processingFormat) 

bir oyuncu için mikrofon girişi besleyen süper temel örnek çalışma var outputNode 2 kanalı ve 44.100Hz örnekleme oranına sahip iken inputNode, 1 kanal ve 44.100Hz örnekleme oranına sahiptir ama hiçbir uyumsuzluk görülüyor. Dolayısıyla, sorun, AVAudioUnitEffect'in çıkış karıştırıcısına bağlandığı yol olmalıdır.

Herhangi bir yardım büyük memnuniyetle karşılanacaktır.

+0

Bunu hiç anladın mı? – user3344977

+1

AVAUdio arkada korkunç bir acı, belgelerin yetersiz yazılmış ve motor gerçekten belirsiz kurallara ve yararsız hata kodlarına göre çalışıyor. Bu berbat, ama ileriye doğru sürmeliyiz. Çözersem cevap vereceğim. – Josh

+0

Bunu yeniden üreten bir projeniz var mı? –

cevap

12

Bu, paylaştığınız kodun dışındaki bazı etkenlere bağlıdır, ancak yanlış AVAudioSession kategorisini kullanmanız mümkündür.

Bazı benzer durumlarda, aynı sorunla karşılaştım. AVAudioSessionCategoryRecord'u AVAudioSession kategorisi olarak kullanırken, bir ses musluğunu bağlamaya çalışırken aynı sorunla karşılaştım. Ben sadece bu hatayı aldım, ama AVAudioEngine inputNode'um 0.0 örnek oranıyla bir outputFormat gösterdi.

AVAudioSessionCategoryPlayAndRecord ile değiştirilmesi Beklenen 44.100Hz örnekleme oranını aldım ve sorun çözüldü.