2013-04-22 2 views
0

Я новичок в 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, когда я пытаюсь установить обратный вызов. Я предполагаю, что звуковой модуль фильтра не поддерживает это свойство. Как я могу получить записанный звук? Насколько мне известно, второй общий выходной блок не разрешен.

Спасибо за вашу помощь заранее

ответ

2

Настройка обратного вызова на выходе (шины 0) от Audio Unit RemoteIO (вместо блока фильтра или входной шине), но в этом RemoteIO обратный вызов, тянуть (визуализации) от блока фильтра. Затем блок фильтра будет вызываться для вывода доступных данных с входа RemoteIO (шина 1) для его обработки.

Также заполняйте выходные буферы нулями, если вы не хотите звучать.

В принципе, сторона динамика RemoteIO обеспечивает синхронизацию обратных вызовов для данных на стороне микрофона RemoteIO, даже если вы не хотите воспроизводить звук из динамика. Это связано с тем, что целая цепочка аудиоустройств основана на модели pull (нет места для АЦП для передачи данных в API), но частота дискретизации аппаратного обеспечения ввода и вывода оказывается одинаковой. Таким образом, вывод вызывается точно в нужное время для того, чтобы цепочка аудиоустройств вытащила из входных буферов микрофона.

+0

Хм, это разумный подход, но это больше не вызывает обратный вызов. Какие автобусы мне точно нужно подключить. Я подключил шину 1 rioUnit с шиной 0 фильтра. Структура обратного вызова была сконфигурирована на шине 1 rioUnit области вывода. Обратный вызов был вызван, но он не содержал никаких данных в 'ioData-> mBuffers [0] .mData' – lbrndnr