blob: 63b41cddedc031881ae1e20bc93bafe8911ae963 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:361/*
kjellanderb24317b2016-02-10 15:54:432 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:363 *
kjellanderb24317b2016-02-10 15:54:434 * 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.
henrike@webrtc.org28e20752013-07-10 00:45:369 */
10
Steve Anton10542f22019-01-11 17:11:0011#include "pc/test/fake_audio_capture_module.h"
henrike@webrtc.org28e20752013-07-10 00:45:3612
Yves Gerey3e707812018-11-28 15:47:4913#include <string.h>
Jonas Olssona4d87372019-07-05 17:08:3314
henrike@webrtc.org28e20752013-07-10 00:45:3615#include <algorithm>
16
Mirko Bonadeid9708072019-01-25 19:26:4817#include "api/scoped_refptr.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3118#include "rtc_base/gunit.h"
Markus Handell6fcd0f82020-07-07 17:08:5319#include "rtc_base/synchronization/mutex.h"
Yves Gerey3e707812018-11-28 15:47:4920#include "test/gtest.h"
henrike@webrtc.org28e20752013-07-10 00:45:3621
Mirko Bonadei6a489f22019-04-09 13:11:1222class FakeAdmTest : public ::testing::Test, public webrtc::AudioTransport {
henrike@webrtc.org28e20752013-07-10 00:45:3623 protected:
24 static const int kMsInSecond = 1000;
25
26 FakeAdmTest()
Yves Gerey665174f2018-06-19 13:03:0527 : push_iterations_(0), pull_iterations_(0), rec_buffer_bytes_(0) {
henrike@webrtc.org28e20752013-07-10 00:45:3628 memset(rec_buffer_, 0, sizeof(rec_buffer_));
29 }
30
nisseef8b61e2016-04-29 13:09:1531 void SetUp() override {
deadbeefee8c6d32015-08-13 21:27:1832 fake_audio_capture_module_ = FakeAudioCaptureModule::Create();
henrike@webrtc.org28e20752013-07-10 00:45:3633 EXPECT_TRUE(fake_audio_capture_module_.get() != NULL);
34 }
35
36 // Callbacks inherited from webrtc::AudioTransport.
37 // ADM is pushing data.
Peter Kasting728d9032015-06-11 21:31:3838 int32_t RecordedDataIsAvailable(const void* audioSamples,
Peter Kastingdce40cf2015-08-24 21:52:2339 const size_t nSamples,
40 const size_t nBytesPerSample,
Peter Kasting69558702016-01-13 00:26:3541 const size_t nChannels,
Peter Kasting728d9032015-06-11 21:31:3842 const uint32_t samplesPerSec,
43 const uint32_t totalDelayMS,
44 const int32_t clockDrift,
45 const uint32_t currentMicLevel,
46 const bool keyPressed,
47 uint32_t& newMicLevel) override {
Markus Handell6fcd0f82020-07-07 17:08:5348 webrtc::MutexLock lock(&mutex_);
henrike@webrtc.org28e20752013-07-10 00:45:3649 rec_buffer_bytes_ = nSamples * nBytesPerSample;
Peter Kastingb7e50542015-06-11 19:55:5050 if ((rec_buffer_bytes_ == 0) ||
Yves Gerey665174f2018-06-19 13:03:0551 (rec_buffer_bytes_ >
52 FakeAudioCaptureModule::kNumberSamples *
53 FakeAudioCaptureModule::kNumberBytesPerSample)) {
henrike@webrtc.org28e20752013-07-10 00:45:3654 ADD_FAILURE();
55 return -1;
56 }
57 memcpy(rec_buffer_, audioSamples, rec_buffer_bytes_);
58 ++push_iterations_;
59 newMicLevel = currentMicLevel;
60 return 0;
61 }
62
maxmorin1aee0b52016-08-15 18:46:1963 void PullRenderData(int bits_per_sample,
64 int sample_rate,
65 size_t number_of_channels,
66 size_t number_of_frames,
67 void* audio_data,
68 int64_t* elapsed_time_ms,
69 int64_t* ntp_time_ms) override {}
70
henrike@webrtc.org28e20752013-07-10 00:45:3671 // ADM is pulling data.
Peter Kastingdce40cf2015-08-24 21:52:2372 int32_t NeedMorePlayData(const size_t nSamples,
73 const size_t nBytesPerSample,
Peter Kasting69558702016-01-13 00:26:3574 const size_t nChannels,
Peter Kasting728d9032015-06-11 21:31:3875 const uint32_t samplesPerSec,
76 void* audioSamples,
Peter Kastingdce40cf2015-08-24 21:52:2377 size_t& nSamplesOut,
Peter Kasting728d9032015-06-11 21:31:3878 int64_t* elapsed_time_ms,
79 int64_t* ntp_time_ms) override {
Markus Handell6fcd0f82020-07-07 17:08:5380 webrtc::MutexLock lock(&mutex_);
henrike@webrtc.org28e20752013-07-10 00:45:3681 ++pull_iterations_;
Peter Kastingdce40cf2015-08-24 21:52:2382 const size_t audio_buffer_size = nSamples * nBytesPerSample;
Yves Gerey665174f2018-06-19 13:03:0583 const size_t bytes_out =
84 RecordedDataReceived()
85 ? CopyFromRecBuffer(audioSamples, audio_buffer_size)
86 : GenerateZeroBuffer(audioSamples, audio_buffer_size);
henrike@webrtc.org28e20752013-07-10 00:45:3687 nSamplesOut = bytes_out / nBytesPerSample;
wu@webrtc.org94454b72014-06-05 20:34:0888 *elapsed_time_ms = 0;
buildbot@webrtc.orgd8524342014-07-14 20:05:0989 *ntp_time_ms = 0;
henrike@webrtc.org28e20752013-07-10 00:45:3690 return 0;
91 }
92
deadbeefee8c6d32015-08-13 21:27:1893 int push_iterations() const {
Markus Handell6fcd0f82020-07-07 17:08:5394 webrtc::MutexLock lock(&mutex_);
deadbeefee8c6d32015-08-13 21:27:1895 return push_iterations_;
96 }
97 int pull_iterations() const {
Markus Handell6fcd0f82020-07-07 17:08:5398 webrtc::MutexLock lock(&mutex_);
deadbeefee8c6d32015-08-13 21:27:1899 return pull_iterations_;
100 }
henrike@webrtc.org28e20752013-07-10 00:45:36101
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52102 rtc::scoped_refptr<FakeAudioCaptureModule> fake_audio_capture_module_;
henrike@webrtc.org28e20752013-07-10 00:45:36103
104 private:
Yves Gerey665174f2018-06-19 13:03:05105 bool RecordedDataReceived() const { return rec_buffer_bytes_ != 0; }
Peter Kastingdce40cf2015-08-24 21:52:23106 size_t GenerateZeroBuffer(void* audio_buffer, size_t audio_buffer_size) {
henrike@webrtc.org28e20752013-07-10 00:45:36107 memset(audio_buffer, 0, audio_buffer_size);
108 return audio_buffer_size;
109 }
Peter Kastingdce40cf2015-08-24 21:52:23110 size_t CopyFromRecBuffer(void* audio_buffer, size_t audio_buffer_size) {
henrike@webrtc.org28e20752013-07-10 00:45:36111 EXPECT_EQ(audio_buffer_size, rec_buffer_bytes_);
Steve Anton64b626b2019-01-29 01:25:26112 const size_t min_buffer_size =
113 std::min(audio_buffer_size, rec_buffer_bytes_);
henrike@webrtc.org28e20752013-07-10 00:45:36114 memcpy(audio_buffer, rec_buffer_, min_buffer_size);
115 return min_buffer_size;
116 }
117
Markus Handell6fcd0f82020-07-07 17:08:53118 mutable webrtc::Mutex mutex_;
deadbeefee8c6d32015-08-13 21:27:18119
henrike@webrtc.org28e20752013-07-10 00:45:36120 int push_iterations_;
121 int pull_iterations_;
122
123 char rec_buffer_[FakeAudioCaptureModule::kNumberSamples *
124 FakeAudioCaptureModule::kNumberBytesPerSample];
Peter Kastingdce40cf2015-08-24 21:52:23125 size_t rec_buffer_bytes_;
henrike@webrtc.org28e20752013-07-10 00:45:36126};
127
henrike@webrtc.org28e20752013-07-10 00:45:36128TEST_F(FakeAdmTest, PlayoutTest) {
129 EXPECT_EQ(0, fake_audio_capture_module_->RegisterAudioCallback(this));
130
henrike@webrtc.org28e20752013-07-10 00:45:36131 bool stereo_available = false;
Yves Gerey665174f2018-06-19 13:03:05132 EXPECT_EQ(0, fake_audio_capture_module_->StereoPlayoutIsAvailable(
133 &stereo_available));
henrike@webrtc.org28e20752013-07-10 00:45:36134 EXPECT_TRUE(stereo_available);
135
136 EXPECT_NE(0, fake_audio_capture_module_->StartPlayout());
137 EXPECT_FALSE(fake_audio_capture_module_->PlayoutIsInitialized());
138 EXPECT_FALSE(fake_audio_capture_module_->Playing());
139 EXPECT_EQ(0, fake_audio_capture_module_->StopPlayout());
140
141 EXPECT_EQ(0, fake_audio_capture_module_->InitPlayout());
142 EXPECT_TRUE(fake_audio_capture_module_->PlayoutIsInitialized());
143 EXPECT_FALSE(fake_audio_capture_module_->Playing());
144
145 EXPECT_EQ(0, fake_audio_capture_module_->StartPlayout());
146 EXPECT_TRUE(fake_audio_capture_module_->Playing());
147
148 uint16_t delay_ms = 10;
149 EXPECT_EQ(0, fake_audio_capture_module_->PlayoutDelay(&delay_ms));
150 EXPECT_EQ(0, delay_ms);
151
152 EXPECT_TRUE_WAIT(pull_iterations() > 0, kMsInSecond);
153 EXPECT_GE(0, push_iterations());
154
155 EXPECT_EQ(0, fake_audio_capture_module_->StopPlayout());
156 EXPECT_FALSE(fake_audio_capture_module_->Playing());
157}
158
159TEST_F(FakeAdmTest, RecordTest) {
160 EXPECT_EQ(0, fake_audio_capture_module_->RegisterAudioCallback(this));
161
henrike@webrtc.org28e20752013-07-10 00:45:36162 bool stereo_available = false;
163 EXPECT_EQ(0, fake_audio_capture_module_->StereoRecordingIsAvailable(
Yves Gerey665174f2018-06-19 13:03:05164 &stereo_available));
henrike@webrtc.org28e20752013-07-10 00:45:36165 EXPECT_FALSE(stereo_available);
166
167 EXPECT_NE(0, fake_audio_capture_module_->StartRecording());
168 EXPECT_FALSE(fake_audio_capture_module_->Recording());
169 EXPECT_EQ(0, fake_audio_capture_module_->StopRecording());
170
171 EXPECT_EQ(0, fake_audio_capture_module_->InitRecording());
172 EXPECT_EQ(0, fake_audio_capture_module_->StartRecording());
173 EXPECT_TRUE(fake_audio_capture_module_->Recording());
174
175 EXPECT_TRUE_WAIT(push_iterations() > 0, kMsInSecond);
176 EXPECT_GE(0, pull_iterations());
177
178 EXPECT_EQ(0, fake_audio_capture_module_->StopRecording());
179 EXPECT_FALSE(fake_audio_capture_module_->Recording());
180}
181
182TEST_F(FakeAdmTest, DuplexTest) {
183 EXPECT_EQ(0, fake_audio_capture_module_->RegisterAudioCallback(this));
184
185 EXPECT_EQ(0, fake_audio_capture_module_->InitPlayout());
186 EXPECT_EQ(0, fake_audio_capture_module_->StartPlayout());
187
188 EXPECT_EQ(0, fake_audio_capture_module_->InitRecording());
189 EXPECT_EQ(0, fake_audio_capture_module_->StartRecording());
190
191 EXPECT_TRUE_WAIT(push_iterations() > 0, kMsInSecond);
192 EXPECT_TRUE_WAIT(pull_iterations() > 0, kMsInSecond);
193
194 EXPECT_EQ(0, fake_audio_capture_module_->StopPlayout());
195 EXPECT_EQ(0, fake_audio_capture_module_->StopRecording());
196}