我们找到了问题的根源,以在被送往Core Audio的音频缓存有坏的数据。具体来说,其中一个音频处理步骤输出的是NaN(非数字)数据,而不是+/- 1.0有效范围内的浮点数。
看来,在某些设备上,如果该数据包含NaN的,它杀死了整个设备的音频。
我们工作围绕它通过音频数据检查NaN值循环,并将它们转换为0.0,而不是。注意检查一个浮点数是否是NaN是一个奇怪的检查(或者对我来说似乎很奇怪)。 NaN不等于任何东西,包括它本身。
一些伪代码来解决这个问题,直到我们得到的是有一个适当的修复新库:
float *interleavedAudio; // pointer to a buffer of the audio data
unsigned int numberOfSamples; // number of left/right samples in the audio buffer
unsigned int numberOfLeftRightSamples = numberOfSamples * 2; // number of float values in the audio buffer
// loop through each float in the audio data
for (unsigned int i = 0; i < numberOfLeftRightSamples; i++)
{
float *sample = interleavedAudio + i;
// NaN is never equal to anything, including itself
if(*sample != *sample)
{
// This sample is NaN - force it to 0.0 so it doesn't corrupt the audio
*sample = 0.0;
}
}
也许你应该发送的代码中使用他们的错误报告系统,这是否给苹果重复的例子。 – hotpaw2
不幸的是,这是连接到这么多的代码,这将是非常难以复制。我们很可能在连锁店做错了事情,但如果是这样的话,它非常微妙,我们的小型测试应用程序似乎没问题。我们不知道如何影响另一个应用,尽管如此,如果我们能够发现我们可能能够追踪问题的根源。 –