【发布时间】:2014-08-06 15:14:59
【问题描述】:
我正在尝试使用新的 AVAudioUnits / AVAudioNodes 进行一些音频处理。由于 AVAudioUnits 暴露了它们的底层(经典 CA)AudioUnit,我假设我可以像往常一样简单地附加一个渲染回调,但回调永远不会被调用。
这是我正在谈论的代码:
AVAudioUnitReverb *reverbUnit = [[AVAudioUnitReverb alloc] init];
AURenderCallbackStruct renderCallbackStruct;
renderCallbackStruct.inputProc = &myRenderCallback;
renderCallbackStruct.inputProcRefCon = myAudioStruct;
AudioUnitSetProperty(reverbUnit.audioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, 0, &renderCallbackStruct, sizeof(renderCallbackStruct));
并且渲染回调看起来基本如下:
OSStatus myRenderCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData) {
printf("callback!");
return noErr;
}
reverbUnit 当然是连接到引擎 (PlayerNode -> Reverb -> MainMixer) 上的,我可以按预期听到播放器的音频(混响)。
注意:当我通过设置回调时
AudioUnitAddRenderNotify(reverbUnit, &myRenderCallback, myAudioStruct)
它被调用了,但是ioData->mBuffers[0].mData 为 nil(这是正确的 AFAIK),所以这不是替代方案。
【问题讨论】:
-
不要使用 printf 或 NSLog 等任何打印功能。这是一个性能瓶颈。
-
是的,谢谢,我知道了。但这不是这里的问题。真正的回调显然不会是这样的。
标签: objective-c cocoa core-audio ios8 audiounit