From df5635e506588b335748c3095b59747f33addda6 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 25 Mar 2011 16:41:35 +0100 Subject: [PATCH] fix speaker button behavior --- Classes/LinphoneUI/UISpeakerButton.m | 35 ++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/Classes/LinphoneUI/UISpeakerButton.m b/Classes/LinphoneUI/UISpeakerButton.m index adeb0490e..3ad08dd18 100644 --- a/Classes/LinphoneUI/UISpeakerButton.m +++ b/Classes/LinphoneUI/UISpeakerButton.m @@ -19,9 +19,27 @@ #import "UISpeakerButton.h" #import +#include "linphonecore.h" @implementation UISpeakerButton +static void audioRouteChangeListenerCallback ( + void *inUserData, // 1 + AudioSessionPropertyID inPropertyID, // 2 + UInt32 inPropertyValueSize, // 3 + const void *inPropertyValue // 4 + ) { + if (inPropertyID != kAudioSessionProperty_AudioRouteChange) return; // 5 + [(UISpeakerButton*)inUserData reset]; + +} + +-(void) initWithOnImage:(UIImage*) onImage offImage:(UIImage*) offImage { + [super initWithOnImage:onImage offImage:offImage]; + AudioSessionPropertyID routeChangeID = kAudioSessionProperty_AudioRouteChange; + AudioSessionAddPropertyListener(routeChangeID, audioRouteChangeListenerCallback, self); +} + -(void) onOn { //redirect audio to speaker @@ -38,13 +56,16 @@ , &audioRouteOverride); } -(bool) isInitialStateOn { - UInt32 audioRouteOverride; - UInt32 size = sizeof (audioRouteOverride); - AudioSessionGetProperty (kAudioSessionProperty_OverrideAudioRoute - , &size - , (void*)(&audioRouteOverride)); - return kAudioSessionOverrideAudioRoute_Speaker == audioRouteOverride; - + CFStringRef lNewRoute=CFSTR("Unknown"); + UInt32 lNewRouteSize = sizeof(lNewRoute); + OSStatus lStatus = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute + ,&lNewRouteSize + ,&lNewRoute); + if (!lStatus && CFStringGetLength(lNewRoute) > 0) { + ms_message("Current audio route is [%s]",CFStringGetCStringPtr(lNewRoute, kCFStringEncodingUTF8)); + return (kCFCompareEqualTo == CFStringCompare (lNewRoute,CFSTR("Speaker"),0)); + } else + return false; }