我们的应用程序正在丢失声音(无声音),但这以某种方式导致所有其他应用程序也丢失了声音。我不知道我们怎么可能阻止来自Apple Music应用程序等外部应用程序的声音。
我们正在转储AVAudioSession
session 的内容,并且在声音正常工作与无效之间没有区别。我们已经验证,即使我们丢失声音,路线输出仍然是iPhone的扬声器。
这是在带有扬声器的iPhone 6s和6s Plus上发生的。我们可以通过更改输出路线(例如插入和拔出耳机)来“修复”音频。
如何影响播放其他应用程序声音的能力,这可能有助于解决正在发生的事情?
最佳答案
我们跟踪了问题的根源,即发送到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;
}
}