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

时间:2016-11-10 16:53:51

标签: ios audio core-audio avaudiosession

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

我们正在倾销我们AVAudioSession会话的内容,我们可以看到声音在工作与否之间的差异。我们已经确认路线输出仍然是iPhone的扬声器,即使我们丢失了声音。

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

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

1 个答案:

答案 0 :(得分: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;
    }
}