7

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.

+0

Ciao ... Avete qualche soluzione? Sto affrontando lo stesso problema qui. –

risposta

8

Apparentemente l'ordine delle proprietà di impostazione è importante, sebbene non ci sia alcun accenno nei documenti. Per coloro che lo trovano alla fine, ecco cosa funziona:

//Init and set the interrupt listener. last parameter is passed to interruptlistener 
AudioSessionInitialize(NULL, NULL, interruptlistener, NULL); 

//Allow the app sound to continue to play when the screen is locked. 
UInt32 audioCategory = kAudioSessionCategory_PlayAndRecord; 
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory); 

//Force current audio out through speaker 
UInt32 routeSpeaker = kAudioSessionOverrideAudioRoute_Speaker; 
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(routeSpeaker), &routeSpeaker); 

//Turn on the ability to mix with others 
UInt32 doSetProperty = 1; 
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);