没有声音问题会终止设备上所有应用程序的音频
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;
}
}
我们的应用程序正在丢失声音(没有声音),但这会以某种方式导致所有其他应用程序也丢失声音。我不知道我们怎么可能阻止来自外部应用程序(如 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;
}
}