我想离线弹回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, ¤tTime)), fail, "MusicPlayerGetTime");
if (shouldPrint && (++i % numTimesFor10Secs == 0))
printf ("current time: %6.2f beats\n", currentTime);
} while (currentTime < sequenceLength);
}
答案 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文档中的此内容。