Apple的PlaySequence项目中的回调函数在哪里?

时间:2015-04-07 09:11:41

标签: core-audio midi audiounit

我想离线弹回midi文件,而PlaySequence示例就是这样,我试图理解它。
我一直在读到你需要一个回调函数来在CoreAudio中做任何事情,但我在这个项目中看不到任何东西。
我粘贴包含AudioUnitRender的循环,感谢您的帮助!

    CAStreamBasicDescription clientFormat = CAStreamBasicDescription();
    size = sizeof(clientFormat);
    FailIf ((result = AudioUnitGetProperty (outputUnit,
                                                kAudioUnitProperty_StreamFormat,
                                                kAudioUnitScope_Output, 0,
                                                &clientFormat, &size)), fail, "AudioUnitGetProperty: kAudioUnitProperty_StreamFormat");
    size = sizeof(clientFormat);
    FailIf ((result = ExtAudioFileSetProperty(outfile, kExtAudioFileProperty_ClientDataFormat, size, &clientFormat)), fail, "ExtAudioFileSetProperty: kExtAudioFileProperty_ClientDataFormat");

    {
        MusicTimeStamp currentTime;
        AUOutputBL outputBuffer (clientFormat, numFrames);
        AudioTimeStamp tStamp;
        memset (&tStamp, 0, sizeof(AudioTimeStamp));
        tStamp.mFlags = kAudioTimeStampSampleTimeValid;
        int i = 0;
        int numTimesFor10Secs = (int)(10. / (numFrames / srate));
        do {
            outputBuffer.Prepare();
            AudioUnitRenderActionFlags actionFlags = 0;
            FailIf ((result = AudioUnitRender (outputUnit, &actionFlags, &tStamp, 0, numFrames, outputBuffer.ABL())), fail, "AudioUnitRender");

            tStamp.mSampleTime += numFrames;

            FailIf ((result = ExtAudioFileWrite(outfile, numFrames, outputBuffer.ABL())), fail, "ExtAudioFileWrite");   

            FailIf ((result = MusicPlayerGetTime (player, &currentTime)), fail, "MusicPlayerGetTime");
            if (shouldPrint && (++i % numTimesFor10Secs == 0))
                printf ("current time: %6.2f beats\n", currentTime);
        } while (currentTime < sequenceLength);
    }

1 个答案:

答案 0 :(得分:1)

我查看了该项目,你说得对,它没有rendercallback。渲染回调有coreaudio audiounit effect processing的位置。设置渲染回调的调用如下所示:

inline OSStatus     SetInputCallback (CAAudioUnit &inUnit, AURenderCallbackStruct &inInputCallback)
{
    return inUnit.SetProperty (kAudioUnitProperty_SetRenderCallback, 
                                            kAudioUnitScope_Input, 
                                            0,
                                            &inInputCallback, 
                                            sizeof(inInputCallback));
}

然而,这段代码只是一个大的main()设置顺序,augraph,音乐播放器,然后是文件编写器WriteOutputFile,以防有一个输出文件反弹。

我建议您在关键方法中设置一些断点,然后浏览代码,观察它的作用并查看变量。

编辑:请注意,在RemoteIO上设置iOS上的rendercallback(兼作输入和输出单位)时,在正确的范围内获取正确的流格式&amp; setproperty调用中的总线元素编号可能很棘手。请参阅Apple文档中的此内容。

enter image description here