Piszę aplikację na iOS, używając AudioQueue do nagrywania. Tworzę kolejkę wejściową skonfigurowaną do uzyskania liniowego PCM, stwierdziłem tę kolejkę i wszystko działa zgodnie z oczekiwaniami.

Aby zarządzać przerwaniami, zaimplementowałem metody delegata AVAudioSession, aby wyłapać początek i koniec przerwania. Metoda endInterruption wygląda następująco:

- (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]);
            }
        }
    }
    // ...
}

Jeśli aplikacja zostanie przerwana, gdy jest na pierwszym planie, wszystko działa poprawnie. Problem pojawia się, jeśli przerwa ma miejsce w tle. Aktywacja sesji audio powoduje błąd !cat:

Określona kategoria sesji audio nie może być użyta do próby wykonania operacji audio. Na przykład próbowałeś odtworzyć lub nagrać dźwięk z kategorią sesji audio ustawioną na kAudioSessionCategory_AudioProcessing.

Uruchomienie kolejki bez aktywacji sesji powoduje wyświetlenie kodu błędu: -12985

W tym momencie kategoria jest ustawiona na AVAudioSessionCategoryPlayAndRecord, a tryb to AVAudioSessionModeDefault.

Nie mogłem znaleźć żadnej dokumentacji dla tego komunikatu o błędzie, ani czy jest możliwe ponowne uruchomienie kolejki wejściowej audio w tle.

8
Tobias Kräntzer 14 luty 2012, 16:04

3 odpowiedzi

Najlepsza odpowiedź

Obecnie nie ma możliwości ponownej aktywacji, jeśli pracujesz w tle.

0
Aran Mulholland 15 luty 2012, 04:48

Tak, jest to możliwe, ale aby ponownie aktywować sesję w tle, sesja audio musi albo ustawić AudioSessionProperty kAudioSessionProperty_OverrideCategoryMixWithOthers

OSStatus propertySetError = 0;
    UInt32 allowMixing = true;



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

Lub aplikacja musi odbierać zdarzenia poleceń zdalnego sterowania< /a>:

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];
8
nekiTamoTip 22 marzec 2012, 16:15

Czy Twoja aplikacja obsługuje tło w info.plist? Nie jestem pewien, czy nagrywanie jest możliwe w tle, ale prawdopodobnie musisz dodać „Wymagane tryby tła”, a następnie wartość w tej tablicy „Aplikacja odtwarza dźwięk”

Aktualizacja Właśnie sprawdziłem i możliwe jest nagrywanie w tle.

0
Jack Freeman 15 luty 2012, 00:35