2013-08-06 9 views
16

Sto lavorando a un'app Podcast. Questo riproduce l'audio usando il tipo di sessione AVAudioSessionCategoryPlayback. Questo fa quasi tutto ciò che voglio che faccia. Mette in pausa altri brani musicali, viene interrotto quando arriva una chiamata e generalmente funziona esattamente come voglio.Rileva quando AVAudioSession sta "Ducked"

Con un'eccezione. Quando viene riprodotto audio con priorità più alta (ad esempio, quando si esegue un'applicazione di navigazione turn-by-turn), l'audio nella mia applicazione viene ridotto in volume ma continua a funzionare. Questo crea una terribile fusione delle due voci che non è desiderata. Preferisco invece che l'audio della mia applicazione si interrompa durante il suono sovra-riprodotto, quindi riprendo una volta terminato.

Ho provato a cambiare le diverse proprietà di AVAudioSession come AVAudioSessionCategoryOptionMixWithOthers, ma questi cambiano solo il modo in cui i suoni con priorità più bassa si fondono con la mia applicazione. Non cambiano il modo in cui il mio si fonde con i suoni con priorità più alta. Ho anche provato ad osservare la proprietà otherAudioPlaying dello sharedSession, ma questo non ha comportato alcun cambiamento quando questi brevi clip sono stati sovrapposti.

C'è un modo per rilevare quando l'audio nella mia app viene ridotto per poterlo invece mettere in pausa? Oppure, in alternativa, per evitare che l'audio della mia app venga schivato in modo che possa trattare questi altri suoni come interruzioni?

Grazie.

+0

Hai provato a utilizzare 'kAudioSessionBeginInterruption' e' kAudioSessionEndInterruption'? – iwasrobbed

+0

Sì, ma il ducking overlay non conta come una "interruzione" per quanto riguarda AVAudioSession. Quindi queste callback/notifiche non vengono attivate. –

+2

Si consiglia di archiviare un radar con Apple a tale proposito, se si ritiene che dovrebbe essere. A mio parere, sembra logico che dovrebbe essere considerata un'interruzione della sessione audio. – iwasrobbed

risposta

0

Non ho mai fatto questo, ma immagino si potrebbe usare la funzione AudioSession servizi C audioSessionAddPropertyListener per registrare il callback per kAudioSessionProperty_OtherAudioIsPlaying.

Attenzione c'è una certa confusione nella documentazione "FLATDACTED" e in Apple DevForums sulla possibilità che tutte o alcune funzioni di AudioSession C siano deprecate "in futuro".

+0

Grazie per il tuo suggerimento, apprezzo l'aiuto. Tuttavia, ho provato entrambi con l'API Obj-C e C. Nessuno dei due ha prodotto il risultato desiderato di una richiamata quando è stato sparato durante il ducking. –

0

Si potrebbe voler esaminare le interruzioni, e semplicemente eliminare la sessione audio quando interrotta, per poi riprendere quando l'interruzione si conclude, come segue:

Nel vostro viewDidLoad:

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 

if ([self canBecomeFirstResponder]) { 
    [self becomeFirstResponder]; 
} 

gestire le notifiche :

static NSInteger audioSessionActiveCounter = 0; 

- (void)audioSessionDidChangeInterruptionType:(NSNotification *)notification 
{ 
    AVAudioSessionInterruptionType interruptionType = [[[notification userInfo] objectForKey:AVAudioSessionInterruptionTypeKey] unsignedIntegerValue]; 

    if (AVAudioSessionInterruptionTypeBegan == interruptionType) 
    { 
     DDLogVerbose(@"Session interrupted: --- Begin Interruption ---"); 
     // stop your session here with a setActive:NO 

    } 
    else if (AVAudioSessionInterruptionTypeEnded == interruptionType) 
    { 
     DDLogVerbose(@"Session interrupted: --- End Interruption ---"); 
     // resume your session here with a setActive:YES 
    } 
} 

Spero che sia d'aiuto.

0

Non credo che kAudioSessionProperty_OtherAudioIsPlaying si supponga di richiamare in alcun modo - è possibile che sia necessario eseguire il polling di questo valore su base regolare.

Dovrebbe restituire un valore diverso da zero quando viene riprodotto un altro audio sul dispositivo. Questo potrebbe non indicare che ti stai "schivando" di per sé, ma ciò indicherebbe che l'altro audio si sta mescolando con il tuo audio. Presumibilmente verrai schivato solo se l'altra app imposta la proprietà kAudioSessionProperty_OtherMixableAudioShouldDuck della loro sessione audio.

Per quanto riguarda il polling, sì, potrebbe non essere elegante come un callback, ma a volte è necessario e sospetto che il polling di questo valore sia un successo minore.

Spero che questo aiuti.

1

In te AppDelegate.m classe e in didFinishLaunchingWithOptions la funzione, ascolta la seguente notifica

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioSessionInterruption:) name:AVAudioSessionInterruptionNotification object:nil]; 

e al di fuori del metodo di applicazione lanciare, implementare il selettore come

- (void)audioSessionInterruption:(NSNotification *)notif{ 
    NSLog(@"\n\nInterruption Notification :%@\n\n",notif.userInfo); 
} 

Spero che questo funzionerà per voi .. ..

0

Ho scritto a Apple DTS su questo problema. Ecco cosa sono tornato:

Grazie per aver contattato il Supporto tecnico degli sviluppatori Apple (DTS). I nostri ingegneri hanno esaminato la richiesta e hanno concluso che non esiste un modo supportato per ottenere la funzionalità desiderata con lo , date le configurazioni di sistema attualmente in spedizione .

Se volete per Apple di prendere in considerazione l'aggiunta del supporto in futuro per consentire/informare l'applicazione di fondo di smettere di giocare audio quando il primo piano app sceglie di anatra altro audio, quindi attivare lo sfondo applicazione di ricominciare audio dopo aver completato il ducking, inviare una richiesta di miglioramento tramite lo strumento Bug Reporter allo http://bugreport.apple.com.

Sembra che sia impossibile ora purtroppo.

Problemi correlati