Como usar o kAudioSessionProperty_OverrideCategoryMixWithOthers
Eu gostaria de tornar o meu aplicativo de instrumento virtual capaz de ser usado (através de um teclado MIDI) quando o aplicativo está em segundo plano. Isso funciona bem, definindo UIBackgroundModes como "áudio" e definindo a categoria AudioSessions como AVAudioSessionCategoryPlayback. Além disso, para permitir a mistura com o aplicativo Music Player, defino a propriedade kAudioSessionProperty_OverrideCategoryMixWithOthers.
Para economizar energia da bateria, é recomendável deixar o usuário desligar a operação em segundo plano, se não for necessário. Portanto, há um alternador no meu aplicativo para alternar entre a categoria AVAudioSessionCategoryAmbient e a categoria AVAudioSessionCategoryPlayback (com kAudioSessionProperty_OverrideCategoryMixWithOthers). O código é assim (tratamento de erros omitido):
<code>NSString *category = supportsBackgroundOperation ? AVAudioSessionCategoryPlayback : AVAudioSessionCategoryAmbient; [session setCategory:category error:nil]; if (category == AVAudioSessionCategoryPlayback) { UInt32 allowMixing = true; AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing); } </code>
Agora, o problema: suponha que o aplicativo Music esteja tocando em segundo plano. O usuário está tocando o instrumento virtual em primeiro plano (através de um teclado MIDI) para acompanhar o reprodutor de música e decide iniciar outro aplicativo, por exemplo, uma apresentação de slides para apreciar o motivo da reprodução do instrumento. Então ele vai para a visualização de configurações do meu aplicativo e ativa a operação em segundo plano. Então o código acima é executado. Boom, o aplicativo Music fica em silêncio. Pelo que entendi, a propriedade kAudioSessionProperty_OverrideCategoryMixWithOthers só pode ser definidadepois de definindo a categoria, mas quando eu definir a categoria para AVAudioSessionCategoryPlayback, o Music player é silenciado pelo sistema antes que eu tenha a chance de definir kAudioSessionProperty_OverrideCategoryMixWithOthers.
Isso foi aconteceu? Pode alguma coisa ser feita? Tentei desativar / ativar a sessão antes / depois de alterar a categoria, mas isso levou a outros problemas.
Markus