2016-11-10 1 views
5

Nous perdons le son (pas de son) dans notre application, mais cela provoque d'une manière ou d'une autre la perte de son de toutes les autres applications. Je ne sais pas comment il serait possible pour nous de bloquer le son d'une application externe comme l'application Apple Music.Aucun son ne tue audio pour toutes les applications sur l'appareil

Nous vidons le contenu de notre session AVAudioSession et il n'y a aucune différence que nous pouvons voir entre quand le son fonctionne et non. Nous avons vérifié que la sortie de l'itinéraire est toujours le haut-parleur de l'iPhone, même lorsque nous avons perdu le son.

Cela se passe sur l'iPhone 6s & 6s Plus avec le haut-parleur. Nous pouvons "réparer" l'audio en changeant la route de sortie, comme brancher et débrancher les écouteurs.

Comment est-il possible d'influer sur la capacité de reproduire le son d'autres applications, ce qui peut aider à résoudre ce qui se passe?

+0

Peut-être que vous devriez envoyer un exemple reproductible de code qui fait cela pour Apple à l'aide de leur système rapporteur de bogue. – hotpaw2

+0

Malheureusement, ceci est tellement câblé qu'il serait très difficile à reproduire. Nous faisons probablement quelque chose de mal dans la chaîne, mais si c'est le cas, c'est très subtil et nos applications de test plus petites semblent aller bien. Nous ne savons pas comment il est même possible d'influencer une autre application, donc si nous pouvons découvrir que nous pouvons être en mesure de trouver la source du problème. –

Répondre

2

Nous avons détecté la source du problème en ayant des données incorrectes dans le tampon audio qui a été envoyé à Core Audio. Plus précisément, l'une des étapes de traitement audio produit des données qui étaient NaN (Not a Number), au lieu d'un flottant dans la plage valide de +/- 1.0.

Il semble que sur certains périphériques, si les données contiennent du NaN, cela tue l'audio de l'ensemble du périphérique.

Nous avons travaillé autour d'elle en bouclant la vérification des données audio pour les valeurs NaN, et en les convertissant à 0.0 à la place. Notez que vérifier si un flottant est NaN est une vérification étrange (ou cela me semble étrange). NaN n'est égal à rien, y compris lui-même.

Certains pseudo-code pour contourner le problème jusqu'à ce que nous obtenons de nouvelles bibliothèques qui ont une solution appropriée:

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