Index: webrtc/modules/audio_processing/echo_control_mobile_impl.cc |
diff --git a/webrtc/modules/audio_processing/echo_control_mobile_impl.cc b/webrtc/modules/audio_processing/echo_control_mobile_impl.cc |
index a653519fe22a70829c562ed53538857f9b1269cb..ca5f0b3a2a28106eba6f49d4e2f13f076836e2c1 100644 |
--- a/webrtc/modules/audio_processing/echo_control_mobile_impl.cc |
+++ b/webrtc/modules/audio_processing/echo_control_mobile_impl.cc |
@@ -15,7 +15,6 @@ |
#include "webrtc/modules/audio_processing/aecm/echo_control_mobile.h" |
#include "webrtc/modules/audio_processing/audio_buffer.h" |
-#include "webrtc/system_wrappers/include/critical_section_wrapper.h" |
#include "webrtc/system_wrappers/include/logging.h" |
namespace webrtc { |
@@ -70,11 +69,13 @@ size_t EchoControlMobile::echo_path_size_bytes() { |
EchoControlMobileImpl::EchoControlMobileImpl( |
const AudioProcessing* apm, |
- CriticalSectionWrapper* crit, |
+ rtc::CriticalSection* crit_render, |
+ rtc::CriticalSection* crit_capture, |
const rtc::ThreadChecker* render_thread_checker) |
: ProcessingComponent(), |
apm_(apm), |
- crit_(crit), |
+ crit_render_(crit_render), |
+ crit_capture_(crit_capture), |
render_thread_checker_(render_thread_checker), |
routing_mode_(kSpeakerphone), |
comfort_noise_enabled_(true), |
@@ -124,7 +125,11 @@ int EchoControlMobileImpl::ProcessRenderAudio(const AudioBuffer* audio) { |
// Insert the samples into the queue. |
if (!render_signal_queue_->Insert(&render_queue_buffer_)) { |
- ReadQueuedRenderData(); |
+ // The data queue is full and needs to be emptied. |
+ { |
+ rtc::CritScope cs_capture(crit_capture_); |
+ ReadQueuedRenderData(); |
+ } |
// Retry the insert (should always work). |
RTC_DCHECK_EQ(render_signal_queue_->Insert(&render_queue_buffer_), true); |
@@ -205,7 +210,9 @@ int EchoControlMobileImpl::ProcessCaptureAudio(AudioBuffer* audio) { |
} |
int EchoControlMobileImpl::Enable(bool enable) { |
- CriticalSectionScoped crit_scoped(crit_); |
+ // Run in a single-threaded manner |
+ rtc::CritScope cs_render(crit_render_); |
+ rtc::CritScope cs_capture(crit_capture_); |
// Ensure AEC and AECM are not both enabled. |
if (enable && apm_->echo_cancellation()->is_enabled()) { |
return apm_->kBadParameterError; |
@@ -215,11 +222,12 @@ int EchoControlMobileImpl::Enable(bool enable) { |
} |
bool EchoControlMobileImpl::is_enabled() const { |
+ rtc::CritScope cs(crit_capture_); |
return is_component_enabled(); |
} |
int EchoControlMobileImpl::set_routing_mode(RoutingMode mode) { |
- CriticalSectionScoped crit_scoped(crit_); |
+ rtc::CritScope cs(crit_capture_); |
if (MapSetting(mode) == -1) { |
return apm_->kBadParameterError; |
} |
@@ -230,22 +238,25 @@ int EchoControlMobileImpl::set_routing_mode(RoutingMode mode) { |
EchoControlMobile::RoutingMode EchoControlMobileImpl::routing_mode() |
const { |
+ rtc::CritScope cs(crit_capture_); |
return routing_mode_; |
} |
int EchoControlMobileImpl::enable_comfort_noise(bool enable) { |
- CriticalSectionScoped crit_scoped(crit_); |
+ rtc::CritScope cs(crit_capture_); |
comfort_noise_enabled_ = enable; |
return Configure(); |
} |
bool EchoControlMobileImpl::is_comfort_noise_enabled() const { |
+ rtc::CritScope cs(crit_capture_); |
return comfort_noise_enabled_; |
} |
int EchoControlMobileImpl::SetEchoPath(const void* echo_path, |
size_t size_bytes) { |
- CriticalSectionScoped crit_scoped(crit_); |
+ rtc::CritScope cs_render(crit_render_); |
+ rtc::CritScope cs_capture(crit_capture_); |
if (echo_path == NULL) { |
return apm_->kNullPointerError; |
} |
@@ -264,7 +275,7 @@ int EchoControlMobileImpl::SetEchoPath(const void* echo_path, |
int EchoControlMobileImpl::GetEchoPath(void* echo_path, |
size_t size_bytes) const { |
- CriticalSectionScoped crit_scoped(crit_); |
+ rtc::CritScope cs(crit_capture_); |
if (echo_path == NULL) { |
return apm_->kNullPointerError; |
} |
@@ -286,6 +297,7 @@ int EchoControlMobileImpl::GetEchoPath(void* echo_path, |
} |
int EchoControlMobileImpl::Initialize() { |
+ // Only called from within APM, hence no locking is needed. |
if (!is_component_enabled()) { |
return apm_->kNoError; |
} |
@@ -330,14 +342,17 @@ void EchoControlMobileImpl::AllocateRenderQueue() { |
} |
void* EchoControlMobileImpl::CreateHandle() const { |
+ // Only called from within APM, hence no locking is needed. |
return WebRtcAecm_Create(); |
} |
void EchoControlMobileImpl::DestroyHandle(void* handle) const { |
+ // Only called from within APM, hence no locking is needed. |
WebRtcAecm_Free(static_cast<Handle*>(handle)); |
} |
int EchoControlMobileImpl::InitializeHandle(void* handle) const { |
+ // Only called from within APM, hence no locking is needed. |
assert(handle != NULL); |
Handle* my_handle = static_cast<Handle*>(handle); |
if (WebRtcAecm_Init(my_handle, apm_->proc_sample_rate_hz()) != 0) { |
@@ -355,6 +370,7 @@ int EchoControlMobileImpl::InitializeHandle(void* handle) const { |
} |
int EchoControlMobileImpl::ConfigureHandle(void* handle) const { |
+ // Only called from within APM, hence no locking is needed. |
AecmConfig config; |
config.cngMode = comfort_noise_enabled_; |
config.echoMode = MapSetting(routing_mode_); |
@@ -363,11 +379,13 @@ int EchoControlMobileImpl::ConfigureHandle(void* handle) const { |
} |
int EchoControlMobileImpl::num_handles_required() const { |
+ // Only called from within APM, hence no locking is needed. |
return apm_->num_output_channels() * |
apm_->num_reverse_channels(); |
} |
int EchoControlMobileImpl::GetHandleError(void* handle) const { |
+ // Only called from within APM, hence no locking is needed. |
assert(handle != NULL); |
return AudioProcessing::kUnspecifiedError; |
} |