Search code examples
objective-cccocoamacosheadphones

How to detect something in headphone jack on a Mac?


Is there a way to detect if something is plugged into the headphone jack of a Mac using c or objective-c?

Thanks


Solution

  • Should you still want to dive in and mess with this deep magic I was able to construct something together form the code I found here:

    http://www.iphonedevsdk.com/forum/iphone-sdk-development/54013-hardware-volume-change-listener-callback.html

    You want to register a listen to the AudioProperties and catch any messages about 'kAudioSessionProperty_AudioRouteChange'. Using the 'reason' and the 'name' you can parse togather what happened. You can also read more about that here:

    http://developer.apple.com/library/ios/#DOCUMENTATION/AudioToolbox/Reference/AudioSessionServicesReference/Reference/reference.html

    // Registers this class as the delegate of the audio session.
    [[AVAudioSession sharedInstance] setDelegate: self];
    
    // Use this code instead to allow the app sound to continue to play when the screen is locked.
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];
    
    // Registers the audio route change listener callback function
    AudioSessionAddPropertyListener (kAudioSessionProperty_AudioRouteChange, audioRouteChangeListenerCallback, self);
    

    Callback:

    void audioRouteChangeListenerCallback (void *inUserData, AudioSessionPropertyID inPropertyID, UInt32 inPropertyValueSize, const void *inPropertyValue ) {
        // ensure that this callback was invoked for a route change
        if (inPropertyID != kAudioSessionProperty_AudioRouteChange) return;
    
    
        {
            // Determines the reason for the route change, to ensure that it is not
            //      because of a category change.
            CFDictionaryRef routeChangeDictionary = (CFDictionaryRef)inPropertyValue;
    
            CFNumberRef routeChangeReasonRef = (CFNumberRef)CFDictionaryGetValue (routeChangeDictionary, CFSTR (kAudioSession_AudioRouteChangeKey_Reason) );
            SInt32 routeChangeReason;
            CFNumberGetValue (routeChangeReasonRef, kCFNumberSInt32Type, &routeChangeReason);
    
            if (routeChangeReason == kAudioSessionRouteChangeReason_OldDeviceUnavailable) {
    
                //Handle Headset Unplugged
            } else if (routeChangeReason == kAudioSessionRouteChangeReason_NewDeviceAvailable) {
                        //Handle Headset plugged in
            }
    
        }
    }