| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 <limits> | 5 #include <limits> |
| 6 #include <memory> |
| 6 #include <vector> | 7 #include <vector> |
| 7 | 8 |
| 8 #include "base/bind.h" | 9 #include "base/bind.h" |
| 9 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| 10 #include "base/macros.h" | 11 #include "base/macros.h" |
| 11 #include "media/base/audio_bus.h" | 12 #include "media/base/audio_bus.h" |
| 12 #include "media/base/audio_push_fifo.h" | 13 #include "media/base/audio_push_fifo.h" |
| 13 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
| 14 | 15 |
| 15 namespace media { | 16 namespace media { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 int GetNumPushTestIterations(int input_chunk_size) const { | 50 int GetNumPushTestIterations(int input_chunk_size) const { |
| 50 return 3 * std::max(1, output_chunk_size() / input_chunk_size); | 51 return 3 * std::max(1, output_chunk_size() / input_chunk_size); |
| 51 } | 52 } |
| 52 | 53 |
| 53 // Repeatedly pushes constant-sized batches of input samples and checks that | 54 // Repeatedly pushes constant-sized batches of input samples and checks that |
| 54 // the input data is re-chunked correctly. | 55 // the input data is re-chunked correctly. |
| 55 void RunSimpleRechunkTest(int input_chunk_size) { | 56 void RunSimpleRechunkTest(int input_chunk_size) { |
| 56 const int num_iterations = GetNumPushTestIterations(input_chunk_size); | 57 const int num_iterations = GetNumPushTestIterations(input_chunk_size); |
| 57 | 58 |
| 58 int sample_value = 0; | 59 int sample_value = 0; |
| 59 const scoped_ptr<AudioBus> audio_bus = | 60 const std::unique_ptr<AudioBus> audio_bus = |
| 60 AudioBus::Create(1, input_chunk_size); | 61 AudioBus::Create(1, input_chunk_size); |
| 61 | 62 |
| 62 for (int i = 0; i < num_iterations; ++i) { | 63 for (int i = 0; i < num_iterations; ++i) { |
| 63 EXPECT_EQ(GetExpectedOutputChunks(i * input_chunk_size), results_.size()); | 64 EXPECT_EQ(GetExpectedOutputChunks(i * input_chunk_size), results_.size()); |
| 64 | 65 |
| 65 // Fill audio data with predictable values. | 66 // Fill audio data with predictable values. |
| 66 for (int j = 0; j < audio_bus->frames(); ++j) | 67 for (int j = 0; j < audio_bus->frames(); ++j) |
| 67 audio_bus->channel(0)[j] = static_cast<float>(sample_value++); | 68 audio_bus->channel(0)[j] = static_cast<float>(sample_value++); |
| 68 | 69 |
| 69 fifo_->Push(*audio_bus); | 70 fifo_->Push(*audio_bus); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 108 } | 109 } |
| 109 } | 110 } |
| 110 | 111 |
| 111 // Returns a "random" integer in the range [begin,end). | 112 // Returns a "random" integer in the range [begin,end). |
| 112 int GetRandomInRange(int begin, int end) { | 113 int GetRandomInRange(int begin, int end) { |
| 113 const int len = end - begin; | 114 const int len = end - begin; |
| 114 const int rand_offset = (len == 0) ? 0 : (NextRandomInt() % (end - begin)); | 115 const int rand_offset = (len == 0) ? 0 : (NextRandomInt() % (end - begin)); |
| 115 return begin + rand_offset; | 116 return begin + rand_offset; |
| 116 } | 117 } |
| 117 | 118 |
| 118 scoped_ptr<AudioPushFifo> fifo_; | 119 std::unique_ptr<AudioPushFifo> fifo_; |
| 119 std::vector<OutputChunkResult> results_; | 120 std::vector<OutputChunkResult> results_; |
| 120 | 121 |
| 121 private: | 122 private: |
| 122 // Called by |fifo_| to deliver another chunk of audio. Sanity checks | 123 // Called by |fifo_| to deliver another chunk of audio. Sanity checks |
| 123 // the sample values are as expected, and without any dropped/duplicated, and | 124 // the sample values are as expected, and without any dropped/duplicated, and |
| 124 // adds a result to |results_|. | 125 // adds a result to |results_|. |
| 125 void ReceiveAndCheckNextChunk(const AudioBus& audio_bus, int frame_delay) { | 126 void ReceiveAndCheckNextChunk(const AudioBus& audio_bus, int frame_delay) { |
| 126 OutputChunkResult result; | 127 OutputChunkResult result; |
| 127 result.num_frames = audio_bus.frames(); | 128 result.num_frames = audio_bus.frames(); |
| 128 result.first_sample_value = audio_bus.channel(0)[0]; | 129 result.first_sample_value = audio_bus.channel(0)[0]; |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 // occurred; and 2) there are at least 3 entries in |results_|. | 195 // occurred; and 2) there are at least 3 entries in |results_|. |
| 195 const int kMinNumIterations = 30; | 196 const int kMinNumIterations = 30; |
| 196 | 197 |
| 197 int sample_value = 0; | 198 int sample_value = 0; |
| 198 int frames_pushed_so_far = 0; | 199 int frames_pushed_so_far = 0; |
| 199 for (int i = 0; i < kMinNumIterations || results_.size() < 3; ++i) { | 200 for (int i = 0; i < kMinNumIterations || results_.size() < 3; ++i) { |
| 200 EXPECT_EQ(GetExpectedOutputChunks(frames_pushed_so_far), results_.size()); | 201 EXPECT_EQ(GetExpectedOutputChunks(frames_pushed_so_far), results_.size()); |
| 201 | 202 |
| 202 // Create an AudioBus of a random length, populated with sample values. | 203 // Create an AudioBus of a random length, populated with sample values. |
| 203 const int input_chunk_size = GetRandomInRange(1, 1920); | 204 const int input_chunk_size = GetRandomInRange(1, 1920); |
| 204 const scoped_ptr<AudioBus> audio_bus = | 205 const std::unique_ptr<AudioBus> audio_bus = |
| 205 AudioBus::Create(1, input_chunk_size); | 206 AudioBus::Create(1, input_chunk_size); |
| 206 for (int j = 0; j < audio_bus->frames(); ++j) | 207 for (int j = 0; j < audio_bus->frames(); ++j) |
| 207 audio_bus->channel(0)[j] = static_cast<float>(sample_value++); | 208 audio_bus->channel(0)[j] = static_cast<float>(sample_value++); |
| 208 | 209 |
| 209 fifo_->Push(*audio_bus); | 210 fifo_->Push(*audio_bus); |
| 210 // Note: AudioPushFifo has just called ReceiveAndCheckNextChunk() zero or | 211 // Note: AudioPushFifo has just called ReceiveAndCheckNextChunk() zero or |
| 211 // more times. | 212 // more times. |
| 212 | 213 |
| 213 frames_pushed_so_far += input_chunk_size; | 214 frames_pushed_so_far += input_chunk_size; |
| 214 } | 215 } |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 // 60 ms output chunks at common sample rates. | 248 // 60 ms output chunks at common sample rates. |
| 248 960, // 16000 Hz | 249 960, // 16000 Hz |
| 249 1323, // 22050 Hz | 250 1323, // 22050 Hz |
| 250 2646, // 44100 Hz | 251 2646, // 44100 Hz |
| 251 2880 // 48000 Hz | 252 2880 // 48000 Hz |
| 252 )); | 253 )); |
| 253 | 254 |
| 254 } // namespace | 255 } // namespace |
| 255 | 256 |
| 256 } // namespace media | 257 } // namespace media |
| OLD | NEW |