【发布时间】:2017-08-01 22:22:01
【问题描述】:
创建版本 3 AudioUnit 的示例代码演示了实现需要如何返回一个功能块以进行渲染处理。该块都将从前一个中获取样本
AxudioUnit 通过pullInputBlock 在链中,并为输出缓冲区提供处理后的样本。如果更下游的单元没有,它还必须提供一些输出缓冲区。以下是 AudioUnit 子类的代码摘录:
- (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 的最小值或强制它为特定值?
【问题讨论】:
标签: audio core-audio audiounit