没有声音问题可以杀死设备上所有应用的音频

Jim*_*ask 5 audio core-audio ios avaudiosession

我们的应用程序中正在丢失声音(没有声音),但这会导致所有其他应用程序也失去声音.我不知道我们怎么可能阻止来自Apple Music应用程序之类的外部应用程序的声音.

我们正在抛弃AVAudioSession会话的内容,在声音工作与否之间我们看不出任何差异.我们已经确认路线输出仍然是iPhone的扬声器,即使我们丢失了声音.

这种情况发生在带有扬声器的iPhone 6s和6s Plus上.我们可以通过改变输出路径来"修复"音频,例如插入和拔出耳机.

如何影响播放其他应用程序声音的能力,这可能有助于解决正在发生的事情?

Jim*_*ask 2

我们追踪到问题的根源是发送到 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;
    }
}
Run Code Online (Sandbox Code Playgroud)