将输入回调添加到AVAudioEngine

时间:2015-08-21 12:06:37

标签: ios objective-c avfoundation core-audio avaudioengine

我试图将输入回调添加到AVAudioEngine's inputNode,但它永远不会被调用。

希望我可以使用AVAudioEngine来管理iOS和OS X的基本AUGraph,我可以在其间运行自己的代码。我还尝试在输入节点上安装一个水龙头,但我无法更改缓冲区长度。

我已制作单一视图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)

有人有任何建议吗?

3 个答案:

答案 0 :(得分:1)

您能否显示启用I / O的代码?请注意,它应位于范围kAudioUnitScope_Input和元素1上。

答案 1 :(得分:1)

RemoteIO在准备好呈现时实际上并没有提供回调。 由于它与输出的硬件相同,因此可以在输出单元渲染时渲染输入单元

答案 2 :(得分: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))

还有其他事情需要检查,但是你说你在其他地方有回调,所以这些是特定于这个单元和总线的。

注意:此代码不完整,只是设置音频会话和启用输入的主要和相关点。