From abfa99d3d8fa9fd9f74c93af2e9786821d26157f Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Fri, 15 Feb 2013 10:55:23 +0100 Subject: [PATCH] Fix issue with speaker and headset(disabled speaker) --- Classes/LinphoneManager.h | 2 ++ Classes/LinphoneManager.m | 19 ++++++++++++++++++- Classes/LinphoneUI/UISpeakerButton.m | 1 + 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/Classes/LinphoneManager.h b/Classes/LinphoneManager.h index f3c38d984..5b4e8f741 100644 --- a/Classes/LinphoneManager.h +++ b/Classes/LinphoneManager.h @@ -132,6 +132,8 @@ typedef struct _LinphoneManagerSounds { - (void)refreshRegisters; +- (bool)allowSpeaker; + + (BOOL)copyFile:(NSString*)src destination:(NSString*)dst override:(BOOL)override; + (NSString*)bundleFile:(NSString*)file; + (NSString*)documentFile:(NSString*)file; diff --git a/Classes/LinphoneManager.m b/Classes/LinphoneManager.m index 4664c5460..96217b332 100644 --- a/Classes/LinphoneManager.m +++ b/Classes/LinphoneManager.m @@ -1115,6 +1115,23 @@ static int comp_call_state_paused (const LinphoneCall* call, const void* param) #pragma mark - Speaker Functions +- (bool)allowSpeaker { + bool notallow = false; + CFStringRef lNewRoute = CFSTR("Unknown"); + UInt32 lNewRouteSize = sizeof(lNewRoute); + OSStatus lStatus = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &lNewRouteSize, &lNewRoute); + if (!lStatus && lNewRouteSize > 0) { + NSString *route = (NSString *) lNewRoute; + notallow = [route isEqualToString: @"Headset"] || + [route isEqualToString: @"Headphone"] || + [route isEqualToString: @"HeadphonesAndMicrophone"] || + [route isEqualToString: @"HeadsetInOut"] || + [route isEqualToString: @"Lineout"]; + CFRelease(lNewRoute); + } + return !notallow; +} + static void audioRouteChangeListenerCallback ( void *inUserData, // 1 AudioSessionPropertyID inPropertyID, // 2 @@ -1142,7 +1159,7 @@ static void audioRouteChangeListenerCallback ( - (void)setSpeakerEnabled:(BOOL)enable { speakerEnabled = enable; - if(enable) { + if(enable && [self allowSpeaker]) { UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute , sizeof (audioRouteOverride) diff --git a/Classes/LinphoneUI/UISpeakerButton.m b/Classes/LinphoneUI/UISpeakerButton.m index 474bd6f8c..0cf70b561 100644 --- a/Classes/LinphoneUI/UISpeakerButton.m +++ b/Classes/LinphoneUI/UISpeakerButton.m @@ -92,6 +92,7 @@ static void audioRouteChangeListenerCallback ( } - (bool)onUpdate { + [self setEnabled:[[LinphoneManager instance] allowSpeaker]]; return [[LinphoneManager instance] speakerEnabled]; }