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 插件

AUGraph 弃用是不是意味着不再有音频渲染回调?

核心音频:文件播放渲染回调函数

在 BackBone js 中渲染视图时调用 javascript。渲染后回调?

iOS在渲染回调处理之前添加音频效果?

如何等待 API 回调完全渲染组件?