| 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 |