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, ¤tTime)), 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 文档中的内容。
我想离线并轨 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);
}
我看过这个项目,你是对的,它没有 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 文档中的内容。