2010-09-16 15 views
14

Ich muss meine Audio abhängig davon ändern, ob Kopfhörer angeschlossen sind oder nicht. Ich kenne kAudioSessionProperty_AudioInputAvailable, die mir sagen, ob es ein Mikrofon gibt, aber Ich möchte auf jeden Kopfhörer testen, nicht nur auf Kopfhörer mit eingebautem Mikrofon. Ist das möglich? HierErmitteln, ob Kopfhörer (nicht Mikrofon) an ein iOS-Gerät angeschlossen sind

+1

@Brad Larson Die Antwort auf diese Frage gab mir nicht die Informationen, die ich brauche. Meine Frage spezifiziert _headphones_, kein Mikrofon. Ich glaube, die akzeptierte Antwort auf die Frage, die Sie verknüpft haben, beschreibt, wie man erkennt, ob ein Mikrofon eingesteckt ist. – morgancodes

+0

Ja, ich denke, Sie fragen nach einer Verfeinerung dieser Frage, bei der das Erkennen der Audioeingabe nicht gut genug ist. Vielleicht könnten einige der Diskussionen um [diese Frage] (http://stackoverflow.com/questions/1238758/how-can-i-detect-if-headphones-are-connected-to-an-ipod-touch-g1) möglicherweise auch hilfreich sein. –

+0

Danke, dass Sie mich auf diese Frage hingewiesen haben. – morgancodes

Antwort

28

ist eine Methode meiner eigenen, das ist eine leicht modifizierte Version eines auf dieser Website: 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; 
} 
+0

das scheint nur nicht zu funktionieren :(kümmern sich um Ihre Antwort zu aktualisieren? – binnyb

+0

was nicht funktioniert? Kompilieren nicht? Ich verwende dieses Stück Code in einem Spiel und es funktioniert für mich. – jptsetung

+0

NO wird immer zurückgegeben, unabhängig Wenn meine Kopfhörer angeschlossen sind – binnyb

1

ich mit dem Code Gestartet von jpsetung oben angegebenen, aber es gab ein paar Probleme mit ihm für meinen Anwendungsfall:

  • Kein Nachweis von so genannten kAudioSessionProperty_AudioRoute in der Dokumentation
  • Leaks route
  • Kein Audio Session Check
  • String-Check für Kopfhörer statt logische Wahrnehmung der Kategorien
  • Ich war mehr daran interessiert, ob das iPhone seine Lautsprecher verwendet, mit "Kopfhörer" bedeutet "alles andere als Lautsprecher". Ich denke, dass das Auslassen von Optionen wie "Bluetooth", "Airplay" oder "Lineout" gefährlich ist.

Diese Implementierung erweitert den Scheck für jede Art von bestimmten Ausgang zu ermöglichen:

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

wie so verwendet:

if (isAudioRouteAvailable(kAudioSessionOutputRoute_BuiltInSpeaker)) { 
    //Do great things... 
} 
+2

Sehen Sie sich '- [AVAudioSession currentRoute]' für eine Objective-C-Schnittstelle zu diesen Informationen ab iOS 6.0 an. –

+0

Definitiv eine gute Anmerkung, aber nur wenn Sie AVFoundation verlinken (der obige Code ist für AudioToolbox) – SG1

3

Nur ein Heads für zukünftige Leser dieses Beitrags auf. Link

- (BOOL)isHeadsetPluggedIn 
{ 
    AVAudioSessionRouteDescription *route = [[AVAudioSession sharedInstance] currentRoute]; 

    BOOL headphonesLocated = NO; 
    for(AVAudioSessionPortDescription *portDescription in route.outputs) 
    { 
     headphonesLocated |= ([portDescription.portType isEqualToString:AVAudioSessionPortHeadphones]); 
    } 
    return headphonesLocated; 
} 

einfach an:

Die meisten der AVToolbox Methoden haben mit der Veröffentlichung von iOS 7 ohne Alternative so Audio-Hörer sind jetzt weitgehend redundanz

12

Hier ist eine Lösung auf rob mayoff Kommentar basiert veraltet das AVFoundation-Framework.

+0

Großartig !!!! Perfekt arbeiten. :) –

Verwandte Themen