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

我又打了另一个iOS模拟器的错误。 我的问题是,是否有一些解决方法?

错误是这样的:

加载苹果的AurioTouch示例项目。

并简单地输出渲染callback接收的帧数(在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 的幂,以产生对此持续时间的最佳近似值 。 但经validation据表明事实并非如此。

无论如何,很确定这是一个错误。 我要去把它归档。 如果有人可以摆脱一些光,请做!

一般来说,模拟器错误的解决方法是testing设备上的应用程序。 iOS模拟器只是一个模拟器,而不是模拟器。

iOS模拟器有一些奇怪的错误。 这可能与克里斯托弗·彭罗斯(Christopher Penrose)根据这篇文章的缓冲区大小有关:

模拟器将采取非常不同的设置,因为它依赖于主机audio设备,在您的情况下可能是第三方接口。 我已经看到模拟器由于设备的原因拒绝合理的2尺寸的功率。 我无法可靠地在模拟器中使用audio。
詹姆斯告诉我,我是愚蠢的,但在实践中,我已经能够依靠原来configuration的缓冲区大小,而不会改变我。

链接可能更有用的信息: http : //osdir.com/ml/coreaudio-api/2010-04/msg00150.html

如果你想让audio与你的模拟器一起工作,你需要确保OS X的audio/ MIDI设置工具中的采样率设置为44.1k。 AVAudioSession / Audio Services会将您的采样率报告为44.1k,无论使用模拟器时的实际情况如何。

通过设置你的Mac的采样率为44.1k,你会得到一个一致的inNumberFrames(默认是1024)每个callback,虽然这仍然可以据称由系统改变(例如应用程序去后台)。