У меня было прозрение относительно Аудиоустройств только что, которое помогло мне решить мою собственную проблему.У меня было неправильное представление о том, как работают соединения аудиоустройств и обратные вызовы рендеринга.Я думал, что это были совершенно разные вещи, но оказалось, что соединение - это просто короткая рука для обратного вызова рендеринга.
Выполнение kAudioUnitProperty_MakeConnection с выхода аудиоустройства A на вход аудиоустройства B аналогично выполнению kAudioUnitProperty_SetRenderCallback на входе блока B и вызову функции обратного вызова AudioUnitRender на выходе аудиоустройства A.
Я проверил это, установив соединение после установки моего обратного вызова рендеринга, и обратный вызов рендеринга больше не вызывался.
Поэтому я смог решить свою проблему, выполнив следующие действия:
AURenderCallbackStruct callbackStruct = {0};
callbackStruct.inputProc = MyAURenderCallback;
callbackStruct.inputProcRefCon = mixerUnit;
AudioUnitSetProperty(ioUnit,
kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Input,
0,
&callbackStruct,
sizeof(callbackStruct));
И моя функция обратного вызова сделала что-то вроде этого:
OSStatus MyAURenderCallback(void *inRefCon,
AudioUnitRenderActionFlags *actionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData) {
AudioUnit mixerUnit = (AudioUnit)inRefCon;
AudioUnitRender(mixerUnit,
actionFlags,
inTimeStamp,
0,
inNumberFrames,
ioData);
ExtAudioFileWriteAsync(outputFile,
inNumberFrames,
ioData);
return noErr;
}
Это, вероятно, должно было быть для меня очевидным, но, поскольку я не уверен, что другие были сбиты с толкуточно так же, надеюсь, это тоже полезно для них.
Я до сих пор не уверен, почему у меня возникли проблемы с обратным вызовом AUGraphAddRenderNotify.Я углублюсь в это позже, но пока я нашел решение, которое, кажется, работает.