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