2016-11-10 113 views
5

我们在应用程序中失去声音(没有声音),但这会以某种方式导致所有其他应用程序也失去声音。我不知道我们如何阻止来自Apple Music应用程序等外部应用程序的声音。没有声音问题杀死设备上所有应用程序的音频

我们都为之倾倒我们AVAudioSession会议的内容,并没有任何区别,我们可以在声音工作,不看之间。我们已经证实,即使我们失去了声音,路由输出仍然是iPhone的扬声器。

这是发生在iPhone 6S & 6S加上与扬声器。我们可以通过更改输出路径来“修复”音频,例如插入和拔下耳机。

怎么可能冲击发挥其他应用程序的声音的能力,这可以帮助解决发生了什么?

+0

也许你应该发送的代码中使用他们的错误报告系统,这是否给苹果重复的例子。 – hotpaw2

+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; 
    } 
}