我遇到了另一个iOS模拟器错误。我的问题是,有一些解决方法吗?
Bug就是这个:
加载Apple的 AurioTouch 示例项目。
并打印出渲染回调(在aurioTouchAppDelegate.mm中)收到的帧数
static OSStatus PerformThru(
void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData)
{
printf( "%u, ", (unsigned int)inNumberFrames );
我得到以下输出:
471, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, ...
但是,如果你在下一行注释掉 AudioUnitRender 的电话:
{
printf( "%u, ", (unsigned int)inNumberFrames );
aurioTouchAppDelegate *THIS = (aurioTouchAppDelegate *)inRefCon;
OSStatus err = 0; // AudioUnitRender(THIS->rioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData);
现在每次都会发送适当数量的花车。
471, 470, 471, 470, 470, 471, 470, 471, 470, 470, 471, 470, 471, 470, 470, 471, 470,
我的另一个问题是:为什么这样的随机数为470,471?我在某处读到你通过指定其持续时间来隐式指定缓冲区长度,并将缓冲区长度设置为 2的幂,得到这个持续时间的最佳近似值。但经验证据表明情况并非如此。
无论如何,很确定这是一个错误。我要继续提交它。如果有人能说清楚,请做!
答案 0 :(得分:1)
通常,模拟器错误的解决方法是测试设备上的应用程序。 iOS模拟器只是一个模拟器,而不是模拟器。
iOS模拟器有一些奇怪的错误。根据Christopher Penrose的这篇文章,它可能与缓冲区大小有关:
模拟器将采用完全不同的设置进行设置,因为它依赖于您的主机音频设备,在您的情况下可能是第三方界面。我已经看到由于设备,模拟器拒绝合理的2大小功率。我无法可靠地在模拟器中使用音频 詹姆斯告诉我,我是愚蠢的,但实际上我已经能够依赖原始配置的缓冲区大小,而不会改变我。
链接可能更有用的信息:http://osdir.com/ml/coreaudio-api/2010-04/msg00150.html
答案 1 :(得分:1)
如果您想让音频与您的模拟器配合使用,您需要确保在OS X的audio / midi设置工具中将采样率设置为44.1k。 AVAudioSession / Audio Services将使用模拟器将您的采样率报告为44.1k,无论它实际是什么。
通过将您的mac的采样率设置为44.1k,您将获得每个回调的一致inNumberFrames(默认值为1024),尽管系统仍然可以更改(例如app转到后台) )。