| 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 | 
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 74   assert(false); | 74   assert(false); | 
| 75   return false; | 75   return false; | 
| 76 } | 76 } | 
| 77 }  // namespace | 77 }  // namespace | 
| 78 | 78 | 
| 79 struct AudioProcessingImpl::ApmPublicSubmodules { | 79 struct AudioProcessingImpl::ApmPublicSubmodules { | 
| 80   ApmPublicSubmodules() | 80   ApmPublicSubmodules() | 
| 81       : echo_cancellation(nullptr), | 81       : echo_cancellation(nullptr), | 
| 82         echo_control_mobile(nullptr), | 82         echo_control_mobile(nullptr), | 
| 83         gain_control(nullptr), | 83         gain_control(nullptr), | 
| 84         high_pass_filter(nullptr), |  | 
| 85         level_estimator(nullptr), | 84         level_estimator(nullptr), | 
| 86         noise_suppression(nullptr), | 85         noise_suppression(nullptr), | 
| 87         voice_detection(nullptr) {} | 86         voice_detection(nullptr) {} | 
| 88   // Accessed externally of APM without any lock acquired. | 87   // Accessed externally of APM without any lock acquired. | 
| 89   EchoCancellationImpl* echo_cancellation; | 88   EchoCancellationImpl* echo_cancellation; | 
| 90   EchoControlMobileImpl* echo_control_mobile; | 89   EchoControlMobileImpl* echo_control_mobile; | 
| 91   GainControlImpl* gain_control; | 90   GainControlImpl* gain_control; | 
| 92   HighPassFilterImpl* high_pass_filter; | 91   rtc::scoped_ptr<HighPassFilterImpl> high_pass_filter; | 
| 93   LevelEstimatorImpl* level_estimator; | 92   LevelEstimatorImpl* level_estimator; | 
| 94   NoiseSuppressionImpl* noise_suppression; | 93   NoiseSuppressionImpl* noise_suppression; | 
| 95   VoiceDetectionImpl* voice_detection; | 94   VoiceDetectionImpl* voice_detection; | 
| 96   rtc::scoped_ptr<GainControlForNewAgc> gain_control_for_new_agc; | 95   rtc::scoped_ptr<GainControlForNewAgc> gain_control_for_new_agc; | 
| 97 | 96 | 
| 98   // Accessed internally from both render and capture. | 97   // Accessed internally from both render and capture. | 
| 99   rtc::scoped_ptr<TransientSuppressor> transient_suppressor; | 98   rtc::scoped_ptr<TransientSuppressor> transient_suppressor; | 
| 100   rtc::scoped_ptr<IntelligibilityEnhancer> intelligibility_enhancer; | 99   rtc::scoped_ptr<IntelligibilityEnhancer> intelligibility_enhancer; | 
| 101 }; | 100 }; | 
| 102 | 101 | 
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 236   { | 235   { | 
| 237     rtc::CritScope cs_render(&crit_render_); | 236     rtc::CritScope cs_render(&crit_render_); | 
| 238     rtc::CritScope cs_capture(&crit_capture_); | 237     rtc::CritScope cs_capture(&crit_capture_); | 
| 239 | 238 | 
| 240     public_submodules_->echo_cancellation = | 239     public_submodules_->echo_cancellation = | 
| 241         new EchoCancellationImpl(this, &crit_render_, &crit_capture_); | 240         new EchoCancellationImpl(this, &crit_render_, &crit_capture_); | 
| 242     public_submodules_->echo_control_mobile = | 241     public_submodules_->echo_control_mobile = | 
| 243         new EchoControlMobileImpl(this, &crit_render_, &crit_capture_); | 242         new EchoControlMobileImpl(this, &crit_render_, &crit_capture_); | 
| 244     public_submodules_->gain_control = | 243     public_submodules_->gain_control = | 
| 245         new GainControlImpl(this, &crit_capture_, &crit_capture_); | 244         new GainControlImpl(this, &crit_capture_, &crit_capture_); | 
| 246     public_submodules_->high_pass_filter = | 245     public_submodules_->high_pass_filter.reset( | 
| 247         new HighPassFilterImpl(this, &crit_capture_); | 246         new HighPassFilterImpl(&crit_capture_)); | 
| 248     public_submodules_->level_estimator = | 247     public_submodules_->level_estimator = | 
| 249         new LevelEstimatorImpl(this, &crit_capture_); | 248         new LevelEstimatorImpl(this, &crit_capture_); | 
| 250     public_submodules_->noise_suppression = | 249     public_submodules_->noise_suppression = | 
| 251         new NoiseSuppressionImpl(this, &crit_capture_); | 250         new NoiseSuppressionImpl(this, &crit_capture_); | 
| 252     public_submodules_->voice_detection = | 251     public_submodules_->voice_detection = | 
| 253         new VoiceDetectionImpl(this, &crit_capture_); | 252         new VoiceDetectionImpl(this, &crit_capture_); | 
| 254     public_submodules_->gain_control_for_new_agc.reset( | 253     public_submodules_->gain_control_for_new_agc.reset( | 
| 255         new GainControlForNewAgc(public_submodules_->gain_control)); | 254         new GainControlForNewAgc(public_submodules_->gain_control)); | 
| 256 | 255 | 
| 257     private_submodules_->component_list.push_back( | 256     private_submodules_->component_list.push_back( | 
| 258         public_submodules_->echo_cancellation); | 257         public_submodules_->echo_cancellation); | 
| 259     private_submodules_->component_list.push_back( | 258     private_submodules_->component_list.push_back( | 
| 260         public_submodules_->echo_control_mobile); | 259         public_submodules_->echo_control_mobile); | 
| 261     private_submodules_->component_list.push_back( | 260     private_submodules_->component_list.push_back( | 
| 262         public_submodules_->gain_control); | 261         public_submodules_->gain_control); | 
| 263     private_submodules_->component_list.push_back( | 262     private_submodules_->component_list.push_back( | 
| 264         public_submodules_->high_pass_filter); |  | 
| 265     private_submodules_->component_list.push_back( |  | 
| 266         public_submodules_->level_estimator); | 263         public_submodules_->level_estimator); | 
| 267     private_submodules_->component_list.push_back( | 264     private_submodules_->component_list.push_back( | 
| 268         public_submodules_->noise_suppression); | 265         public_submodules_->noise_suppression); | 
| 269     private_submodules_->component_list.push_back( | 266     private_submodules_->component_list.push_back( | 
| 270         public_submodules_->voice_detection); | 267         public_submodules_->voice_detection); | 
| 271   } | 268   } | 
| 272 | 269 | 
| 273   SetExtraOptions(config); | 270   SetExtraOptions(config); | 
| 274 } | 271 } | 
| 275 | 272 | 
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 399   } | 396   } | 
| 400 | 397 | 
| 401   InitializeExperimentalAgc(); | 398   InitializeExperimentalAgc(); | 
| 402 | 399 | 
| 403   InitializeTransient(); | 400   InitializeTransient(); | 
| 404 | 401 | 
| 405   InitializeBeamformer(); | 402   InitializeBeamformer(); | 
| 406 | 403 | 
| 407   InitializeIntelligibility(); | 404   InitializeIntelligibility(); | 
| 408 | 405 | 
|  | 406   InitializeHighPassFilter(); | 
|  | 407 | 
| 409 #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP | 408 #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP | 
| 410   if (debug_dump_.debug_file->Open()) { | 409   if (debug_dump_.debug_file->Open()) { | 
| 411     int err = WriteInitMessage(); | 410     int err = WriteInitMessage(); | 
| 412     if (err != kNoError) { | 411     if (err != kNoError) { | 
| 413       return err; | 412       return err; | 
| 414     } | 413     } | 
| 415   } | 414   } | 
| 416 #endif | 415 #endif | 
| 417 | 416 | 
| 418   return kNoError; | 417   return kNoError; | 
| (...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 760         ca->split_channels_f(kBand0To8kHz), capture_nonlocked_.split_rate, | 759         ca->split_channels_f(kBand0To8kHz), capture_nonlocked_.split_rate, | 
| 761         ca->num_channels()); | 760         ca->num_channels()); | 
| 762   } | 761   } | 
| 763 | 762 | 
| 764   if (constants_.beamformer_enabled) { | 763   if (constants_.beamformer_enabled) { | 
| 765     private_submodules_->beamformer->ProcessChunk(*ca->split_data_f(), | 764     private_submodules_->beamformer->ProcessChunk(*ca->split_data_f(), | 
| 766                                                   ca->split_data_f()); | 765                                                   ca->split_data_f()); | 
| 767     ca->set_num_channels(1); | 766     ca->set_num_channels(1); | 
| 768   } | 767   } | 
| 769 | 768 | 
| 770   RETURN_ON_ERR(public_submodules_->high_pass_filter->ProcessCaptureAudio(ca)); | 769   public_submodules_->high_pass_filter->ProcessCaptureAudio(ca); | 
| 771   RETURN_ON_ERR(public_submodules_->gain_control->AnalyzeCaptureAudio(ca)); | 770   RETURN_ON_ERR(public_submodules_->gain_control->AnalyzeCaptureAudio(ca)); | 
| 772   RETURN_ON_ERR(public_submodules_->noise_suppression->AnalyzeCaptureAudio(ca)); | 771   RETURN_ON_ERR(public_submodules_->noise_suppression->AnalyzeCaptureAudio(ca)); | 
| 773   RETURN_ON_ERR(public_submodules_->echo_cancellation->ProcessCaptureAudio(ca)); | 772   RETURN_ON_ERR(public_submodules_->echo_cancellation->ProcessCaptureAudio(ca)); | 
| 774 | 773 | 
| 775   if (public_submodules_->echo_control_mobile->is_enabled() && | 774   if (public_submodules_->echo_control_mobile->is_enabled() && | 
| 776       public_submodules_->noise_suppression->is_enabled()) { | 775       public_submodules_->noise_suppression->is_enabled()) { | 
| 777     ca->CopyLowPassToReference(); | 776     ca->CopyLowPassToReference(); | 
| 778   } | 777   } | 
| 779   RETURN_ON_ERR(public_submodules_->noise_suppression->ProcessCaptureAudio(ca)); | 778   RETURN_ON_ERR(public_submodules_->noise_suppression->ProcessCaptureAudio(ca)); | 
| 780   RETURN_ON_ERR( | 779   RETURN_ON_ERR( | 
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1140   // from the returned pointer. | 1139   // from the returned pointer. | 
| 1141   if (constants_.use_new_agc) { | 1140   if (constants_.use_new_agc) { | 
| 1142     return public_submodules_->gain_control_for_new_agc.get(); | 1141     return public_submodules_->gain_control_for_new_agc.get(); | 
| 1143   } | 1142   } | 
| 1144   return public_submodules_->gain_control; | 1143   return public_submodules_->gain_control; | 
| 1145 } | 1144 } | 
| 1146 | 1145 | 
| 1147 HighPassFilter* AudioProcessingImpl::high_pass_filter() const { | 1146 HighPassFilter* AudioProcessingImpl::high_pass_filter() const { | 
| 1148   // Adding a lock here has no effect as it allows any access to the submodule | 1147   // Adding a lock here has no effect as it allows any access to the submodule | 
| 1149   // from the returned pointer. | 1148   // from the returned pointer. | 
| 1150   return public_submodules_->high_pass_filter; | 1149   return public_submodules_->high_pass_filter.get(); | 
| 1151 } | 1150 } | 
| 1152 | 1151 | 
| 1153 LevelEstimator* AudioProcessingImpl::level_estimator() const { | 1152 LevelEstimator* AudioProcessingImpl::level_estimator() const { | 
| 1154   // Adding a lock here has no effect as it allows any access to the submodule | 1153   // Adding a lock here has no effect as it allows any access to the submodule | 
| 1155   // from the returned pointer. | 1154   // from the returned pointer. | 
| 1156   return public_submodules_->level_estimator; | 1155   return public_submodules_->level_estimator; | 
| 1157 } | 1156 } | 
| 1158 | 1157 | 
| 1159 NoiseSuppression* AudioProcessingImpl::noise_suppression() const { | 1158 NoiseSuppression* AudioProcessingImpl::noise_suppression() const { | 
| 1160   // Adding a lock here has no effect as it allows any access to the submodule | 1159   // Adding a lock here has no effect as it allows any access to the submodule | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 1172   if (constants_.beamformer_enabled) { | 1171   if (constants_.beamformer_enabled) { | 
| 1173     return true; | 1172     return true; | 
| 1174   } | 1173   } | 
| 1175 | 1174 | 
| 1176   int enabled_count = 0; | 1175   int enabled_count = 0; | 
| 1177   for (auto item : private_submodules_->component_list) { | 1176   for (auto item : private_submodules_->component_list) { | 
| 1178     if (item->is_component_enabled()) { | 1177     if (item->is_component_enabled()) { | 
| 1179       enabled_count++; | 1178       enabled_count++; | 
| 1180     } | 1179     } | 
| 1181   } | 1180   } | 
|  | 1181   if (public_submodules_->high_pass_filter->is_enabled()) { | 
|  | 1182     enabled_count++; | 
|  | 1183   } | 
| 1182 | 1184 | 
| 1183   // Data is unchanged if no components are enabled, or if only | 1185   // Data is unchanged if no components are enabled, or if only | 
| 1184   // public_submodules_->level_estimator | 1186   // public_submodules_->level_estimator | 
| 1185   // or public_submodules_->voice_detection is enabled. | 1187   // or public_submodules_->voice_detection is enabled. | 
| 1186   if (enabled_count == 0) { | 1188   if (enabled_count == 0) { | 
| 1187     return false; | 1189     return false; | 
| 1188   } else if (enabled_count == 1) { | 1190   } else if (enabled_count == 1) { | 
| 1189     if (public_submodules_->level_estimator->is_enabled() || | 1191     if (public_submodules_->level_estimator->is_enabled() || | 
| 1190         public_submodules_->voice_detection->is_enabled()) { | 1192         public_submodules_->voice_detection->is_enabled()) { | 
| 1191       return false; | 1193       return false; | 
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1286   if (constants_.intelligibility_enabled) { | 1288   if (constants_.intelligibility_enabled) { | 
| 1287     IntelligibilityEnhancer::Config config; | 1289     IntelligibilityEnhancer::Config config; | 
| 1288     config.sample_rate_hz = capture_nonlocked_.split_rate; | 1290     config.sample_rate_hz = capture_nonlocked_.split_rate; | 
| 1289     config.num_capture_channels = capture_.capture_audio->num_channels(); | 1291     config.num_capture_channels = capture_.capture_audio->num_channels(); | 
| 1290     config.num_render_channels = render_.render_audio->num_channels(); | 1292     config.num_render_channels = render_.render_audio->num_channels(); | 
| 1291     public_submodules_->intelligibility_enhancer.reset( | 1293     public_submodules_->intelligibility_enhancer.reset( | 
| 1292         new IntelligibilityEnhancer(config)); | 1294         new IntelligibilityEnhancer(config)); | 
| 1293   } | 1295   } | 
| 1294 } | 1296 } | 
| 1295 | 1297 | 
|  | 1298 void AudioProcessingImpl::InitializeHighPassFilter() { | 
|  | 1299   public_submodules_->high_pass_filter->Initialize(num_output_channels(), | 
|  | 1300                                                    proc_sample_rate_hz()); | 
|  | 1301 } | 
|  | 1302 | 
| 1296 void AudioProcessingImpl::MaybeUpdateHistograms() { | 1303 void AudioProcessingImpl::MaybeUpdateHistograms() { | 
| 1297   static const int kMinDiffDelayMs = 60; | 1304   static const int kMinDiffDelayMs = 60; | 
| 1298 | 1305 | 
| 1299   if (echo_cancellation()->is_enabled()) { | 1306   if (echo_cancellation()->is_enabled()) { | 
| 1300     // Activate delay_jumps_ counters if we know echo_cancellation is runnning. | 1307     // Activate delay_jumps_ counters if we know echo_cancellation is runnning. | 
| 1301     // If a stream has echo we know that the echo_cancellation is in process. | 1308     // If a stream has echo we know that the echo_cancellation is in process. | 
| 1302     if (capture_.stream_delay_jumps == -1 && | 1309     if (capture_.stream_delay_jumps == -1 && | 
| 1303         echo_cancellation()->stream_has_echo()) { | 1310         echo_cancellation()->stream_has_echo()) { | 
| 1304       capture_.stream_delay_jumps = 0; | 1311       capture_.stream_delay_jumps = 0; | 
| 1305     } | 1312     } | 
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1470   debug_dump_.capture.event_msg->set_type(audioproc::Event::CONFIG); | 1477   debug_dump_.capture.event_msg->set_type(audioproc::Event::CONFIG); | 
| 1471   debug_dump_.capture.event_msg->mutable_config()->CopyFrom(config); | 1478   debug_dump_.capture.event_msg->mutable_config()->CopyFrom(config); | 
| 1472 | 1479 | 
| 1473   RETURN_ON_ERR(WriteMessageToDebugFile(debug_dump_.debug_file.get(), | 1480   RETURN_ON_ERR(WriteMessageToDebugFile(debug_dump_.debug_file.get(), | 
| 1474                                         &crit_debug_, &debug_dump_.capture)); | 1481                                         &crit_debug_, &debug_dump_.capture)); | 
| 1475   return kNoError; | 1482   return kNoError; | 
| 1476 } | 1483 } | 
| 1477 #endif  // WEBRTC_AUDIOPROC_DEBUG_DUMP | 1484 #endif  // WEBRTC_AUDIOPROC_DEBUG_DUMP | 
| 1478 | 1485 | 
| 1479 }  // namespace webrtc | 1486 }  // namespace webrtc | 
| OLD | NEW | 
|---|