| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 // The format of these tests are to enqueue a known amount of data and then | 5 // The format of these tests are to enqueue a known amount of data and then |
| 6 // request the exact amount we expect in order to dequeue the known amount of | 6 // request the exact amount we expect in order to dequeue the known amount of |
| 7 // data. This ensures that for any rate we are consuming input data at the | 7 // data. This ensures that for any rate we are consuming input data at the |
| 8 // correct rate. We always pass in a very large destination buffer with the | 8 // correct rate. We always pass in a very large destination buffer with the |
| 9 // expectation that FillBuffer() will fill as much as it can but no more. | 9 // expectation that FillBuffer() will fill as much as it can but no more. |
| 10 | 10 |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/callback.h" | 12 #include "base/callback.h" |
| 13 #include "media/base/data_buffer.h" | 13 #include "media/base/data_buffer.h" |
| 14 #include "media/filters/audio_renderer_algorithm_base.h" | 14 #include "media/filters/audio_renderer_algorithm_base.h" |
| 15 #include "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 17 | 17 |
| 18 using ::testing::AnyNumber; | 18 using ::testing::AnyNumber; |
| 19 | 19 |
| 20 namespace media { | 20 namespace media { |
| 21 | 21 |
| 22 static const int kChannels = 1; | 22 static const int kChannels = 1; |
| 23 static const int kSampleRate = 1000; | 23 static const int kSampleRate = 1000; |
| 24 static const int kSampleBits = 8; | 24 static const int kSampleBits = 8; |
| 25 static void DoNothing() {} | |
| 26 | 25 |
| 27 TEST(AudioRendererAlgorithmBaseTest, FillBuffer_NormalRate) { | 26 TEST(AudioRendererAlgorithmBaseTest, FillBuffer_NormalRate) { |
| 28 // When playback rate == 1.0f: straight copy of whatever is in |queue_|. | 27 // When playback rate == 1.0f: straight copy of whatever is in |queue_|. |
| 29 AudioRendererAlgorithmBase algorithm; | 28 AudioRendererAlgorithmBase algorithm; |
| 30 algorithm.Initialize(kChannels, kSampleRate, kSampleBits, 1.0f, | 29 algorithm.Initialize(kChannels, kSampleRate, kSampleBits, 1.0f, |
| 31 base::Bind(&DoNothing)); | 30 base::Bind(&base::DoNothing)); |
| 32 | 31 |
| 33 // Enqueue a buffer of any size since it doesn't matter. | 32 // Enqueue a buffer of any size since it doesn't matter. |
| 34 const size_t kDataSize = 1024; | 33 const size_t kDataSize = 1024; |
| 35 algorithm.EnqueueBuffer(new DataBuffer(new uint8[kDataSize], kDataSize)); | 34 algorithm.EnqueueBuffer(new DataBuffer(new uint8[kDataSize], kDataSize)); |
| 36 EXPECT_EQ(kDataSize, algorithm.QueueSize()); | 35 EXPECT_EQ(kDataSize, algorithm.QueueSize()); |
| 37 | 36 |
| 38 // Read the same sized amount. | 37 // Read the same sized amount. |
| 39 scoped_array<uint8> data(new uint8[kDataSize]); | 38 scoped_array<uint8> data(new uint8[kDataSize]); |
| 40 EXPECT_EQ(kDataSize, algorithm.FillBuffer(data.get(), kDataSize)); | 39 EXPECT_EQ(kDataSize, algorithm.FillBuffer(data.get(), kDataSize)); |
| 41 EXPECT_EQ(0u, algorithm.QueueSize()); | 40 EXPECT_EQ(0u, algorithm.QueueSize()); |
| 42 } | 41 } |
| 43 | 42 |
| 44 TEST(AudioRendererAlgorithmBaseTest, FillBuffer_DoubleRate) { | 43 TEST(AudioRendererAlgorithmBaseTest, FillBuffer_DoubleRate) { |
| 45 // When playback rate > 1.0f: input is read faster than output is written. | 44 // When playback rate > 1.0f: input is read faster than output is written. |
| 46 AudioRendererAlgorithmBase algorithm; | 45 AudioRendererAlgorithmBase algorithm; |
| 47 algorithm.Initialize(kChannels, kSampleRate, kSampleBits, 2.0f, | 46 algorithm.Initialize(kChannels, kSampleRate, kSampleBits, 2.0f, |
| 48 base::Bind(&DoNothing)); | 47 base::Bind(&base::DoNothing)); |
| 49 | 48 |
| 50 // First parameter is the input buffer size, second parameter is how much data | 49 // First parameter is the input buffer size, second parameter is how much data |
| 51 // we expect to consume in order to have no data left in the |algorithm|. | 50 // we expect to consume in order to have no data left in the |algorithm|. |
| 52 // | 51 // |
| 53 // For rate == 0.5f, reading half the input size should consume all enqueued | 52 // For rate == 0.5f, reading half the input size should consume all enqueued |
| 54 // data. | 53 // data. |
| 55 const size_t kBufferSize = 16 * 1024; | 54 const size_t kBufferSize = 16 * 1024; |
| 56 scoped_array<uint8> data(new uint8[kBufferSize]); | 55 scoped_array<uint8> data(new uint8[kBufferSize]); |
| 57 const size_t kTestData[][2] = { | 56 const size_t kTestData[][2] = { |
| 58 { algorithm.window_size_, algorithm.window_size_ / 2}, | 57 { algorithm.window_size_, algorithm.window_size_ / 2}, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 70 ASSERT_LE(kExpectedSize, kBufferSize); | 69 ASSERT_LE(kExpectedSize, kBufferSize); |
| 71 EXPECT_EQ(kExpectedSize, algorithm.FillBuffer(data.get(), kBufferSize)); | 70 EXPECT_EQ(kExpectedSize, algorithm.FillBuffer(data.get(), kBufferSize)); |
| 72 EXPECT_EQ(0u, algorithm.QueueSize()); | 71 EXPECT_EQ(0u, algorithm.QueueSize()); |
| 73 } | 72 } |
| 74 } | 73 } |
| 75 | 74 |
| 76 TEST(AudioRendererAlgorithmBaseTest, FillBuffer_HalfRate) { | 75 TEST(AudioRendererAlgorithmBaseTest, FillBuffer_HalfRate) { |
| 77 // When playback rate < 1.0f: input is read slower than output is written. | 76 // When playback rate < 1.0f: input is read slower than output is written. |
| 78 AudioRendererAlgorithmBase algorithm; | 77 AudioRendererAlgorithmBase algorithm; |
| 79 algorithm.Initialize(kChannels, kSampleRate, kSampleBits, 0.5f, | 78 algorithm.Initialize(kChannels, kSampleRate, kSampleBits, 0.5f, |
| 80 base::Bind(&DoNothing)); | 79 base::Bind(&base::DoNothing)); |
| 81 | 80 |
| 82 // First parameter is the input buffer size, second parameter is how much data | 81 // First parameter is the input buffer size, second parameter is how much data |
| 83 // we expect to consume in order to have no data left in the |algorithm|. | 82 // we expect to consume in order to have no data left in the |algorithm|. |
| 84 // | 83 // |
| 85 // For rate == 0.5f, reading double the input size should consume all enqueued | 84 // For rate == 0.5f, reading double the input size should consume all enqueued |
| 86 // data. | 85 // data. |
| 87 const size_t kBufferSize = 16 * 1024; | 86 const size_t kBufferSize = 16 * 1024; |
| 88 scoped_array<uint8> data(new uint8[kBufferSize]); | 87 scoped_array<uint8> data(new uint8[kBufferSize]); |
| 89 const size_t kTestData[][2] = { | 88 const size_t kTestData[][2] = { |
| 90 { algorithm.window_size_, algorithm.window_size_ * 2 }, | 89 { algorithm.window_size_, algorithm.window_size_ * 2 }, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 102 ASSERT_LE(kExpectedSize, kBufferSize); | 101 ASSERT_LE(kExpectedSize, kBufferSize); |
| 103 EXPECT_EQ(kExpectedSize, algorithm.FillBuffer(data.get(), kBufferSize)); | 102 EXPECT_EQ(kExpectedSize, algorithm.FillBuffer(data.get(), kBufferSize)); |
| 104 EXPECT_EQ(0u, algorithm.QueueSize()); | 103 EXPECT_EQ(0u, algorithm.QueueSize()); |
| 105 } | 104 } |
| 106 } | 105 } |
| 107 | 106 |
| 108 TEST(AudioRendererAlgorithmBaseTest, FillBuffer_QuarterRate) { | 107 TEST(AudioRendererAlgorithmBaseTest, FillBuffer_QuarterRate) { |
| 109 // When playback rate is very low the audio is simply muted. | 108 // When playback rate is very low the audio is simply muted. |
| 110 AudioRendererAlgorithmBase algorithm; | 109 AudioRendererAlgorithmBase algorithm; |
| 111 algorithm.Initialize(kChannels, kSampleRate, kSampleBits, 0.25f, | 110 algorithm.Initialize(kChannels, kSampleRate, kSampleBits, 0.25f, |
| 112 base::Bind(&DoNothing)); | 111 base::Bind(&base::DoNothing)); |
| 113 | 112 |
| 114 // First parameter is the input buffer size, second parameter is how much data | 113 // First parameter is the input buffer size, second parameter is how much data |
| 115 // we expect to consume in order to have no data left in the |algorithm|. | 114 // we expect to consume in order to have no data left in the |algorithm|. |
| 116 // | 115 // |
| 117 // For rate == 0.25f, reading four times the input size should consume all | 116 // For rate == 0.25f, reading four times the input size should consume all |
| 118 // enqueued data but without executing OLA. | 117 // enqueued data but without executing OLA. |
| 119 const size_t kBufferSize = 16 * 1024; | 118 const size_t kBufferSize = 16 * 1024; |
| 120 scoped_array<uint8> data(new uint8[kBufferSize]); | 119 scoped_array<uint8> data(new uint8[kBufferSize]); |
| 121 const size_t kTestData[][2] = { | 120 const size_t kTestData[][2] = { |
| 122 { algorithm.window_size_, algorithm.window_size_ * 4}, | 121 { algorithm.window_size_, algorithm.window_size_ * 4}, |
| 123 { algorithm.window_size_ / 2, algorithm.window_size_ * 2}, | 122 { algorithm.window_size_ / 2, algorithm.window_size_ * 2}, |
| 124 { 1u, 4u }, | 123 { 1u, 4u }, |
| 125 { 0u, 0u }, | 124 { 0u, 0u }, |
| 126 }; | 125 }; |
| 127 | 126 |
| 128 for (size_t i = 0u; i < arraysize(kTestData); ++i) { | 127 for (size_t i = 0u; i < arraysize(kTestData); ++i) { |
| 129 const size_t kDataSize = kTestData[i][0]; | 128 const size_t kDataSize = kTestData[i][0]; |
| 130 algorithm.EnqueueBuffer(new DataBuffer(new uint8[kDataSize], kDataSize)); | 129 algorithm.EnqueueBuffer(new DataBuffer(new uint8[kDataSize], kDataSize)); |
| 131 EXPECT_EQ(kDataSize, algorithm.QueueSize()); | 130 EXPECT_EQ(kDataSize, algorithm.QueueSize()); |
| 132 | 131 |
| 133 const size_t kExpectedSize = kTestData[i][1]; | 132 const size_t kExpectedSize = kTestData[i][1]; |
| 134 ASSERT_LE(kExpectedSize, kBufferSize); | 133 ASSERT_LE(kExpectedSize, kBufferSize); |
| 135 EXPECT_EQ(kExpectedSize, algorithm.FillBuffer(data.get(), kBufferSize)); | 134 EXPECT_EQ(kExpectedSize, algorithm.FillBuffer(data.get(), kBufferSize)); |
| 136 EXPECT_EQ(0u, algorithm.QueueSize()); | 135 EXPECT_EQ(0u, algorithm.QueueSize()); |
| 137 } | 136 } |
| 138 } | 137 } |
| 139 | 138 |
| 140 } // namespace media | 139 } // namespace media |
| OLD | NEW |