2017-08-01 44 views
0

創建第3版AudioUnit的示例代碼演示了實現如何返回用於渲染處理的功能塊。該塊將通過pullInputBlock從鏈中的前一個 AxudioUnit中獲取樣本,並向輸出緩衝區提供處理後的樣本。如果單位下游的單位沒有,它也必須提供一些輸出緩衝區。下面是代碼的AudioUnit子類的摘錄:版本3 AudioUnits:internalRenderBlock中的最小frameCount

- (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的最小值或強制它成爲特定值?

示例代碼取自:https://github.com/WildDylan/appleSample/blob/master/AudioUnitV3ExampleABasicAudioUnitExtensionandHostImplementation/FilterDemoFramework/FilterDemo.mm

回答

0

在iOS的,音頻單元回調必須能夠處理可變frameCounts。你不能強迫它成爲一個常量。

因此,任何需要固定大小緩衝區的處理都應該在音頻單元回調之外完成。您可以通過使用無鎖循環緩衝區/ fifo或類似的結構將數據傳遞到處理線程,該結構不需要回調中的內存管理。

通過使用AVAudioSession API設置緩衝區持續時間,可以建議frameCount爲特定大小。但是操作系統可以自由地忽略這一點,這取決於系統中的其他音頻需求(省電模式,系統聲音等)。根據我的經驗,音頻驅動程序只會增加您的建議尺寸,而不會降低它(超過如果重採樣不是2的冪,則將樣本耦合)。

+0

感謝您指出我正確的方向,但我也對OSX感興趣(我不知道這些API對於不同的操作系統來說是如此不同)。任何想法爲OSX上運行的應用程序設置此位置? – mondaugen

+0

只需將它放在這裏,我就可以了:看起來AUDeferredRenderer可以幫助我。 – mondaugen