iOS AVAudioSession ducking es lento y sincrónico

En iOS, estoy tratando de esquivar la música de la aplicación de música al reproducir algunos efectos de sonido. En caso de que no lo sepas, "ducking" simplemente significa que el volumen de la música se networkinguce un poco antes de reproducir mi sonido, luego el sonido se reproduce, y luego el volumen de la música recupera su volumen inicial.

Para ducking, estoy configurando la categoría AVAudioSession en AVAudioSessionCategoryAmbient con la opción AVAudioSessionCategoryOptionDuckOthers , y luego activando / desactivando la session (y reproduciendo el sonido intermedio, obviamente). Funciona bien, pero los cambios de volumen parecen realizarse en el mismo hilo que la llamada y la aplicación se cuelga mientras se modifica el volumen.

Si quiere replicar el comportamiento, creo que la ruta más rápida es comenzar un nuevo proyecto SpriteKit, que le dará la muestra, proyecto rotativo de la nave. Luego, coloque el siguiente código en los touchesBegan:withEvent método de touchesBegan:withEvent :

 [[AVAudioSession shanetworkingInstance] setCategory:AVAudioSessionCategoryAmbient withOptions: AVAudioSessionCategoryOptionDuckOthers error: nil]; [[AVAudioSession shanetworkingInstance] setActive:YES error:nil]; [[AVAudioSession shanetworkingInstance] setActive:NO error:nil]; 

Luego ejecute la aplicación en un dispositivo iOS, coloque algo de música en la aplicación Música y toque la pantalla para crear naves y agachar la música. Escuchará el agacharse, pero también verá que los barcos se congelan en la pantalla.

¿Esto es normal? ¿Cuál sería la forma más sencilla de evitar que la aplicación se congele mientras se hace el ducking?

Por cierto, estoy usando un iPhone 5S en iOS 8.1. Además, estoy usando esto en un complemento Unity3D. ¿Cómo puedo esquivar la aplicación de música de la propia unidad?

Puede intentar poner las llamadas de AVAudioSession en un hilo diferente. Entonces no bloquearán el hilo principal (UI). Esto es especialmente para setActive , que toma una cantidad notable de time para completarse.

  dispatch_queue_t myQueue = dispatch_queue_create("com.myname.myapp", nil); dispatch_async(myQueue, ^{ [[AVAudioSession shanetworkingInstance] setCategory:AVAudioSessionCategoryAmbient withOptions: AVAudioSessionCategoryOptionDuckOthers error: nil]; [[AVAudioSession shanetworkingInstance] setActive:YES error:nil]; }); 

Esta pregunta también parece pertinente: iOS AudioSessionSetActive () bloqueando el hilo principal?