Cleanup of the mixer interface.
This implements some of the suggestions in https://codereview.webrtc.org/2386383003/, namely
* Removing anonymous mixing.
* Removing the volume meter.
BUG=webrtc:6346
Review-Url: https://codereview.webrtc.org/2402283003
Cr-Commit-Position: refs/heads/master@{#14609}
diff --git a/webrtc/modules/audio_mixer/audio_mixer.h b/webrtc/modules/audio_mixer/audio_mixer.h
index 1744fd5..0c71469 100644
--- a/webrtc/modules/audio_mixer/audio_mixer.h
+++ b/webrtc/modules/audio_mixer/audio_mixer.h
@@ -13,7 +13,6 @@
#include <memory>
-#include "webrtc/modules/include/module.h"
#include "webrtc/modules/include/module_common_types.h"
namespace webrtc {
@@ -21,14 +20,6 @@
class AudioMixer {
public:
static const int kMaximumAmountOfMixedAudioSources = 3;
- enum Frequency {
- kNbInHz = 8000,
- kWbInHz = 16000,
- kSwbInHz = 32000,
- kFbInHz = 48000,
- kDefaultFrequency = kWbInHz
- };
-
// A callback class that all mixer participants must inherit from/implement.
class Source {
public:
@@ -54,52 +45,26 @@
// AudioFrame pointer at any time until the next call to
// GetAudioFrameWithInfo, or until the source is removed from the
// mixer.
- virtual AudioFrameWithInfo GetAudioFrameWithInfo(int32_t id,
- int sample_rate_hz) = 0;
+ virtual AudioFrameWithInfo GetAudioFrameWithInfo(int sample_rate_hz) = 0;
protected:
virtual ~Source() {}
};
// Factory method. Constructor disabled.
- static std::unique_ptr<AudioMixer> Create(int id);
+ static std::unique_ptr<AudioMixer> Create();
virtual ~AudioMixer() {}
// Add/remove audio sources as candidates for mixing.
virtual int32_t SetMixabilityStatus(Source* audio_source, bool mixable) = 0;
- // Returns true if an audio source is a candidate for mixing.
- virtual bool MixabilityStatus(const Source& audio_source) const = 0;
-
- // Inform the mixer that the audio source should always be mixed and not
- // count toward the number of mixed audio sources. Note that an audio source
- // must have been added to the mixer (by calling SetMixabilityStatus())
- // before this function can be successfully called.
- virtual int32_t SetAnonymousMixabilityStatus(Source* audio_source,
- bool mixable) = 0;
// Performs mixing by asking registered audio sources for audio. The
- // mixed result is placed in the provided AudioFrame. Can only be
+ // mixed result is placed in the provided AudioFrame. Will only be
// called from a single thread. The rate and channels arguments
// specify the rate and number of channels of the mix result.
- virtual void Mix(int sample_rate,
+ virtual void Mix(int sample_rate_hz,
size_t number_of_channels,
AudioFrame* audio_frame_for_mixing) = 0;
-
- // Returns true if the audio source is mixed anonymously.
- virtual bool AnonymousMixabilityStatus(const Source& audio_source) const = 0;
-
- // Output level functions for VoEVolumeControl. Return value
- // between 0 and 9 is returned by voe::AudioLevel.
- virtual int GetOutputAudioLevel() = 0;
-
- // Return value between 0 and 0x7fff is returned by voe::AudioLevel.
- virtual int GetOutputAudioLevelFullRange() = 0;
-
- protected:
- AudioMixer() {}
-
- private:
- RTC_DISALLOW_COPY_AND_ASSIGN(AudioMixer);
};
} // namespace webrtc
diff --git a/webrtc/modules/audio_mixer/audio_mixer_impl.cc b/webrtc/modules/audio_mixer/audio_mixer_impl.cc
index 789d63b..e570e22 100644
--- a/webrtc/modules/audio_mixer/audio_mixer_impl.cc
+++ b/webrtc/modules/audio_mixer/audio_mixer_impl.cc
@@ -17,7 +17,6 @@
#include "webrtc/base/logging.h"
#include "webrtc/modules/audio_mixer/audio_frame_manipulator.h"
#include "webrtc/modules/utility/include/audio_frame_operations.h"
-#include "webrtc/system_wrappers/include/trace.h"
namespace webrtc {
namespace {
@@ -81,12 +80,10 @@
// Mix the AudioFrames stored in audioFrameList into mixed_audio.
int32_t MixFromList(AudioFrame* mixed_audio,
const AudioFrameList& audio_frame_list,
- int32_t id,
bool use_limiter) {
- WEBRTC_TRACE(kTraceStream, kTraceAudioMixerServer, id,
- "MixFromList(mixed_audio, audio_frame_list)");
- if (audio_frame_list.empty())
+ if (audio_frame_list.empty()) {
return 0;
+ }
if (audio_frame_list.size() == 1) {
mixed_audio->timestamp_ = audio_frame_list.front()->timestamp_;
@@ -128,6 +125,7 @@
});
}
+// TODO(aleloi): remove non-const version when WEBRTC only supports modern STL.
AudioMixerImpl::SourceStatusList::iterator FindSourceInList(
AudioMixerImpl::Source const* audio_source,
AudioMixerImpl::SourceStatusList* audio_source_list) {
@@ -139,14 +137,12 @@
} // namespace
-std::unique_ptr<AudioMixer> AudioMixer::Create(int id) {
- return AudioMixerImpl::Create(id);
+std::unique_ptr<AudioMixer> AudioMixer::Create() {
+ return AudioMixerImpl::Create();
}
-AudioMixerImpl::AudioMixerImpl(int id, std::unique_ptr<AudioProcessing> limiter)
- : id_(id),
- audio_source_list_(),
- additional_audio_source_list_(),
+AudioMixerImpl::AudioMixerImpl(std::unique_ptr<AudioProcessing> limiter)
+ : audio_source_list_(),
num_mixed_audio_sources_(0),
use_limiter_(true),
time_stamp_(0),
@@ -157,34 +153,41 @@
AudioMixerImpl::~AudioMixerImpl() {}
-std::unique_ptr<AudioMixerImpl> AudioMixerImpl::Create(int id) {
+std::unique_ptr<AudioMixerImpl> AudioMixerImpl::Create() {
Config config;
config.Set<ExperimentalAgc>(new ExperimentalAgc(false));
std::unique_ptr<AudioProcessing> limiter(AudioProcessing::Create(config));
- if (!limiter.get())
+ if (!limiter.get()) {
return nullptr;
+ }
if (limiter->gain_control()->set_mode(GainControl::kFixedDigital) !=
- limiter->kNoError)
+ limiter->kNoError) {
return nullptr;
+ }
// We smoothly limit the mixed frame to -7 dbFS. -6 would correspond to the
// divide-by-2 but -7 is used instead to give a bit of headroom since the
// AGC is not a hard limiter.
- if (limiter->gain_control()->set_target_level_dbfs(7) != limiter->kNoError)
+ if (limiter->gain_control()->set_target_level_dbfs(7) != limiter->kNoError) {
return nullptr;
+ }
- if (limiter->gain_control()->set_compression_gain_db(0) != limiter->kNoError)
+ if (limiter->gain_control()->set_compression_gain_db(0) !=
+ limiter->kNoError) {
return nullptr;
+ }
- if (limiter->gain_control()->enable_limiter(true) != limiter->kNoError)
+ if (limiter->gain_control()->enable_limiter(true) != limiter->kNoError) {
return nullptr;
+ }
- if (limiter->gain_control()->Enable(true) != limiter->kNoError)
+ if (limiter->gain_control()->Enable(true) != limiter->kNoError) {
return nullptr;
+ }
return std::unique_ptr<AudioMixerImpl>(
- new AudioMixerImpl(id, std::move(limiter)));
+ new AudioMixerImpl(std::move(limiter)));
}
void AudioMixerImpl::Mix(int sample_rate,
@@ -193,31 +196,18 @@
RTC_DCHECK(number_of_channels == 1 || number_of_channels == 2);
RTC_DCHECK_RUN_ON(&thread_checker_);
- if (sample_rate != kNbInHz && sample_rate != kWbInHz &&
- sample_rate != kSwbInHz && sample_rate != kFbInHz) {
- WEBRTC_TRACE(kTraceError, kTraceAudioMixerServer, id_,
- "Invalid frequency: %d", sample_rate);
- RTC_NOTREACHED();
- return;
- }
-
if (OutputFrequency() != sample_rate) {
- SetOutputFrequency(static_cast<Frequency>(sample_rate));
+ SetOutputFrequency(sample_rate);
}
AudioFrameList mix_list;
- AudioFrameList anonymous_mix_list;
size_t num_mixed_audio_sources;
{
rtc::CritScope lock(&crit_);
mix_list = GetNonAnonymousAudio();
- anonymous_mix_list = GetAnonymousAudio();
num_mixed_audio_sources = num_mixed_audio_sources_;
}
- mix_list.insert(mix_list.begin(), anonymous_mix_list.begin(),
- anonymous_mix_list.end());
-
for (const auto& frame : mix_list) {
RemixFrame(number_of_channels, frame);
}
@@ -231,7 +221,7 @@
use_limiter_ = num_mixed_audio_sources > 1;
// We only use the limiter if we're actually mixing multiple streams.
- MixFromList(audio_frame_for_mixing, mix_list, id_, use_limiter_);
+ MixFromList(audio_frame_for_mixing, mix_list, use_limiter_);
if (audio_frame_for_mixing->samples_per_channel_ == 0) {
// Nothing was mixed, set the audio samples to silence.
@@ -242,40 +232,28 @@
LimitMixedAudio(audio_frame_for_mixing);
}
- // Pass the final result to the level indicator.
- audio_level_.ComputeLevel(*audio_frame_for_mixing);
-
return;
}
-int32_t AudioMixerImpl::SetOutputFrequency(const Frequency& frequency) {
+void AudioMixerImpl::SetOutputFrequency(int frequency) {
RTC_DCHECK_RUN_ON(&thread_checker_);
output_frequency_ = frequency;
sample_size_ = (output_frequency_ * kFrameDurationInMs) / 1000;
-
- return 0;
}
-AudioMixer::Frequency AudioMixerImpl::OutputFrequency() const {
+int AudioMixerImpl::OutputFrequency() const {
RTC_DCHECK_RUN_ON(&thread_checker_);
return output_frequency_;
}
int32_t AudioMixerImpl::SetMixabilityStatus(Source* audio_source,
bool mixable) {
- if (!mixable) {
- // Anonymous audio sources are in a separate list. Make sure that the
- // audio source is in the _audioSourceList if it is being mixed.
- SetAnonymousMixabilityStatus(audio_source, false);
- }
{
rtc::CritScope lock(&crit_);
const bool is_mixed = FindSourceInList(audio_source, &audio_source_list_) !=
audio_source_list_.end();
// API must be called with a new state.
if (!(mixable ^ is_mixed)) {
- WEBRTC_TRACE(kTraceWarning, kTraceAudioMixerServer, id_,
- "Mixable is aready %s", is_mixed ? "ON" : "off");
return -1;
}
bool success = false;
@@ -285,8 +263,6 @@
success = RemoveAudioSourceFromList(audio_source, &audio_source_list_);
}
if (!success) {
- WEBRTC_TRACE(kTraceError, kTraceAudioMixerServer, id_,
- "failed to %s audio_source", mixable ? "add" : "remove");
RTC_NOTREACHED();
return -1;
}
@@ -295,64 +271,15 @@
if (num_mixed_non_anonymous > kMaximumAmountOfMixedAudioSources) {
num_mixed_non_anonymous = kMaximumAmountOfMixedAudioSources;
}
- num_mixed_audio_sources_ =
- num_mixed_non_anonymous + additional_audio_source_list_.size();
+ num_mixed_audio_sources_ = num_mixed_non_anonymous;
}
return 0;
}
-bool AudioMixerImpl::MixabilityStatus(const Source& audio_source) const {
- rtc::CritScope lock(&crit_);
- return FindSourceInList(&audio_source, &audio_source_list_) !=
- audio_source_list_.end();
-}
-int32_t AudioMixerImpl::SetAnonymousMixabilityStatus(Source* audio_source,
- bool anonymous) {
- rtc::CritScope lock(&crit_);
- if (FindSourceInList(audio_source, &additional_audio_source_list_) !=
- additional_audio_source_list_.end()) {
- if (anonymous) {
- return 0;
- }
- if (!RemoveAudioSourceFromList(audio_source,
- &additional_audio_source_list_)) {
- WEBRTC_TRACE(kTraceError, kTraceAudioMixerServer, id_,
- "unable to remove audio_source from anonymous list");
- RTC_NOTREACHED();
- return -1;
- }
- return AddAudioSourceToList(audio_source, &audio_source_list_) ? 0 : -1;
- }
- if (!anonymous) {
- return 0;
- }
- const bool mixable =
- RemoveAudioSourceFromList(audio_source, &audio_source_list_);
- if (!mixable) {
- WEBRTC_TRACE(
- kTraceWarning, kTraceAudioMixerServer, id_,
- "audio_source must be registered before turning it into anonymous");
- // Setting anonymous status is only possible if MixerAudioSource is
- // already registered.
- return -1;
- }
- return AddAudioSourceToList(audio_source, &additional_audio_source_list_)
- ? 0
- : -1;
-}
-
-bool AudioMixerImpl::AnonymousMixabilityStatus(
- const Source& audio_source) const {
- rtc::CritScope lock(&crit_);
- return FindSourceInList(&audio_source, &additional_audio_source_list_) !=
- additional_audio_source_list_.end();
-}
AudioFrameList AudioMixerImpl::GetNonAnonymousAudio() {
RTC_DCHECK_RUN_ON(&thread_checker_);
- WEBRTC_TRACE(kTraceStream, kTraceAudioMixerServer, id_,
- "GetNonAnonymousAudio()");
AudioFrameList result;
std::vector<SourceFrame> audio_source_mixing_data_list;
std::vector<SourceFrame> ramp_list;
@@ -361,14 +288,13 @@
for (auto& source_and_status : audio_source_list_) {
auto audio_frame_with_info =
source_and_status.audio_source->GetAudioFrameWithInfo(
- id_, static_cast<int>(OutputFrequency()));
+ static_cast<int>(OutputFrequency()));
const auto audio_frame_info = audio_frame_with_info.audio_frame_info;
AudioFrame* audio_source_audio_frame = audio_frame_with_info.audio_frame;
if (audio_frame_info == Source::AudioFrameInfo::kError) {
- WEBRTC_TRACE(kTraceWarning, kTraceAudioMixerServer, id_,
- "failed to GetAudioFrameWithMuted() from source");
+ LOG_F(LS_WARNING) << "failed to GetAudioFrameWithInfo() from source";
continue;
}
audio_source_mixing_data_list.emplace_back(
@@ -404,38 +330,9 @@
return result;
}
-AudioFrameList AudioMixerImpl::GetAnonymousAudio() {
- RTC_DCHECK_RUN_ON(&thread_checker_);
- WEBRTC_TRACE(kTraceStream, kTraceAudioMixerServer, id_,
- "GetAnonymousAudio()");
- std::vector<SourceFrame> ramp_list;
- AudioFrameList result;
- for (auto& source_and_status : additional_audio_source_list_) {
- const auto audio_frame_with_info =
- source_and_status.audio_source->GetAudioFrameWithInfo(
- id_, OutputFrequency());
- const auto ret = audio_frame_with_info.audio_frame_info;
- AudioFrame* audio_frame = audio_frame_with_info.audio_frame;
- if (ret == Source::AudioFrameInfo::kError) {
- WEBRTC_TRACE(kTraceWarning, kTraceAudioMixerServer, id_,
- "failed to GetAudioFrameWithMuted() from audio_source");
- continue;
- }
- if (ret != Source::AudioFrameInfo::kMuted) {
- result.push_back(audio_frame);
- ramp_list.emplace_back(&source_and_status, audio_frame, false, 0);
- source_and_status.is_mixed = true;
- }
- }
- RampAndUpdateGain(ramp_list);
- return result;
-}
-
bool AudioMixerImpl::AddAudioSourceToList(
Source* audio_source,
SourceStatusList* audio_source_list) const {
- WEBRTC_TRACE(kTraceStream, kTraceAudioMixerServer, id_,
- "AddAudioSourceToList(audio_source, audio_source_list)");
audio_source_list->emplace_back(audio_source, false, 0);
return true;
}
@@ -443,8 +340,6 @@
bool AudioMixerImpl::RemoveAudioSourceFromList(
Source* audio_source,
SourceStatusList* audio_source_list) const {
- WEBRTC_TRACE(kTraceStream, kTraceAudioMixerServer, id_,
- "RemoveAudioSourceFromList(audio_source, audio_source_list)");
const auto iter = FindSourceInList(audio_source, audio_source_list);
if (iter != audio_source_list->end()) {
audio_source_list->erase(iter);
@@ -476,32 +371,15 @@
*mixed_audio += *mixed_audio;
if (error != limiter_->kNoError) {
- WEBRTC_TRACE(kTraceError, kTraceAudioMixerServer, id_,
- "Error from AudioProcessing: %d", error);
+ LOG_F(LS_ERROR) << "Error from AudioProcessing: " << error;
RTC_NOTREACHED();
return false;
}
return true;
}
-int AudioMixerImpl::GetOutputAudioLevel() {
- RTC_DCHECK_RUN_ON(&thread_checker_);
- const int level = audio_level_.Level();
- WEBRTC_TRACE(kTraceStateInfo, kTraceAudioMixerServer, id_,
- "GetAudioOutputLevel() => level=%d", level);
- return level;
-}
-
-int AudioMixerImpl::GetOutputAudioLevelFullRange() {
- RTC_DCHECK_RUN_ON(&thread_checker_);
- const int level = audio_level_.LevelFullRange();
- WEBRTC_TRACE(kTraceStateInfo, kTraceAudioMixerServer, id_,
- "GetAudioOutputLevelFullRange() => level=%d", level);
- return level;
-}
-
bool AudioMixerImpl::GetAudioSourceMixabilityStatusForTest(
- AudioMixerImpl::Source* audio_source) {
+ AudioMixerImpl::Source* audio_source) const {
RTC_DCHECK_RUN_ON(&thread_checker_);
rtc::CritScope lock(&crit_);
@@ -511,12 +389,6 @@
return non_anonymous_iter->is_mixed;
}
- const auto anonymous_iter =
- FindSourceInList(audio_source, &additional_audio_source_list_);
- if (anonymous_iter != audio_source_list_.end()) {
- return anonymous_iter->is_mixed;
- }
-
LOG(LS_ERROR) << "Audio source unknown";
return false;
}
diff --git a/webrtc/modules/audio_mixer/audio_mixer_impl.h b/webrtc/modules/audio_mixer/audio_mixer_impl.h
index d4b9aa8..9048775 100644
--- a/webrtc/modules/audio_mixer/audio_mixer_impl.h
+++ b/webrtc/modules/audio_mixer/audio_mixer_impl.h
@@ -11,7 +11,6 @@
#ifndef WEBRTC_MODULES_AUDIO_MIXER_AUDIO_MIXER_IMPL_H_
#define WEBRTC_MODULES_AUDIO_MIXER_AUDIO_MIXER_IMPL_H_
-#include <map>
#include <memory>
#include <vector>
@@ -42,41 +41,35 @@
// AudioProcessing only accepts 10 ms frames.
static const int kFrameDurationInMs = 10;
+ static const int kDefaultFrequency = 48000;
- static std::unique_ptr<AudioMixerImpl> Create(int id);
+ static std::unique_ptr<AudioMixerImpl> Create();
~AudioMixerImpl() override;
// AudioMixer functions
int32_t SetMixabilityStatus(Source* audio_source, bool mixable) override;
- bool MixabilityStatus(const Source& audio_source) const override;
- int32_t SetAnonymousMixabilityStatus(Source* audio_source,
- bool mixable) override;
void Mix(int sample_rate,
size_t number_of_channels,
AudioFrame* audio_frame_for_mixing) override;
- bool AnonymousMixabilityStatus(const Source& audio_source) const override;
// Returns true if the source was mixed last round. Returns
// false and logs an error if the source was never added to the
// mixer.
- bool GetAudioSourceMixabilityStatusForTest(Source* audio_source);
+ bool GetAudioSourceMixabilityStatusForTest(Source* audio_source) const;
private:
- AudioMixerImpl(int id, std::unique_ptr<AudioProcessing> limiter);
+ explicit AudioMixerImpl(std::unique_ptr<AudioProcessing> limiter);
// Set/get mix frequency
- int32_t SetOutputFrequency(const Frequency& frequency);
- Frequency OutputFrequency() const;
+ void SetOutputFrequency(int frequency);
+ int OutputFrequency() const;
// Compute what audio sources to mix from audio_source_list_. Ramp
// in and out. Update mixed status. Mixes up to
// kMaximumAmountOfMixedAudioSources audio sources.
AudioFrameList GetNonAnonymousAudio() EXCLUSIVE_LOCKS_REQUIRED(crit_);
- // Return the AudioFrames that should be mixed anonymously. Ramp in
- // and out. Update mixed status.
- AudioFrameList GetAnonymousAudio() EXCLUSIVE_LOCKS_REQUIRED(crit_);
// Add/remove the MixerAudioSource to the specified
// MixerAudioSource list.
@@ -87,25 +80,16 @@
bool LimitMixedAudio(AudioFrame* mixed_audio) const;
- // Output level functions for VoEVolumeControl.
- int GetOutputAudioLevel() override;
-
- int GetOutputAudioLevelFullRange() override;
rtc::CriticalSection crit_;
- const int32_t id_;
-
// The current sample frequency and sample size when mixing.
- Frequency output_frequency_ ACCESS_ON(&thread_checker_);
+ int output_frequency_ ACCESS_ON(&thread_checker_);
size_t sample_size_ ACCESS_ON(&thread_checker_);
// List of all audio sources. Note all lists are disjunct
SourceStatusList audio_source_list_ GUARDED_BY(crit_); // May be mixed.
- // Always mixed, anonymously.
- SourceStatusList additional_audio_source_list_ GUARDED_BY(crit_);
-
size_t num_mixed_audio_sources_ GUARDED_BY(crit_);
// Determines if we will use a limiter for clipping protection during
// mixing.
@@ -119,9 +103,6 @@
// Used for inhibiting saturation in mixing.
std::unique_ptr<AudioProcessing> limiter_ ACCESS_ON(&thread_checker_);
- // Measures audio level for the combined signal.
- voe::AudioLevel audio_level_ ACCESS_ON(&thread_checker_);
-
RTC_DISALLOW_COPY_AND_ASSIGN(AudioMixerImpl);
};
} // namespace webrtc
diff --git a/webrtc/modules/audio_mixer/test/audio_mixer_unittest.cc b/webrtc/modules/audio_mixer/test/audio_mixer_unittest.cc
index 4bf706b..2226fe9 100644
--- a/webrtc/modules/audio_mixer/test/audio_mixer_unittest.cc
+++ b/webrtc/modules/audio_mixer/test/audio_mixer_unittest.cc
@@ -52,13 +52,12 @@
public:
MockMixerAudioSource()
: fake_audio_frame_info_(AudioMixer::Source::AudioFrameInfo::kNormal) {
- ON_CALL(*this, GetAudioFrameWithInfo(_, _))
+ ON_CALL(*this, GetAudioFrameWithInfo(_))
.WillByDefault(
Invoke(this, &MockMixerAudioSource::FakeAudioFrameWithInfo));
}
- MOCK_METHOD2(GetAudioFrameWithInfo,
- AudioFrameWithInfo(const int32_t id, int sample_rate_hz));
+ MOCK_METHOD1(GetAudioFrameWithInfo, AudioFrameWithInfo(int sample_rate_hz));
AudioFrame* fake_frame() { return &fake_frame_; }
AudioFrameInfo fake_info() { return fake_audio_frame_info_; }
@@ -69,8 +68,7 @@
private:
AudioFrame fake_frame_, fake_output_frame_;
AudioFrameInfo fake_audio_frame_info_;
- AudioFrameWithInfo FakeAudioFrameWithInfo(const int32_t id,
- int sample_rate_hz) {
+ AudioFrameWithInfo FakeAudioFrameWithInfo(int sample_rate_hz) {
fake_output_frame_.CopyFrom(fake_frame_);
return {
&fake_output_frame_, // audio_frame_pointer
@@ -89,7 +87,7 @@
RTC_DCHECK(frames.size() == frame_info.size());
RTC_DCHECK(frame_info.size() == expected_status.size());
- const std::unique_ptr<AudioMixerImpl> mixer(AudioMixerImpl::Create(kId));
+ const std::unique_ptr<AudioMixerImpl> mixer(AudioMixerImpl::Create());
std::vector<MockMixerAudioSource> participants(num_audio_sources);
for (int i = 0; i < num_audio_sources; i++) {
@@ -99,7 +97,7 @@
for (int i = 0; i < num_audio_sources; i++) {
EXPECT_EQ(0, mixer->SetMixabilityStatus(&participants[i], true));
- EXPECT_CALL(participants[i], GetAudioFrameWithInfo(_, kDefaultSampleRateHz))
+ EXPECT_CALL(participants[i], GetAudioFrameWithInfo(kDefaultSampleRateHz))
.Times(Exactly(1));
}
@@ -112,62 +110,11 @@
}
}
-TEST(AudioMixer, AnonymousAndNamed) {
- // Should not matter even if partipants are more than
- // kMaximumAmountOfMixedAudioSources.
- constexpr int kNamed = AudioMixer::kMaximumAmountOfMixedAudioSources + 1;
- constexpr int kAnonymous = AudioMixer::kMaximumAmountOfMixedAudioSources + 1;
-
- const std::unique_ptr<AudioMixer> mixer(AudioMixer::Create(kId));
-
- MockMixerAudioSource named[kNamed];
- MockMixerAudioSource anonymous[kAnonymous];
-
- for (int i = 0; i < kNamed; ++i) {
- EXPECT_EQ(0, mixer->SetMixabilityStatus(&named[i], true));
- EXPECT_TRUE(mixer->MixabilityStatus(named[i]));
- }
-
- for (int i = 0; i < kAnonymous; ++i) {
- // AudioSource must be registered before turning it into anonymous.
- EXPECT_EQ(-1, mixer->SetAnonymousMixabilityStatus(&anonymous[i], true));
- EXPECT_EQ(0, mixer->SetMixabilityStatus(&anonymous[i], true));
- EXPECT_TRUE(mixer->MixabilityStatus(anonymous[i]));
- EXPECT_FALSE(mixer->AnonymousMixabilityStatus(anonymous[i]));
-
- EXPECT_EQ(0, mixer->SetAnonymousMixabilityStatus(&anonymous[i], true));
- EXPECT_TRUE(mixer->AnonymousMixabilityStatus(anonymous[i]));
-
- // Anonymous participants do not show status by MixabilityStatus.
- EXPECT_FALSE(mixer->MixabilityStatus(anonymous[i]));
- }
-
- for (int i = 0; i < kNamed; ++i) {
- EXPECT_EQ(0, mixer->SetMixabilityStatus(&named[i], false));
- EXPECT_FALSE(mixer->MixabilityStatus(named[i]));
- }
-
- for (int i = 0; i < kAnonymous - 1; i++) {
- EXPECT_EQ(0, mixer->SetAnonymousMixabilityStatus(&anonymous[i], false));
- EXPECT_FALSE(mixer->AnonymousMixabilityStatus(anonymous[i]));
-
- // SetAnonymousMixabilityStatus(anonymous, false) moves anonymous to the
- // named group.
- EXPECT_TRUE(mixer->MixabilityStatus(anonymous[i]));
- }
-
- // SetMixabilityStatus(anonymous, false) will remove anonymous from both
- // anonymous and named groups.
- EXPECT_EQ(0, mixer->SetMixabilityStatus(&anonymous[kAnonymous - 1], false));
- EXPECT_FALSE(mixer->AnonymousMixabilityStatus(anonymous[kAnonymous - 1]));
- EXPECT_FALSE(mixer->MixabilityStatus(anonymous[kAnonymous - 1]));
-}
-
TEST(AudioMixer, LargestEnergyVadActiveMixed) {
constexpr int kAudioSources =
AudioMixer::kMaximumAmountOfMixedAudioSources + 3;
- const std::unique_ptr<AudioMixerImpl> mixer(AudioMixerImpl::Create(kId));
+ const std::unique_ptr<AudioMixerImpl> mixer(AudioMixerImpl::Create());
MockMixerAudioSource participants[kAudioSources];
@@ -179,7 +126,7 @@
participants[i].fake_frame()->data_[80] = i;
EXPECT_EQ(0, mixer->SetMixabilityStatus(&participants[i], true));
- EXPECT_CALL(participants[i], GetAudioFrameWithInfo(_, _)).Times(Exactly(1));
+ EXPECT_CALL(participants[i], GetAudioFrameWithInfo(_)).Times(Exactly(1));
}
// Last participant gives audio frame with passive VAD, although it has the
@@ -207,7 +154,7 @@
}
TEST(AudioMixer, FrameNotModifiedForSingleParticipant) {
- const std::unique_ptr<AudioMixer> mixer(AudioMixer::Create(kId));
+ const std::unique_ptr<AudioMixer> mixer(AudioMixer::Create());
MockMixerAudioSource participant;
@@ -220,36 +167,7 @@
}
EXPECT_EQ(0, mixer->SetMixabilityStatus(&participant, true));
- EXPECT_CALL(participant, GetAudioFrameWithInfo(_, _)).Times(Exactly(2));
-
- AudioFrame audio_frame;
- // Two mix iteration to compare after the ramp-up step.
- for (int i = 0; i < 2; i++) {
- mixer->Mix(kDefaultSampleRateHz,
- 1, // number of channels
- &audio_frame);
- }
-
- EXPECT_EQ(
- 0, memcmp(participant.fake_frame()->data_, audio_frame.data_, n_samples));
-}
-
-TEST(AudioMixer, FrameNotModifiedForSingleAnonymousParticipant) {
- const std::unique_ptr<AudioMixer> mixer(AudioMixer::Create(kId));
-
- MockMixerAudioSource participant;
-
- ResetFrame(participant.fake_frame());
- const int n_samples = participant.fake_frame()->samples_per_channel_;
-
- // Modify the frame so that it's not zero.
- for (int j = 0; j < n_samples; j++) {
- participant.fake_frame()->data_[j] = j;
- }
-
- EXPECT_EQ(0, mixer->SetMixabilityStatus(&participant, true));
- EXPECT_EQ(0, mixer->SetAnonymousMixabilityStatus(&participant, true));
- EXPECT_CALL(participant, GetAudioFrameWithInfo(_, _)).Times(Exactly(2));
+ EXPECT_CALL(participant, GetAudioFrameWithInfo(_)).Times(Exactly(2));
AudioFrame audio_frame;
// Two mix iteration to compare after the ramp-up step.
@@ -264,14 +182,14 @@
}
TEST(AudioMixer, ParticipantSampleRate) {
- const std::unique_ptr<AudioMixer> mixer(AudioMixer::Create(kId));
+ const std::unique_ptr<AudioMixer> mixer(AudioMixer::Create());
MockMixerAudioSource participant;
ResetFrame(participant.fake_frame());
EXPECT_EQ(0, mixer->SetMixabilityStatus(&participant, true));
for (auto frequency : {8000, 16000, 32000, 48000}) {
- EXPECT_CALL(participant, GetAudioFrameWithInfo(_, frequency))
+ EXPECT_CALL(participant, GetAudioFrameWithInfo(frequency))
.Times(Exactly(1));
participant.fake_frame()->sample_rate_hz_ = frequency;
participant.fake_frame()->samples_per_channel_ = frequency / 100;
@@ -281,77 +199,27 @@
}
TEST(AudioMixer, ParticipantNumberOfChannels) {
- const std::unique_ptr<AudioMixer> mixer(AudioMixer::Create(kId));
+ const std::unique_ptr<AudioMixer> mixer(AudioMixer::Create());
MockMixerAudioSource participant;
ResetFrame(participant.fake_frame());
EXPECT_EQ(0, mixer->SetMixabilityStatus(&participant, true));
for (size_t number_of_channels : {1, 2}) {
- EXPECT_CALL(participant, GetAudioFrameWithInfo(_, kDefaultSampleRateHz))
+ EXPECT_CALL(participant, GetAudioFrameWithInfo(kDefaultSampleRateHz))
.Times(Exactly(1));
mixer->Mix(kDefaultSampleRateHz, number_of_channels, &frame_for_mixing);
EXPECT_EQ(number_of_channels, frame_for_mixing.num_channels_);
}
}
-// Test that the volume is reported as zero when the mixer input
-// comprises only zero values.
-TEST(AudioMixer, LevelIsZeroWhenMixingZeroes) {
- const std::unique_ptr<AudioMixer> mixer(AudioMixer::Create(kId));
-
- MockMixerAudioSource participant;
- ResetFrame(participant.fake_frame());
-
- EXPECT_EQ(0, mixer->SetMixabilityStatus(&participant, true));
- for (int i = 0; i < 11; i++) {
- EXPECT_CALL(participant, GetAudioFrameWithInfo(_, kDefaultSampleRateHz))
- .Times(Exactly(1));
- mixer->Mix(kDefaultSampleRateHz, 1, &frame_for_mixing);
- }
-
- EXPECT_EQ(0, mixer->GetOutputAudioLevel());
- EXPECT_EQ(0, mixer->GetOutputAudioLevelFullRange());
-}
-
-// Test that the reported volume is maximal when the mixer
-// input comprises frames with maximal values.
-TEST(AudioMixer, LevelIsMaximalWhenMixingMaximalValues) {
- const std::unique_ptr<AudioMixer> mixer(AudioMixer::Create(kId));
-
- MockMixerAudioSource participant;
- ResetFrame(participant.fake_frame());
-
- // Fill participant frame data with maximal sound.
- std::fill(participant.fake_frame()->data_,
- participant.fake_frame()->data_ + kDefaultSampleRateHz / 100,
- std::numeric_limits<int16_t>::max());
-
- EXPECT_EQ(0, mixer->SetMixabilityStatus(&participant, true));
-
- // We do >10 iterations, because the audio level indicator only
- // updates once every 10 calls.
- for (int i = 0; i < 11; i++) {
- EXPECT_CALL(participant, GetAudioFrameWithInfo(_, kDefaultSampleRateHz))
- .Times(Exactly(1));
- mixer->Mix(kDefaultSampleRateHz, 1, &frame_for_mixing);
- }
-
- // 9 is the highest possible audio level
- EXPECT_EQ(9, mixer->GetOutputAudioLevel());
-
- // 0x7fff = 32767 is the highest full range audio level.
- EXPECT_EQ(std::numeric_limits<int16_t>::max(),
- mixer->GetOutputAudioLevelFullRange());
-}
-
// Maximal amount of participants are mixed one iteration, then
// another participant with higher energy is added.
TEST(AudioMixer, RampedOutSourcesShouldNotBeMarkedMixed) {
constexpr int kAudioSources =
AudioMixer::kMaximumAmountOfMixedAudioSources + 1;
- const std::unique_ptr<AudioMixerImpl> mixer(AudioMixerImpl::Create(kId));
+ const std::unique_ptr<AudioMixerImpl> mixer(AudioMixerImpl::Create());
MockMixerAudioSource participants[kAudioSources];
for (int i = 0; i < kAudioSources; i++) {
@@ -364,7 +232,7 @@
// Add all participants but the loudest for mixing.
for (int i = 0; i < kAudioSources - 1; i++) {
EXPECT_EQ(0, mixer->SetMixabilityStatus(&participants[i], true));
- EXPECT_CALL(participants[i], GetAudioFrameWithInfo(_, kDefaultSampleRateHz))
+ EXPECT_CALL(participants[i], GetAudioFrameWithInfo(kDefaultSampleRateHz))
.Times(Exactly(1));
}
@@ -381,7 +249,7 @@
EXPECT_EQ(0,
mixer->SetMixabilityStatus(&participants[kAudioSources - 1], true));
for (int i = 0; i < kAudioSources; i++) {
- EXPECT_CALL(participants[i], GetAudioFrameWithInfo(_, kDefaultSampleRateHz))
+ EXPECT_CALL(participants[i], GetAudioFrameWithInfo(kDefaultSampleRateHz))
.Times(Exactly(1));
}
@@ -407,7 +275,7 @@
init_thread->Start();
std::unique_ptr<AudioMixer> mixer(
init_thread->Invoke<std::unique_ptr<AudioMixer>>(
- RTC_FROM_HERE, std::bind(&AudioMixer::Create, kId)));
+ RTC_FROM_HERE, &AudioMixer::Create));
MockMixerAudioSource participant;
ResetFrame(participant.fake_frame());
@@ -417,12 +285,7 @@
RTC_FROM_HERE, rtc::Bind(&AudioMixer::SetMixabilityStatus,
mixer.get(), &participant, true)));
- EXPECT_EQ(
- 0, participant_thread->Invoke<int>(
- RTC_FROM_HERE, rtc::Bind(&AudioMixer::SetAnonymousMixabilityStatus,
- mixer.get(), &participant, true)));
-
- EXPECT_CALL(participant, GetAudioFrameWithInfo(_, kDefaultSampleRateHz))
+ EXPECT_CALL(participant, GetAudioFrameWithInfo(kDefaultSampleRateHz))
.Times(Exactly(1));
// Do one mixer iteration