Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 /* | |
| 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | |
| 3 * | |
| 4 * Use of this source code is governed by a BSD-style license | |
| 5 * that can be found in the LICENSE file in the root of the source | |
| 6 * tree. An additional intellectual property rights grant can be found | |
| 7 * in the file PATENTS. All contributing project authors may | |
| 8 * be found in the AUTHORS file in the root of the source tree. | |
| 9 */ | |
| 10 | |
| 11 #include "webrtc/base/scoped_ptr.h" | |
| 12 #include "webrtc/modules/audio_conference_mixer/interface/audio_conference_mixer .h" | |
| 13 #include "webrtc/modules/audio_conference_mixer/interface/audio_conference_mixer _defines.h" | |
| 14 | |
| 15 #include "testing/gmock/include/gmock/gmock.h" | |
|
Andrew MacDonald
2015/08/18 04:03:48
This can go with the other includes.
| |
| 16 | |
| 17 namespace webrtc { | |
| 18 | |
| 19 using testing::_; | |
| 20 using testing::AtLeast; | |
| 21 using testing::Invoke; | |
| 22 using testing::Return; | |
| 23 | |
| 24 class MockAudioMixerOutputReceiver : public AudioMixerOutputReceiver { | |
| 25 public: | |
| 26 MOCK_METHOD4(NewMixedAudio, void(const int32_t id, | |
| 27 const AudioFrame& general_audio_frame, | |
| 28 const AudioFrame** unique_audio_frames, | |
| 29 const uint32_t size)); | |
| 30 }; | |
| 31 | |
| 32 class MockMixerParticipant : public MixerParticipant { | |
| 33 public: | |
| 34 MockMixerParticipant() { | |
| 35 ON_CALL(*this, GetAudioFrame(_, _)) | |
| 36 .WillByDefault(Invoke(this, &MockMixerParticipant::FakeAudioFrame)); | |
|
Andrew MacDonald
2015/08/18 04:03:48
If you always want this behavior, don't mock it, b
minyue-webrtc
2015/08/25 15:36:12
The reason that I mock GetAudioFrame is that I wan
ajm
2015/08/25 16:46:03
Ah OK. You can often define the methods actions di
| |
| 37 } | |
| 38 MOCK_METHOD2(GetAudioFrame, | |
| 39 int32_t(const int32_t id, AudioFrame& audio_frame)); | |
| 40 MOCK_METHOD1(NeededFrequency, int32_t(const int32_t id)); | |
| 41 AudioFrame fake_frame_; | |
|
Andrew MacDonald
2015/08/18 04:03:48
This should be private with a setter.
minyue-webrtc
2015/08/25 15:36:12
Yes, it can be nicer but the it is more complicate
ajm
2015/08/25 16:46:03
The typical way to do this is:
AudioFrame* fake_fr
minyue-webrtc
2015/08/31 14:28:39
I like the proposal, changes made accordingly.
| |
| 42 private: | |
| 43 int32_t FakeAudioFrame(const int32_t id, AudioFrame& audio_frame) { | |
| 44 audio_frame.CopyFrom(fake_frame_); | |
| 45 return 0; | |
| 46 } | |
| 47 }; | |
| 48 | |
| 49 TEST(AudioConferenceMixer, AnonymousAndUnanonymous) { | |
|
Andrew MacDonald
2015/08/18 04:03:48
Nonanonymous is a bit more natural (but also weird
minyue-webrtc
2015/08/25 15:36:12
How about "Named"?
ajm
2015/08/25 16:46:03
Nice.
| |
| 50 const int kId = 1; | |
| 51 // Should not matter even if partipants are more than | |
| 52 // kMaximumAmountOfMixedParticipants. | |
| 53 const int kUnanonymous = | |
| 54 AudioConferenceMixer::kMaximumAmountOfMixedParticipants + 1; | |
| 55 const int kAnonymous = | |
| 56 AudioConferenceMixer::kMaximumAmountOfMixedParticipants + 1; | |
| 57 | |
| 58 rtc::scoped_ptr<AudioConferenceMixer> mixer; | |
| 59 mixer.reset(AudioConferenceMixer::Create(kId)); | |
|
Andrew MacDonald
2015/08/18 04:03:48
Don't reset, assign directly:
rtc::scoped_ptr<Audi
minyue-webrtc
2015/08/25 15:36:12
Done.
| |
| 60 | |
| 61 MockMixerParticipant unanonymous[kUnanonymous]; | |
| 62 MockMixerParticipant anonymous[kAnonymous]; | |
|
Andrew MacDonald
2015/08/18 04:03:48
Use vectors.
minyue-webrtc
2015/08/25 15:36:12
Done.
| |
| 63 | |
| 64 bool ret; | |
| 65 for (int i = 0; i < kUnanonymous; i++) { | |
|
Andrew MacDonald
2015/08/18 04:03:48
nit: ++i and below
minyue-webrtc
2015/08/25 15:36:12
Done.
| |
| 66 EXPECT_EQ(0, mixer->SetMixabilityStatus(unanonymous[i], true)); | |
| 67 EXPECT_EQ(0, mixer->MixabilityStatus(unanonymous[i], ret)); | |
|
Andrew MacDonald
2015/08/18 04:03:48
Is there any value in testing this with more than
minyue-webrtc
2015/08/25 15:36:12
May be not very needed. But I made the number of "
| |
| 68 EXPECT_TRUE(ret); | |
| 69 } | |
| 70 | |
| 71 for (int i = 0; i < kAnonymous; i++) { | |
|
Andrew MacDonald
2015/08/18 04:03:48
Same here, is this loop adding any value? And the
minyue-webrtc
2015/08/25 15:36:12
I made the number of "named" to be larger than kMa
| |
| 72 // Participant must be registered before turning it into anonymous. | |
| 73 EXPECT_EQ(-1, mixer->SetAnonymousMixabilityStatus(anonymous[i], true)); | |
| 74 EXPECT_EQ(0, mixer->SetMixabilityStatus(anonymous[i], true)); | |
| 75 EXPECT_EQ(0, mixer->MixabilityStatus(anonymous[i], ret)); | |
| 76 EXPECT_TRUE(ret); | |
| 77 EXPECT_EQ(0, mixer->AnonymousMixabilityStatus(anonymous[i], ret)); | |
| 78 EXPECT_FALSE(ret); | |
| 79 | |
| 80 EXPECT_EQ(0, mixer->SetAnonymousMixabilityStatus(anonymous[i], true)); | |
| 81 EXPECT_EQ(0, mixer->AnonymousMixabilityStatus(anonymous[i], ret)); | |
| 82 EXPECT_TRUE(ret); | |
| 83 | |
| 84 // Anonymous participants do not show status by MixabilityStatus. | |
| 85 EXPECT_EQ(0, mixer->MixabilityStatus(anonymous[i], ret)); | |
| 86 EXPECT_FALSE(ret); | |
| 87 } | |
| 88 | |
| 89 for (int i = 0; i < kUnanonymous; i++) { | |
| 90 EXPECT_EQ(0, mixer->SetMixabilityStatus(unanonymous[i], false)); | |
| 91 EXPECT_EQ(0, mixer->MixabilityStatus(unanonymous[i], ret)); | |
| 92 EXPECT_FALSE(ret); | |
| 93 } | |
| 94 | |
| 95 for (int i = 0; i < kAnonymous - 1; i++) { | |
| 96 EXPECT_EQ(0, mixer->SetAnonymousMixabilityStatus(anonymous[i], false)); | |
| 97 EXPECT_EQ(0, mixer->AnonymousMixabilityStatus(anonymous[i], ret)); | |
| 98 EXPECT_FALSE(ret); | |
| 99 // SetAnonymousMixabilityStatus(anonymous, false) moves anonymous to the | |
| 100 // unanonymous group. | |
| 101 EXPECT_EQ(0, mixer->MixabilityStatus(anonymous[i], ret)); | |
| 102 EXPECT_TRUE(ret); | |
| 103 } | |
| 104 | |
| 105 // SetMixabilityStatus(anonymous, false) will remove anonymous from both | |
| 106 // anonymous and unanonymous groups. | |
| 107 EXPECT_EQ(0, mixer->SetMixabilityStatus(anonymous[kAnonymous - 1], false)); | |
| 108 EXPECT_EQ(0, mixer->AnonymousMixabilityStatus(anonymous[kAnonymous - 1], | |
| 109 ret)); | |
| 110 EXPECT_FALSE(ret); | |
| 111 EXPECT_EQ(0, mixer->MixabilityStatus(anonymous[kAnonymous - 1], ret)); | |
| 112 EXPECT_FALSE(ret); | |
| 113 } | |
| 114 | |
| 115 TEST(AudioConferenceMixer, LargestEnergyVadActiveMixed) { | |
| 116 const int kId = 1; | |
| 117 const int kParticipants = | |
| 118 AudioConferenceMixer::kMaximumAmountOfMixedParticipants + 3; | |
| 119 | |
| 120 rtc::scoped_ptr<AudioConferenceMixer> mixer; | |
| 121 mixer.reset(AudioConferenceMixer::Create(kId)); | |
|
Andrew MacDonald
2015/08/18 04:03:48
As above, reset is not needed.
minyue-webrtc
2015/08/25 15:36:12
Done.
| |
| 122 | |
| 123 MockAudioMixerOutputReceiver output_receiver; | |
| 124 EXPECT_EQ(0, mixer->RegisterMixedStreamCallback(output_receiver)); | |
| 125 | |
| 126 MockMixerParticipant participants[kParticipants]; | |
|
Andrew MacDonald
2015/08/18 04:03:48
vector
minyue-webrtc
2015/08/25 15:36:12
Done.
| |
| 127 | |
| 128 for (int i = 0; i < kParticipants; i++) { | |
| 129 participants[i].fake_frame_.UpdateFrame(i, 0, nullptr, 320, 32000, | |
|
Andrew MacDonald
2015/08/18 04:03:48
This is a rarely used method. Could you just set t
minyue-webrtc
2015/08/25 15:36:12
I searched for its usage, and found that it is not
ajm
2015/08/25 16:46:03
I'd argue that this is _less_ readable since you h
minyue-webrtc
2015/08/31 14:28:39
I'd take your initial suggestion.
| |
| 130 AudioFrame::kNormalSpeech, | |
| 131 AudioFrame::kVadActive, 1, 0); | |
| 132 // Use 80 to escape from ramped-in window. | |
|
Andrew MacDonald
2015/08/18 04:03:48
Do you mean that you need to choose a late enough
minyue-webrtc
2015/08/25 15:36:12
Done.
| |
| 133 participants[i].fake_frame_.data_[80] = i; | |
| 134 | |
| 135 EXPECT_EQ(0, mixer->SetMixabilityStatus(participants[i], true)); | |
| 136 EXPECT_CALL(participants[i], GetAudioFrame(_, _)) | |
| 137 .Times(AtLeast(1)); | |
| 138 EXPECT_CALL(participants[i], NeededFrequency(_)) | |
| 139 .WillRepeatedly(Return(32000)); | |
| 140 } | |
| 141 | |
| 142 // Last participant gives audio frame with passive VAD, although it has the | |
| 143 // largest energy. | |
| 144 participants[kParticipants - 1].fake_frame_.vad_activity_ = | |
| 145 AudioFrame::kVadPassive; | |
| 146 | |
| 147 EXPECT_CALL(output_receiver, NewMixedAudio(_, _, _, _)) | |
| 148 .Times(AtLeast(1)); | |
| 149 | |
| 150 EXPECT_EQ(0, mixer->Process()); | |
| 151 | |
| 152 bool ret; | |
|
Andrew MacDonald
2015/08/18 04:03:48
Instead of ret, name this what it is: is_mixed.
minyue-webrtc
2015/08/25 15:36:12
Done.
| |
| 153 for (int i = 0; i < kParticipants; i++) { | |
| 154 EXPECT_EQ(0, participants[i].IsMixed(ret)); | |
| 155 if (i == kParticipants - 1 || i < kParticipants - 1 - | |
| 156 AudioConferenceMixer::kMaximumAmountOfMixedParticipants) { | |
| 157 EXPECT_FALSE(ret) << "Mixing status of Participant #" << i << " wrong."; | |
| 158 } else { | |
| 159 EXPECT_TRUE(ret) << "Mixing status of Participant #" << i << " wrong."; | |
| 160 } | |
| 161 } | |
| 162 | |
| 163 EXPECT_EQ(0, mixer->UnRegisterMixedStreamCallback()); | |
| 164 } | |
| 165 | |
| 166 } // namespace webrtc | |
| OLD | NEW |