Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(47)

Unified Diff: webrtc/modules/audio_mixer/audio_mixer_impl.cc

Issue 2557713006: Injectable output rate calculater for AudioMixer. (Closed)
Patch Set: stl instead of loop, renamed SetOutputFrequency. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 70363c09d481c4ad620400879748344eb558ef82..3da1be227071da85ea62b08f4ec3cdf3611286e5 100644
--- a/webrtc/modules/audio_mixer/audio_mixer_impl.cc
+++ b/webrtc/modules/audio_mixer/audio_mixer_impl.cc
@@ -12,11 +12,13 @@
#include <algorithm>
#include <functional>
+#include <iterator>
#include <utility>
#include "webrtc/audio/utility/audio_frame_operations.h"
#include "webrtc/base/logging.h"
#include "webrtc/modules/audio_mixer/audio_frame_manipulator.h"
+#include "webrtc/modules/audio_mixer/default_output_rate_calculator.h"
namespace webrtc {
namespace {
@@ -137,45 +139,7 @@ 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)
- : audio_source_list_(),
- use_limiter_(true),
- time_stamp_(0),
- limiter_(std::move(limiter)) {
- SetOutputFrequency(kDefaultFrequency);
-}
-
-AudioMixerImpl::~AudioMixerImpl() {}
-
-rtc::scoped_refptr<AudioMixerImpl> AudioMixerImpl::Create() {
+std::unique_ptr<AudioProcessing> CreateLimiter() {
Config config;
config.Set<ExperimentalAgc>(new ExperimentalAgc(false));
std::unique_ptr<AudioProcessing> limiter(AudioProcessing::Create(config));
@@ -207,9 +171,36 @@ rtc::scoped_refptr<AudioMixerImpl> AudioMixerImpl::Create() {
if (limiter->gain_control()->Enable(true) != limiter->kNoError) {
return nullptr;
}
+ return limiter;
+}
+} // namespace
+
+AudioMixerImpl::AudioMixerImpl(
+ std::unique_ptr<AudioProcessing> limiter,
+ std::unique_ptr<OutputRateCalculator> output_rate_calculator)
+ : output_rate_calculator_(std::move(output_rate_calculator)),
+ output_frequency_(0),
+ sample_size_(0),
+ audio_source_list_(),
+ use_limiter_(true),
+ time_stamp_(0),
+ limiter_(std::move(limiter)) {}
+
+AudioMixerImpl::~AudioMixerImpl() {}
+
+rtc::scoped_refptr<AudioMixerImpl> AudioMixerImpl::Create() {
+ return CreateWithOutputRateCalculator(
+ std::unique_ptr<DefaultOutputRateCalculator>(
+ new DefaultOutputRateCalculator()));
+}
+
+rtc::scoped_refptr<AudioMixerImpl>
+AudioMixerImpl::CreateWithOutputRateCalculator(
+ std::unique_ptr<OutputRateCalculator> output_rate_calculator) {
return rtc::scoped_refptr<AudioMixerImpl>(
- new rtc::RefCountedObject<AudioMixerImpl>(std::move(limiter)));
+ new rtc::RefCountedObject<AudioMixerImpl>(
+ CreateLimiter(), std::move(output_rate_calculator)));
}
void AudioMixerImpl::Mix(size_t number_of_channels,
@@ -217,14 +208,7 @@ void AudioMixerImpl::Mix(size_t number_of_channels,
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);
- }
+ CalculateOutputFrequency();
AudioFrameList mix_list;
{
@@ -259,9 +243,19 @@ void AudioMixerImpl::Mix(size_t number_of_channels,
return;
}
-void AudioMixerImpl::SetOutputFrequency(int frequency) {
+void AudioMixerImpl::CalculateOutputFrequency() {
RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
- output_frequency_ = frequency;
+ rtc::CritScope lock(&crit_);
+
+ std::vector<int> preferred_rates;
+ std::transform(audio_source_list_.begin(), audio_source_list_.end(),
+ std::back_inserter(preferred_rates),
+ [&](std::unique_ptr<SourceStatus>& a) {
+ return a->audio_source->PreferredSampleRate();
+ });
+
+ output_frequency_ =
+ output_rate_calculator_->CalculateOutputRate(preferred_rates);
sample_size_ = (output_frequency_ * kFrameDurationInMs) / 1000;
}
« no previous file with comments | « webrtc/modules/audio_mixer/audio_mixer_impl.h ('k') | webrtc/modules/audio_mixer/audio_mixer_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698