刚刚开始开发一个小型测试 iOS 5.0 应用程序,看看该平台上的可能性。
一些资源没有价值,例如 Chris Adamson 的博客和 David Zicarelli 的 audioGraph 示例(基于 Apple 的 MixerHost 并具有许多新功能)。
我想要做的是设置这样的东西,使用来自 iOS 5.x SDK 的新 FilePlayer AudioUnit。
(AUFilePlayer bus0) -> (一些自定义进程) -> (bus0 MultiChannelMixer bus0) -> (bus0 Remote I/O)
我从 audioGraph 开始,删除了我不想要的,最后得到了上面的链。
我可以看到 AUFilePlayer 的首选输出是 8.24 流,因此混音器也以这种方式设置(输入范围为 8.24)。我的流程将处理它需要的任何转换。
为总线 0 上的混音器注册了“自定义进程”回调。启动应用程序后,它会定期调用,我可以通过记录来验证。
static OSStatus simpleRenderCallback (
void *inRefCon,
AudioUnitRenderActionFlags
*ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData
) {
MixerHostAudio* THIS = (MixerHostAudio*) inRefCon; //the MixerHostAudio instance
AudioUnit fpUnit= THIS.auFilePlayerUnit_1;
OSStatus renderErr = noErr;
renderErr= AudioUnitRender(AUFilePlayerUnit, ioActionFlags, inTimeStamp, 0, inNumberFrames, ioData);
if (renderErr < 0) {
NSLog(@"error:%ld",renderErr);
return renderErr;
}
return noErr;
}
问题是每次在我的回调中调用 AudioUnitRender 时,我总是得到一个 renderErr = -50。
我现在正在使用模拟器运行,Mac 声卡设置为 44,100Hz,我可以看到 inNumberFrames 始终等于 512。
问题出在哪里?-50 表示 CoreAudio 中的“错误参数”,但这还不足以知道出了什么问题。
谢谢!