iphone - solo - Detecta si los auriculares(no el micrófono) están enchufados a un dispositivo iOS
mi iphone solo se escucha en altavoz (4)
Esta pregunta ya tiene una respuesta aquí:
- ¿Están enchufados los auriculares? iOS7 7 respuestas
Necesito cambiar mi audio dependiendo de si los auriculares están enchufados o no. Conozco kAudioSessionProperty_AudioInputAvailable, que me dirá si hay un micrófono, pero me gustaría probar los auriculares, no solo los auriculares con un built-in. en el micrófono es posible?
Aquí hay una solución basada en el comentario de Rob Mayoff:
- (BOOL)isHeadsetPluggedIn
{
AVAudioSessionRouteDescription *route = [[AVAudioSession sharedInstance] currentRoute];
BOOL headphonesLocated = NO;
for( AVAudioSessionPortDescription *portDescription in route.outputs )
{
headphonesLocated |= ( [portDescription.portType isEqualToString:AVAudioSessionPortHeadphones] );
}
return headphonesLocated;
}
Simplemente enlace al marco de AVFoundation.
Aquí hay un método mío que es una versión ligeramente modificada de uno encontrado en este sitio: http://www.iphonedevsdk.com/forum/iphone-sdk-development/9982-play-record-same-time.html
- (BOOL)isHeadsetPluggedIn {
UInt32 routeSize = sizeof (CFStringRef);
CFStringRef route;
OSStatus error = AudioSessionGetProperty (kAudioSessionProperty_AudioRoute,
&routeSize,
&route);
/* Known values of route:
* "Headset"
* "Headphone"
* "Speaker"
* "SpeakerAndMicrophone"
* "HeadphonesAndMicrophone"
* "HeadsetInOut"
* "ReceiverAndMicrophone"
* "Lineout"
*/
if (!error && (route != NULL)) {
NSString* routeStr = (NSString*)route;
NSRange headphoneRange = [routeStr rangeOfString : @"Head"];
if (headphoneRange.location != NSNotFound) return YES;
}
return NO;
}
Comencé con el código dado arriba por jpsetung, pero hubo algunos problemas con mi caso de uso:
- No hay evidencia de algo llamado
kAudioSessionProperty_AudioRoute
en los documentos -
route
fugas - Sin sesión de audio
- Comprobación de cuerdas para auriculares en lugar de conciencia lógica de las categorías
- Estaba más interesado en si el iPhone estaba usando sus parlantes, con "auriculares" que significa "cualquier cosa que no sean parlantes". Siento que omitir opciones como "bluetooth", "airplay" o "lineout" era peligroso.
Esta implementación amplía la verificación para permitir cualquier tipo de salida especificada:
BOOL isAudioRouteAvailable(CFStringRef routeType)
{
/*
As of iOS 5:
kAudioSessionOutputRoute_LineOut;
kAudioSessionOutputRoute_Headphones;
kAudioSessionOutputRoute_BluetoothHFP;
kAudioSessionOutputRoute_BluetoothA2DP;
kAudioSessionOutputRoute_BuiltInReceiver;
kAudioSessionOutputRoute_BuiltInSpeaker;
kAudioSessionOutputRoute_USBAudio;
kAudioSessionOutputRoute_HDMI;
kAudioSessionOutputRoute_AirPlay;
*/
//Prep
BOOL foundRoute = NO;
CFDictionaryRef description = NULL;
//Session
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
AudioSessionInitialize(NULL, NULL, NULL, NULL);
});
//Property
UInt32 propertySize;
AudioSessionGetPropertySize(kAudioSessionProperty_AudioRouteDescription, &propertySize);
OSStatus error = AudioSessionGetProperty(kAudioSessionProperty_AudioRouteDescription, &propertySize, &description);
if ( !error && description ) {
CFArrayRef outputs = CFDictionaryGetValue(description, kAudioSession_AudioRouteKey_Outputs);
CFIndex count = CFArrayGetCount(outputs);
if ( outputs && count ) {
for (CFIndex i = 0; i < count; i++) {
CFDictionaryRef route = CFArrayGetValueAtIndex(outputs, i);
CFStringRef type = CFDictionaryGetValue(route, kAudioSession_AudioRouteKey_Type);
NSLog(@"Got audio route %@", type);
//Audio route type
if ( CFStringCompare(type, routeType, 0) == kCFCompareEqualTo ) {
foundRoute = YES;
break;
}
}
}
} else if ( error ) {
NSLog(@"Audio route error %ld", error);
}
//Cleanup
if ( description ) {
CFRelease(description);
}
//Done
return foundRoute;
}
Usado así:
if ( isAudioRouteAvailable(kAudioSessionOutputRoute_BuiltInSpeaker) ) {
//Do great things...
}
Solo un aviso para los futuros lectores de esta publicación.
La mayoría de los métodos de AVToolbox han quedado en desuso con el lanzamiento de iOS 7 sin alternativa, por lo que los oyentes de audio ahora son en gran medida redundantes