Index: webrtc/modules/audio_processing/audio_processing_impl.cc |
diff --git a/webrtc/modules/audio_processing/audio_processing_impl.cc b/webrtc/modules/audio_processing/audio_processing_impl.cc |
index 1623875ca6b9bf44273f66f02fc09ea160f64740..cfd52df65ac6dc67b7b20bd27922e5bb7a8a139d 100644 |
--- a/webrtc/modules/audio_processing/audio_processing_impl.cc |
+++ b/webrtc/modules/audio_processing/audio_processing_impl.cc |
@@ -58,6 +58,21 @@ |
} while (0) |
namespace webrtc { |
+ |
+const int AudioProcessing::kNativeSampleRatesHz[] = { |
+ AudioProcessing::kSampleRate8kHz, |
+ AudioProcessing::kSampleRate16kHz, |
+#ifdef WEBRTC_ARCH_ARM_FAMILY |
+ AudioProcessing::kSampleRate32kHz}; |
+#else |
+ AudioProcessing::kSampleRate32kHz, |
+ AudioProcessing::kSampleRate48kHz}; |
+#endif // WEBRTC_ARCH_ARM_FAMILY |
+const size_t AudioProcessing::kNumNativeSampleRates = |
+ arraysize(AudioProcessing::kNativeSampleRatesHz); |
+const int AudioProcessing::kMaxNativeSampleRateHz = AudioProcessing:: |
+ kNativeSampleRatesHz[AudioProcessing::kNumNativeSampleRates - 1]; |
+ |
namespace { |
static bool LayoutHasKeyboard(AudioProcessing::ChannelLayout layout) { |
@@ -73,6 +88,21 @@ static bool LayoutHasKeyboard(AudioProcessing::ChannelLayout layout) { |
assert(false); |
return false; |
} |
+ |
+bool is_multi_band(int sample_rate_hz) { |
+ return sample_rate_hz == AudioProcessing::kSampleRate32kHz || |
+ sample_rate_hz == AudioProcessing::kSampleRate48kHz; |
+} |
+ |
+int ClosestNativeRate(int min_proc_rate) { |
+ for (int rate : AudioProcessing::kNativeSampleRatesHz) { |
+ if (rate >= min_proc_rate) { |
+ return rate; |
+ } |
+ } |
+ return AudioProcessing::kMaxNativeSampleRateHz; |
+} |
+ |
} // namespace |
// Throughout webrtc, it's assumed that success is represented by zero. |
@@ -104,20 +134,6 @@ struct AudioProcessingImpl::ApmPrivateSubmodules { |
std::unique_ptr<AgcManagerDirect> agc_manager; |
}; |
-const int AudioProcessing::kNativeSampleRatesHz[] = { |
- AudioProcessing::kSampleRate8kHz, |
- AudioProcessing::kSampleRate16kHz, |
-#ifdef WEBRTC_ARCH_ARM_FAMILY |
- AudioProcessing::kSampleRate32kHz}; |
-#else |
- AudioProcessing::kSampleRate32kHz, |
- AudioProcessing::kSampleRate48kHz}; |
-#endif // WEBRTC_ARCH_ARM_FAMILY |
-const size_t AudioProcessing::kNumNativeSampleRates = |
- arraysize(AudioProcessing::kNativeSampleRatesHz); |
-const int AudioProcessing::kMaxNativeSampleRateHz = AudioProcessing:: |
- kNativeSampleRatesHz[AudioProcessing::kNumNativeSampleRates - 1]; |
- |
AudioProcessing* AudioProcessing::Create() { |
Config config; |
return Create(config, nullptr); |
@@ -346,32 +362,19 @@ int AudioProcessingImpl::InitializeLocked(const ProcessingConfig& config) { |
formats_.api_format = config; |
- // We process at the closest native rate >= min(input rate, output rate). |
- const int min_proc_rate = |
- std::min(formats_.api_format.input_stream().sample_rate_hz(), |
- formats_.api_format.output_stream().sample_rate_hz()); |
- int fwd_proc_rate; |
- for (size_t i = 0; i < kNumNativeSampleRates; ++i) { |
- fwd_proc_rate = kNativeSampleRatesHz[i]; |
- if (fwd_proc_rate >= min_proc_rate) { |
- break; |
- } |
- } |
- |
- capture_nonlocked_.fwd_proc_format = StreamConfig(fwd_proc_rate); |
+ capture_nonlocked_.fwd_proc_format = StreamConfig(ClosestNativeRate(std::min( |
+ formats_.api_format.input_stream().sample_rate_hz(), |
+ formats_.api_format.output_stream().sample_rate_hz()))); |
- // We normally process the reverse stream at 16 kHz. Unless... |
- int rev_proc_rate = kSampleRate16kHz; |
+ int rev_proc_rate = ClosestNativeRate(std::min( |
+ formats_.api_format.reverse_input_stream().sample_rate_hz(), |
+ formats_.api_format.reverse_output_stream().sample_rate_hz())); |
+ // If the forward sample rate is 8 kHz, the reverse stream is also processed |
+ // at this rate. |
if (capture_nonlocked_.fwd_proc_format.sample_rate_hz() == kSampleRate8kHz) { |
- // ...the forward stream is at 8 kHz. |
rev_proc_rate = kSampleRate8kHz; |
} else { |
- if (formats_.api_format.reverse_input_stream().sample_rate_hz() == |
- kSampleRate32kHz) { |
- // ...or the input is at 32 kHz, in which case we use the splitting |
- // filter rather than the resampler. |
- rev_proc_rate = kSampleRate32kHz; |
- } |
+ rev_proc_rate = std::max(rev_proc_rate, static_cast<int>(kSampleRate16kHz)); |
} |
// Always downmix the reverse stream to mono for analysis. This has been |
@@ -627,8 +630,7 @@ int AudioProcessingImpl::ProcessStream(AudioFrame* frame) { |
capture_.capture_audio->DeinterleaveFrom(frame); |
RETURN_ON_ERR(ProcessStreamLocked()); |
- capture_.capture_audio->InterleaveTo(frame, |
- output_copy_needed(is_data_processed())); |
+ capture_.capture_audio->InterleaveTo(frame, output_copy_needed()); |
#ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP |
if (debug_dump_.debug_file->Open()) { |
@@ -674,8 +676,7 @@ int AudioProcessingImpl::ProcessStreamLocked() { |
capture_nonlocked_.fwd_proc_format.num_frames()); |
} |
- bool data_processed = is_data_processed(); |
- if (analysis_needed(data_processed)) { |
+ if (fwd_analysis_needed()) { |
ca->SplitIntoFrequencyBands(); |
} |
@@ -733,7 +734,7 @@ int AudioProcessingImpl::ProcessStreamLocked() { |
RETURN_ON_ERR(public_submodules_->gain_control->ProcessCaptureAudio( |
ca, echo_cancellation()->stream_has_echo())); |
- if (synthesis_needed(data_processed)) { |
+ if (fwd_synthesis_needed()) { |
ca->MergeFrequencyBands(); |
} |
@@ -903,7 +904,7 @@ int AudioProcessingImpl::AnalyzeReverseStream(AudioFrame* frame) { |
int AudioProcessingImpl::ProcessReverseStreamLocked() { |
AudioBuffer* ra = render_.render_audio.get(); // For brevity. |
- if (formats_.rev_proc_format.sample_rate_hz() == kSampleRate32kHz) { |
+ if (rev_analysis_needed()) { |
ra->SplitIntoFrequencyBands(); |
} |
@@ -920,8 +921,7 @@ int AudioProcessingImpl::ProcessReverseStreamLocked() { |
RETURN_ON_ERR(public_submodules_->gain_control->ProcessRenderAudio(ra)); |
} |
- if (formats_.rev_proc_format.sample_rate_hz() == kSampleRate32kHz && |
- is_rev_processed()) { |
+ if (rev_synthesis_needed()) { |
ra->MergeFrequencyBands(); |
} |
@@ -1128,31 +1128,26 @@ bool AudioProcessingImpl::is_data_processed() const { |
return false; |
} |
-bool AudioProcessingImpl::output_copy_needed(bool is_data_processed) const { |
+bool AudioProcessingImpl::output_copy_needed() const { |
// Check if we've upmixed or downmixed the audio. |
return ((formats_.api_format.output_stream().num_channels() != |
formats_.api_format.input_stream().num_channels()) || |
- is_data_processed || capture_.transient_suppressor_enabled); |
+ is_data_processed() || capture_.transient_suppressor_enabled); |
} |
-bool AudioProcessingImpl::synthesis_needed(bool is_data_processed) const { |
- return (is_data_processed && |
- (capture_nonlocked_.fwd_proc_format.sample_rate_hz() == |
- kSampleRate32kHz || |
- capture_nonlocked_.fwd_proc_format.sample_rate_hz() == |
- kSampleRate48kHz)); |
+bool AudioProcessingImpl::fwd_synthesis_needed() const { |
+ return (is_data_processed() && |
+ is_multi_band(capture_nonlocked_.fwd_proc_format.sample_rate_hz())); |
} |
-bool AudioProcessingImpl::analysis_needed(bool is_data_processed) const { |
- if (!is_data_processed && |
+bool AudioProcessingImpl::fwd_analysis_needed() const { |
+ if (!is_data_processed() && |
!public_submodules_->voice_detection->is_enabled() && |
!capture_.transient_suppressor_enabled) { |
// Only public_submodules_->level_estimator is enabled. |
return false; |
- } else if (capture_nonlocked_.fwd_proc_format.sample_rate_hz() == |
- kSampleRate32kHz || |
- capture_nonlocked_.fwd_proc_format.sample_rate_hz() == |
- kSampleRate48kHz) { |
+ } else if (is_multi_band( |
+ capture_nonlocked_.fwd_proc_format.sample_rate_hz())) { |
// Something besides public_submodules_->level_estimator is enabled, and we |
// have super-wb. |
return true; |
@@ -1164,6 +1159,15 @@ bool AudioProcessingImpl::is_rev_processed() const { |
return constants_.intelligibility_enabled; |
} |
+bool AudioProcessingImpl::rev_synthesis_needed() const { |
+ return (is_rev_processed() && |
+ is_multi_band(formats_.rev_proc_format.sample_rate_hz())); |
+} |
+ |
+bool AudioProcessingImpl::rev_analysis_needed() const { |
+ return is_multi_band(formats_.rev_proc_format.sample_rate_hz()); |
+} |
+ |
bool AudioProcessingImpl::render_check_rev_conversion_needed() const { |
return rev_conversion_needed(); |
} |