Index: webrtc/modules/audio_mixer/test/audio_mixer_unittest.cc |
diff --git a/webrtc/modules/audio_mixer/test/audio_mixer_unittest.cc b/webrtc/modules/audio_mixer/test/audio_mixer_unittest.cc |
deleted file mode 100644 |
index 2226fe9c180379e905d24b3ce764a32bee8a4de4..0000000000000000000000000000000000000000 |
--- a/webrtc/modules/audio_mixer/test/audio_mixer_unittest.cc |
+++ /dev/null |
@@ -1,370 +0,0 @@ |
-/* |
- * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |
- * |
- * Use of this source code is governed by a BSD-style license |
- * that can be found in the LICENSE file in the root of the source |
- * tree. An additional intellectual property rights grant can be found |
- * in the file PATENTS. All contributing project authors may |
- * be found in the AUTHORS file in the root of the source tree. |
- */ |
- |
-#include <string.h> |
- |
-#include <memory> |
-#include <utility> |
- |
-#include "webrtc/base/bind.h" |
-#include "webrtc/base/thread.h" |
-#include "webrtc/modules/audio_mixer/audio_mixer_impl.h" |
-#include "webrtc/modules/audio_mixer/audio_mixer.h" |
-#include "webrtc/test/gmock.h" |
- |
-using testing::_; |
-using testing::Exactly; |
-using testing::Invoke; |
-using testing::Return; |
- |
-namespace webrtc { |
- |
-namespace { |
- |
-constexpr int kDefaultSampleRateHz = 48000; |
-constexpr int kId = 1; |
- |
-// Utility function that resets the frame member variables with |
-// sensible defaults. |
-void ResetFrame(AudioFrame* frame) { |
- frame->id_ = kId; |
- frame->sample_rate_hz_ = kDefaultSampleRateHz; |
- frame->num_channels_ = 1; |
- |
- // Frame duration 10ms. |
- frame->samples_per_channel_ = kDefaultSampleRateHz / 100; |
- frame->vad_activity_ = AudioFrame::kVadActive; |
- frame->speech_type_ = AudioFrame::kNormalSpeech; |
-} |
- |
-AudioFrame frame_for_mixing; |
- |
-} // namespace |
- |
-class MockMixerAudioSource : public AudioMixer::Source { |
- public: |
- MockMixerAudioSource() |
- : fake_audio_frame_info_(AudioMixer::Source::AudioFrameInfo::kNormal) { |
- ON_CALL(*this, GetAudioFrameWithInfo(_)) |
- .WillByDefault( |
- Invoke(this, &MockMixerAudioSource::FakeAudioFrameWithInfo)); |
- } |
- |
- MOCK_METHOD1(GetAudioFrameWithInfo, AudioFrameWithInfo(int sample_rate_hz)); |
- |
- AudioFrame* fake_frame() { return &fake_frame_; } |
- AudioFrameInfo fake_info() { return fake_audio_frame_info_; } |
- void set_fake_info(const AudioFrameInfo audio_frame_info) { |
- fake_audio_frame_info_ = audio_frame_info; |
- } |
- |
- private: |
- AudioFrame fake_frame_, fake_output_frame_; |
- AudioFrameInfo fake_audio_frame_info_; |
- AudioFrameWithInfo FakeAudioFrameWithInfo(int sample_rate_hz) { |
- fake_output_frame_.CopyFrom(fake_frame_); |
- return { |
- &fake_output_frame_, // audio_frame_pointer |
- fake_info(), // audio_frame_info |
- }; |
- } |
-}; |
- |
-// Creates participants from |frames| and |frame_info| and adds them |
-// to the mixer. Compares mixed status with |expected_status| |
-void MixAndCompare( |
- const std::vector<AudioFrame>& frames, |
- const std::vector<AudioMixer::Source::AudioFrameInfo>& frame_info, |
- const std::vector<bool>& expected_status) { |
- int num_audio_sources = frames.size(); |
- RTC_DCHECK(frames.size() == frame_info.size()); |
- RTC_DCHECK(frame_info.size() == expected_status.size()); |
- |
- const std::unique_ptr<AudioMixerImpl> mixer(AudioMixerImpl::Create()); |
- std::vector<MockMixerAudioSource> participants(num_audio_sources); |
- |
- for (int i = 0; i < num_audio_sources; i++) { |
- participants[i].fake_frame()->CopyFrom(frames[i]); |
- participants[i].set_fake_info(frame_info[i]); |
- } |
- |
- for (int i = 0; i < num_audio_sources; i++) { |
- EXPECT_EQ(0, mixer->SetMixabilityStatus(&participants[i], true)); |
- EXPECT_CALL(participants[i], GetAudioFrameWithInfo(kDefaultSampleRateHz)) |
- .Times(Exactly(1)); |
- } |
- |
- mixer->Mix(kDefaultSampleRateHz, 1, &frame_for_mixing); |
- |
- for (int i = 0; i < num_audio_sources; i++) { |
- EXPECT_EQ(expected_status[i], |
- mixer->GetAudioSourceMixabilityStatusForTest(&participants[i])) |
- << "Mixed status of AudioSource #" << i << " wrong."; |
- } |
-} |
- |
-TEST(AudioMixer, LargestEnergyVadActiveMixed) { |
- constexpr int kAudioSources = |
- AudioMixer::kMaximumAmountOfMixedAudioSources + 3; |
- |
- const std::unique_ptr<AudioMixerImpl> mixer(AudioMixerImpl::Create()); |
- |
- MockMixerAudioSource participants[kAudioSources]; |
- |
- for (int i = 0; i < kAudioSources; ++i) { |
- ResetFrame(participants[i].fake_frame()); |
- |
- // We set the 80-th sample value since the first 80 samples may be |
- // modified by a ramped-in window. |
- participants[i].fake_frame()->data_[80] = i; |
- |
- EXPECT_EQ(0, mixer->SetMixabilityStatus(&participants[i], true)); |
- EXPECT_CALL(participants[i], GetAudioFrameWithInfo(_)).Times(Exactly(1)); |
- } |
- |
- // Last participant gives audio frame with passive VAD, although it has the |
- // largest energy. |
- participants[kAudioSources - 1].fake_frame()->vad_activity_ = |
- AudioFrame::kVadPassive; |
- |
- AudioFrame audio_frame; |
- mixer->Mix(kDefaultSampleRateHz, |
- 1, // number of channels |
- &audio_frame); |
- |
- for (int i = 0; i < kAudioSources; ++i) { |
- bool is_mixed = |
- mixer->GetAudioSourceMixabilityStatusForTest(&participants[i]); |
- if (i == kAudioSources - 1 || |
- i < kAudioSources - 1 - AudioMixer::kMaximumAmountOfMixedAudioSources) { |
- EXPECT_FALSE(is_mixed) << "Mixing status of AudioSource #" << i |
- << " wrong."; |
- } else { |
- EXPECT_TRUE(is_mixed) << "Mixing status of AudioSource #" << i |
- << " wrong."; |
- } |
- } |
-} |
- |
-TEST(AudioMixer, FrameNotModifiedForSingleParticipant) { |
- const std::unique_ptr<AudioMixer> mixer(AudioMixer::Create()); |
- |
- 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_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, ParticipantSampleRate) { |
- 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)) |
- .Times(Exactly(1)); |
- participant.fake_frame()->sample_rate_hz_ = frequency; |
- participant.fake_frame()->samples_per_channel_ = frequency / 100; |
- mixer->Mix(frequency, 1, &frame_for_mixing); |
- EXPECT_EQ(frequency, frame_for_mixing.sample_rate_hz_); |
- } |
-} |
- |
-TEST(AudioMixer, ParticipantNumberOfChannels) { |
- 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)) |
- .Times(Exactly(1)); |
- mixer->Mix(kDefaultSampleRateHz, number_of_channels, &frame_for_mixing); |
- EXPECT_EQ(number_of_channels, frame_for_mixing.num_channels_); |
- } |
-} |
- |
-// 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()); |
- MockMixerAudioSource participants[kAudioSources]; |
- |
- for (int i = 0; i < kAudioSources; i++) { |
- ResetFrame(participants[i].fake_frame()); |
- // Set the participant audio energy to increase with the index |
- // |i|. |
- participants[i].fake_frame()->data_[0] = 100 * i; |
- } |
- |
- // 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)) |
- .Times(Exactly(1)); |
- } |
- |
- // First mixer iteration |
- mixer->Mix(kDefaultSampleRateHz, 1, &frame_for_mixing); |
- |
- // All participants but the loudest should have been mixed. |
- for (int i = 0; i < kAudioSources - 1; i++) { |
- EXPECT_TRUE(mixer->GetAudioSourceMixabilityStatusForTest(&participants[i])) |
- << "Mixed status of AudioSource #" << i << " wrong."; |
- } |
- |
- // Add new participant with higher energy. |
- EXPECT_EQ(0, |
- mixer->SetMixabilityStatus(&participants[kAudioSources - 1], true)); |
- for (int i = 0; i < kAudioSources; i++) { |
- EXPECT_CALL(participants[i], GetAudioFrameWithInfo(kDefaultSampleRateHz)) |
- .Times(Exactly(1)); |
- } |
- |
- mixer->Mix(kDefaultSampleRateHz, 1, &frame_for_mixing); |
- |
- // The most quiet participant should not have been mixed. |
- EXPECT_FALSE(mixer->GetAudioSourceMixabilityStatusForTest(&participants[0])) |
- << "Mixed status of AudioSource #0 wrong."; |
- |
- // The loudest participants should have been mixed. |
- for (int i = 1; i < kAudioSources; i++) { |
- EXPECT_EQ(true, |
- mixer->GetAudioSourceMixabilityStatusForTest(&participants[i])) |
- << "Mixed status of AudioSource #" << i << " wrong."; |
- } |
-} |
- |
-// This test checks that the initialization and participant addition |
-// can be done on a different thread. |
-TEST(AudioMixer, ConstructFromOtherThread) { |
- std::unique_ptr<rtc::Thread> init_thread = rtc::Thread::Create(); |
- std::unique_ptr<rtc::Thread> participant_thread = rtc::Thread::Create(); |
- init_thread->Start(); |
- std::unique_ptr<AudioMixer> mixer( |
- init_thread->Invoke<std::unique_ptr<AudioMixer>>( |
- RTC_FROM_HERE, &AudioMixer::Create)); |
- MockMixerAudioSource participant; |
- |
- ResetFrame(participant.fake_frame()); |
- |
- participant_thread->Start(); |
- EXPECT_EQ(0, participant_thread->Invoke<int>( |
- RTC_FROM_HERE, rtc::Bind(&AudioMixer::SetMixabilityStatus, |
- mixer.get(), &participant, true))); |
- |
- EXPECT_CALL(participant, GetAudioFrameWithInfo(kDefaultSampleRateHz)) |
- .Times(Exactly(1)); |
- |
- // Do one mixer iteration |
- mixer->Mix(kDefaultSampleRateHz, 1, &frame_for_mixing); |
-} |
- |
-TEST(AudioMixer, MutedShouldMixAfterUnmuted) { |
- constexpr int kAudioSources = |
- AudioMixer::kMaximumAmountOfMixedAudioSources + 1; |
- |
- std::vector<AudioFrame> frames(kAudioSources); |
- for (auto& frame : frames) { |
- ResetFrame(&frame); |
- } |
- |
- std::vector<AudioMixer::Source::AudioFrameInfo> frame_info( |
- kAudioSources, AudioMixer::Source::AudioFrameInfo::kNormal); |
- frame_info[0] = AudioMixer::Source::AudioFrameInfo::kMuted; |
- std::vector<bool> expected_status(kAudioSources, true); |
- expected_status[0] = false; |
- |
- MixAndCompare(frames, frame_info, expected_status); |
-} |
- |
-TEST(AudioMixer, PassiveShouldMixAfterNormal) { |
- constexpr int kAudioSources = |
- AudioMixer::kMaximumAmountOfMixedAudioSources + 1; |
- |
- std::vector<AudioFrame> frames(kAudioSources); |
- for (auto& frame : frames) { |
- ResetFrame(&frame); |
- } |
- |
- std::vector<AudioMixer::Source::AudioFrameInfo> frame_info( |
- kAudioSources, AudioMixer::Source::AudioFrameInfo::kNormal); |
- frames[0].vad_activity_ = AudioFrame::kVadPassive; |
- std::vector<bool> expected_status(kAudioSources, true); |
- expected_status[0] = false; |
- |
- MixAndCompare(frames, frame_info, expected_status); |
-} |
- |
-TEST(AudioMixer, ActiveShouldMixBeforeLoud) { |
- constexpr int kAudioSources = |
- AudioMixer::kMaximumAmountOfMixedAudioSources + 1; |
- |
- std::vector<AudioFrame> frames(kAudioSources); |
- for (auto& frame : frames) { |
- ResetFrame(&frame); |
- } |
- |
- std::vector<AudioMixer::Source::AudioFrameInfo> frame_info( |
- kAudioSources, AudioMixer::Source::AudioFrameInfo::kNormal); |
- frames[0].vad_activity_ = AudioFrame::kVadPassive; |
- std::fill(frames[0].data_, frames[0].data_ + kDefaultSampleRateHz / 100, |
- std::numeric_limits<int16_t>::max()); |
- std::vector<bool> expected_status(kAudioSources, true); |
- expected_status[0] = false; |
- |
- MixAndCompare(frames, frame_info, expected_status); |
-} |
- |
-TEST(AudioMixer, UnmutedShouldMixBeforeLoud) { |
- constexpr int kAudioSources = |
- AudioMixer::kMaximumAmountOfMixedAudioSources + 1; |
- |
- std::vector<AudioFrame> frames(kAudioSources); |
- for (auto& frame : frames) { |
- ResetFrame(&frame); |
- } |
- |
- std::vector<AudioMixer::Source::AudioFrameInfo> frame_info( |
- kAudioSources, AudioMixer::Source::AudioFrameInfo::kNormal); |
- frame_info[0] = AudioMixer::Source::AudioFrameInfo::kMuted; |
- std::fill(frames[0].data_, frames[0].data_ + kDefaultSampleRateHz / 100, |
- std::numeric_limits<int16_t>::max()); |
- std::vector<bool> expected_status(kAudioSources, true); |
- expected_status[0] = false; |
- |
- MixAndCompare(frames, frame_info, expected_status); |
-} |
-} // namespace webrtc |