2012-02-14 18 views
7

Sto scrivendo un'app iOS utilizzando un AudioQueue per la registrazione. Creo una coda di input configurata per ottenere PCM lineare, ho dichiarato questa coda e tutto funziona come previsto.Impossibile riavviare una coda di input audio interrotta in modalità background su iOS

Per gestire le interruzioni, ho implementato i metodi delegati di AVAudioSession per catturare l'inizio e la fine di un'interruzione. Il metodo endInterruption sia simile alla seguente:

- (void)endInterruptionWithFlags:(NSUInteger)flags; 
{ 
    if (flags == AVAudioSessionInterruptionFlags_ShouldResume && audioQueue != 0) { 

     NSLog(@"Current audio session - category: '%@' mode: '%@'", 
       [[AVAudioSession sharedInstance] category], 
       [[AVAudioSession sharedInstance] mode]); 

     NSError *error = nil; 
     OSStatus errorStatus; 
     if ((errorStatus = AudioSessionSetActive(true)) != noErr) { 
      error = [self errorForAudioSessionServiceWithOSStatus:errorStatus]; 
      NSLog(@"Could not reactivate the audio session: %@", 
        [error localizedDescription]); 
     } else { 
      if ((errorStatus = AudioQueueStart(audioQueue, NULL)) != noErr) { 
       error = [self errorForAudioQueueServiceWithOSStatus:errorStatus]; 
       NSLog(@"Could not restart the audio queue: %@", 
         [error localizedDescription]); 
      } 
     } 
    } 
    // ... 
} 

Se l'applicazione viene interrotto mentre è in primo piano, tutto funziona correttamente. Il problema appare, se l'interruzione avviene in background. Attivando il risultato sessione audio nell'errore gatto:

L'audio categoria sessione specificata non possono essere utilizzati per l'operazione tentata audio. Ad esempio, si è tentato di riprodurre o registrare audio con la categoria di sessione audio impostata su kAudioSessionCategory_AudioProcessing.

partire alla coda senza attivare i risultati di sessione nel codice di errore: -12985

A quel punto la categoria è impostato su AVAudioSessionCategoryPlayAndRecord e la modalità è AVAudioSessionModeDefault.

Non sono riuscito a trovare alcuna documentazione per questo messaggio di errore, né se è possibile riavviare una coda audio di input in background.

risposta

0

Al momento non è possibile riattivare se ci si trova in background.

+0

Ho pensato così. :-( –

0

Hai creato il supporto per l'app in background in info.plist? Non sono sicuro che la registrazione sia possibile in background, ma probabilmente è necessario aggiungere "Richiesto modalità di sfondo" e quindi un valore in quella matrice di "App riproduce audio"

Aggiornamento Ho appena controllato e registrato in lo sfondo è possibile.

+0

Le opere di registrazione bene in sottofondo. Il problema appare, se l'interruzione della sessione audio termina in background. –

+0

Hai provato a utilizzare gli eventi di controllo remoto? Ovviamente l'utente dovrà premere il pulsante. ** [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; ** –

+0

Ho riscontrato lo stesso problema: quando la registrazione viene interrotta mentre l'applicazione è in background, nessuna notifica di "interruzione di fine" viene attivata in qualsiasi momento nell'applicazione. Siccome l'applicazione iTalk gestisce correttamente questo tipo di interruzione, dovrebbe esserci una soluzione ... – Denis

7

Sì, è possibile, ma per riattivare la sessione sullo sfondo, la sessione audio deve o impostare AudioSessionProperty kAudioSessionProperty_OverrideCategoryMixWithOthers

OSStatus propertySetError = 0; 
    UInt32 allowMixing = true; 



    propertySetError = AudioSessionSetProperty (
               kAudioSessionProperty_OverrideCategoryMixWithOthers, 
               sizeof (allowMixing), 
               &allowMixing 
               ); 

o l'applicazione deve receive remote control command events:

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
[self becomeFirstResponder]; 
+0

Grazie! Lo avevo inseguito per diversi giorni! Avrei +10 se potessi :-) –