首页 文章

将输入回调添加到AVAudioEngine

提问于
浏览
3

我正在尝试将输入回调添加到 AVAudioEngine's inputNode,但它永远不会被调用 .

希望我可以使用 AVAudioEngine 管理iOS和OS X的基本AUGraph,我可以在其间运行自己的代码 . 我've also tried installing a tap on the input node but I' m无法更改缓冲区长度 .

我制作了一个单独的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;
}

我已经设法以相同的方式在输出节点的音频单元上安装渲染回调,但我的输入回调从未被调用过 .

我've checked that the input node'的音频单元与输出节点相同's audio unit which suggests the graph has been set up correctly. I' ve也尝试在 RemoteIO 单元上设置 kAudioOutputUnitProperty_EnableIO (inputNode.audioUnit)

有人有什么建议吗?

3 回答

  • 1

    我看到有两件事可能是错的 . 你没有提到音频会话 . 我想知道你是否已将其设置为需要输入的内容:

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

    此外 kAudioOutputUnitProperty_EnableIO 需要应用于 kAudioUnitScope_Input ,因为您可以单独启用/禁用输入或输出 .

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

    还有其他事情要检查,但你说你有一个回调在别处工作,所以这些是特定于这个单位和公共汽车 .

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

  • 0

    你能展示启用I / O的代码吗?请注意,它应该在范围 kAudioUnitScope_Input 和元素 1 上 .

  • 1

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

相关问题