Jan 27, 2010 Comments
iPhone SDK: Making Your AudioSession Routes Play Nicely with the Vibrate Switch
So, you’re writing an awesome multimedia application for the iPhone. Everything’s going swimmingly, and you even have some nice animation effects for when the iPhone is plugged into an external accessory, just like the iPod app:
- (void)toggleVolumeDisplay: (BOOL)show
{
BOOL isShowing = (volumeSlider.alpha > 0.0);
if( isShowing && !show )
{
// Animate volume slider down and out, while animating play controls to center of view
}
else if( !isShowing && show )
{
// Animate volume slider in, while animating play controls up to the top of the view
}
}
Or something like that. That’s purely to illustrate what you might be doing in response to a run-of-the-mill hardware route change (headphones plugged in, connected to speaker dock, etc.), which of course you’re detecting like this:
// When the view is loaded
AudioSessionAddPropertyListener( kAudioSessionProperty_AudioRouteChange, RouteChangeListener, (void *)self);
// Called later as part of your listener callback
CFStringRef state = nil;
UInt32 propertySize = sizeof(CFStringRef);
OSStatus result = AudioSessionGetProperty( kAudioSessionProperty_AudioRoute, &propertySize, &state);
if( result == kAudioSessionNoError)
{
if( CFStringGetLength(state) > 0)
{
if ([(NSString *)state compare:@"LineOut"] == NSOrderedSame) // only special case we care about
shouldShowVolumeControl = NO;
}
else
; // vibrate switch engaged
}
else
{
if (result == kAudioSessionUnsupportedPropertyError)
shouldShowVolumeControl = NO; // probably simulator
else
; // error encountered
}
This has been documented in plenty of places.
Read the rest of this entry »