5

Tengo una aplicación que sí escucha y reproduce sonido al mismo tiempo. Por defecto, la salida de sonido pasa por el auricular. Así que utilizo el siguiente código para enrutarlo a través del altavoz:Enrutamiento Sonido de audio de iPhone

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride); 

Esto funciona bien. Pero ahora, me gustaría enrutar el sonido a través de los auriculares cuando se conectan auriculares o parlantes externos. ¿Cómo lo lograría?

También idealmente, todos los demás sonidos (es decir, música, etc.) deberían silenciarse cuando se inicie la aplicación.

Gracias!

Respuesta

11

Para hacer esto hay que añadir que escucha la propiedad cuando sesión de audio configuración:

AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, audioSessionPropertyListener, nil); 

Dónde

void audioSessionPropertyListener(void* inClientData, AudioSessionPropertyID inID, 
              UInt32 inDataSize, const void* inData) { 
      UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 

      if (!isHeadsetPluggedIn()) 
      AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride); 
     } 

BOOL isHeadsetPluggedIn() { 
    UInt32 routeSize = sizeof (CFStringRef); 
    CFStringRef route; 

    OSStatus error = AudioSessionGetProperty (kAudioSessionProperty_AudioRoute, 
              &routeSize, 
              &route 
              ); 



    if (!error && (route != NULL) && ([(NSString*)route rangeOfString:@"Head"].location != NSNotFound)) { 
     NSLog(@"HeadsetPluggedIn"); 
     return YES; 
     } 
     NSLog(@"Headset_NOT_PluggedIn"); 
     return NO; 
    } 

Así que cuando se conectan los auriculares o salida recibirá una notificación y cambiar de audio dirección de salida.

+0

Esto no funciona para mí. ¿Alguna ayuda? –

1

Esta es una manera rápida y sucia y parece que funciona para mí:

void sessionPropertyListener(void *     inClientData, 
          AudioSessionPropertyID inID, 
          UInt32     inDataSize, 
          const void *   inData){ 

    if (inID == kAudioSessionProperty_AudioRouteChange) 
    { 
    CFStringRef newRoute; 
    UInt32 size = sizeof(CFStringRef); 
    AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &size, &newRoute); 
    if (newRoute) 
    { 
     CFShow(newRoute); 
     if (CFStringCompare(newRoute, CFSTR("ReceiverAndMicrophone"), 
          (UInt32)NULL) == kCFCompareEqualTo)//if receiver, play through speakers 
     { 
     UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
     AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, 
           sizeof(audioRouteOverride), 
           &audioRouteOverride); 
     } 
     else if (CFStringCompare(newRoute, CFSTR("HeadsetInOut"), 
           (UInt32)NULL) == kCFCompareEqualTo)//headset 
     { 
     UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None; 
     AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, 
           sizeof(audioRouteOverride), 
           &audioRouteOverride); 
     } 
    } 
    } 
} 
0

Con AudioSessionSetProperty desuso desde iOS 7 debemos utilizar AVFoundation AVAudioSession. Como la acción deseada es permitir que una acción del usuario anule la ruta a través del altavoz, puede considerar la diferencia entre AVAudioSessionPortOverrideSpeaker y AVAudioSessionCategoryOptionDefaultToSpeaker.

acuerdo con el Boletín Técnico Q & Un QA1754: ". Cuando se utiliza AVAudioSessionCategoryOptionDefaultToSpeaker, se respetarán los gestos del usuario, por ejemplo, conectar un auricular hará que la ruta para cambiar a los auriculares de micrófono/auriculares y desconectar los auriculares hará que la ruta para cambiar al micrófono/altavoz incorporado ".

Tenga en cuenta que el boletín técnico explica que AVAudioSessionPortOverrideSpeaker sería más apropiado para su uso con un botón de altavoz, por ejemplo, que no es lo que la publicación original estaba pidiendo.

https://developer.apple.com/library/ios/qa/qa1754/_index.html

Mi propia aplicación se llama antes invoco el jugador de la siguiente manera:

NSError *error; 
AVAudioSession* audioSession = [AVAudioSession sharedInstance]; 
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&error]; 
// handle any error 
// initiate the player or recorder 
[_player play]; 

También esta pregunta es similar a la que se atendió en un puesto diferente pero relacionado.

De acuerdo con el mismo boletín técnico al que se hace referencia aquí "Piensa en usar overrideOutputAudioPort: en términos de lo que puedes usar para implementar un botón Speakerphone donde deseas poder alternar entre el altavoz (AVAudioSessionPortOverrideSpeaker) y la ruta de salida normal (AVAudioSessionPortOverrideNone). "

referirse a ese puesto si usted está buscando la aplicación de la categoría anular overrideOutputPort altavoz: How Do I Route Audio to Speaker without using AudioSessionSetProperty?

Cuestiones relacionadas