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 <stddef.h> | 5 #include <stddef.h> |
6 #include <stdint.h> | 6 #include <stdint.h> |
7 | 7 |
8 #include <limits> | 8 #include <limits> |
| 9 #include <memory> |
9 | 10 |
10 #include "base/macros.h" | 11 #include "base/macros.h" |
11 #include "base/strings/stringprintf.h" | 12 #include "base/strings/stringprintf.h" |
12 #include "base/time/time.h" | 13 #include "base/time/time.h" |
13 #include "build/build_config.h" | 14 #include "build/build_config.h" |
14 #include "media/base/audio_bus.h" | 15 #include "media/base/audio_bus.h" |
15 #include "media/base/audio_parameters.h" | 16 #include "media/base/audio_parameters.h" |
16 #include "media/base/channel_layout.h" | 17 #include "media/base/channel_layout.h" |
17 #include "media/base/fake_audio_render_callback.h" | 18 #include "media/base/fake_audio_render_callback.h" |
18 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 } | 105 } |
105 | 106 |
106 protected: | 107 protected: |
107 std::vector<float*> data_; | 108 std::vector<float*> data_; |
108 | 109 |
109 DISALLOW_COPY_AND_ASSIGN(AudioBusTest); | 110 DISALLOW_COPY_AND_ASSIGN(AudioBusTest); |
110 }; | 111 }; |
111 | 112 |
112 // Verify basic Create(...) method works as advertised. | 113 // Verify basic Create(...) method works as advertised. |
113 TEST_F(AudioBusTest, Create) { | 114 TEST_F(AudioBusTest, Create) { |
114 scoped_ptr<AudioBus> bus = AudioBus::Create(kChannels, kFrameCount); | 115 std::unique_ptr<AudioBus> bus = AudioBus::Create(kChannels, kFrameCount); |
115 VerifyParams(bus.get()); | 116 VerifyParams(bus.get()); |
116 VerifyChannelData(bus.get()); | 117 VerifyChannelData(bus.get()); |
117 } | 118 } |
118 | 119 |
119 // Verify Create(...) using AudioParameters works as advertised. | 120 // Verify Create(...) using AudioParameters works as advertised. |
120 TEST_F(AudioBusTest, CreateUsingAudioParameters) { | 121 TEST_F(AudioBusTest, CreateUsingAudioParameters) { |
121 scoped_ptr<AudioBus> bus = AudioBus::Create(AudioParameters( | 122 std::unique_ptr<AudioBus> bus = AudioBus::Create( |
122 AudioParameters::AUDIO_PCM_LINEAR, kChannelLayout, kSampleRate, 32, | 123 AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, kChannelLayout, |
123 kFrameCount)); | 124 kSampleRate, 32, kFrameCount)); |
124 VerifyParams(bus.get()); | 125 VerifyParams(bus.get()); |
125 VerifyChannelData(bus.get()); | 126 VerifyChannelData(bus.get()); |
126 } | 127 } |
127 | 128 |
128 // Verify an AudioBus created via wrapping a vector works as advertised. | 129 // Verify an AudioBus created via wrapping a vector works as advertised. |
129 TEST_F(AudioBusTest, WrapVector) { | 130 TEST_F(AudioBusTest, WrapVector) { |
130 data_.reserve(kChannels); | 131 data_.reserve(kChannels); |
131 for (int i = 0; i < kChannels; ++i) { | 132 for (int i = 0; i < kChannels; ++i) { |
132 data_.push_back(static_cast<float*>(base::AlignedAlloc( | 133 data_.push_back(static_cast<float*>(base::AlignedAlloc( |
133 sizeof(*data_[i]) * kFrameCount, AudioBus::kChannelAlignment))); | 134 sizeof(*data_[i]) * kFrameCount, AudioBus::kChannelAlignment))); |
134 } | 135 } |
135 | 136 |
136 scoped_ptr<AudioBus> bus = AudioBus::WrapVector(kFrameCount, data_); | 137 std::unique_ptr<AudioBus> bus = AudioBus::WrapVector(kFrameCount, data_); |
137 VerifyParams(bus.get()); | 138 VerifyParams(bus.get()); |
138 VerifyChannelData(bus.get()); | 139 VerifyChannelData(bus.get()); |
139 } | 140 } |
140 | 141 |
141 // Verify an AudioBus created via wrapping a memory block works as advertised. | 142 // Verify an AudioBus created via wrapping a memory block works as advertised. |
142 TEST_F(AudioBusTest, WrapMemory) { | 143 TEST_F(AudioBusTest, WrapMemory) { |
143 AudioParameters params( | 144 AudioParameters params( |
144 AudioParameters::AUDIO_PCM_LINEAR, kChannelLayout, kSampleRate, 32, | 145 AudioParameters::AUDIO_PCM_LINEAR, kChannelLayout, kSampleRate, 32, |
145 kFrameCount); | 146 kFrameCount); |
146 int data_size = AudioBus::CalculateMemorySize(params); | 147 int data_size = AudioBus::CalculateMemorySize(params); |
147 scoped_ptr<float, base::AlignedFreeDeleter> data(static_cast<float*>( | 148 std::unique_ptr<float, base::AlignedFreeDeleter> data(static_cast<float*>( |
148 base::AlignedAlloc(data_size, AudioBus::kChannelAlignment))); | 149 base::AlignedAlloc(data_size, AudioBus::kChannelAlignment))); |
149 | 150 |
150 // Fill the memory with a test value we can check for after wrapping. | 151 // Fill the memory with a test value we can check for after wrapping. |
151 static const float kTestValue = 3; | 152 static const float kTestValue = 3; |
152 std::fill( | 153 std::fill( |
153 data.get(), data.get() + data_size / sizeof(*data.get()), kTestValue); | 154 data.get(), data.get() + data_size / sizeof(*data.get()), kTestValue); |
154 | 155 |
155 scoped_ptr<AudioBus> bus = AudioBus::WrapMemory(params, data.get()); | 156 std::unique_ptr<AudioBus> bus = AudioBus::WrapMemory(params, data.get()); |
156 // Verify the test value we filled prior to wrapping. | 157 // Verify the test value we filled prior to wrapping. |
157 for (int i = 0; i < bus->channels(); ++i) | 158 for (int i = 0; i < bus->channels(); ++i) |
158 VerifyValue(bus->channel(i), bus->frames(), kTestValue); | 159 VerifyValue(bus->channel(i), bus->frames(), kTestValue); |
159 VerifyParams(bus.get()); | 160 VerifyParams(bus.get()); |
160 VerifyChannelData(bus.get()); | 161 VerifyChannelData(bus.get()); |
161 | 162 |
162 // Verify the channel vectors lie within the provided memory block. | 163 // Verify the channel vectors lie within the provided memory block. |
163 EXPECT_GE(bus->channel(0), data.get()); | 164 EXPECT_GE(bus->channel(0), data.get()); |
164 EXPECT_LT(bus->channel(bus->channels() - 1) + bus->frames(), | 165 EXPECT_LT(bus->channel(bus->channels() - 1) + bus->frames(), |
165 data.get() + data_size / sizeof(*data.get())); | 166 data.get() + data_size / sizeof(*data.get())); |
166 } | 167 } |
167 | 168 |
168 // Simulate a shared memory transfer and verify results. | 169 // Simulate a shared memory transfer and verify results. |
169 TEST_F(AudioBusTest, CopyTo) { | 170 TEST_F(AudioBusTest, CopyTo) { |
170 // Create one bus with AudioParameters and the other through direct values to | 171 // Create one bus with AudioParameters and the other through direct values to |
171 // test for parity between the Create() functions. | 172 // test for parity between the Create() functions. |
172 AudioParameters params( | 173 AudioParameters params( |
173 AudioParameters::AUDIO_PCM_LINEAR, kChannelLayout, kSampleRate, 32, | 174 AudioParameters::AUDIO_PCM_LINEAR, kChannelLayout, kSampleRate, 32, |
174 kFrameCount); | 175 kFrameCount); |
175 scoped_ptr<AudioBus> bus1 = AudioBus::Create(kChannels, kFrameCount); | 176 std::unique_ptr<AudioBus> bus1 = AudioBus::Create(kChannels, kFrameCount); |
176 scoped_ptr<AudioBus> bus2 = AudioBus::Create(params); | 177 std::unique_ptr<AudioBus> bus2 = AudioBus::Create(params); |
177 | 178 |
178 { | 179 { |
179 SCOPED_TRACE("Created"); | 180 SCOPED_TRACE("Created"); |
180 CopyTest(bus1.get(), bus2.get()); | 181 CopyTest(bus1.get(), bus2.get()); |
181 } | 182 } |
182 { | 183 { |
183 SCOPED_TRACE("Wrapped Vector"); | 184 SCOPED_TRACE("Wrapped Vector"); |
184 // Try a copy to an AudioBus wrapping a vector. | 185 // Try a copy to an AudioBus wrapping a vector. |
185 data_.reserve(kChannels); | 186 data_.reserve(kChannels); |
186 for (int i = 0; i < kChannels; ++i) { | 187 for (int i = 0; i < kChannels; ++i) { |
187 data_.push_back(static_cast<float*>(base::AlignedAlloc( | 188 data_.push_back(static_cast<float*>(base::AlignedAlloc( |
188 sizeof(*data_[i]) * kFrameCount, AudioBus::kChannelAlignment))); | 189 sizeof(*data_[i]) * kFrameCount, AudioBus::kChannelAlignment))); |
189 } | 190 } |
190 | 191 |
191 bus2 = AudioBus::WrapVector(kFrameCount, data_); | 192 bus2 = AudioBus::WrapVector(kFrameCount, data_); |
192 CopyTest(bus1.get(), bus2.get()); | 193 CopyTest(bus1.get(), bus2.get()); |
193 } | 194 } |
194 { | 195 { |
195 SCOPED_TRACE("Wrapped Memory"); | 196 SCOPED_TRACE("Wrapped Memory"); |
196 // Try a copy to an AudioBus wrapping a memory block. | 197 // Try a copy to an AudioBus wrapping a memory block. |
197 scoped_ptr<float, base::AlignedFreeDeleter> data( | 198 std::unique_ptr<float, base::AlignedFreeDeleter> data(static_cast<float*>( |
198 static_cast<float*>(base::AlignedAlloc( | 199 base::AlignedAlloc(AudioBus::CalculateMemorySize(params), |
199 AudioBus::CalculateMemorySize(params), | 200 AudioBus::kChannelAlignment))); |
200 AudioBus::kChannelAlignment))); | |
201 | 201 |
202 bus2 = AudioBus::WrapMemory(params, data.get()); | 202 bus2 = AudioBus::WrapMemory(params, data.get()); |
203 CopyTest(bus1.get(), bus2.get()); | 203 CopyTest(bus1.get(), bus2.get()); |
204 } | 204 } |
205 } | 205 } |
206 | 206 |
207 // Verify Zero() and ZeroFrames(...) utility methods work as advertised. | 207 // Verify Zero() and ZeroFrames(...) utility methods work as advertised. |
208 TEST_F(AudioBusTest, Zero) { | 208 TEST_F(AudioBusTest, Zero) { |
209 scoped_ptr<AudioBus> bus = AudioBus::Create(kChannels, kFrameCount); | 209 std::unique_ptr<AudioBus> bus = AudioBus::Create(kChannels, kFrameCount); |
210 | 210 |
211 // Fill the bus with dummy data. | 211 // Fill the bus with dummy data. |
212 for (int i = 0; i < bus->channels(); ++i) | 212 for (int i = 0; i < bus->channels(); ++i) |
213 std::fill(bus->channel(i), bus->channel(i) + bus->frames(), i + 1); | 213 std::fill(bus->channel(i), bus->channel(i) + bus->frames(), i + 1); |
214 EXPECT_FALSE(bus->AreFramesZero()); | 214 EXPECT_FALSE(bus->AreFramesZero()); |
215 | 215 |
216 // Zero first half the frames of each channel. | 216 // Zero first half the frames of each channel. |
217 bus->ZeroFrames(kFrameCount / 2); | 217 bus->ZeroFrames(kFrameCount / 2); |
218 for (int i = 0; i < bus->channels(); ++i) { | 218 for (int i = 0; i < bus->channels(); ++i) { |
219 SCOPED_TRACE("First Half Zero"); | 219 SCOPED_TRACE("First Half Zero"); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 INT32_MIN / 2, 0, INT32_MAX, 0, 0}; | 266 INT32_MIN / 2, 0, INT32_MAX, 0, 0}; |
267 | 267 |
268 // Expected results. | 268 // Expected results. |
269 static const int kTestVectorFrames = kTestVectorSize / 2; | 269 static const int kTestVectorFrames = kTestVectorSize / 2; |
270 static const float kTestVectorResult[][kTestVectorFrames] = { | 270 static const float kTestVectorResult[][kTestVectorFrames] = { |
271 { -1, 1, 0.5, 0, 0 }, { 0, -1, -0.5, 1, 0 }}; | 271 { -1, 1, 0.5, 0, 0 }, { 0, -1, -0.5, 1, 0 }}; |
272 static const int kTestVectorChannels = arraysize(kTestVectorResult); | 272 static const int kTestVectorChannels = arraysize(kTestVectorResult); |
273 | 273 |
274 // Verify FromInterleaved() deinterleaves audio in supported formats correctly. | 274 // Verify FromInterleaved() deinterleaves audio in supported formats correctly. |
275 TEST_F(AudioBusTest, FromInterleaved) { | 275 TEST_F(AudioBusTest, FromInterleaved) { |
276 scoped_ptr<AudioBus> bus = AudioBus::Create( | 276 std::unique_ptr<AudioBus> bus = |
277 kTestVectorChannels, kTestVectorFrames); | 277 AudioBus::Create(kTestVectorChannels, kTestVectorFrames); |
278 scoped_ptr<AudioBus> expected = AudioBus::Create( | 278 std::unique_ptr<AudioBus> expected = |
279 kTestVectorChannels, kTestVectorFrames); | 279 AudioBus::Create(kTestVectorChannels, kTestVectorFrames); |
280 for (int ch = 0; ch < kTestVectorChannels; ++ch) { | 280 for (int ch = 0; ch < kTestVectorChannels; ++ch) { |
281 memcpy(expected->channel(ch), kTestVectorResult[ch], | 281 memcpy(expected->channel(ch), kTestVectorResult[ch], |
282 kTestVectorFrames * sizeof(*expected->channel(ch))); | 282 kTestVectorFrames * sizeof(*expected->channel(ch))); |
283 } | 283 } |
284 { | 284 { |
285 SCOPED_TRACE("uint8_t"); | 285 SCOPED_TRACE("uint8_t"); |
286 bus->Zero(); | 286 bus->Zero(); |
287 bus->FromInterleaved( | 287 bus->FromInterleaved( |
288 kTestVectorUint8, kTestVectorFrames, sizeof(*kTestVectorUint8)); | 288 kTestVectorUint8, kTestVectorFrames, sizeof(*kTestVectorUint8)); |
289 // Biased uint8_t calculations have poor precision, so the epsilon here is | 289 // Biased uint8_t calculations have poor precision, so the epsilon here is |
(...skipping 19 matching lines...) Expand all Loading... |
309 } | 309 } |
310 } | 310 } |
311 | 311 |
312 // Verify FromInterleavedPartial() deinterleaves audio correctly. | 312 // Verify FromInterleavedPartial() deinterleaves audio correctly. |
313 TEST_F(AudioBusTest, FromInterleavedPartial) { | 313 TEST_F(AudioBusTest, FromInterleavedPartial) { |
314 // Only deinterleave the middle two frames in each channel. | 314 // Only deinterleave the middle two frames in each channel. |
315 static const int kPartialStart = 1; | 315 static const int kPartialStart = 1; |
316 static const int kPartialFrames = 2; | 316 static const int kPartialFrames = 2; |
317 ASSERT_LE(kPartialStart + kPartialFrames, kTestVectorFrames); | 317 ASSERT_LE(kPartialStart + kPartialFrames, kTestVectorFrames); |
318 | 318 |
319 scoped_ptr<AudioBus> bus = AudioBus::Create( | 319 std::unique_ptr<AudioBus> bus = |
320 kTestVectorChannels, kTestVectorFrames); | 320 AudioBus::Create(kTestVectorChannels, kTestVectorFrames); |
321 scoped_ptr<AudioBus> expected = AudioBus::Create( | 321 std::unique_ptr<AudioBus> expected = |
322 kTestVectorChannels, kTestVectorFrames); | 322 AudioBus::Create(kTestVectorChannels, kTestVectorFrames); |
323 expected->Zero(); | 323 expected->Zero(); |
324 for (int ch = 0; ch < kTestVectorChannels; ++ch) { | 324 for (int ch = 0; ch < kTestVectorChannels; ++ch) { |
325 memcpy(expected->channel(ch) + kPartialStart, | 325 memcpy(expected->channel(ch) + kPartialStart, |
326 kTestVectorResult[ch] + kPartialStart, | 326 kTestVectorResult[ch] + kPartialStart, |
327 kPartialFrames * sizeof(*expected->channel(ch))); | 327 kPartialFrames * sizeof(*expected->channel(ch))); |
328 } | 328 } |
329 | 329 |
330 bus->Zero(); | 330 bus->Zero(); |
331 bus->FromInterleavedPartial( | 331 bus->FromInterleavedPartial( |
332 kTestVectorInt32 + kPartialStart * bus->channels(), kPartialStart, | 332 kTestVectorInt32 + kPartialStart * bus->channels(), kPartialStart, |
333 kPartialFrames, sizeof(*kTestVectorInt32)); | 333 kPartialFrames, sizeof(*kTestVectorInt32)); |
334 VerifyBus(bus.get(), expected.get()); | 334 VerifyBus(bus.get(), expected.get()); |
335 } | 335 } |
336 | 336 |
337 // Verify ToInterleaved() interleaves audio in suported formats correctly. | 337 // Verify ToInterleaved() interleaves audio in suported formats correctly. |
338 TEST_F(AudioBusTest, ToInterleaved) { | 338 TEST_F(AudioBusTest, ToInterleaved) { |
339 scoped_ptr<AudioBus> bus = AudioBus::Create( | 339 std::unique_ptr<AudioBus> bus = |
340 kTestVectorChannels, kTestVectorFrames); | 340 AudioBus::Create(kTestVectorChannels, kTestVectorFrames); |
341 // Fill the bus with our test vector. | 341 // Fill the bus with our test vector. |
342 for (int ch = 0; ch < bus->channels(); ++ch) { | 342 for (int ch = 0; ch < bus->channels(); ++ch) { |
343 memcpy(bus->channel(ch), kTestVectorResult[ch], | 343 memcpy(bus->channel(ch), kTestVectorResult[ch], |
344 kTestVectorFrames * sizeof(*bus->channel(ch))); | 344 kTestVectorFrames * sizeof(*bus->channel(ch))); |
345 } | 345 } |
346 { | 346 { |
347 SCOPED_TRACE("uint8_t"); | 347 SCOPED_TRACE("uint8_t"); |
348 uint8_t test_array[arraysize(kTestVectorUint8)]; | 348 uint8_t test_array[arraysize(kTestVectorUint8)]; |
349 bus->ToInterleaved(bus->frames(), sizeof(*kTestVectorUint8), test_array); | 349 bus->ToInterleaved(bus->frames(), sizeof(*kTestVectorUint8), test_array); |
350 ASSERT_EQ(memcmp( | 350 ASSERT_EQ(memcmp( |
(...skipping 24 matching lines...) Expand all Loading... |
375 } | 375 } |
376 } | 376 } |
377 | 377 |
378 // Verify ToInterleavedPartial() interleaves audio correctly. | 378 // Verify ToInterleavedPartial() interleaves audio correctly. |
379 TEST_F(AudioBusTest, ToInterleavedPartial) { | 379 TEST_F(AudioBusTest, ToInterleavedPartial) { |
380 // Only interleave the middle two frames in each channel. | 380 // Only interleave the middle two frames in each channel. |
381 static const int kPartialStart = 1; | 381 static const int kPartialStart = 1; |
382 static const int kPartialFrames = 2; | 382 static const int kPartialFrames = 2; |
383 ASSERT_LE(kPartialStart + kPartialFrames, kTestVectorFrames); | 383 ASSERT_LE(kPartialStart + kPartialFrames, kTestVectorFrames); |
384 | 384 |
385 scoped_ptr<AudioBus> expected = AudioBus::Create( | 385 std::unique_ptr<AudioBus> expected = |
386 kTestVectorChannels, kTestVectorFrames); | 386 AudioBus::Create(kTestVectorChannels, kTestVectorFrames); |
387 for (int ch = 0; ch < kTestVectorChannels; ++ch) { | 387 for (int ch = 0; ch < kTestVectorChannels; ++ch) { |
388 memcpy(expected->channel(ch), kTestVectorResult[ch], | 388 memcpy(expected->channel(ch), kTestVectorResult[ch], |
389 kTestVectorFrames * sizeof(*expected->channel(ch))); | 389 kTestVectorFrames * sizeof(*expected->channel(ch))); |
390 } | 390 } |
391 | 391 |
392 int16_t test_array[arraysize(kTestVectorInt16)]; | 392 int16_t test_array[arraysize(kTestVectorInt16)]; |
393 expected->ToInterleavedPartial( | 393 expected->ToInterleavedPartial( |
394 kPartialStart, kPartialFrames, sizeof(*kTestVectorInt16), test_array); | 394 kPartialStart, kPartialFrames, sizeof(*kTestVectorInt16), test_array); |
395 ASSERT_EQ(memcmp( | 395 ASSERT_EQ(memcmp( |
396 test_array, kTestVectorInt16 + kPartialStart * kTestVectorChannels, | 396 test_array, kTestVectorInt16 + kPartialStart * kTestVectorChannels, |
397 kPartialFrames * sizeof(*kTestVectorInt16) * kTestVectorChannels), 0); | 397 kPartialFrames * sizeof(*kTestVectorInt16) * kTestVectorChannels), 0); |
398 } | 398 } |
399 | 399 |
400 TEST_F(AudioBusTest, Scale) { | 400 TEST_F(AudioBusTest, Scale) { |
401 scoped_ptr<AudioBus> bus = AudioBus::Create(kChannels, kFrameCount); | 401 std::unique_ptr<AudioBus> bus = AudioBus::Create(kChannels, kFrameCount); |
402 | 402 |
403 // Fill the bus with dummy data. | 403 // Fill the bus with dummy data. |
404 static const float kFillValue = 1; | 404 static const float kFillValue = 1; |
405 for (int i = 0; i < bus->channels(); ++i) | 405 for (int i = 0; i < bus->channels(); ++i) |
406 std::fill(bus->channel(i), bus->channel(i) + bus->frames(), kFillValue); | 406 std::fill(bus->channel(i), bus->channel(i) + bus->frames(), kFillValue); |
407 | 407 |
408 // Adjust by an invalid volume and ensure volume is unchanged. | 408 // Adjust by an invalid volume and ensure volume is unchanged. |
409 bus->Scale(-1); | 409 bus->Scale(-1); |
410 for (int i = 0; i < bus->channels(); ++i) { | 410 for (int i = 0; i < bus->channels(); ++i) { |
411 SCOPED_TRACE("Invalid Scale"); | 411 SCOPED_TRACE("Invalid Scale"); |
(...skipping 10 matching lines...) Expand all Loading... |
422 | 422 |
423 // Verify zero volume case. | 423 // Verify zero volume case. |
424 bus->Scale(0); | 424 bus->Scale(0); |
425 for (int i = 0; i < bus->channels(); ++i) { | 425 for (int i = 0; i < bus->channels(); ++i) { |
426 SCOPED_TRACE("Zero Scale"); | 426 SCOPED_TRACE("Zero Scale"); |
427 VerifyValue(bus->channel(i), bus->frames(), 0); | 427 VerifyValue(bus->channel(i), bus->frames(), 0); |
428 } | 428 } |
429 } | 429 } |
430 | 430 |
431 } // namespace media | 431 } // namespace media |
OLD | NEW |