2016-01-26 18 views
9

iOS用のCore Audioを使用して非常に簡単なオーディオエフェクトチェーンを構築しようとしています。今まで私はシミュレータで完璧に動作するEQ - Compression - Limiterチェーンを実装しました。ただし、デバイスでは、入力および出力ハードウェア形式の見た目の不一致により、ノードをAVAudioEngineに接続するとアプリケーションがクラッシュします。AVAudioEngineの入力と出力のハードウェア設定を一致させる

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

私のオーディオグラフは、次のとおりです。

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

グラフは、上記の例外を除いてクラッシュ

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

を使用して移入されます。エンジンのオーディオ・ノードを接続する前kAudioUnitErr_FormatNotSupportedエラー

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

でミキサーに

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

アプリケーションがクラッシュを接続する場合、私は代わりにリミッタのフォーマットを使用する場合、inputNodeは1つのチャネルと有しますサンプルレートは44.100Hzであり、outputNodeは0チャンネルでサンプルレートは0Hzです(outputFormatForBus(0)プロパティを使用して推定されます)。しかし、出力ミキサーにまだノードが接続されていないことが原因ですか? の好ましいサンプルレートの設定AVAudioSessionは違いがありません。

ここには何かがありますか?私は、マイクへのアクセス(AVAudioSession.sharedInstanceを(使用して検証)。recordPermission())を持っている、と私はレコードにAVAudioSessionモードを設定している(AVAudioSession.sharedInstance()。setCategory(AVAudioSessionCategoryRecord))。次のように初期化さ

リミッターがAVAudioUnitEffectです:私は、これは、シミュレータを使用して完全に正常に動作し、言ったように

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

とエンジンが(グローバル、クラス変数

var engine = AVAudioEngine() 

で、 Macのデフォルトハードウェア)、iOS8のさまざまなiPadsで継続的にクラッシュする& iOS9。私は単純に出力ミキサーここ

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) 

にプレイヤーにマイク入力を供給し、超基本的な例の作業を持って出力ノードが2つのチャンネルと44.100Hzのサンプリングレートを有しているinputNodeは、1つのチャネルおよび44.100Hzのサンプリングレートを持っていますミスマッチは発生していないようです。したがって、問題は、AVAudioUnitEffectが出力ミキサーに接続されている方法でなければなりません。

ご協力いただければ幸いです。

+0

あなたはこれを理解しましたか? – user3344977

+1

AVAUdioは後ろにひどい痛みがあり、ドキュメンテーションの書き方が悪く、エンジンは実際にはあいまいなルールや役に立たないエラーコードに従って動作します。それは吸うが、我々は前方に耕す必要があります。私はそれを解決すれば私は答えを掲示するでしょう。 – Josh

+0

これを再現するプロジェクトはありますか? –

答えて

12

これは、共有しているコード以外の要因によって異なりますが、間違ったAVAudioSessionカテゴリを使用している可能性があります。

私はこの同じ問題を、少し異なる状況下で実行しました。 AVAudioSessionCategoryRecordをAVAudioSessionカテゴリとして使用していたとき、オーディオタップに接続しようとしたときに同じ問題が発生しました。私はそのエラーを受け取っただけでなく、AVAudioEngine inputNodeが0.0のサンプルレートのoutputFormatを示しました。

AVAudioSessionCategoryPlayAndRecordに変更する予定の44.100Hzのサンプルレートを受信しましたが、問題は解決しました。

関連する問題