創建第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
的最小值或強制它成爲特定值?
感謝您指出我正確的方向,但我也對OSX感興趣(我不知道這些API對於不同的操作系統來說是如此不同)。任何想法爲OSX上運行的應用程序設置此位置? – mondaugen
只需將它放在這裏,我就可以了:看起來AUDeferredRenderer可以幫助我。 – mondaugen