AVAudioUnit(渲染)回调
Posted
技术标签:
【中文标题】AVAudioUnit(渲染)回调【英文标题】:AVAudioUnit (render) callback 【发布时间】: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 等任何打印功能。这是一个性能瓶颈。 是的,谢谢,我知道了。但这不是这里的问题。真正的回调显然不会是这样的。 【参考方案1】:在 AUGraph 中连接混响单元的输入节点会覆盖渲染回调。混响节点只能有一个输入,输入节点或渲染回调。
【讨论】:
希望主题:可以创建一个带有自定义回调的 AVAudioUnit 以在 AVAudioEngine 中使用吗?以上是关于AVAudioUnit(渲染)回调的主要内容,如果未能解决你的问题,请参考以下文章
Mac OS 桌面音频主机应用程序无法加载某些 AVAudioUnit 插件