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

Where is the callback function in Apple's PlaySequence project?

我想离线并轨 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);
    }

我看过这个项目,你是对的,它没有 rendercallback。渲染回调在 coreaudio audiounit effect processing 中占有一席之地。设置渲染回调的调用如下所示:

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

然而,这段代码只是一个大的 main(),它设置了序列、签名、音乐播放器,然后是文件编写器 WriteOutputFile,以防有一个输出文件要反弹到。

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

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