OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "remoting/client/audio_player.h" | 5 #include "remoting/client/audio_player.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 | 10 |
| 11 #include "base/callback.h" |
11 #include "base/compiler_specific.h" | 12 #include "base/compiler_specific.h" |
12 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
13 | 14 |
14 namespace { | 15 namespace { |
15 | 16 |
16 const int kAudioSamplesPerFrame = 25; | 17 const int kAudioSamplesPerFrame = 25; |
17 const int kAudioSampleBytes = 4; | 18 const int kAudioSampleBytes = 4; |
18 const int kAudioFrameBytes = kAudioSamplesPerFrame * kAudioSampleBytes; | 19 const int kAudioFrameBytes = kAudioSamplesPerFrame * kAudioSampleBytes; |
19 const int kPaddingBytes = 16; | 20 const int kPaddingBytes = 16; |
20 | 21 |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
110 } | 111 } |
111 | 112 |
112 std::unique_ptr<AudioPacket> CreatePacket48000Hz(int samples) { | 113 std::unique_ptr<AudioPacket> CreatePacket48000Hz(int samples) { |
113 return CreatePacketWithSamplingRate(AudioPacket::SAMPLING_RATE_48000, | 114 return CreatePacketWithSamplingRate(AudioPacket::SAMPLING_RATE_48000, |
114 samples); | 115 samples); |
115 } | 116 } |
116 | 117 |
117 TEST_F(AudioPlayerTest, Init) { | 118 TEST_F(AudioPlayerTest, Init) { |
118 ASSERT_EQ(0, GetNumQueuedPackets()); | 119 ASSERT_EQ(0, GetNumQueuedPackets()); |
119 | 120 |
120 audio_->AddAudioPacket(CreatePacket44100Hz(10)); | 121 audio_->ProcessAudioPacket(CreatePacket44100Hz(10), base::Closure()); |
121 ASSERT_EQ(1, GetNumQueuedPackets()); | 122 ASSERT_EQ(1, GetNumQueuedPackets()); |
122 } | 123 } |
123 | 124 |
124 TEST_F(AudioPlayerTest, MultipleSamples) { | 125 TEST_F(AudioPlayerTest, MultipleSamples) { |
125 audio_->AddAudioPacket(CreatePacket44100Hz(10)); | 126 audio_->ProcessAudioPacket(CreatePacket44100Hz(10), base::Closure()); |
126 ASSERT_EQ(10, GetNumQueuedSamples()); | 127 ASSERT_EQ(10, GetNumQueuedSamples()); |
127 ASSERT_EQ(1, GetNumQueuedPackets()); | 128 ASSERT_EQ(1, GetNumQueuedPackets()); |
128 | 129 |
129 audio_->AddAudioPacket(CreatePacket44100Hz(20)); | 130 audio_->ProcessAudioPacket(CreatePacket44100Hz(20), base::Closure()); |
130 ASSERT_EQ(30, GetNumQueuedSamples()); | 131 ASSERT_EQ(30, GetNumQueuedSamples()); |
131 ASSERT_EQ(2, GetNumQueuedPackets()); | 132 ASSERT_EQ(2, GetNumQueuedPackets()); |
132 } | 133 } |
133 | 134 |
134 TEST_F(AudioPlayerTest, ChangeSampleRate) { | 135 TEST_F(AudioPlayerTest, ChangeSampleRate) { |
135 audio_->AddAudioPacket(CreatePacket44100Hz(10)); | 136 audio_->ProcessAudioPacket(CreatePacket44100Hz(10), base::Closure()); |
136 ASSERT_EQ(10, GetNumQueuedSamples()); | 137 ASSERT_EQ(10, GetNumQueuedSamples()); |
137 ASSERT_EQ(1, GetNumQueuedPackets()); | 138 ASSERT_EQ(1, GetNumQueuedPackets()); |
138 | 139 |
139 // New packet with different sampling rate causes previous samples to | 140 // New packet with different sampling rate causes previous samples to |
140 // be removed. | 141 // be removed. |
141 audio_->AddAudioPacket(CreatePacket48000Hz(20)); | 142 audio_->ProcessAudioPacket(CreatePacket48000Hz(20), base::Closure()); |
142 ASSERT_EQ(20, GetNumQueuedSamples()); | 143 ASSERT_EQ(20, GetNumQueuedSamples()); |
143 ASSERT_EQ(1, GetNumQueuedPackets()); | 144 ASSERT_EQ(1, GetNumQueuedPackets()); |
144 } | 145 } |
145 | 146 |
146 TEST_F(AudioPlayerTest, ExceedLatency) { | 147 TEST_F(AudioPlayerTest, ExceedLatency) { |
147 // Push about 4 seconds worth of samples. | 148 // Push about 4 seconds worth of samples. |
148 for (int i = 0; i < 100; ++i) { | 149 for (int i = 0; i < 100; ++i) { |
149 audio_->AddAudioPacket(CreatePacket48000Hz(2000)); | 150 audio_->ProcessAudioPacket(CreatePacket48000Hz(2000), base::Closure()); |
150 } | 151 } |
151 | 152 |
152 // Verify that we don't have more than 0.5s. | 153 // Verify that we don't have more than 0.5s. |
153 EXPECT_LT(GetNumQueuedSamples(), 24000); | 154 EXPECT_LT(GetNumQueuedSamples(), 24000); |
154 } | 155 } |
155 | 156 |
156 // Incoming packets: 100 | 157 // Incoming packets: 100 |
157 // Consume: 25 (w/ 75 remaining, offset 25 into packet) | 158 // Consume: 25 (w/ 75 remaining, offset 25 into packet) |
158 TEST_F(AudioPlayerTest, ConsumePartialPacket) { | 159 TEST_F(AudioPlayerTest, ConsumePartialPacket) { |
159 int total_samples = 0; | 160 int total_samples = 0; |
160 int bytes_consumed = 0; | 161 int bytes_consumed = 0; |
161 | 162 |
162 // Process 100 samples. | 163 // Process 100 samples. |
163 int packet1_samples = 100; | 164 int packet1_samples = 100; |
164 total_samples += packet1_samples; | 165 total_samples += packet1_samples; |
165 audio_->AddAudioPacket(CreatePacket44100Hz(packet1_samples)); | 166 audio_->ProcessAudioPacket(CreatePacket44100Hz(packet1_samples), |
| 167 base::Closure()); |
166 ASSERT_EQ(total_samples, GetNumQueuedSamples()); | 168 ASSERT_EQ(total_samples, GetNumQueuedSamples()); |
167 ASSERT_EQ(1, GetNumQueuedPackets()); | 169 ASSERT_EQ(1, GetNumQueuedPackets()); |
168 ASSERT_EQ(bytes_consumed, GetBytesConsumed()); | 170 ASSERT_EQ(bytes_consumed, GetBytesConsumed()); |
169 | 171 |
170 // Consume one frame (=25) of samples. | 172 // Consume one frame (=25) of samples. |
171 ConsumeAudioFrame(); | 173 ConsumeAudioFrame(); |
172 total_samples -= kAudioSamplesPerFrame; | 174 total_samples -= kAudioSamplesPerFrame; |
173 bytes_consumed += kAudioFrameBytes; | 175 bytes_consumed += kAudioFrameBytes; |
174 ASSERT_EQ(total_samples, GetNumQueuedSamples()); | 176 ASSERT_EQ(total_samples, GetNumQueuedSamples()); |
175 ASSERT_EQ(1, GetNumQueuedPackets()); | 177 ASSERT_EQ(1, GetNumQueuedPackets()); |
176 ASSERT_EQ(bytes_consumed, GetBytesConsumed()); | 178 ASSERT_EQ(bytes_consumed, GetBytesConsumed()); |
177 CheckAudioFrameBytes(kAudioFrameBytes); | 179 CheckAudioFrameBytes(kAudioFrameBytes); |
178 | 180 |
179 // Remaining samples. | 181 // Remaining samples. |
180 ASSERT_EQ(75, total_samples); | 182 ASSERT_EQ(75, total_samples); |
181 ASSERT_EQ(25 * kAudioSampleBytes, bytes_consumed); | 183 ASSERT_EQ(25 * kAudioSampleBytes, bytes_consumed); |
182 } | 184 } |
183 | 185 |
184 // Incoming packets: 20, 70 | 186 // Incoming packets: 20, 70 |
185 // Consume: 25, 25 (w/ 40 remaining, offset 30 into packet) | 187 // Consume: 25, 25 (w/ 40 remaining, offset 30 into packet) |
186 TEST_F(AudioPlayerTest, ConsumeAcrossPackets) { | 188 TEST_F(AudioPlayerTest, ConsumeAcrossPackets) { |
187 int total_samples = 0; | 189 int total_samples = 0; |
188 int bytes_consumed = 0; | 190 int bytes_consumed = 0; |
189 | 191 |
190 // Packet 1. | 192 // Packet 1. |
191 int packet1_samples = 20; | 193 int packet1_samples = 20; |
192 total_samples += packet1_samples; | 194 total_samples += packet1_samples; |
193 audio_->AddAudioPacket(CreatePacket44100Hz(packet1_samples)); | 195 audio_->ProcessAudioPacket(CreatePacket44100Hz(packet1_samples), |
| 196 base::Closure()); |
194 ASSERT_EQ(total_samples, GetNumQueuedSamples()); | 197 ASSERT_EQ(total_samples, GetNumQueuedSamples()); |
195 | 198 |
196 // Packet 2. | 199 // Packet 2. |
197 int packet2_samples = 70; | 200 int packet2_samples = 70; |
198 total_samples += packet2_samples; | 201 total_samples += packet2_samples; |
199 audio_->AddAudioPacket(CreatePacket44100Hz(packet2_samples)); | 202 audio_->ProcessAudioPacket(CreatePacket44100Hz(packet2_samples), |
| 203 base::Closure()); |
200 ASSERT_EQ(total_samples, GetNumQueuedSamples()); | 204 ASSERT_EQ(total_samples, GetNumQueuedSamples()); |
201 ASSERT_EQ(bytes_consumed, GetBytesConsumed()); | 205 ASSERT_EQ(bytes_consumed, GetBytesConsumed()); |
202 | 206 |
203 // Consume 1st frame of 25 samples. | 207 // Consume 1st frame of 25 samples. |
204 // This will consume the entire 1st packet. | 208 // This will consume the entire 1st packet. |
205 ConsumeAudioFrame(); | 209 ConsumeAudioFrame(); |
206 total_samples -= kAudioSamplesPerFrame; | 210 total_samples -= kAudioSamplesPerFrame; |
207 bytes_consumed += kAudioFrameBytes - (packet1_samples * kAudioSampleBytes); | 211 bytes_consumed += kAudioFrameBytes - (packet1_samples * kAudioSampleBytes); |
208 ASSERT_EQ(total_samples, GetNumQueuedSamples()); | 212 ASSERT_EQ(total_samples, GetNumQueuedSamples()); |
209 ASSERT_EQ(1, GetNumQueuedPackets()); | 213 ASSERT_EQ(1, GetNumQueuedPackets()); |
(...skipping 16 matching lines...) Expand all Loading... |
226 | 230 |
227 // Incoming packets: 50, 30 | 231 // Incoming packets: 50, 30 |
228 // Consume: 25, 25, 25 (w/ 5 remaining, offset 25 into packet) | 232 // Consume: 25, 25, 25 (w/ 5 remaining, offset 25 into packet) |
229 TEST_F(AudioPlayerTest, ConsumeEntirePacket) { | 233 TEST_F(AudioPlayerTest, ConsumeEntirePacket) { |
230 int total_samples = 0; | 234 int total_samples = 0; |
231 int bytes_consumed = 0; | 235 int bytes_consumed = 0; |
232 | 236 |
233 // Packet 1. | 237 // Packet 1. |
234 int packet1_samples = 50; | 238 int packet1_samples = 50; |
235 total_samples += packet1_samples; | 239 total_samples += packet1_samples; |
236 audio_->AddAudioPacket(CreatePacket44100Hz(packet1_samples)); | 240 audio_->ProcessAudioPacket(CreatePacket44100Hz(packet1_samples), |
| 241 base::Closure()); |
237 ASSERT_EQ(total_samples, GetNumQueuedSamples()); | 242 ASSERT_EQ(total_samples, GetNumQueuedSamples()); |
238 ASSERT_EQ(bytes_consumed, GetBytesConsumed()); | 243 ASSERT_EQ(bytes_consumed, GetBytesConsumed()); |
239 | 244 |
240 // Packet 2. | 245 // Packet 2. |
241 int packet2_samples = 30; | 246 int packet2_samples = 30; |
242 total_samples += packet2_samples; | 247 total_samples += packet2_samples; |
243 audio_->AddAudioPacket(CreatePacket44100Hz(packet2_samples)); | 248 audio_->ProcessAudioPacket(CreatePacket44100Hz(packet2_samples), |
| 249 base::Closure()); |
244 ASSERT_EQ(total_samples, GetNumQueuedSamples()); | 250 ASSERT_EQ(total_samples, GetNumQueuedSamples()); |
245 ASSERT_EQ(bytes_consumed, GetBytesConsumed()); | 251 ASSERT_EQ(bytes_consumed, GetBytesConsumed()); |
246 | 252 |
247 // Consume 1st frame of 25 samples. | 253 // Consume 1st frame of 25 samples. |
248 ConsumeAudioFrame(); | 254 ConsumeAudioFrame(); |
249 total_samples -= kAudioSamplesPerFrame; | 255 total_samples -= kAudioSamplesPerFrame; |
250 bytes_consumed += kAudioFrameBytes; | 256 bytes_consumed += kAudioFrameBytes; |
251 ASSERT_EQ(total_samples, GetNumQueuedSamples()); | 257 ASSERT_EQ(total_samples, GetNumQueuedSamples()); |
252 ASSERT_EQ(2, GetNumQueuedPackets()); | 258 ASSERT_EQ(2, GetNumQueuedPackets()); |
253 ASSERT_EQ(bytes_consumed, GetBytesConsumed()); | 259 ASSERT_EQ(bytes_consumed, GetBytesConsumed()); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 | 298 |
293 // Incoming packets: 10 | 299 // Incoming packets: 10 |
294 // Consume: 25 | 300 // Consume: 25 |
295 TEST_F(AudioPlayerTest, NotEnoughDataToConsume) { | 301 TEST_F(AudioPlayerTest, NotEnoughDataToConsume) { |
296 int total_samples = 0; | 302 int total_samples = 0; |
297 int bytes_consumed = 0; | 303 int bytes_consumed = 0; |
298 | 304 |
299 // Packet 1. | 305 // Packet 1. |
300 int packet1_samples = 10; | 306 int packet1_samples = 10; |
301 total_samples += packet1_samples; | 307 total_samples += packet1_samples; |
302 audio_->AddAudioPacket(CreatePacket44100Hz(packet1_samples)); | 308 audio_->ProcessAudioPacket(CreatePacket44100Hz(packet1_samples), |
| 309 base::Closure()); |
303 ASSERT_EQ(total_samples, GetNumQueuedSamples()); | 310 ASSERT_EQ(total_samples, GetNumQueuedSamples()); |
304 ASSERT_EQ(bytes_consumed, GetBytesConsumed()); | 311 ASSERT_EQ(bytes_consumed, GetBytesConsumed()); |
305 | 312 |
306 // Attempt to consume a frame of 25 samples. | 313 // Attempt to consume a frame of 25 samples. |
307 ConsumeAudioFrame(); | 314 ConsumeAudioFrame(); |
308 ASSERT_EQ(0, GetNumQueuedSamples()); | 315 ASSERT_EQ(0, GetNumQueuedSamples()); |
309 ASSERT_EQ(0, GetNumQueuedPackets()); | 316 ASSERT_EQ(0, GetNumQueuedPackets()); |
310 ASSERT_EQ(0, GetBytesConsumed()); | 317 ASSERT_EQ(0, GetBytesConsumed()); |
311 CheckAudioFrameBytes(packet1_samples * kAudioSampleBytes); | 318 CheckAudioFrameBytes(packet1_samples * kAudioSampleBytes); |
312 } | 319 } |
313 | 320 |
314 } // namespace remoting | 321 } // namespace remoting |
OLD | NEW |