没有声音问题会终止设备上所有应用程序的音频

No sound issue kills audio for all apps on the device

我们的应用程序正在丢失声音(没有声音),但这会以某种方式导致所有其他应用程序也丢失声音。我不知道我们怎么可能阻止来自外部应用程序(如 Apple Music 应用程序)的声音。

我们正在转储我们 AVAudioSession 会话的内容,我们可以看到声音工作和不工作之间没有区别。我们已经验证路由输出仍然是 iPhone 的扬声器,即使我们失去了声音。

这发生在 iPhone 6s 和 6s Plus 的扬声器上。我们可以"fix"通过改变输出路径来播放音频,比如插拔耳机。

如何影响其他应用播放声音的能力,这可能有助于解决所发生的问题?

我们追踪到问题的根源是发送到 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;
    }
}