¿Cómo envío el audio al altavoz sin utilizar AudioSessionSetProperty?

Como AudioSessionSetProperty puede quedar en deprecated , estoy tratando de encontrar un ejemplo de código de cómo enrutar el audio al speaker por otros medios.

Anteriormente, hice lo siguiente:

 -(void)setSpeakerEnabled { debugLog(@"%s",__FUNCTION__); UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; AudioSessionSetProperty ( kAudioSessionProperty_OverrideAudioRoute, sizeof (audioRouteOverride), &audioRouteOverride ); } 

Intentando obtener el mismo resultado pero without call a AudioSessionSetProperty .

En cada versión de iOS, la mayoría de las propiedades de audioSession se migran a AVFoundation, por lo que debe usarlas de preferencia siempre que esté disponible.

Dado que iOS 6 kAudioSessionProperty_OverrideAudioRoute está representado en AVAudioSession por el método

 - (BOOL)overrideOutputAudioPort:error: 

Los valores disponibles son AVAudioSessionPortOverrideNone y AVAudioSessionPortOverrideSpeaker

Aquí hay una sesión de audio de ejemplo configurada completamente a través de AVFoundation:

  - (void)configureAVAudioSession { // Get your app's audioSession singleton object AVAudioSession *session = [AVAudioSession sharedInstance]; // Error handling BOOL success; NSError *error; // set the audioSession category. // Needs to be Record or PlayAndRecord to use audioRouteOverride: success = [session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error]; if (!success) { NSLog(@"AVAudioSession error setting category:%@",error); } // Set the audioSession override success = [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error]; if (!success) { NSLog(@"AVAudioSession error overrideOutputAudioPort:%@",error); } // Activate the audio session success = [session setActive:YES error:&error]; if (!success) { NSLog(@"AVAudioSession error activating: %@",error); } else { NSLog(@"AudioSession active"); } } 

ACTUALIZAR

Desde iOS 7.0, la API C de Audio Session Services ahora está totalmente obsoleta a favor de AVAudioSession.

ACTUALIZACIÓN 2

 - (BOOL)overrideOutputAudioPort:error: 

es un método, no una propiedad, y establece un valor subyacente solo de escritura UInt32. No puede obtener el valor actual, y debe tratar el método como establecer un estado temporal. Si la ruta de audio cambia o se interrumpe, la propiedad se restablece a su valor predeterminado ( AVAudioSessionPortOverrideNone ). Puede recibir notificaciones de interrupción a través de AVAudioSessionDelegate .

 NSError *error; [[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error]; if(error) { NSLog(@"Error: AudioSession cannot use speakers"); } 

La solución de Foundry junto con este blog de Mario Diana también me permitió actualizar el código de configuración de la sesión de audio obsoleto en iOS 7. Mi código anterior estaba basado en AudioBufferPlayer por Matthijs Hollemans . Recuerde agregar el marco AVFoundation.