2011-09-08 21 views
7

Estoy tratando de averiguar cómo detectar qué dispositivos de audio están conectados en iphone/ipad/ipod. Sé todo sobre las llamadas de ruta de audio y las devoluciones de llamadas de cambio de ruta, pero estas no me dicen nada sobre lo que se adjunta. Solo informan dónde se enruta actualmente el audio. Necesito saber, por ejemplo, si los auriculares y/o Bluetooth todavía están conectados mientras el audio se enruta a través de los altavoces. O, por ejemplo, si un usuario conecta el auricular mientras usa bluetooth y luego decide desconectar el bluetooth, necesito saber que el bluetooth está desconectado, incluso cuando el audio sigue enrutando a través de los auriculares.Detectar dispositivos de audio conectados iOS

+1

Tengo un problema similar en mi aplicación, mi aplicación está jugando flujo correctamente, pero si cambio de la salida de audio (auriculares desenchufado), que deja de jugar .. ¿U figureout cómo detectar cuando la salida de audio se cambia? –

+2

Sí, la detección de un cambio de ruta se realiza a través de una devolución de llamada AudioSessionPropertyListener. El detector de propiedades se registra a través de la función AudioSessionAddPropertyListener. Sin embargo, eso no es lo que estaba tratando de hacer arriba. En mi aplicación, necesito detectar qué dispositivos están conectados para mostrar correctamente las opciones de enrutamiento disponibles para el usuario. – Cliff

Respuesta

0

Puede obtener de las propiedades AudioSession una lista de InputSources y OutputDestinations. Salida estas propiedades de sesión:

kAudioSessionProperty_InputSources 
kAudioSessionProperty_OutputDestinations 

Y para consultar los detalles de cada uno, puede utilizar:

kAudioSessionProperty_InputSource 
kAudioSessionProperty_OutputDestination 
+0

Estas propiedades son para accesorios USB, por lo que no se aplican en mi situación. Estoy buscando detectar cuando un bluetooth o un auricular con cable está conectado. – Cliff

+0

Vaya, disculpe, veo la diferencia en su pregunta ahora. – MOK9

1

En caso de iOS 5 se debe utilizar:

CFStringRef newRoute; 
size = sizeof(CFStringRef); 
XThrowIfError(AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &size, &newRoute), "couldn't get new audio route"); 
if (newRoute) 
{ 
    CFShow(newRoute); 
    if (CFStringCompare(newRoute, CFSTR("HeadsetInOut"), NULL) == kCFCompareEqualTo) // headset plugged in 
      { 
      colorLevels[0] = .3;     
      colorLevels[5] = .5; 
      } 
    else if (CFStringCompare(newRoute, CFSTR("SpeakerAndMicrophone"), NULL) == kCFCompareEqualTo) 
} 
0

Desafortunadamente , a partir de iOS11, parece que no hay API para obtener de manera confiable la lista de los dispositivos de salida que están conectados actualmente: tan pronto como la ruta actual cambie, solo verá 1 dispositivo (actualmente enrutado) a través de AVAu dioSession's currentRoute.outputs, aunque todavía se pueden conectar varios dispositivos.

Sin embargo, para la entrada, y que incluye los dispositivos Bluetooth con el perfil HFP, si el modo de sesión de audio adecuado se utiliza (AVAudioSessionModeVoiceChat o AVAudioSessionModeVideoChat por ejemplo), se puede obtener la lista de las entradas disponibles a través de AVAudioSession de availableInputs, y aquellos las entradas se enumeran allí incluso cuando ese dispositivo no es una ruta activa; esto es muy útil cuando un usuario está haciendo una anulación manual a través del MPVolumeView de Bluetooth al altavoz, por ejemplo, y ya que HFP es un IO bidireccional (tiene ambas entradas y salida), puede juzgar si la salida HFP Bluetooth todavía está disponible mirando las entradas.

BOOL isBtInputAvailable = NO; 
NSArray *inputs = [[AVAudioSession sharedInstance] availableInputs]; 
for (AVAudioSessionPortDescription* port in inputs) { 
    if ([port.portType isEqualToString:AVAudioSessionPortBluetoothHFP]) { 
     isBtInputAvailable = YES; 
     break; 
    } 
} 
Cuestiones relacionadas