iOS:使用AudioUnitRender的模拟器中的错误

时间:2011-07-09 07:31:06

标签: ios core-audio simulator

我遇到了另一个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的幂,得到这个持续时间的最佳近似值。但经验证据表明情况并非如此。

无论如何,很确定这是一个错误。我要继续提交它。如果有人能说清楚,请做!

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转到后台) )。