我尝试使用新的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),所以这不是替代。
答案 0 :(得分:3)
通过连接AUGraph中混响单元的输入节点,渲染回调被覆盖。您只能有一个输入到混响节点,输入节点或渲染回调。