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

Side by Side Diff: webrtc/modules/audio_mixer/test/audio_mixer_unittest.cc

Issue 2221443002: Changed mixing api and removed resampler (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Described Mix args in comments. Created 4 years, 4 months 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 unified diff | Download patch
« no previous file with comments | « webrtc/modules/audio_mixer/source/new_audio_conference_mixer_impl.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 public: 62 public:
63 MockMixerAudioSource() 63 MockMixerAudioSource()
64 : fake_audio_frame_info_(MixerAudioSource::AudioFrameInfo::kNormal) { 64 : fake_audio_frame_info_(MixerAudioSource::AudioFrameInfo::kNormal) {
65 ON_CALL(*this, GetAudioFrameWithMuted(_, _)) 65 ON_CALL(*this, GetAudioFrameWithMuted(_, _))
66 .WillByDefault( 66 .WillByDefault(
67 Invoke(this, &MockMixerAudioSource::FakeAudioFrameWithMuted)); 67 Invoke(this, &MockMixerAudioSource::FakeAudioFrameWithMuted));
68 } 68 }
69 69
70 MOCK_METHOD2(GetAudioFrameWithMuted, 70 MOCK_METHOD2(GetAudioFrameWithMuted,
71 AudioFrameWithMuted(const int32_t id, int sample_rate_hz)); 71 AudioFrameWithMuted(const int32_t id, int sample_rate_hz));
72 MOCK_CONST_METHOD1(NeededFrequency, int32_t(const int32_t id));
73 72
74 AudioFrame* fake_frame() { return &fake_frame_; } 73 AudioFrame* fake_frame() { return &fake_frame_; }
75 AudioFrameInfo fake_info() { return fake_audio_frame_info_; } 74 AudioFrameInfo fake_info() { return fake_audio_frame_info_; }
76 void set_fake_info(const AudioFrameInfo audio_frame_info) { 75 void set_fake_info(const AudioFrameInfo audio_frame_info) {
77 fake_audio_frame_info_ = audio_frame_info; 76 fake_audio_frame_info_ = audio_frame_info;
78 } 77 }
79 78
80 private: 79 private:
81 AudioFrame fake_frame_; 80 AudioFrame fake_frame_;
82 AudioFrameInfo fake_audio_frame_info_; 81 AudioFrameInfo fake_audio_frame_info_;
(...skipping 16 matching lines...) Expand all
99 CompareWithOldMixerTest() 98 CompareWithOldMixerTest()
100 : old_mixer_(AudioConferenceMixer::Create(kId)), 99 : old_mixer_(AudioConferenceMixer::Create(kId)),
101 new_mixer_(NewAudioConferenceMixer::Create(kId)) {} 100 new_mixer_(NewAudioConferenceMixer::Create(kId)) {}
102 101
103 ~CompareWithOldMixerTest() { Reset(); } 102 ~CompareWithOldMixerTest() { Reset(); }
104 103
105 // Mixes with both mixers and compares results: resulting frames and 104 // Mixes with both mixers and compares results: resulting frames and
106 // mix statuses. 105 // mix statuses.
107 void MixAndCompare() { 106 void MixAndCompare() {
108 old_mixer_->Process(); 107 old_mixer_->Process();
109 new_mixer_->Mix(&new_mixer_frame_); 108 new_mixer_->Mix(kSampleRateHz,
109 1, // number of channels
110 &new_mixer_frame_);
110 EXPECT_EQ(0, memcmp(old_mixer_frame_.data_, new_mixer_frame_.data_, 111 EXPECT_EQ(0, memcmp(old_mixer_frame_.data_, new_mixer_frame_.data_,
111 sizeof(old_mixer_frame_.data_))); 112 sizeof(old_mixer_frame_.data_)));
112 113
113 for (auto& participant_pair : participants_) { 114 for (auto& participant_pair : participants_) {
114 EXPECT_EQ(participant_pair.first->IsMixed(), 115 EXPECT_EQ(participant_pair.first->IsMixed(),
115 participant_pair.second->IsMixed()); 116 participant_pair.second->IsMixed());
116 } 117 }
117 } 118 }
118 119
119 std::unique_ptr<AudioFrame> last_mixed_audio_old() { 120 std::unique_ptr<AudioFrame> last_mixed_audio_old() {
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 196
196 // We modify one sample within the RampIn window and one sample 197 // We modify one sample within the RampIn window and one sample
197 // outside of it. 198 // outside of it.
198 participant_.fake_frame()->data_[10] = 100; 199 participant_.fake_frame()->data_[10] = 100;
199 participant_.fake_frame()->data_[20] = -200; 200 participant_.fake_frame()->data_[20] = -200;
200 participant_.fake_frame()->data_[30] = 300; 201 participant_.fake_frame()->data_[30] = 300;
201 participant_.fake_frame()->data_[90] = -400; 202 participant_.fake_frame()->data_[90] = -400;
202 203
203 // Frame duration 10ms. 204 // Frame duration 10ms.
204 participant_.fake_frame()->samples_per_channel_ = kSampleRateHz / 100; 205 participant_.fake_frame()->samples_per_channel_ = kSampleRateHz / 100;
205 EXPECT_CALL(participant_, NeededFrequency(_))
206 .WillRepeatedly(Return(kSampleRateHz));
207 } 206 }
208 207
209 ~BothMixersTest() { AudioMixer::Destroy(audio_mixer_); } 208 ~BothMixersTest() { AudioMixer::Destroy(audio_mixer_); }
210 209
211 // Mark the participant as 'unmixed' last round. 210 // Mark the participant as 'unmixed' last round.
212 void ResetAudioSource() { participant_._mixHistory->SetIsMixed(false); } 211 void ResetAudioSource() { participant_._mixHistory->SetIsMixed(false); }
213 212
214 AudioMixer* audio_mixer_; 213 AudioMixer* audio_mixer_;
215 MockMixerAudioSource participant_; 214 MockMixerAudioSource participant_;
216 AudioFrame mixing_round_frame, mixed_results_frame_; 215 AudioFrame mixing_round_frame, mixed_results_frame_;
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 // Frame duration 10ms. 294 // Frame duration 10ms.
296 participants[i].fake_frame()->samples_per_channel_ = kSampleRateHz / 100; 295 participants[i].fake_frame()->samples_per_channel_ = kSampleRateHz / 100;
297 296
298 // We set the 80-th sample value since the first 80 samples may be 297 // We set the 80-th sample value since the first 80 samples may be
299 // modified by a ramped-in window. 298 // modified by a ramped-in window.
300 participants[i].fake_frame()->data_[80] = i; 299 participants[i].fake_frame()->data_[80] = i;
301 300
302 EXPECT_EQ(0, mixer->SetMixabilityStatus(&participants[i], true)); 301 EXPECT_EQ(0, mixer->SetMixabilityStatus(&participants[i], true));
303 EXPECT_CALL(participants[i], GetAudioFrameWithMuted(_, _)) 302 EXPECT_CALL(participants[i], GetAudioFrameWithMuted(_, _))
304 .Times(Exactly(1)); 303 .Times(Exactly(1));
305 EXPECT_CALL(participants[i], NeededFrequency(_))
306 .WillRepeatedly(Return(kSampleRateHz));
307 } 304 }
308 305
309 // Last participant gives audio frame with passive VAD, although it has the 306 // Last participant gives audio frame with passive VAD, although it has the
310 // largest energy. 307 // largest energy.
311 participants[kAudioSources - 1].fake_frame()->vad_activity_ = 308 participants[kAudioSources - 1].fake_frame()->vad_activity_ =
312 AudioFrame::kVadPassive; 309 AudioFrame::kVadPassive;
313 310
314 AudioFrame audio_frame; 311 AudioFrame audio_frame;
315 mixer->Mix(&audio_frame); 312 mixer->Mix(kSampleRateHz,
313 1, // number of channels
314 &audio_frame);
316 315
317 for (int i = 0; i < kAudioSources; ++i) { 316 for (int i = 0; i < kAudioSources; ++i) {
318 bool is_mixed = participants[i].IsMixed(); 317 bool is_mixed = participants[i].IsMixed();
319 if (i == kAudioSources - 1 || 318 if (i == kAudioSources - 1 ||
320 i < kAudioSources - 1 - 319 i < kAudioSources - 1 -
321 NewAudioConferenceMixer::kMaximumAmountOfMixedAudioSources) { 320 NewAudioConferenceMixer::kMaximumAmountOfMixedAudioSources) {
322 EXPECT_FALSE(is_mixed) << "Mixing status of AudioSource #" << i 321 EXPECT_FALSE(is_mixed) << "Mixing status of AudioSource #" << i
323 << " wrong."; 322 << " wrong.";
324 } else { 323 } else {
325 EXPECT_TRUE(is_mixed) << "Mixing status of AudioSource #" << i 324 EXPECT_TRUE(is_mixed) << "Mixing status of AudioSource #" << i
326 << " wrong."; 325 << " wrong.";
327 } 326 }
328 } 327 }
329 } 328 }
330 329
330 TEST(AudioMixer, ParticipantSampleRate) {
331 const int kId = 1;
332 std::unique_ptr<NewAudioConferenceMixer> mixer(
333 NewAudioConferenceMixer::Create(kId));
334 AudioFrame frame_for_mixing;
335
336 MockMixerAudioSource participant;
337 participant.fake_frame()->sample_rate_hz_ = 8000;
338 participant.fake_frame()->num_channels_ = 1;
339
340 // Frame duration 10ms.
341 participant.fake_frame()->samples_per_channel_ = 8000 / 100;
342
343 EXPECT_EQ(0, mixer->SetMixabilityStatus(&participant, true));
344 for (auto frequency : {8000, 16000, 32000, 48000}) {
345 EXPECT_CALL(participant, GetAudioFrameWithMuted(_, frequency))
346 .Times(Exactly(1));
347 mixer->Mix(frequency, 1, &frame_for_mixing);
348 EXPECT_EQ(frequency, frame_for_mixing.sample_rate_hz_);
349 }
350 }
351
352 TEST(AudioMixer, ParticipantNumberOfChannels) {
353 const int kId = 1;
354 std::unique_ptr<NewAudioConferenceMixer> mixer(
355 NewAudioConferenceMixer::Create(kId));
356 AudioFrame frame_for_mixing;
357
358 MockMixerAudioSource participant;
359 participant.fake_frame()->sample_rate_hz_ = 8000;
360 participant.fake_frame()->num_channels_ = 1;
361
362 // Frame duration 10ms.
363 participant.fake_frame()->samples_per_channel_ = 8000 / 100;
364
365 EXPECT_EQ(0, mixer->SetMixabilityStatus(&participant, true));
366 for (size_t number_of_channels : {1, 2}) {
367 EXPECT_CALL(participant, GetAudioFrameWithMuted(_, 8000)).Times(Exactly(1));
368 mixer->Mix(8000, number_of_channels, &frame_for_mixing);
369 EXPECT_EQ(number_of_channels, frame_for_mixing.num_channels_);
370 }
371 }
372
331 TEST_F(BothMixersTest, CompareInitialFrameAudio) { 373 TEST_F(BothMixersTest, CompareInitialFrameAudio) {
332 EXPECT_CALL(participant_, GetAudioFrameWithMuted(_, _)).Times(Exactly(1)); 374 EXPECT_CALL(participant_, GetAudioFrameWithMuted(_, _)).Times(Exactly(1));
333 375
334 // Make sure the participant is marked as 'non-mixed' so that it is 376 // Make sure the participant is marked as 'non-mixed' so that it is
335 // ramped in next round. 377 // ramped in next round.
336 ResetAudioSource(); 378 ResetAudioSource();
337 379
338 // Construct the expected sound for the first mixing round. 380 // Construct the expected sound for the first mixing round.
339 mixing_round_frame.CopyFrom(*participant_.fake_frame()); 381 mixing_round_frame.CopyFrom(*participant_.fake_frame());
340 RampIn(mixing_round_frame); 382 RampIn(mixing_round_frame);
341 383
342 // Mix frames and put the result into a frame. 384 // Mix frames and put the result into a frame.
343 audio_mixer_->MixActiveChannels();
344 audio_mixer_->GetMixedAudio(kSampleRateHz, 1, &mixed_results_frame_); 385 audio_mixer_->GetMixedAudio(kSampleRateHz, 1, &mixed_results_frame_);
345 386
346 // Compare the received frame with the expected. 387 // Compare the received frame with the expected.
347 EXPECT_EQ(mixing_round_frame.sample_rate_hz_, 388 EXPECT_EQ(mixing_round_frame.sample_rate_hz_,
348 mixed_results_frame_.sample_rate_hz_); 389 mixed_results_frame_.sample_rate_hz_);
349 EXPECT_EQ(mixing_round_frame.num_channels_, 390 EXPECT_EQ(mixing_round_frame.num_channels_,
350 mixed_results_frame_.num_channels_); 391 mixed_results_frame_.num_channels_);
351 EXPECT_EQ(mixing_round_frame.samples_per_channel_, 392 EXPECT_EQ(mixing_round_frame.samples_per_channel_,
352 mixed_results_frame_.samples_per_channel_); 393 mixed_results_frame_.samples_per_channel_);
353 EXPECT_EQ(0, memcmp(mixing_round_frame.data_, mixed_results_frame_.data_, 394 EXPECT_EQ(0, memcmp(mixing_round_frame.data_, mixed_results_frame_.data_,
354 sizeof(mixing_round_frame.data_))); 395 sizeof(mixing_round_frame.data_)));
355 } 396 }
356 397
357 TEST_F(BothMixersTest, CompareSecondFrameAudio) { 398 TEST_F(BothMixersTest, CompareSecondFrameAudio) {
358 EXPECT_CALL(participant_, GetAudioFrameWithMuted(_, _)).Times(Exactly(2)); 399 EXPECT_CALL(participant_, GetAudioFrameWithMuted(_, _)).Times(Exactly(2));
359 400
360 // Make sure the participant is marked as 'non-mixed' so that it is 401 // Make sure the participant is marked as 'non-mixed' so that it is
361 // ramped in next round. 402 // ramped in next round.
362 ResetAudioSource(); 403 ResetAudioSource();
363 404
364 // Do one mixing iteration. 405 // Do one mixing iteration.
365 audio_mixer_->MixActiveChannels(); 406 audio_mixer_->GetMixedAudio(kSampleRateHz, 1, &mixed_results_frame_);
366 407
367 // Mix frames a second time and compare with the expected frame 408 // Mix frames a second time and compare with the expected frame
368 // (which is the participant's frame). 409 // (which is the participant's frame).
369 audio_mixer_->MixActiveChannels();
370 audio_mixer_->GetMixedAudio(kSampleRateHz, 1, &mixed_results_frame_); 410 audio_mixer_->GetMixedAudio(kSampleRateHz, 1, &mixed_results_frame_);
371 EXPECT_EQ(0, 411 EXPECT_EQ(0,
372 memcmp(participant_.fake_frame()->data_, mixed_results_frame_.data_, 412 memcmp(participant_.fake_frame()->data_, mixed_results_frame_.data_,
373 sizeof(mixing_round_frame.data_))); 413 sizeof(mixing_round_frame.data_)));
374 } 414 }
375 415
376 TEST_F(CompareWithOldMixerTest, TwoParticipantsNormalFrames) { 416 TEST_F(CompareWithOldMixerTest, TwoParticipantsNormalFrames) {
377 Reset(); 417 Reset();
378 AudioFrame first_frame, second_frame; 418 AudioFrame first_frame, second_frame;
379 419
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 MixerParticipant::AudioFrameInfo::kMuted); 474 MixerParticipant::AudioFrameInfo::kMuted);
435 } else { 475 } else {
436 AddParticipant(&audio_frames[i], 476 AddParticipant(&audio_frames[i],
437 MixerParticipant::AudioFrameInfo::kNormal); 477 MixerParticipant::AudioFrameInfo::kNormal);
438 } 478 }
439 MixAndCompare(); 479 MixAndCompare();
440 } 480 }
441 } 481 }
442 482
443 } // namespace webrtc 483 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/audio_mixer/source/new_audio_conference_mixer_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698