From 9303eaf512dde59d97298f74afdd250f4bc0c347 Mon Sep 17 00:00:00 2001 From: Noah Richards Date: Wed, 27 May 2015 10:23:50 -0700 Subject: [PATCH] Don't unnecessarily set mode/category on AVAudioSession. Doing so clears transient properties on the session back to defaults. BUG= R=tkchin@webrtc.org Review URL: https://webrtc-codereview.appspot.com/52589004 Cr-Commit-Position: refs/heads/master@{#9297} --- .../audio_device/ios/audio_device_ios.mm | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/webrtc/modules/audio_device/ios/audio_device_ios.mm b/webrtc/modules/audio_device/ios/audio_device_ios.mm index 178ce3e0a9..47503a96d7 100644 --- a/webrtc/modules/audio_device/ios/audio_device_ios.mm +++ b/webrtc/modules/audio_device/ios/audio_device_ios.mm @@ -1189,20 +1189,26 @@ int32_t AudioDeviceIOS::InitPlayOrRecord() { "Could not set preferred sample rate: %s", errorString); } error = nil; - [session setMode:AVAudioSessionModeVoiceChat - error:&error]; - if (error != nil) { + // Make the setMode:error: and setCategory:error: calls only if necessary. + // Non-obviously, setting them to the value they already have will clear + // transient properties (such as PortOverride) that some other component may + // have set up. + if (session.mode != AVAudioSessionModeVoiceChat) { + [session setMode:AVAudioSessionModeVoiceChat error:&error]; + if (error != nil) { const char* errorString = [[error localizedDescription] UTF8String]; WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "Could not set mode: %s", errorString); + } } error = nil; - [session setCategory:AVAudioSessionCategoryPlayAndRecord - error:&error]; - if (error != nil) { + if (session.category != AVAudioSessionCategoryPlayAndRecord) { + [session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error]; + if (error != nil) { const char* errorString = [[error localizedDescription] UTF8String]; WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "Could not set category: %s", errorString); + } } //////////////////////