OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/modules/audio_processing/audio_processing_impl.h" | 11 #include "webrtc/modules/audio_processing/audio_processing_impl.h" |
12 | 12 |
13 #include <math.h> | 13 #include <math.h> |
14 #include <algorithm> | 14 #include <algorithm> |
15 | 15 |
16 #include "webrtc/base/checks.h" | 16 #include "webrtc/base/checks.h" |
17 #include "webrtc/base/logging.h" | 17 #include "webrtc/base/logging.h" |
18 #include "webrtc/base/platform_file.h" | 18 #include "webrtc/base/platform_file.h" |
19 #include "webrtc/base/trace_event.h" | 19 #include "webrtc/base/trace_event.h" |
20 #include "webrtc/common_audio/audio_converter.h" | 20 #include "webrtc/common_audio/audio_converter.h" |
21 #include "webrtc/common_audio/channel_buffer.h" | 21 #include "webrtc/common_audio/channel_buffer.h" |
22 #include "webrtc/common_audio/include/audio_util.h" | 22 #include "webrtc/common_audio/include/audio_util.h" |
23 #include "webrtc/common_audio/signal_processing/include/signal_processing_librar y.h" | 23 #include "webrtc/common_audio/signal_processing/include/signal_processing_librar y.h" |
24 #include "webrtc/modules/audio_processing/aec/aec_core.h" | 24 #include "webrtc/modules/audio_processing/aec/aec_core.h" |
25 #include "webrtc/modules/audio_processing/aec3/echo_canceller3.h" | 25 #include "webrtc/modules/audio_processing/aec3/echo_canceller3.h" |
26 #include "webrtc/modules/audio_processing/agc2/gain_controller2.h" | |
26 #include "webrtc/modules/audio_processing/agc/agc_manager_direct.h" | 27 #include "webrtc/modules/audio_processing/agc/agc_manager_direct.h" |
27 #include "webrtc/modules/audio_processing/audio_buffer.h" | 28 #include "webrtc/modules/audio_processing/audio_buffer.h" |
28 #include "webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.h" | 29 #include "webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.h" |
29 #include "webrtc/modules/audio_processing/common.h" | 30 #include "webrtc/modules/audio_processing/common.h" |
30 #include "webrtc/modules/audio_processing/echo_cancellation_impl.h" | 31 #include "webrtc/modules/audio_processing/echo_cancellation_impl.h" |
31 #include "webrtc/modules/audio_processing/echo_control_mobile_impl.h" | 32 #include "webrtc/modules/audio_processing/echo_control_mobile_impl.h" |
32 #include "webrtc/modules/audio_processing/gain_control_for_experimental_agc.h" | 33 #include "webrtc/modules/audio_processing/gain_control_for_experimental_agc.h" |
33 #include "webrtc/modules/audio_processing/gain_control_impl.h" | 34 #include "webrtc/modules/audio_processing/gain_control_impl.h" |
34 #if WEBRTC_INTELLIGIBILITY_ENHANCER | 35 #if WEBRTC_INTELLIGIBILITY_ENHANCER |
35 #include "webrtc/modules/audio_processing/intelligibility/intelligibility_enhanc er.h" | 36 #include "webrtc/modules/audio_processing/intelligibility/intelligibility_enhanc er.h" |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
161 | 162 |
162 bool AudioProcessingImpl::ApmSubmoduleStates::Update( | 163 bool AudioProcessingImpl::ApmSubmoduleStates::Update( |
163 bool low_cut_filter_enabled, | 164 bool low_cut_filter_enabled, |
164 bool echo_canceller_enabled, | 165 bool echo_canceller_enabled, |
165 bool mobile_echo_controller_enabled, | 166 bool mobile_echo_controller_enabled, |
166 bool residual_echo_detector_enabled, | 167 bool residual_echo_detector_enabled, |
167 bool noise_suppressor_enabled, | 168 bool noise_suppressor_enabled, |
168 bool intelligibility_enhancer_enabled, | 169 bool intelligibility_enhancer_enabled, |
169 bool beamformer_enabled, | 170 bool beamformer_enabled, |
170 bool adaptive_gain_controller_enabled, | 171 bool adaptive_gain_controller_enabled, |
172 bool adaptive_gain_controller2_enabled, | |
171 bool level_controller_enabled, | 173 bool level_controller_enabled, |
172 bool echo_canceller3_enabled, | 174 bool echo_canceller3_enabled, |
173 bool voice_activity_detector_enabled, | 175 bool voice_activity_detector_enabled, |
174 bool level_estimator_enabled, | 176 bool level_estimator_enabled, |
175 bool transient_suppressor_enabled) { | 177 bool transient_suppressor_enabled) { |
176 bool changed = false; | 178 bool changed = false; |
177 changed |= (low_cut_filter_enabled != low_cut_filter_enabled_); | 179 changed |= (low_cut_filter_enabled != low_cut_filter_enabled_); |
178 changed |= (echo_canceller_enabled != echo_canceller_enabled_); | 180 changed |= (echo_canceller_enabled != echo_canceller_enabled_); |
179 changed |= | 181 changed |= |
180 (mobile_echo_controller_enabled != mobile_echo_controller_enabled_); | 182 (mobile_echo_controller_enabled != mobile_echo_controller_enabled_); |
181 changed |= | 183 changed |= |
182 (residual_echo_detector_enabled != residual_echo_detector_enabled_); | 184 (residual_echo_detector_enabled != residual_echo_detector_enabled_); |
183 changed |= (noise_suppressor_enabled != noise_suppressor_enabled_); | 185 changed |= (noise_suppressor_enabled != noise_suppressor_enabled_); |
184 changed |= | 186 changed |= |
185 (intelligibility_enhancer_enabled != intelligibility_enhancer_enabled_); | 187 (intelligibility_enhancer_enabled != intelligibility_enhancer_enabled_); |
186 changed |= (beamformer_enabled != beamformer_enabled_); | 188 changed |= (beamformer_enabled != beamformer_enabled_); |
187 changed |= | 189 changed |= |
188 (adaptive_gain_controller_enabled != adaptive_gain_controller_enabled_); | 190 (adaptive_gain_controller_enabled != adaptive_gain_controller_enabled_); |
191 changed |= | |
192 (adaptive_gain_controller2_enabled != adaptive_gain_controller2_enabled_); | |
189 changed |= (level_controller_enabled != level_controller_enabled_); | 193 changed |= (level_controller_enabled != level_controller_enabled_); |
190 changed |= (echo_canceller3_enabled != echo_canceller3_enabled_); | 194 changed |= (echo_canceller3_enabled != echo_canceller3_enabled_); |
191 changed |= (level_estimator_enabled != level_estimator_enabled_); | 195 changed |= (level_estimator_enabled != level_estimator_enabled_); |
192 changed |= | 196 changed |= |
193 (voice_activity_detector_enabled != voice_activity_detector_enabled_); | 197 (voice_activity_detector_enabled != voice_activity_detector_enabled_); |
194 changed |= (transient_suppressor_enabled != transient_suppressor_enabled_); | 198 changed |= (transient_suppressor_enabled != transient_suppressor_enabled_); |
195 if (changed) { | 199 if (changed) { |
196 low_cut_filter_enabled_ = low_cut_filter_enabled; | 200 low_cut_filter_enabled_ = low_cut_filter_enabled; |
197 echo_canceller_enabled_ = echo_canceller_enabled; | 201 echo_canceller_enabled_ = echo_canceller_enabled; |
198 mobile_echo_controller_enabled_ = mobile_echo_controller_enabled; | 202 mobile_echo_controller_enabled_ = mobile_echo_controller_enabled; |
199 residual_echo_detector_enabled_ = residual_echo_detector_enabled; | 203 residual_echo_detector_enabled_ = residual_echo_detector_enabled; |
200 noise_suppressor_enabled_ = noise_suppressor_enabled; | 204 noise_suppressor_enabled_ = noise_suppressor_enabled; |
201 intelligibility_enhancer_enabled_ = intelligibility_enhancer_enabled; | 205 intelligibility_enhancer_enabled_ = intelligibility_enhancer_enabled; |
202 beamformer_enabled_ = beamformer_enabled; | 206 beamformer_enabled_ = beamformer_enabled; |
203 adaptive_gain_controller_enabled_ = adaptive_gain_controller_enabled; | 207 adaptive_gain_controller_enabled_ = adaptive_gain_controller_enabled; |
208 adaptive_gain_controller2_enabled_ = adaptive_gain_controller2_enabled; | |
204 level_controller_enabled_ = level_controller_enabled; | 209 level_controller_enabled_ = level_controller_enabled; |
205 echo_canceller3_enabled_ = echo_canceller3_enabled; | 210 echo_canceller3_enabled_ = echo_canceller3_enabled; |
206 level_estimator_enabled_ = level_estimator_enabled; | 211 level_estimator_enabled_ = level_estimator_enabled; |
207 voice_activity_detector_enabled_ = voice_activity_detector_enabled; | 212 voice_activity_detector_enabled_ = voice_activity_detector_enabled; |
208 transient_suppressor_enabled_ = transient_suppressor_enabled; | 213 transient_suppressor_enabled_ = transient_suppressor_enabled; |
209 } | 214 } |
210 | 215 |
211 changed |= first_update_; | 216 changed |= first_update_; |
212 first_update_ = false; | 217 first_update_ = false; |
213 return changed; | 218 return changed; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
267 std::unique_ptr<IntelligibilityEnhancer> intelligibility_enhancer; | 272 std::unique_ptr<IntelligibilityEnhancer> intelligibility_enhancer; |
268 #endif | 273 #endif |
269 }; | 274 }; |
270 | 275 |
271 struct AudioProcessingImpl::ApmPrivateSubmodules { | 276 struct AudioProcessingImpl::ApmPrivateSubmodules { |
272 explicit ApmPrivateSubmodules(NonlinearBeamformer* beamformer) | 277 explicit ApmPrivateSubmodules(NonlinearBeamformer* beamformer) |
273 : beamformer(beamformer) {} | 278 : beamformer(beamformer) {} |
274 // Accessed internally from capture or during initialization | 279 // Accessed internally from capture or during initialization |
275 std::unique_ptr<NonlinearBeamformer> beamformer; | 280 std::unique_ptr<NonlinearBeamformer> beamformer; |
276 std::unique_ptr<AgcManagerDirect> agc_manager; | 281 std::unique_ptr<AgcManagerDirect> agc_manager; |
282 std::unique_ptr<GainController2> gain_controller2; | |
277 std::unique_ptr<LowCutFilter> low_cut_filter; | 283 std::unique_ptr<LowCutFilter> low_cut_filter; |
278 std::unique_ptr<LevelController> level_controller; | 284 std::unique_ptr<LevelController> level_controller; |
279 std::unique_ptr<ResidualEchoDetector> residual_echo_detector; | 285 std::unique_ptr<ResidualEchoDetector> residual_echo_detector; |
280 std::unique_ptr<EchoCanceller3> echo_canceller3; | 286 std::unique_ptr<EchoCanceller3> echo_canceller3; |
281 }; | 287 }; |
282 | 288 |
283 AudioProcessing* AudioProcessing::Create() { | 289 AudioProcessing* AudioProcessing::Create() { |
284 webrtc::Config config; | 290 webrtc::Config config; |
285 return Create(config, nullptr); | 291 return Create(config, nullptr); |
286 } | 292 } |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
338 new LevelEstimatorImpl(&crit_capture_)); | 344 new LevelEstimatorImpl(&crit_capture_)); |
339 public_submodules_->noise_suppression.reset( | 345 public_submodules_->noise_suppression.reset( |
340 new NoiseSuppressionImpl(&crit_capture_)); | 346 new NoiseSuppressionImpl(&crit_capture_)); |
341 public_submodules_->voice_detection.reset( | 347 public_submodules_->voice_detection.reset( |
342 new VoiceDetectionImpl(&crit_capture_)); | 348 new VoiceDetectionImpl(&crit_capture_)); |
343 public_submodules_->gain_control_for_experimental_agc.reset( | 349 public_submodules_->gain_control_for_experimental_agc.reset( |
344 new GainControlForExperimentalAgc( | 350 new GainControlForExperimentalAgc( |
345 public_submodules_->gain_control.get(), &crit_capture_)); | 351 public_submodules_->gain_control.get(), &crit_capture_)); |
346 private_submodules_->residual_echo_detector.reset( | 352 private_submodules_->residual_echo_detector.reset( |
347 new ResidualEchoDetector()); | 353 new ResidualEchoDetector()); |
354 private_submodules_->gain_controller2.reset(new GainController2()); | |
348 | 355 |
349 // TODO(peah): Move this creation to happen only when the level controller | 356 // TODO(peah): Move this creation to happen only when the level controller |
350 // is enabled. | 357 // is enabled. |
351 private_submodules_->level_controller.reset(new LevelController()); | 358 private_submodules_->level_controller.reset(new LevelController()); |
352 } | 359 } |
353 | 360 |
354 SetExtraOptions(config); | 361 SetExtraOptions(config); |
355 } | 362 } |
356 | 363 |
357 AudioProcessingImpl::~AudioProcessingImpl() { | 364 AudioProcessingImpl::~AudioProcessingImpl() { |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
510 InitializeIntelligibility(); | 517 InitializeIntelligibility(); |
511 #endif | 518 #endif |
512 InitializeLowCutFilter(); | 519 InitializeLowCutFilter(); |
513 public_submodules_->noise_suppression->Initialize(num_proc_channels(), | 520 public_submodules_->noise_suppression->Initialize(num_proc_channels(), |
514 proc_sample_rate_hz()); | 521 proc_sample_rate_hz()); |
515 public_submodules_->voice_detection->Initialize(proc_split_sample_rate_hz()); | 522 public_submodules_->voice_detection->Initialize(proc_split_sample_rate_hz()); |
516 public_submodules_->level_estimator->Initialize(); | 523 public_submodules_->level_estimator->Initialize(); |
517 InitializeLevelController(); | 524 InitializeLevelController(); |
518 InitializeResidualEchoDetector(); | 525 InitializeResidualEchoDetector(); |
519 InitializeEchoCanceller3(); | 526 InitializeEchoCanceller3(); |
527 InitializeGainController2(); | |
520 | 528 |
521 #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP | 529 #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP |
522 if (debug_dump_.debug_file->is_open()) { | 530 if (debug_dump_.debug_file->is_open()) { |
523 int err = WriteInitMessage(); | 531 int err = WriteInitMessage(); |
524 if (err != kNoError) { | 532 if (err != kNoError) { |
525 return err; | 533 return err; |
526 } | 534 } |
527 } | 535 } |
528 #endif | 536 #endif |
529 | 537 |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
658 } | 666 } |
659 | 667 |
660 if (config.echo_canceller3.enabled != | 668 if (config.echo_canceller3.enabled != |
661 capture_nonlocked_.echo_canceller3_enabled) { | 669 capture_nonlocked_.echo_canceller3_enabled) { |
662 capture_nonlocked_.echo_canceller3_enabled = | 670 capture_nonlocked_.echo_canceller3_enabled = |
663 config_.echo_canceller3.enabled; | 671 config_.echo_canceller3.enabled; |
664 InitializeEchoCanceller3(); | 672 InitializeEchoCanceller3(); |
665 LOG(LS_INFO) << "Echo canceller 3 activated: " | 673 LOG(LS_INFO) << "Echo canceller 3 activated: " |
666 << capture_nonlocked_.echo_canceller3_enabled; | 674 << capture_nonlocked_.echo_canceller3_enabled; |
667 } | 675 } |
676 | |
677 config_ok = GainController2::Validate(config_.gain_controller2); | |
678 if (!config_ok) { | |
679 LOG(LS_ERROR) << "AudioProcessing module config error" << std::endl | |
680 << "gain_controller2: " | |
peah-webrtc
2017/05/05 20:44:11
What about also adding a LOG(LS_INFO) about that t
AleBzk
2017/05/16 12:38:43
Done.
| |
681 << GainController2::ToString(config_.gain_controller2) | |
682 << std::endl | |
683 << "Reverting to default parameter set"; | |
684 config_.gain_controller2 = AudioProcessing::Config::GainController2(); | |
685 } | |
668 } | 686 } |
669 | 687 |
670 void AudioProcessingImpl::SetExtraOptions(const webrtc::Config& config) { | 688 void AudioProcessingImpl::SetExtraOptions(const webrtc::Config& config) { |
671 // Run in a single-threaded manner when setting the extra options. | 689 // Run in a single-threaded manner when setting the extra options. |
672 rtc::CritScope cs_render(&crit_render_); | 690 rtc::CritScope cs_render(&crit_render_); |
673 rtc::CritScope cs_capture(&crit_capture_); | 691 rtc::CritScope cs_capture(&crit_capture_); |
674 | 692 |
675 public_submodules_->echo_cancellation->SetExtraOptions(config); | 693 public_submodules_->echo_cancellation->SetExtraOptions(config); |
676 | 694 |
677 if (capture_.transient_suppressor_enabled != | 695 if (capture_.transient_suppressor_enabled != |
(...skipping 1012 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1690 bool AudioProcessingImpl::UpdateActiveSubmoduleStates() { | 1708 bool AudioProcessingImpl::UpdateActiveSubmoduleStates() { |
1691 return submodule_states_.Update( | 1709 return submodule_states_.Update( |
1692 config_.high_pass_filter.enabled, | 1710 config_.high_pass_filter.enabled, |
1693 public_submodules_->echo_cancellation->is_enabled(), | 1711 public_submodules_->echo_cancellation->is_enabled(), |
1694 public_submodules_->echo_control_mobile->is_enabled(), | 1712 public_submodules_->echo_control_mobile->is_enabled(), |
1695 config_.residual_echo_detector.enabled, | 1713 config_.residual_echo_detector.enabled, |
1696 public_submodules_->noise_suppression->is_enabled(), | 1714 public_submodules_->noise_suppression->is_enabled(), |
1697 capture_nonlocked_.intelligibility_enabled, | 1715 capture_nonlocked_.intelligibility_enabled, |
1698 capture_nonlocked_.beamformer_enabled, | 1716 capture_nonlocked_.beamformer_enabled, |
1699 public_submodules_->gain_control->is_enabled(), | 1717 public_submodules_->gain_control->is_enabled(), |
1718 capture_nonlocked_.adaptive_gain_controller2_enabled, | |
1700 capture_nonlocked_.level_controller_enabled, | 1719 capture_nonlocked_.level_controller_enabled, |
1701 capture_nonlocked_.echo_canceller3_enabled, | 1720 capture_nonlocked_.echo_canceller3_enabled, |
1702 public_submodules_->voice_detection->is_enabled(), | 1721 public_submodules_->voice_detection->is_enabled(), |
1703 public_submodules_->level_estimator->is_enabled(), | 1722 public_submodules_->level_estimator->is_enabled(), |
1704 capture_.transient_suppressor_enabled); | 1723 capture_.transient_suppressor_enabled); |
1705 } | 1724 } |
1706 | 1725 |
1707 | 1726 |
1708 void AudioProcessingImpl::InitializeTransient() { | 1727 void AudioProcessingImpl::InitializeTransient() { |
1709 if (capture_.transient_suppressor_enabled) { | 1728 if (capture_.transient_suppressor_enabled) { |
(...skipping 30 matching lines...) Expand all Loading... | |
1740 } | 1759 } |
1741 | 1760 |
1742 void AudioProcessingImpl::InitializeLowCutFilter() { | 1761 void AudioProcessingImpl::InitializeLowCutFilter() { |
1743 if (config_.high_pass_filter.enabled) { | 1762 if (config_.high_pass_filter.enabled) { |
1744 private_submodules_->low_cut_filter.reset( | 1763 private_submodules_->low_cut_filter.reset( |
1745 new LowCutFilter(num_proc_channels(), proc_sample_rate_hz())); | 1764 new LowCutFilter(num_proc_channels(), proc_sample_rate_hz())); |
1746 } else { | 1765 } else { |
1747 private_submodules_->low_cut_filter.reset(); | 1766 private_submodules_->low_cut_filter.reset(); |
1748 } | 1767 } |
1749 } | 1768 } |
1769 | |
1750 void AudioProcessingImpl::InitializeEchoCanceller3() { | 1770 void AudioProcessingImpl::InitializeEchoCanceller3() { |
1751 if (capture_nonlocked_.echo_canceller3_enabled) { | 1771 if (capture_nonlocked_.echo_canceller3_enabled) { |
1752 private_submodules_->echo_canceller3.reset( | 1772 private_submodules_->echo_canceller3.reset( |
1753 new EchoCanceller3(proc_sample_rate_hz(), true)); | 1773 new EchoCanceller3(proc_sample_rate_hz(), true)); |
1754 } else { | 1774 } else { |
1755 private_submodules_->echo_canceller3.reset(); | 1775 private_submodules_->echo_canceller3.reset(); |
1756 } | 1776 } |
1757 } | 1777 } |
1758 | 1778 |
1779 void AudioProcessingImpl::InitializeGainController2() { | |
1780 if (capture_nonlocked_.adaptive_gain_controller2_enabled) { | |
1781 private_submodules_->gain_controller2.reset(new GainController2()); | |
1782 } else { | |
1783 private_submodules_->gain_controller2.reset(); | |
1784 } | |
1785 } | |
1786 | |
1759 void AudioProcessingImpl::InitializeLevelController() { | 1787 void AudioProcessingImpl::InitializeLevelController() { |
1760 private_submodules_->level_controller->Initialize(proc_sample_rate_hz()); | 1788 private_submodules_->level_controller->Initialize(proc_sample_rate_hz()); |
1761 } | 1789 } |
1762 | 1790 |
1763 void AudioProcessingImpl::InitializeResidualEchoDetector() { | 1791 void AudioProcessingImpl::InitializeResidualEchoDetector() { |
1764 private_submodules_->residual_echo_detector->Initialize(); | 1792 private_submodules_->residual_echo_detector->Initialize(); |
1765 } | 1793 } |
1766 | 1794 |
1767 void AudioProcessingImpl::MaybeUpdateHistograms() { | 1795 void AudioProcessingImpl::MaybeUpdateHistograms() { |
1768 static const int kMinDiffDelayMs = 60; | 1796 static const int kMinDiffDelayMs = 60; |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2003 previous_agc_level(0), | 2031 previous_agc_level(0), |
2004 echo_path_gain_change(false) {} | 2032 echo_path_gain_change(false) {} |
2005 | 2033 |
2006 AudioProcessingImpl::ApmCaptureState::~ApmCaptureState() = default; | 2034 AudioProcessingImpl::ApmCaptureState::~ApmCaptureState() = default; |
2007 | 2035 |
2008 AudioProcessingImpl::ApmRenderState::ApmRenderState() = default; | 2036 AudioProcessingImpl::ApmRenderState::ApmRenderState() = default; |
2009 | 2037 |
2010 AudioProcessingImpl::ApmRenderState::~ApmRenderState() = default; | 2038 AudioProcessingImpl::ApmRenderState::~ApmRenderState() = default; |
2011 | 2039 |
2012 } // namespace webrtc | 2040 } // namespace webrtc |
OLD | NEW |