如果设备连接到输入设备和输出设备,是否有iOS核心音频设备的回调?

时间:2016-06-06 21:02:15

标签: ios callback core-audio audiounit

我有一个音响单元,位于另外两个单元之间。也就是说,我的单元有另一个单元分配给它的输入节点,它有另一个单元分配给它的输出节点。

我想访问送入我单位的AudioBufferList。我想在回调中访问此缓冲区列表。但是,如果我的单元的输入总线已连接到另一个音频单元,则永远不会调用我的RenderCallback。

我可以使用什么回调来访问给定单元的传入音频缓冲区?

AURenderCallbackStruct splitterCallback;
    splitterCallback.inputProc = (AURenderCallback) SplitterCallback;
    splitterCallback.inputProcRefCon = (__bridge void*) self;
    status = AudioUnitSetProperty(splitterAuUnit,
                                  kAudioUnitProperty_SetRenderCallback,
                                  kAudioUnitScope_Input,
                                  0, &splitterCallback,  sizeof(splitterCallback));


  AudioUnitElement genericOutputBus  = 0;
    AudioUnitConnection genericOutToIoUnitIn;
    genericOutToIoUnitIn.sourceAudioUnit    = genericAuUnit;
    genericOutToIoUnitIn.sourceOutputNumber = genericOutputBus;
    genericOutToIoUnitIn.destInputNumber    = ioUnitOutputElement;



    AudioUnitSetProperty (
                          splitterAuUnit,                     // connection destination
                          kAudioUnitProperty_MakeConnection,  // property key
                          kAudioUnitScope_Input,              // destination scope
                          ioUnitOutputElement,                // destination element
                          &genericOutToIoUnitIn,                // connection definition
                          sizeof (genericOutToIoUnitIn)
                          );

// Callback
static OSStatus SplitterCallback(void                        *inRefCon,
                               AudioUnitRenderActionFlags  *ioActionFlags,
                               const AudioTimeStamp        *inTimeStamp,
                               UInt32                      inBusNumber,
                               UInt32                      inNumberFrames,
                               AudioBufferList             *ioData)
    {
    @autoreleasepool {
        NSLog(@"splitterCallback"); // This is never called. :(
    }
}

1 个答案:

答案 0 :(得分:1)

以下是在不破坏API的情况下在AUGraph API中注册回调的Core Audio过程。它在OSX中进行了测试,但这部分API也是iOS常见的。假设您想要收听输出单元输入信号,那么一个单元“上游”将是splitterAuUnit。我将通过以下方式注册回调MyRenderProc()

AudioUnitAddRenderNotify(splitterAuUnit,
                         MyRenderProc,
                         &player);

在回调中,检查渲染操作和发布渲染错误非常重要:

if (*ioActionFlags & kAudioUnitRenderAction_PostRender){
    static int TEMP_kAudioUnitRenderAction_PostRenderError = (1 << 8);
    if (!(*ioActionFlags & TEMP_kAudioUnitRenderAction_PostRenderError)){

        Float32* data = (Float32 *)ioData->mBuffers[0].mData; //just for one channel!
    //    …   …   
    }
}
相关问题