Saída de comutação dos Serviços de Sessão AVAudioSession / Audio

Ok, eu tenho o meu AVAudioSession definido com o seguinte (sim, mistura das chamadas c e obj-c) Observe também que o aplicativo tem áudio modo de fundo, porque se a gravação deve continuar a fazê-lo enquanto o aplicativo está em segundo plano:

[(AVAudioSession *)[AVAudioSession sharedInstance] setDelegate: self];
// Allow the app sound to continue to play when the screen is locked.
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
//Turn off automatic gain on the microphone
[[AVAudioSession sharedInstance] setMode:AVAudioSessionModeMeasurement error:nil];
//Turn on the ability to mix with others
UInt32 doSetProperty = 1;
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);

//Activate the audio session
[[AVAudioSession sharedInstance] setActive:YES error:nil];

O aplicativo tem várias opções diferentes de áudio (apenas as duas primeiras foram programadas):

Normal: sem áudio do aplicativo, por isso não mexa com o áudio externoApenas gravação do fone de ouvido mic: não deve ter ajustes de ganho e não deve mexer no áudio externo (que será reproduzido pelo fone de ouvido)Reproduza música a partir da aplicação, sem gravar: pare o áudio externo e reproduza a saída atual (altifalante ou auricular)Reproduza música a partir da aplicação e grave o microfone do auricular: pare o áudio externo, grave e reproduza apenas através do auricular

A gravação está funcionando bem em primeiro plano e em segundo plano, e adicionarei a reprodução mais tarde. No entanto, eu só notei hoje à noite que se o áudio já está tocando (Pandora) no alto-falante e eu entro no meu aplicativo e ativo o modo de gravação, ele alterna o Pandora para tocar no alto-falante do telefone e mesmo após a audiosession ser desativada. app é fundo (mas não forçado fechado) o áudio continua a jogar através do alto-falante do telefone até que eu force o fechamento do aplicativo.

//Deactivate the audio session
[[AVAudioSession sharedInstance] setActive:NO error:nil];

Por outro lado, se o fone de ouvido estiver ligado e a música estiver tocando no fone de ouvido quando o aplicativo for iniciado no modo de gravação, haverá apenas uma breve pausa e a música continuará tocando no mesmo volume (corretamente, sem abaixar o som) .

Não vejo nenhum motivo pelo qual a rota deva mudar quando eu ativo a sessão de áudio sem um fone de ouvido e por que ela não muda novamente quando a sessão é desativada. Especialmente mudando para o alto-falante do telefone! Existe alguma coisa que estou fazendo errado, ou eu só preciso definir o AVAudioSession de forma diferente dependendo do que o usuário quer fazer (em vez da reprodução geral + registro e medição de modo)? E mesmo se eu precisar defini-lo separadamente para diferentes casos de uso. Por exemplo, o áudio estará sempre passando pelo fone de ouvido se o aplicativo estiver gravando e, se o aplicativo não estiver gravando, a saída de áudio será o fone de ouvido ou alto-falante (dependendo se o usuário tiver um fone de ouvido conectado ou não) - ou seja, comportamento normal).

detalhes adicionais

Ok, eu tentei mudar todo o código c notei uma nota enterrada dentro dos documentos sobre kAudioSessionProperty_OverrideAudioRoute

kAudioSessionOverrideAudioRoute_None
Especifica, para a categoria kAudioSessionCategory_PlayAndRecord, que o áudio de saída deve ir para o receptor. Esta é a rota de áudio de saída padrão para esta categoria.

Então tentei definir essa propriedade (essas propriedades) de 3 maneiras diferentes:

kAudioSessionProperty_OverrideAudioRoute com kAudioSessionOverrideAudioRoute_Speaker continua a reproduzir o áudio, mas desliga-o pelo receptor e mostra a rota como ReceiverAndMicrophonekAudioSessionProperty_OverrideCategoryDefaultToSpeaker com kAudioSessionOverrideAudioRoute_Speaker interrompe a reprodução de áudio no momento e mostra a rota como SpeakerAndMicrophonekAudioSessionProperty_OverrideCategoryDefaultToSpeaker com um valor de 1 faz o mesmo que kAudioSessionOverrideAudioRoute_Speaker

Então, basicamente, os documentos dizem que o padrão é mudar para o receptor. No entanto, não importa o que eu faça, não consigo manter a saída do alto-falante e manter o áudio externo sendo reproduzido.

questionAnswers(1)

yourAnswerToTheQuestion