2012-06-18 15 views
6

Staram się, aby moja aplikacja audio była odtwarzana w tle. Dotychczas dodałem „aplikacja odtwarza dźwięk” na „wymaganych trybów tle” w Info.plist a także następujących kodów tuż przed rozpoczęciem mój generator dźwięku:Dźwięk w tle w iOS zatrzymuje się, gdy ekran jest zablokowany.

AudioSessionInitialize(NULL, kCFRunLoopDefaultMode, &interruptionListener, sgD); 
AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, &routeChangeListener, sgD); 

// select "Playback" audio session category 
NSError *setCategoryError = nil; 
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &setCategoryError]; 

OSStatus propertySetError = 0; 
UInt32 category = kAudioSessionCategory_MediaPlayback; 
propertySetError = AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof (category), &category); 

AudioSessionSetActive(true); 

Jednak ta działa tylko wtedy, kiedy przełączyć się do innej aplikacji lub na główny ekran iPoda. Kiedy wyłączam ekran, wyłącza również moje wyjście audio, co zdecydowanie nie jest tym, czego chcę. Jednak wszystkie samouczki/dokumentacja/odpowiedzi na pytania dotyczące stackoverflow wydają się wskazywać, że utrzymywanie dźwięku działającego, gdy ekran jest wyłączony, przychodzi automatycznie, gdy dostaniesz dźwięk tła do działania. Czy ktoś ma dla mnie wskazówkę? Z góry dziękuję! Fritz

+0

Co ja zapomniałem powiedzieć: Używam AudioQueues do generowania strumienia wyjściowego audio. Callback kolejki audio zostanie wywołany, gdy ekran jest wyłączony, ale nie słychać dźwięku w słuchawkach. Może to wskazywać na problem z trasą audio. Jednak wywołanie zwrotne zmiany trasy nigdy nie jest wywoływane. –

+4

OK, problem rozwiązany ... Okazuje się, że rozmiar bufora audio musi być wystarczająco duży, jeśli powinien działać, gdy ekran jest wyłączony. Nie wiem, czy dotyczy to wszystkich aplikacji, ale moja aplikacja wymagała bufora o wielkości co najmniej 2048 próbek. Przy 1024 próbkach przestało działać. –

+3

Jeśli byłeś w stanie go uruchomić, czy mógłbyś dodać swoje rozwiązanie jako odpowiedź? Dzięki. –

Odpowiedz

5

Ten artykuł wyjaśnia problem:

Technical Q&A QA1606 Audio Unit Processing Graph - Ensuring audio playback continues when screen is locked

Zasadniczo, po prostu trzeba upewnić się, że ustawienie wszystkich Audio Units wspierać 4096 plasterki:

// set the mixer unit to handle 4096 samples per slice since we want to keep rendering during screen lock 
UInt32 maxFPS = 4096; 
AudioUnitSetProperty(
    mMixer, 
    kAudioUnitProperty_MaximumFramesPerSlice, 
    kAudioUnitScope_Global, 
    0, 
    &maxFPS, 
    sizeof(maxFPS)); 
+0

Każdy pomysł, jak zastosować to do AVAudioEngine? – DrMickeyLauer

Powiązane problemy