Agregar callback de input a AVAudioEngine

Estoy intentando agregar una callback de input a un AVAudioEngine's AVAudioEngine, pero nunca se llama.

La esperanza es que puedo usar AVAudioEngine para administrar el AUGraph básico para iOS y OS X y puedo ejecutar mi propio código en el medio. También intenté instalar un toque en el nodo de input, pero no puedo cambiar la longitud del búfer.

Hice una aplicación de iOS de vista única y puse este código en viewDidLoad :

 _audioEngine = [AVAudioEngine new]; _inputNode = _audioEngine.inputNode; _outputNode = _audioEngine.outputNode; AURenderCallbackStruct inputCallback; inputCallback.inputProc = inputCalbackProc; inputCallback.inputProcRefCon = (__bridge void *)(self); AudioUnitSetProperty(_inputNode.audioUnit, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, 0, &inputCallback, sizeof(inputCallback)); [_audioEngine startAndReturnError:nil]; 

La callback de procesamiento se define así:

 OSStatus inputCalbackProc (void * inRefCon, AudioUnitRenderActionFlags * ioActionFlags, const AudioTimeStamp * inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList * ioData) { printf("Called"); return noErr; } 

He logrado instalar una callback de procesamiento en la unidad de audio del nodo de salida de la misma manera, pero nunca se invoca mi callback de input.

He verificado que la unidad de audio del nodo de input es la misma que la unidad de audio del nodo de salida, lo que sugiere que el gráfico se ha configurado correctamente. También intenté configurar kAudioOutputUnitProperty_EnableIO en la unidad RemoteIO (inputNode.audioUnit)

¿Alguien tiene alguna sugerencia?

¿Puedes mostrar tu código para habilitar E / S? kAudioUnitScope_Input en count que debería estar en el scope kAudioUnitScope_Input y el elemento 1 .

RemoteIO en realidad no proporciona una callback cuando está list para ser procesada. Como es el mismo hardware que la salida, puede representar la unidad de input cuando la unidad de salida se representa.

Hay dos cosas que veo que podrían estar equivocadas. No metes la session de audio. Me pregunto si lo ha configurado para algo que requiere una input:

 let audioSession = AVAudioSession.shanetworkingInstance() audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord) audioSession.setActive(true) 

También kAudioOutputUnitProperty_EnableIO debe aplicarse a kAudioUnitScope_Input porque puede habilitar / deshabilitar input o salida de forma independiente.

 AudioUnitSetProperty(ioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, bus1, &enableInput,sizeof(enableInput)) 

Hay otras cosas que debe verificar, pero dijo que tenía una callback en otro lugar, por lo que son específicas de esta unidad y el bus.

Nota: este código NO está completo y es solo los puntos principales y relevantes para configurar una session de audio y habilitar la input.