2015-08-21 1 views
3

Я пытаюсь добавить обратный вызов ввода в AVAudioEngine's inputNode, но он никогда не вызывается.Добавить обратный вызов ввода в AVAudioEngine

Надеюсь, что я смогу использовать AVAudioEngine для управления базовым AUGraph для iOS и OS X, и я могу запустить свой собственный код между ними. Я также попытался установить кран на входном узле, но я не могу изменить длину буфера.

Я сделал один вид IOS приложение и поместить этот код в 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]; 

рендер обратного вызова определяется как это:

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

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

Я проверил, что аудиоузел входного узла совпадает с аудиоустройством выходного узла, который предполагает, что график настроен правильно. Я также попытался установить kAudioOutputUnitProperty_EnableIO на блок RemoteIO (inputNode.audioUnit)

У кого-нибудь есть предложения?

ответ

1

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

1

Можете ли вы показать свой код для включения ввода-вывода? Имейте в виду, что он должен быть в области kAudioUnitScope_Input и элемент 1.

0

Есть две вещи, которые я вижу, что может быть неправильно. Вы не считаете аудио сессию. Интересно, если вы установите его на что-то, что принимает входной сигнал:

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

Также kAudioOutputUnitProperty_EnableIO должен быть применен к kAudioUnitScope_Input, потому что вы можете включить/отключить вход или выход независимо друг от друга.

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

Есть другие вещи, чтобы проверить, но вы сказали, что вы имели обратный вызов работает в другом месте, так они являются специфическими для данного устройства и шины.

Примечание: этот код НЕ является полным и является только основным и важным пунктом при настройке аудио сессии и разрешении ввода.