Cómo usar kAudioSessionProperty_OverrideCategoryMixWithOthers

Me gustaría hacer que mi aplicación de instrumento virtual pueda usarse (a través de un keyboard MIDI) cuando la aplicación está en segundo plano. Esto funciona bien al establecer UIBackgroundModes en "audio" y establecer la categoría de AudioSessions en AVAudioSessionCategoryPlayback. Además, para permitir la mezcla con la aplicación de reproductor de música, establecí la propiedad kAudioSessionProperty_OverrideCategoryMixWithOthers.

Para ahorrar energía de la batería, se recomienda dejar que el usuario desconecte la operación de background si no es necesario. Así que hay un cambio en mi aplicación para alternar entre la categoría AVAudioSessionCategoryAmbient y la categoría AVAudioSessionCategoryPlayback (con kAudioSessionProperty_OverrideCategoryMixWithOthers). El código es así (se omite el event handling errores):

NSString *category = supportsBackgroundOperation ? AVAudioSessionCategoryPlayback : AVAudioSessionCategoryAmbient; [session setCategory:category error:nil]; if (category == AVAudioSessionCategoryPlayback) { UInt32 allowMixing = true; AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing); } 

Ahora el problema: supongamos que la aplicación de música se está reproduciendo en segundo plano. El usuario está tocando el instrumento virtual en primer plano (a través de un keyboard MIDI) para acompañar al reproductor de música y decide comenzar otra aplicación, por ejemplo, una presentación de diapositivas para disfrutar por qué tocar el instrumento. Entonces él / ella va a la vista de configuration de mi aplicación y activa la operación en segundo plano. Luego se ejecuta el código anterior. Boom, la aplicación de música se silencia. Según lo entiendo, la propiedad kAudioSessionProperty_OverrideCategoryMixWithOthers solo se puede configurar después de configurar la categoría, pero cuando configuro la categoría en AVAudioSessionCategoryPlayback, el sistema silencioso reproduce el reproductor antes de tener la posibilidad de establecer kAudioSessionProperty_OverrideCategoryMixWithOthers.

¿Esto sucedió? ¿Se puede hacer algo? Traté de desactivar / activar la session antes / después de cambiar la categoría, pero eso generó otro problema.

Markus

Puedes lograr esto. El principio es desactivar primero tu session de audio, configurar todas las properties de tu session de audio y luego activar la session de audio. De esta forma, la música reproducida en otra aplicación no se silenciará.

 // Initialize audio session AVAudioSession *audioSession = [AVAudioSession shanetworkingInstance]; // Active your audio session [audioSession setActive: NO error: nil]; // Set audio session category [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil]; // Modifying Playback Mixing Behavior, allow playing music in other apps OSStatus propertySetError = 0; UInt32 allowMixing = true; propertySetError = AudioSessionSetProperty ( kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof (allowMixing), &allowMixing); // Active your audio session [audioSession setActive: YES error: nil]; 

Esta solución me funciona. Pero, según su descripción, mencionó que intentó activar / desactivar la session antes / después de cambiar la categoría, pero que generó otros problemas. ¿Hiciste la desactivación / activación de la misma manera que en la anterior? Si es así, proporcione más información sobre otros problemas y tal vez pueda ayudar.

Desde iOS 6.0 puedes usar

 [[AVAudioSession shanetworkingInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil]; 

Debo estar en desacuerdo con M0rph3v5.

El único valor válido para el parámetro AVAudioSessionInterruptionOptionShouldResume es AVAudioSessionInterruptionOptionShouldResume