blob: 6ef76853474ab69fa674b821af4724bd9c5021fa [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * 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:36 +00009 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "pc/test/fakeaudiocapturemodule.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000012
13#include <algorithm>
14
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "rtc_base/criticalsection.h"
16#include "rtc_base/gunit.h"
17#include "rtc_base/scoped_ref_ptr.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000018
19using std::min;
20
Yves Gerey665174f2018-06-19 15:03:05 +020021class FakeAdmTest : public testing::Test, public webrtc::AudioTransport {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000022 protected:
23 static const int kMsInSecond = 1000;
24
25 FakeAdmTest()
Yves Gerey665174f2018-06-19 15:03:05 +020026 : push_iterations_(0), pull_iterations_(0), rec_buffer_bytes_(0) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000027 memset(rec_buffer_, 0, sizeof(rec_buffer_));
28 }
29
nisseef8b61e2016-04-29 06:09:15 -070030 void SetUp() override {
deadbeefee8c6d32015-08-13 14:27:18 -070031 fake_audio_capture_module_ = FakeAudioCaptureModule::Create();
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032 EXPECT_TRUE(fake_audio_capture_module_.get() != NULL);
33 }
34
35 // Callbacks inherited from webrtc::AudioTransport.
36 // ADM is pushing data.
Peter Kasting728d9032015-06-11 14:31:38 -070037 int32_t RecordedDataIsAvailable(const void* audioSamples,
Peter Kastingdce40cf2015-08-24 14:52:23 -070038 const size_t nSamples,
39 const size_t nBytesPerSample,
Peter Kasting69558702016-01-12 16:26:35 -080040 const size_t nChannels,
Peter Kasting728d9032015-06-11 14:31:38 -070041 const uint32_t samplesPerSec,
42 const uint32_t totalDelayMS,
43 const int32_t clockDrift,
44 const uint32_t currentMicLevel,
45 const bool keyPressed,
46 uint32_t& newMicLevel) override {
deadbeefee8c6d32015-08-13 14:27:18 -070047 rtc::CritScope cs(&crit_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000048 rec_buffer_bytes_ = nSamples * nBytesPerSample;
Peter Kastingb7e50542015-06-11 12:55:50 -070049 if ((rec_buffer_bytes_ == 0) ||
Yves Gerey665174f2018-06-19 15:03:05 +020050 (rec_buffer_bytes_ >
51 FakeAudioCaptureModule::kNumberSamples *
52 FakeAudioCaptureModule::kNumberBytesPerSample)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000053 ADD_FAILURE();
54 return -1;
55 }
56 memcpy(rec_buffer_, audioSamples, rec_buffer_bytes_);
57 ++push_iterations_;
58 newMicLevel = currentMicLevel;
59 return 0;
60 }
61
maxmorin1aee0b52016-08-15 11:46:19 -070062 void PullRenderData(int bits_per_sample,
63 int sample_rate,
64 size_t number_of_channels,
65 size_t number_of_frames,
66 void* audio_data,
67 int64_t* elapsed_time_ms,
68 int64_t* ntp_time_ms) override {}
69
henrike@webrtc.org28e20752013-07-10 00:45:36 +000070 // ADM is pulling data.
Peter Kastingdce40cf2015-08-24 14:52:23 -070071 int32_t NeedMorePlayData(const size_t nSamples,
72 const size_t nBytesPerSample,
Peter Kasting69558702016-01-12 16:26:35 -080073 const size_t nChannels,
Peter Kasting728d9032015-06-11 14:31:38 -070074 const uint32_t samplesPerSec,
75 void* audioSamples,
Peter Kastingdce40cf2015-08-24 14:52:23 -070076 size_t& nSamplesOut,
Peter Kasting728d9032015-06-11 14:31:38 -070077 int64_t* elapsed_time_ms,
78 int64_t* ntp_time_ms) override {
deadbeefee8c6d32015-08-13 14:27:18 -070079 rtc::CritScope cs(&crit_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000080 ++pull_iterations_;
Peter Kastingdce40cf2015-08-24 14:52:23 -070081 const size_t audio_buffer_size = nSamples * nBytesPerSample;
Yves Gerey665174f2018-06-19 15:03:05 +020082 const size_t bytes_out =
83 RecordedDataReceived()
84 ? CopyFromRecBuffer(audioSamples, audio_buffer_size)
85 : GenerateZeroBuffer(audioSamples, audio_buffer_size);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000086 nSamplesOut = bytes_out / nBytesPerSample;
wu@webrtc.org94454b72014-06-05 20:34:08 +000087 *elapsed_time_ms = 0;
buildbot@webrtc.orgd8524342014-07-14 20:05:09 +000088 *ntp_time_ms = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000089 return 0;
90 }
91
deadbeefee8c6d32015-08-13 14:27:18 -070092 int push_iterations() const {
93 rtc::CritScope cs(&crit_);
94 return push_iterations_;
95 }
96 int pull_iterations() const {
97 rtc::CritScope cs(&crit_);
98 return pull_iterations_;
99 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000100
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000101 rtc::scoped_refptr<FakeAudioCaptureModule> fake_audio_capture_module_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000102
103 private:
Yves Gerey665174f2018-06-19 15:03:05 +0200104 bool RecordedDataReceived() const { return rec_buffer_bytes_ != 0; }
Peter Kastingdce40cf2015-08-24 14:52:23 -0700105 size_t GenerateZeroBuffer(void* audio_buffer, size_t audio_buffer_size) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000106 memset(audio_buffer, 0, audio_buffer_size);
107 return audio_buffer_size;
108 }
Peter Kastingdce40cf2015-08-24 14:52:23 -0700109 size_t CopyFromRecBuffer(void* audio_buffer, size_t audio_buffer_size) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000110 EXPECT_EQ(audio_buffer_size, rec_buffer_bytes_);
Peter Kastingdce40cf2015-08-24 14:52:23 -0700111 const size_t min_buffer_size = min(audio_buffer_size, rec_buffer_bytes_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000112 memcpy(audio_buffer, rec_buffer_, min_buffer_size);
113 return min_buffer_size;
114 }
115
pbos5ad935c2016-01-25 03:52:44 -0800116 rtc::CriticalSection crit_;
deadbeefee8c6d32015-08-13 14:27:18 -0700117
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000118 int push_iterations_;
119 int pull_iterations_;
120
121 char rec_buffer_[FakeAudioCaptureModule::kNumberSamples *
122 FakeAudioCaptureModule::kNumberBytesPerSample];
Peter Kastingdce40cf2015-08-24 14:52:23 -0700123 size_t rec_buffer_bytes_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000124};
125
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000126TEST_F(FakeAdmTest, PlayoutTest) {
127 EXPECT_EQ(0, fake_audio_capture_module_->RegisterAudioCallback(this));
128
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000129 bool stereo_available = false;
Yves Gerey665174f2018-06-19 15:03:05 +0200130 EXPECT_EQ(0, fake_audio_capture_module_->StereoPlayoutIsAvailable(
131 &stereo_available));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000132 EXPECT_TRUE(stereo_available);
133
134 EXPECT_NE(0, fake_audio_capture_module_->StartPlayout());
135 EXPECT_FALSE(fake_audio_capture_module_->PlayoutIsInitialized());
136 EXPECT_FALSE(fake_audio_capture_module_->Playing());
137 EXPECT_EQ(0, fake_audio_capture_module_->StopPlayout());
138
139 EXPECT_EQ(0, fake_audio_capture_module_->InitPlayout());
140 EXPECT_TRUE(fake_audio_capture_module_->PlayoutIsInitialized());
141 EXPECT_FALSE(fake_audio_capture_module_->Playing());
142
143 EXPECT_EQ(0, fake_audio_capture_module_->StartPlayout());
144 EXPECT_TRUE(fake_audio_capture_module_->Playing());
145
146 uint16_t delay_ms = 10;
147 EXPECT_EQ(0, fake_audio_capture_module_->PlayoutDelay(&delay_ms));
148 EXPECT_EQ(0, delay_ms);
149
150 EXPECT_TRUE_WAIT(pull_iterations() > 0, kMsInSecond);
151 EXPECT_GE(0, push_iterations());
152
153 EXPECT_EQ(0, fake_audio_capture_module_->StopPlayout());
154 EXPECT_FALSE(fake_audio_capture_module_->Playing());
155}
156
157TEST_F(FakeAdmTest, RecordTest) {
158 EXPECT_EQ(0, fake_audio_capture_module_->RegisterAudioCallback(this));
159
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000160 bool stereo_available = false;
161 EXPECT_EQ(0, fake_audio_capture_module_->StereoRecordingIsAvailable(
Yves Gerey665174f2018-06-19 15:03:05 +0200162 &stereo_available));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000163 EXPECT_FALSE(stereo_available);
164
165 EXPECT_NE(0, fake_audio_capture_module_->StartRecording());
166 EXPECT_FALSE(fake_audio_capture_module_->Recording());
167 EXPECT_EQ(0, fake_audio_capture_module_->StopRecording());
168
169 EXPECT_EQ(0, fake_audio_capture_module_->InitRecording());
170 EXPECT_EQ(0, fake_audio_capture_module_->StartRecording());
171 EXPECT_TRUE(fake_audio_capture_module_->Recording());
172
173 EXPECT_TRUE_WAIT(push_iterations() > 0, kMsInSecond);
174 EXPECT_GE(0, pull_iterations());
175
176 EXPECT_EQ(0, fake_audio_capture_module_->StopRecording());
177 EXPECT_FALSE(fake_audio_capture_module_->Recording());
178}
179
180TEST_F(FakeAdmTest, DuplexTest) {
181 EXPECT_EQ(0, fake_audio_capture_module_->RegisterAudioCallback(this));
182
183 EXPECT_EQ(0, fake_audio_capture_module_->InitPlayout());
184 EXPECT_EQ(0, fake_audio_capture_module_->StartPlayout());
185
186 EXPECT_EQ(0, fake_audio_capture_module_->InitRecording());
187 EXPECT_EQ(0, fake_audio_capture_module_->StartRecording());
188
189 EXPECT_TRUE_WAIT(push_iterations() > 0, kMsInSecond);
190 EXPECT_TRUE_WAIT(pull_iterations() > 0, kMsInSecond);
191
192 EXPECT_EQ(0, fake_audio_capture_module_->StopPlayout());
193 EXPECT_EQ(0, fake_audio_capture_module_->StopRecording());
194}