Search code examples
audioipod

iPod touch not detecting the earphone


I use the below mentioned code to identify if any 'earphone' is connected to the iOS device.

//find out, if any earphones are connected to the device
- (BOOL)isHeadsetPluggedIn {
    UInt32 routeSize = sizeof (CFStringRef);
    CFStringRef route;
    NSLog(@"Inside 'isHeadsetPluggedIn'");

    // Registers the audio route change listener callback function
    AudioSessionAddPropertyListener (kAudioSessionProperty_AudioRouteChange, audioRouteChangeListenerCallback, (__bridge void *)(self));

    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*)CFBridgingRelease(route);
        NSRange headphoneRange = [routeStr rangeOfString : @"Head"];
        NSLog(@"route %@", routeStr);
        if (headphoneRange.location != NSNotFound) {
            return YES;
        }
    } else {
        NSLog(@"Error %d while retrieving audio property", error);
    }
    return NO;
}

The above code is working fine for iPad mini, iPad and iPhone devices. But in 'iPod touch' device, 'AudioSessionGetProperty' function is returning error 'Error '560557673' while retrieving audio property'. Hence it is not detecting if any 'earphone' is connected to the 'iPod touch' device.

How to find out the 'earphone' on 'iPod touch' device'?


Solution

  • I could resolve this issue, using the below mentioned method (found from 'SO', but not remembering the address).

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

    And by calling,

    isAudioRouteAvailable(kAudioSessionOutputRoute_Headphones)