2012-06-18 23 views
6

Estoy intentando que mi aplicación de audio se reproduzca en segundo plano. Hasta ahora he añadido "de la aplicación para reproducir audio que" a los "modos requeridos de fondo" en info.plist y también el siguiente código justo antes de comenzar mi generador de sonido:El audio de fondo de iOS se detiene cuando la pantalla está bloqueada

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); 

Sin embargo, esto sólo funciona cuando cambio a otra aplicación o a la pantalla principal del iPod. Cuando apago la pantalla, también apaga mi salida de audio, que definitivamente no es lo que quiero. Sin embargo, todos los tutoriales/documentación/respuestas a las preguntas sobre el stackoverflow parecen indicar que mantener el audio en ejecución mientras la pantalla está apagada se produce automáticamente cuando el audio de fondo funciona. ¿Alguien tiene una pista para mí? ¡Muchas gracias por adelantado! Fritz

+0

Lo que olvidó decir: Estoy usando AudioQueues para generar la secuencia de salida de audio. La devolución de llamada de Audio Queue se activa mientras la pantalla está apagada, pero no se escucha el sonido en los auriculares. Esto podría indicar algún problema de ruta de audio. Sin embargo, nunca se llama mi devolución de llamada de cambio de ruta. –

+4

Ok, problema resuelto ... Resulta que el tamaño del búfer de audio debe ser lo suficientemente grande si se ejecuta mientras la pantalla está apagada. No sé si esto se aplica a todas las aplicaciones, pero mi aplicación necesitaba un tamaño de búfer de al menos 2048 muestras. Con 1024 muestras, simplemente dejó de funcionar. –

+3

Si pudiera hacer que funcione, ¿podría agregar su solución como respuesta? Gracias. –

Respuesta

5

En este artículo se explica el problema:

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

Básicamente, sólo tiene que asegurarse de asignar a todas las AudioUnits para apoyar 4096 rebanadas:

// 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

¿Alguna idea de cómo aplicar esto a AVAudioEngine? – DrMickeyLauer

Cuestiones relacionadas