2017-08-01 19 views
0

バージョン3のAudioUnitを作成するためのサンプルコードは、実装がレンダリング処理のためにファンクションブロックを返す必要があることを示しています。このブロックは、チェーン内の前の AxudioUnitのサンプルをpullInputBlock経由で取得し、処理されたサンプルを出力バッファに供給します。さらにユニットがチェインを下っていない場合、出力バッファをいくつか用意しなければなりません。ここでAudioUnitのサブクラスからのコードの抜粋は以下のとおりです。バージョン3 AudioUnits:internalRenderBlockの最小フレーム数

- (AUInternalRenderBlock)internalRenderBlock { 
    /* 
     Capture in locals to avoid ObjC member lookups. 
    */ 
    // Specify captured objects are mutable. 
    __block FilterDSPKernel *state = &_kernel; 
    __block BufferedInputBus *input = &_inputBus; 

    return Block_copy(^AUAudioUnitStatus(
      AudioUnitRenderActionFlags *actionFlags, 
      const AudioTimeStamp  *timestamp, 
      AVAudioFrameCount   frameCount, 
      NSInteger     outputBusNumber, 
      AudioBufferList   *outputData, 
      const AURenderEvent  *realtimeEventListHead, 
      AURenderPullInputBlock  pullInputBlock) { 
     ... 
    }); 

処理はこのブロックを呼び出す前にframeCountを知る必要がない場合、これは大丈夫ですが、多くのアプリケーションがために、このブロックの前にframeCountを知る必要がありませんメモリを割り当て、処理パラメータを準備するなど。frameCountが既知の場合にのみ、frameCountのサンプルを出力するだけで出力バッファを累積することができます。動作させるには、このフレーム数より大きなサイズで処理を初期化する必要があります。 frameCountの最小値を指定または取得する方法、または強制的に特定の値にする方法はありますか?オーディオユニットコールバックが可変frameCountsを扱うことができなければならない、IOSの下https://github.com/WildDylan/appleSample/blob/master/AudioUnitV3ExampleABasicAudioUnitExtensionandHostImplementation/FilterDemoFramework/FilterDemo.mm

答えて

0

例コードがから取られます。それを強制的に定数にすることはできません。

したがって、固定サイズのバッファを必要とする処理は、オーディオユニットのコールバックの外側で行う必要があります。ロックのない循環バッファ/ FIFOや、コールバックでメモリ管理が不要な同様の構造を使用することで、処理スレッドにデータを渡すことができます。

AVAudioSession APIを使用してバッファの長さを設定することによって、frameCountが特定のサイズになるようにすることができます。しかし、OSは、システム内の他のオーディオニーズ(省電力モード、システムサウンドなど)に応じて、これを無視することは自由です。私の経験では、オーディオドライバは推奨サイズを増加させます。 2のべき乗ではないサンプルにリサンプリングした場合、サンプルを結合します)。

+0

正しい方向に私を指摘してくれてありがとうが、私はOSXにも興味があります(私はAPIがさまざまなOSで非常に異なっていたことは知らなかった)。 OSX上で動作するアプリケーションのためにこれをどこに設定するのですか? – mondaugen

+0

私が作業している間にこれをここに置いてください:AUDeferredRendererが私を助けることができるようです。 – mondaugen

関連する問題