Я новичок в Core Audio, поэтому я не вижу ничего очевидного ... Моя цель - обработать ранее записанные аудиосигналы. Однако эти сигналы сначала следует отфильтровать. Мне не нужно воспроизводить аудио. Мне нужно только записывать и обрабатывать его.Core Audio: kAudioOutputUnitProperty_SetInputCallback на модуле non-remoteIO
Мой график выглядит следующим образом: RemoteIO -> HighPassFilter -> обратный вызов (процесс аудио)
И я поставил его так:
LBAudioDetectiveGetDefaultFormat(&detective->streamFormat);
// Create new AUGraph
OSStatus error = NewAUGraph(&detective->graph);
LBErrorCheck(error);
// Initialize AUNodes
AudioComponentDescription rioCD = {0};
rioCD.componentType = kAudioUnitType_Output;
rioCD.componentSubType = kAudioUnitSubType_RemoteIO;
rioCD.componentManufacturer = kAudioUnitManufacturer_Apple;
AUNode rioNode;
error = AUGraphAddNode(detective->graph, &rioCD, &rioNode);
LBErrorCheck(error);
AudioComponentDescription filterCD = {0};
filterCD.componentType = kAudioUnitType_Effect;
filterCD.componentSubType = kAudioUnitSubType_HighPassFilter;
filterCD.componentManufacturer = kAudioUnitManufacturer_Apple;
AUNode filterNode;
error = AUGraphAddNode(detective->graph, &filterCD, &filterNode);
LBErrorCheck(error);
// Open the graph so I can modify the AudioUnits
error = AUGraphOpen(detective->graph);
// Adapt rioUnit
error = AUGraphNodeInfo(detective->graph, rioNode, NULL, &detective->rioUnit);
LBErrorCheck(error);
UInt32 onFlag = 1;
AudioUnitElement bus1 = 1;
UInt32 propertySize = sizeof(UInt32);
error = AudioUnitSetProperty(detective->rioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, bus1, &onFlag, propertySize);
LBErrorCheck(error);
propertySize = sizeof(AudioStreamBasicDescription);
error = AudioUnitSetProperty(detective->rioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, bus1, &detective->streamFormat, propertySize);
LBErrorCheck(error);
// Adapt filterUnit
error = AUGraphNodeInfo(detective->graph, filterNode, NULL, &detective->filterUnit);
LBErrorCheck(error);
AURenderCallbackStruct callback = {0};
callback.inputProc = _LBAudioDetectiveFilterOutput;
callback.inputProcRefCon = detective;
propertySize = sizeof(AURenderCallbackStruct);
error = AudioUnitSetProperty(detective->filterUnit, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, 0, &callback, propertySize);
LBErrorCheck(error);
// Connect the two units
AudioUnitElement bus0 = 0;
error = AUGraphConnectNodeInput(detective->graph, rioNode, bus1, filterNode, bus0);
LBErrorCheck(error);
AUGraphInitialize(detective->graph);
Мой код завершается с ошибкой - 10879, когда я пытаюсь установить обратный вызов. Я предполагаю, что звуковой модуль фильтра не поддерживает это свойство. Как я могу получить записанный звук? Насколько мне известно, второй общий выходной блок не разрешен.
Спасибо за вашу помощь заранее
Хм, это разумный подход, но это больше не вызывает обратный вызов. Какие автобусы мне точно нужно подключить. Я подключил шину 1 rioUnit с шиной 0 фильтра. Структура обратного вызова была сконфигурирована на шине 1 rioUnit области вывода. Обратный вызов был вызван, но он не содержал никаких данных в 'ioData-> mBuffers [0] .mData' – lbrndnr