From 7c931ad698bb90ec7a8f37bb045a1358751c619b Mon Sep 17 00:00:00 2001 From: peah Date: Thu, 24 Mar 2016 12:52:02 -0700 Subject: [PATCH] Fixed a potential deadlock problem in the AGC where the render and capture locks were acquired in the wrong order. BUG=webrtc:5339 Review URL: https://codereview.webrtc.org/1827013002 Cr-Commit-Position: refs/heads/master@{#12122} --- .../audio_processing/gain_control_impl.cc | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/webrtc/modules/audio_processing/gain_control_impl.cc b/webrtc/modules/audio_processing/gain_control_impl.cc index db1c585ca9..d190284063 100644 --- a/webrtc/modules/audio_processing/gain_control_impl.cc +++ b/webrtc/modules/audio_processing/gain_control_impl.cc @@ -336,7 +336,6 @@ GainControl::Mode GainControlImpl::mode() const { int GainControlImpl::set_analog_level_limits(int minimum, int maximum) { - rtc::CritScope cs(crit_capture_); if (minimum < 0) { return AudioProcessing::kBadParameterError; } @@ -349,12 +348,20 @@ int GainControlImpl::set_analog_level_limits(int minimum, return AudioProcessing::kBadParameterError; } - minimum_capture_level_ = minimum; - maximum_capture_level_ = maximum; + size_t num_proc_channels_local = 0u; + int sample_rate_hz_local = 0; + { + rtc::CritScope cs(crit_capture_); - RTC_DCHECK(num_proc_channels_); - RTC_DCHECK(sample_rate_hz_); - Initialize(*num_proc_channels_, *sample_rate_hz_); + minimum_capture_level_ = minimum; + maximum_capture_level_ = maximum; + + RTC_DCHECK(num_proc_channels_); + RTC_DCHECK(sample_rate_hz_); + num_proc_channels_local = *num_proc_channels_; + sample_rate_hz_local = *sample_rate_hz_; + } + Initialize(num_proc_channels_local, sample_rate_hz_local); return AudioProcessing::kNoError; }