AVAudioUnit(渲染)回调

时间:2014-08-06 15:14:59

标签: objective-c cocoa core-audio ios8 audiounit

我尝试使用新的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),所以这不是替代。

1 个答案:

答案 0 :(得分:3)

通过连接AUGraph中混响单元的输入节点,渲染回调被覆盖。您只能有一个输入到混响节点,输入节点或渲染回调。