Chromium Code Reviews| 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 9210499ad25215f2303e34a617d70a94b51be150..ac7139c3e1798f3e4d070de299a73056a58ddf5f 100644 |
| --- a/webrtc/modules/audio_processing/echo_control_mobile_impl.cc |
| +++ b/webrtc/modules/audio_processing/echo_control_mobile_impl.cc |
| @@ -13,9 +13,9 @@ |
| #include <assert.h> |
| #include <string.h> |
| +#include "webrtc/base/criticalsection.h" |
| #include "webrtc/modules/audio_processing/aecm/include/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 { |
| @@ -67,11 +67,13 @@ size_t EchoControlMobile::echo_path_size_bytes() { |
| EchoControlMobileImpl::EchoControlMobileImpl( |
| const AudioProcessing* apm, |
| - CriticalSectionWrapper* crit, |
| + rtc::CriticalSection* crit_render, |
| + rtc::CriticalSection* crit_capture, |
| 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), |
| @@ -121,9 +123,18 @@ int EchoControlMobileImpl::ProcessRenderAudio(const AudioBuffer* audio) { |
| } |
| } |
| - // Check of success is temporarily disabled as it breaks a unit test. |
| - // TODO(peah): Will be fixed in the next CL. |
| - (void)render_signal_queue_->Insert(&render_queue_buffer_); |
| + // Insert the samples into the queue. |
| + bool success = render_signal_queue_->Insert(&render_queue_buffer_); |
| + if (!success) { |
|
hlundin-webrtc
2015/11/05 16:11:22
if (!render_signal_queue_->Insert(&render_queue_bu
peah-webrtc
2015/11/06 09:54:32
Done.
|
| + // 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); |
| + } |
| return apm_->kNoError; |
| } |
| @@ -201,7 +212,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; |
| @@ -211,11 +224,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; |
| } |
| @@ -226,22 +240,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; |
| } |
| @@ -260,7 +277,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; |
| } |
| @@ -282,6 +299,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; |
| } |
| @@ -302,6 +320,7 @@ int EchoControlMobileImpl::Initialize() { |
| } |
| void EchoControlMobileImpl::AllocateRenderQueue() { |
| + // Only called from within APM, hence no locking is needed. |
| const size_t max_frame_size = std::max(kAllowedValuesOfSamplesPerFrame1, |
| kAllowedValuesOfSamplesPerFrame2); |
| const size_t new_render_queue_element_max_size = |
| @@ -328,14 +347,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) { |
| @@ -353,6 +375,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_); |
| @@ -361,11 +384,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; |
| } |