OK, ho definito la mia AVAudioSession con il seguente (sì, mix delle chiamate c e obj-c) Si noti inoltre che l'app ha audio in modalità background, perché se la registrazione deve continuare a farlo mentre l'applicazione è in background:Uscita AVAudioSession/Audio Session Services uscita di commutazione
[(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];
l'applicazione ha diverse opzioni per l'audio (solo i primi due sono stati programmati):
- normale: senza audio dalla app, in modo don non si scherza con l'audio esterno
- Solo registrazione del microfono dell'auricolare: non deve avere regolazioni del guadagno, e non pasticciare con l'audio esterno (che verrà riprodotto tramite l'auricolare)
- Riprodurre la musica dall'app, senza registrare: interrompere l'audio e riprodurre la corrente uscita (altoparlante o l'auricolare)
- riprodurre musica da in app e microfono auricolare registrare: Stop audio esterno, registrare e riprodurre solo attraverso cuffie
La registrazione sta lavorando bene in primo piano e sfondo, e io aggiungerò il gioco dopo. Tuttavia, ho notato stasera che se l'audio è già in riproduzione (Pandora) sull'altoparlante e vado nella mia app e attiva la modalità di registrazione, Pandora passa a suonare attraverso l'altoparlante del telefono, e anche dopo che l'audiosessione è disattivata e la l'app è in background (ma non forzatamente chiusa) l'audio continua a suonare attraverso l'altoparlante del telefono finché non chiudo l'app.
//Deactivate the audio session
[[AVAudioSession sharedInstance] setActive:NO error:nil];
D'altra parte, se l'auricolare è in e la musica è in riproduzione tramite l'auricolare quando l'applicazione viene avviato in modalità di registrazione, allora c'è solo una breve pausa e la musica continua a giocare allo stesso volume (correttamente, senza ducking).
Non vedo alcun motivo per cui il percorso debba cambiare quando si attiva la sessione audio senza auricolare e perché non cambia quando la sessione è disattivata. Soprattutto cambiando per l'altoparlante del telefono! C'è qualcosa che sto facendo male, o devo solo definire la AVAudioSession in modo diverso a seconda di cosa l'utente vuole fare (invece della riproduzione coperta + registrazione e misurazione della modalità)? E anche se devo definirlo separatamente per diversi casi d'uso. Ad esempio, l'audio passerà sempre attraverso l'auricolare se l'app sta registrando e se l'app non sta registrando, quindi l'audio emetterà l'auricolare o l'altoparlante (a seconda che l'utente abbia una cuffia collegata o no - cioè, comportamento normale).
Dettagli aggiuntivi
Va bene, ho provato il passaggio tutto il codice C e ho notato una nota sepolta all'interno dei documenti su kAudioSessionProperty_OverrideAudioRoute
kAudioSessionOverrideAudioRoute_None
Specifica, per la categoria kAudioSessionCategory_PlayAndRecord, che l'audio in uscita dovrebbe andare al ricevitore. Questo è il percorso audio di uscita predefinito per questa categoria.
Allora ho provato a installare questa struttura (queste proprietà) in 3 modi diversi:
- kAudioSessionProperty_OverrideAudioRoute con kAudioSessionOverrideAudioRoute_Speaker continua a riprodurre l'audio, ma passa fuori attraverso il ricevitore, e mostra la rotta come ReceiverAndMicrophone
- kAudioSessionProperty_OverrideCategoryDefaultToSpeaker con kAudioSessionOverrideAudioRoute_Speaker arresta l'audio in fase di riproduzione, e mostra la rotta come SpeakerAndMicrophone
- kAud ioSessionProperty_OverrideCategoryDefaultToSpeaker con un valore pari a 1 fa la stessa cosa come kAudioSessionOverrideAudioRoute_Speaker
Quindi, in pratica i documenti dicono che il default è di passare al ricevitore. Tuttavia, non importa quello che faccio, non riesco a mantenere l'uscita Speaker e mantenere la riproduzione dell'audio esterno.
Ciao ... Avete qualche soluzione? Sto affrontando lo stesso problema qui. –