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 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
115 #ifdef WEBRTC_ARCH_ARM_FAMILY | 115 #ifdef WEBRTC_ARCH_ARM_FAMILY |
116 AudioProcessing::kSampleRate32kHz}; | 116 AudioProcessing::kSampleRate32kHz}; |
117 #else | 117 #else |
118 AudioProcessing::kSampleRate32kHz, | 118 AudioProcessing::kSampleRate32kHz, |
119 AudioProcessing::kSampleRate48kHz}; | 119 AudioProcessing::kSampleRate48kHz}; |
120 #endif // WEBRTC_ARCH_ARM_FAMILY | 120 #endif // WEBRTC_ARCH_ARM_FAMILY |
121 const size_t AudioProcessing::kNumNativeSampleRates = | 121 const size_t AudioProcessing::kNumNativeSampleRates = |
122 arraysize(AudioProcessing::kNativeSampleRatesHz); | 122 arraysize(AudioProcessing::kNativeSampleRatesHz); |
123 const int AudioProcessing::kMaxNativeSampleRateHz = AudioProcessing:: | 123 const int AudioProcessing::kMaxNativeSampleRateHz = AudioProcessing:: |
124 kNativeSampleRatesHz[AudioProcessing::kNumNativeSampleRates - 1]; | 124 kNativeSampleRatesHz[AudioProcessing::kNumNativeSampleRates - 1]; |
125 const int AudioProcessing::kMaxAECMSampleRateHz = kSampleRate16kHz; | |
126 | 125 |
127 AudioProcessing* AudioProcessing::Create() { | 126 AudioProcessing* AudioProcessing::Create() { |
128 Config config; | 127 Config config; |
129 return Create(config, nullptr); | 128 return Create(config, nullptr); |
130 } | 129 } |
131 | 130 |
132 AudioProcessing* AudioProcessing::Create(const Config& config) { | 131 AudioProcessing* AudioProcessing::Create(const Config& config) { |
133 return Create(config, nullptr); | 132 return Create(config, nullptr); |
134 } | 133 } |
135 | 134 |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
362 return kBadNumberChannelsError; | 361 return kBadNumberChannelsError; |
363 } | 362 } |
364 | 363 |
365 if (capture_nonlocked_.beamformer_enabled && | 364 if (capture_nonlocked_.beamformer_enabled && |
366 num_in_channels != capture_.array_geometry.size()) { | 365 num_in_channels != capture_.array_geometry.size()) { |
367 return kBadNumberChannelsError; | 366 return kBadNumberChannelsError; |
368 } | 367 } |
369 | 368 |
370 formats_.api_format = config; | 369 formats_.api_format = config; |
371 | 370 |
372 // We process at the closest native rate >= min(input rate, output rate)... | 371 // We process at the closest native rate >= min(input rate, output rate). |
373 const int min_proc_rate = | 372 const int min_proc_rate = |
374 std::min(formats_.api_format.input_stream().sample_rate_hz(), | 373 std::min(formats_.api_format.input_stream().sample_rate_hz(), |
375 formats_.api_format.output_stream().sample_rate_hz()); | 374 formats_.api_format.output_stream().sample_rate_hz()); |
376 int fwd_proc_rate; | 375 int fwd_proc_rate; |
377 for (size_t i = 0; i < kNumNativeSampleRates; ++i) { | 376 for (size_t i = 0; i < kNumNativeSampleRates; ++i) { |
378 fwd_proc_rate = kNativeSampleRatesHz[i]; | 377 fwd_proc_rate = kNativeSampleRatesHz[i]; |
379 if (fwd_proc_rate >= min_proc_rate) { | 378 if (fwd_proc_rate >= min_proc_rate) { |
380 break; | 379 break; |
381 } | 380 } |
382 } | 381 } |
383 // ...with one exception. | |
384 if (public_submodules_->echo_control_mobile->is_enabled() && | |
385 min_proc_rate > kMaxAECMSampleRateHz) { | |
386 fwd_proc_rate = kMaxAECMSampleRateHz; | |
387 } | |
388 | 382 |
389 capture_nonlocked_.fwd_proc_format = StreamConfig(fwd_proc_rate); | 383 capture_nonlocked_.fwd_proc_format = StreamConfig(fwd_proc_rate); |
390 | 384 |
391 // We normally process the reverse stream at 16 kHz. Unless... | 385 // We normally process the reverse stream at 16 kHz. Unless... |
392 int rev_proc_rate = kSampleRate16kHz; | 386 int rev_proc_rate = kSampleRate16kHz; |
393 if (capture_nonlocked_.fwd_proc_format.sample_rate_hz() == kSampleRate8kHz) { | 387 if (capture_nonlocked_.fwd_proc_format.sample_rate_hz() == kSampleRate8kHz) { |
394 // ...the forward stream is at 8 kHz. | 388 // ...the forward stream is at 8 kHz. |
395 rev_proc_rate = kSampleRate8kHz; | 389 rev_proc_rate = kSampleRate8kHz; |
396 } else { | 390 } else { |
397 if (formats_.api_format.reverse_input_stream().sample_rate_hz() == | 391 if (formats_.api_format.reverse_input_stream().sample_rate_hz() == |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
613 return kNullPointerError; | 607 return kNullPointerError; |
614 } | 608 } |
615 // Must be a native rate. | 609 // Must be a native rate. |
616 if (frame->sample_rate_hz_ != kSampleRate8kHz && | 610 if (frame->sample_rate_hz_ != kSampleRate8kHz && |
617 frame->sample_rate_hz_ != kSampleRate16kHz && | 611 frame->sample_rate_hz_ != kSampleRate16kHz && |
618 frame->sample_rate_hz_ != kSampleRate32kHz && | 612 frame->sample_rate_hz_ != kSampleRate32kHz && |
619 frame->sample_rate_hz_ != kSampleRate48kHz) { | 613 frame->sample_rate_hz_ != kSampleRate48kHz) { |
620 return kBadSampleRateError; | 614 return kBadSampleRateError; |
621 } | 615 } |
622 | 616 |
623 if (public_submodules_->echo_control_mobile->is_enabled() && | |
624 frame->sample_rate_hz_ > kMaxAECMSampleRateHz) { | |
625 LOG(LS_ERROR) << "AECM only supports 16 or 8 kHz sample rates"; | |
626 return kUnsupportedComponentError; | |
627 } | |
628 | |
629 ProcessingConfig processing_config; | 617 ProcessingConfig processing_config; |
630 { | 618 { |
631 // Aquire lock for the access of api_format. | 619 // Aquire lock for the access of api_format. |
632 // The lock is released immediately due to the conditional | 620 // The lock is released immediately due to the conditional |
633 // reinitialization. | 621 // reinitialization. |
634 rtc::CritScope cs_capture(&crit_capture_); | 622 rtc::CritScope cs_capture(&crit_capture_); |
635 // TODO(ajm): The input and output rates and channels are currently | 623 // TODO(ajm): The input and output rates and channels are currently |
636 // constrained to be identical in the int16 interface. | 624 // constrained to be identical in the int16 interface. |
637 processing_config = formats_.api_format; | 625 processing_config = formats_.api_format; |
638 } | 626 } |
(...skipping 813 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1452 debug_dump_.capture.event_msg->mutable_config()->CopyFrom(config); | 1440 debug_dump_.capture.event_msg->mutable_config()->CopyFrom(config); |
1453 | 1441 |
1454 RETURN_ON_ERR(WriteMessageToDebugFile(debug_dump_.debug_file.get(), | 1442 RETURN_ON_ERR(WriteMessageToDebugFile(debug_dump_.debug_file.get(), |
1455 &debug_dump_.num_bytes_left_for_log_, | 1443 &debug_dump_.num_bytes_left_for_log_, |
1456 &crit_debug_, &debug_dump_.capture)); | 1444 &crit_debug_, &debug_dump_.capture)); |
1457 return kNoError; | 1445 return kNoError; |
1458 } | 1446 } |
1459 #endif // WEBRTC_AUDIOPROC_DEBUG_DUMP | 1447 #endif // WEBRTC_AUDIOPROC_DEBUG_DUMP |
1460 | 1448 |
1461 } // namespace webrtc | 1449 } // namespace webrtc |
OLD | NEW |