Index: webrtc/modules/audio_mixer/audio_mixer_impl.cc |
diff --git a/webrtc/modules/audio_mixer/audio_mixer_impl.cc b/webrtc/modules/audio_mixer/audio_mixer_impl.cc |
index a7af8c33d74a85df86a237cb299f5dcd12ce97d0..d7025f9e671279fc73bd7152f55663228c8a005a 100644 |
--- a/webrtc/modules/audio_mixer/audio_mixer_impl.cc |
+++ b/webrtc/modules/audio_mixer/audio_mixer_impl.cc |
@@ -137,6 +137,32 @@ AudioMixerImpl::SourceStatusList::iterator FindSourceInList( |
}); |
} |
+// Rounds the maximal audio source frequency up to an APM-native |
+// frequency. |
+int CalculateMixingFrequency( |
+ const AudioMixerImpl::SourceStatusList& audio_source_list) { |
+ if (audio_source_list.empty()) { |
+ return AudioMixerImpl::kDefaultFrequency; |
+ } |
+ using NativeRate = AudioProcessing::NativeRate; |
+ int maximal_frequency = 0; |
+ for (const auto& source_status : audio_source_list) { |
+ const int source_needed_frequency = |
+ source_status->audio_source->PreferredSampleRate(); |
+ RTC_DCHECK_LE(NativeRate::kSampleRate8kHz, source_needed_frequency); |
+ RTC_DCHECK_LE(source_needed_frequency, NativeRate::kSampleRate48kHz); |
+ maximal_frequency = std::max(maximal_frequency, source_needed_frequency); |
+ } |
+ |
+ static constexpr NativeRate native_rates[] = { |
+ NativeRate::kSampleRate8kHz, NativeRate::kSampleRate16kHz, |
+ NativeRate::kSampleRate32kHz, NativeRate::kSampleRate48kHz}; |
+ const auto rounded_up_index = std::lower_bound( |
+ std::begin(native_rates), std::end(native_rates), maximal_frequency); |
+ RTC_DCHECK(rounded_up_index != std::end(native_rates)); |
+ return *rounded_up_index; |
+} |
+ |
} // namespace |
AudioMixerImpl::AudioMixerImpl(std::unique_ptr<AudioProcessing> limiter) |
@@ -186,12 +212,16 @@ rtc::scoped_refptr<AudioMixerImpl> AudioMixerImpl::Create() { |
new rtc::RefCountedObject<AudioMixerImpl>(std::move(limiter))); |
} |
-void AudioMixerImpl::Mix(int sample_rate, |
- size_t number_of_channels, |
+void AudioMixerImpl::Mix(size_t number_of_channels, |
AudioFrame* audio_frame_for_mixing) { |
RTC_DCHECK(number_of_channels == 1 || number_of_channels == 2); |
RTC_DCHECK_RUNS_SERIALIZED(&race_checker_); |
+ const int sample_rate = [&]() { |
+ rtc::CritScope lock(&crit_); |
+ return CalculateMixingFrequency(audio_source_list_); |
+ }(); |
+ |
if (OutputFrequency() != sample_rate) { |
SetOutputFrequency(sample_rate); |
} |