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 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
110 #ifdef WEBRTC_ARCH_ARM_FAMILY | 110 #ifdef WEBRTC_ARCH_ARM_FAMILY |
111 AudioProcessing::kSampleRate32kHz}; | 111 AudioProcessing::kSampleRate32kHz}; |
112 #else | 112 #else |
113 AudioProcessing::kSampleRate32kHz, | 113 AudioProcessing::kSampleRate32kHz, |
114 AudioProcessing::kSampleRate48kHz}; | 114 AudioProcessing::kSampleRate48kHz}; |
115 #endif // WEBRTC_ARCH_ARM_FAMILY | 115 #endif // WEBRTC_ARCH_ARM_FAMILY |
116 const size_t AudioProcessing::kNumNativeSampleRates = | 116 const size_t AudioProcessing::kNumNativeSampleRates = |
117 arraysize(AudioProcessing::kNativeSampleRatesHz); | 117 arraysize(AudioProcessing::kNativeSampleRatesHz); |
118 const int AudioProcessing::kMaxNativeSampleRateHz = AudioProcessing:: | 118 const int AudioProcessing::kMaxNativeSampleRateHz = AudioProcessing:: |
119 kNativeSampleRatesHz[AudioProcessing::kNumNativeSampleRates - 1]; | 119 kNativeSampleRatesHz[AudioProcessing::kNumNativeSampleRates - 1]; |
120 const int AudioProcessing::kMaxAECMSampleRateHz = kSampleRate16kHz; | |
121 | 120 |
122 AudioProcessing* AudioProcessing::Create() { | 121 AudioProcessing* AudioProcessing::Create() { |
123 Config config; | 122 Config config; |
124 return Create(config, nullptr); | 123 return Create(config, nullptr); |
125 } | 124 } |
126 | 125 |
127 AudioProcessing* AudioProcessing::Create(const Config& config) { | 126 AudioProcessing* AudioProcessing::Create(const Config& config) { |
128 return Create(config, nullptr); | 127 return Create(config, nullptr); |
129 } | 128 } |
130 | 129 |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 return kBadNumberChannelsError; | 339 return kBadNumberChannelsError; |
341 } | 340 } |
342 | 341 |
343 if (capture_nonlocked_.beamformer_enabled && | 342 if (capture_nonlocked_.beamformer_enabled && |
344 num_in_channels != capture_.array_geometry.size()) { | 343 num_in_channels != capture_.array_geometry.size()) { |
345 return kBadNumberChannelsError; | 344 return kBadNumberChannelsError; |
346 } | 345 } |
347 | 346 |
348 formats_.api_format = config; | 347 formats_.api_format = config; |
349 | 348 |
350 // We process at the closest native rate >= min(input rate, output rate)... | 349 // We process at the closest native rate >= min(input rate, output rate). |
351 const int min_proc_rate = | 350 const int min_proc_rate = |
352 std::min(formats_.api_format.input_stream().sample_rate_hz(), | 351 std::min(formats_.api_format.input_stream().sample_rate_hz(), |
353 formats_.api_format.output_stream().sample_rate_hz()); | 352 formats_.api_format.output_stream().sample_rate_hz()); |
354 int fwd_proc_rate; | 353 int fwd_proc_rate; |
355 for (size_t i = 0; i < kNumNativeSampleRates; ++i) { | 354 for (size_t i = 0; i < kNumNativeSampleRates; ++i) { |
356 fwd_proc_rate = kNativeSampleRatesHz[i]; | 355 fwd_proc_rate = kNativeSampleRatesHz[i]; |
357 if (fwd_proc_rate >= min_proc_rate) { | 356 if (fwd_proc_rate >= min_proc_rate) { |
358 break; | 357 break; |
359 } | 358 } |
360 } | 359 } |
361 // ...with one exception. | |
362 if (public_submodules_->echo_control_mobile->is_enabled() && | |
363 min_proc_rate > kMaxAECMSampleRateHz) { | |
364 fwd_proc_rate = kMaxAECMSampleRateHz; | |
365 } | |
366 | 360 |
367 capture_nonlocked_.fwd_proc_format = StreamConfig(fwd_proc_rate); | 361 capture_nonlocked_.fwd_proc_format = StreamConfig(fwd_proc_rate); |
368 | 362 |
369 // We normally process the reverse stream at 16 kHz. Unless... | 363 // We normally process the reverse stream at 16 kHz. Unless... |
370 int rev_proc_rate = kSampleRate16kHz; | 364 int rev_proc_rate = kSampleRate16kHz; |
371 if (capture_nonlocked_.fwd_proc_format.sample_rate_hz() == kSampleRate8kHz) { | 365 if (capture_nonlocked_.fwd_proc_format.sample_rate_hz() == kSampleRate8kHz) { |
372 // ...the forward stream is at 8 kHz. | 366 // ...the forward stream is at 8 kHz. |
373 rev_proc_rate = kSampleRate8kHz; | 367 rev_proc_rate = kSampleRate8kHz; |
374 } else { | 368 } else { |
375 if (formats_.api_format.reverse_input_stream().sample_rate_hz() == | 369 if (formats_.api_format.reverse_input_stream().sample_rate_hz() == |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
588 return kNullPointerError; | 582 return kNullPointerError; |
589 } | 583 } |
590 // Must be a native rate. | 584 // Must be a native rate. |
591 if (frame->sample_rate_hz_ != kSampleRate8kHz && | 585 if (frame->sample_rate_hz_ != kSampleRate8kHz && |
592 frame->sample_rate_hz_ != kSampleRate16kHz && | 586 frame->sample_rate_hz_ != kSampleRate16kHz && |
593 frame->sample_rate_hz_ != kSampleRate32kHz && | 587 frame->sample_rate_hz_ != kSampleRate32kHz && |
594 frame->sample_rate_hz_ != kSampleRate48kHz) { | 588 frame->sample_rate_hz_ != kSampleRate48kHz) { |
595 return kBadSampleRateError; | 589 return kBadSampleRateError; |
596 } | 590 } |
597 | 591 |
598 if (public_submodules_->echo_control_mobile->is_enabled() && | |
599 frame->sample_rate_hz_ > kMaxAECMSampleRateHz) { | |
600 LOG(LS_ERROR) << "AECM only supports 16 or 8 kHz sample rates"; | |
601 return kUnsupportedComponentError; | |
602 } | |
603 | |
604 ProcessingConfig processing_config; | 592 ProcessingConfig processing_config; |
605 { | 593 { |
606 // Aquire lock for the access of api_format. | 594 // Aquire lock for the access of api_format. |
607 // The lock is released immediately due to the conditional | 595 // The lock is released immediately due to the conditional |
608 // reinitialization. | 596 // reinitialization. |
609 rtc::CritScope cs_capture(&crit_capture_); | 597 rtc::CritScope cs_capture(&crit_capture_); |
610 // TODO(ajm): The input and output rates and channels are currently | 598 // TODO(ajm): The input and output rates and channels are currently |
611 // constrained to be identical in the int16 interface. | 599 // constrained to be identical in the int16 interface. |
612 processing_config = formats_.api_format; | 600 processing_config = formats_.api_format; |
613 } | 601 } |
(...skipping 633 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1247 num_proc_channels()); | 1235 num_proc_channels()); |
1248 } | 1236 } |
1249 | 1237 |
1250 void AudioProcessingImpl::InitializeGainController() { | 1238 void AudioProcessingImpl::InitializeGainController() { |
1251 public_submodules_->gain_control->Initialize(num_proc_channels(), | 1239 public_submodules_->gain_control->Initialize(num_proc_channels(), |
1252 proc_sample_rate_hz()); | 1240 proc_sample_rate_hz()); |
1253 } | 1241 } |
1254 | 1242 |
1255 void AudioProcessingImpl::InitializeEchoControlMobile() { | 1243 void AudioProcessingImpl::InitializeEchoControlMobile() { |
1256 public_submodules_->echo_control_mobile->Initialize( | 1244 public_submodules_->echo_control_mobile->Initialize( |
1257 proc_sample_rate_hz(), num_reverse_channels(), num_output_channels()); | 1245 proc_split_sample_rate_hz(), |
| 1246 num_reverse_channels(), |
| 1247 num_output_channels()); |
1258 } | 1248 } |
1259 | 1249 |
1260 void AudioProcessingImpl::InitializeLevelEstimator() { | 1250 void AudioProcessingImpl::InitializeLevelEstimator() { |
1261 public_submodules_->level_estimator->Initialize(); | 1251 public_submodules_->level_estimator->Initialize(); |
1262 } | 1252 } |
1263 | 1253 |
1264 void AudioProcessingImpl::InitializeVoiceDetection() { | 1254 void AudioProcessingImpl::InitializeVoiceDetection() { |
1265 public_submodules_->voice_detection->Initialize(proc_split_sample_rate_hz()); | 1255 public_submodules_->voice_detection->Initialize(proc_split_sample_rate_hz()); |
1266 } | 1256 } |
1267 | 1257 |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1459 debug_dump_.capture.event_msg->mutable_config()->CopyFrom(config); | 1449 debug_dump_.capture.event_msg->mutable_config()->CopyFrom(config); |
1460 | 1450 |
1461 RETURN_ON_ERR(WriteMessageToDebugFile(debug_dump_.debug_file.get(), | 1451 RETURN_ON_ERR(WriteMessageToDebugFile(debug_dump_.debug_file.get(), |
1462 &debug_dump_.num_bytes_left_for_log_, | 1452 &debug_dump_.num_bytes_left_for_log_, |
1463 &crit_debug_, &debug_dump_.capture)); | 1453 &crit_debug_, &debug_dump_.capture)); |
1464 return kNoError; | 1454 return kNoError; |
1465 } | 1455 } |
1466 #endif // WEBRTC_AUDIOPROC_DEBUG_DUMP | 1456 #endif // WEBRTC_AUDIOPROC_DEBUG_DUMP |
1467 | 1457 |
1468 } // namespace webrtc | 1458 } // namespace webrtc |
OLD | NEW |