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 // 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 "media/filters/audio_renderer_algorithm.h" |
| 12 |
11 #include <stddef.h> | 13 #include <stddef.h> |
12 #include <stdint.h> | 14 #include <stdint.h> |
13 | 15 |
14 #include <algorithm> // For std::min(). | 16 #include <algorithm> // For std::min(). |
15 #include <cmath> | 17 #include <cmath> |
| 18 #include <memory> |
16 #include <vector> | 19 #include <vector> |
17 | 20 |
18 #include "base/bind.h" | 21 #include "base/bind.h" |
19 #include "base/callback.h" | 22 #include "base/callback.h" |
20 #include "base/macros.h" | 23 #include "base/macros.h" |
21 #include "base/memory/scoped_ptr.h" | |
22 #include "media/base/audio_buffer.h" | 24 #include "media/base/audio_buffer.h" |
23 #include "media/base/audio_bus.h" | 25 #include "media/base/audio_bus.h" |
24 #include "media/base/channel_layout.h" | 26 #include "media/base/channel_layout.h" |
25 #include "media/base/test_helpers.h" | 27 #include "media/base/test_helpers.h" |
26 #include "media/base/timestamp_constants.h" | 28 #include "media/base/timestamp_constants.h" |
27 #include "media/filters/audio_renderer_algorithm.h" | |
28 #include "media/filters/wsola_internals.h" | 29 #include "media/filters/wsola_internals.h" |
29 #include "testing/gtest/include/gtest/gtest.h" | 30 #include "testing/gtest/include/gtest/gtest.h" |
30 | 31 |
31 namespace media { | 32 namespace media { |
32 | 33 |
33 const int kFrameSize = 250; | 34 const int kFrameSize = 250; |
34 const int kSamplesPerSecond = 3000; | 35 const int kSamplesPerSecond = 3000; |
35 const int kOutputDurationInSec = 10; | 36 const int kOutputDurationInSec = 10; |
36 | 37 |
37 static void FillWithSquarePulseTrain( | 38 static void FillWithSquarePulseTrain( |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 TestPlaybackRate( | 166 TestPlaybackRate( |
166 playback_rate, kDefaultBufferSize, kDefaultFramesRequested); | 167 playback_rate, kDefaultBufferSize, kDefaultFramesRequested); |
167 } | 168 } |
168 | 169 |
169 void TestPlaybackRate(double playback_rate, | 170 void TestPlaybackRate(double playback_rate, |
170 int buffer_size_in_frames, | 171 int buffer_size_in_frames, |
171 int total_frames_requested) { | 172 int total_frames_requested) { |
172 int initial_frames_enqueued = frames_enqueued_; | 173 int initial_frames_enqueued = frames_enqueued_; |
173 int initial_frames_buffered = algorithm_.frames_buffered(); | 174 int initial_frames_buffered = algorithm_.frames_buffered(); |
174 | 175 |
175 scoped_ptr<AudioBus> bus = | 176 std::unique_ptr<AudioBus> bus = |
176 AudioBus::Create(channels_, buffer_size_in_frames); | 177 AudioBus::Create(channels_, buffer_size_in_frames); |
177 if (playback_rate == 0.0) { | 178 if (playback_rate == 0.0) { |
178 int frames_written = algorithm_.FillBuffer( | 179 int frames_written = algorithm_.FillBuffer( |
179 bus.get(), 0, buffer_size_in_frames, playback_rate); | 180 bus.get(), 0, buffer_size_in_frames, playback_rate); |
180 EXPECT_EQ(0, frames_written); | 181 EXPECT_EQ(0, frames_written); |
181 return; | 182 return; |
182 } | 183 } |
183 | 184 |
184 bool expect_muted = (playback_rate < 0.5 || playback_rate > 4); | 185 bool expect_muted = (playback_rate < 0.5 || playback_rate > 4); |
185 | 186 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
240 channels_ = ChannelLayoutToChannelCount(kChannelLayout); | 241 channels_ = ChannelLayoutToChannelCount(kChannelLayout); |
241 AudioParameters params(AudioParameters::AUDIO_PCM_LINEAR, kChannelLayout, | 242 AudioParameters params(AudioParameters::AUDIO_PCM_LINEAR, kChannelLayout, |
242 kSampleRateHz, kBytesPerSample * 8, kNumFrames); | 243 kSampleRateHz, kBytesPerSample * 8, kNumFrames); |
243 algorithm_.Initialize(params); | 244 algorithm_.Initialize(params); |
244 | 245 |
245 // A pulse is 6 milliseconds (even number of samples). | 246 // A pulse is 6 milliseconds (even number of samples). |
246 const int kPulseWidthSamples = 6 * kSampleRateHz / 1000; | 247 const int kPulseWidthSamples = 6 * kSampleRateHz / 1000; |
247 const int kHalfPulseWidthSamples = kPulseWidthSamples / 2; | 248 const int kHalfPulseWidthSamples = kPulseWidthSamples / 2; |
248 | 249 |
249 // For the ease of implementation get 1 frame every call to FillBuffer(). | 250 // For the ease of implementation get 1 frame every call to FillBuffer(). |
250 scoped_ptr<AudioBus> output = AudioBus::Create(channels_, 1); | 251 std::unique_ptr<AudioBus> output = AudioBus::Create(channels_, 1); |
251 | 252 |
252 // Input buffer to inject pulses. | 253 // Input buffer to inject pulses. |
253 scoped_refptr<AudioBuffer> input = | 254 scoped_refptr<AudioBuffer> input = |
254 AudioBuffer::CreateBuffer(kSampleFormatPlanarF32, | 255 AudioBuffer::CreateBuffer(kSampleFormatPlanarF32, |
255 kChannelLayout, | 256 kChannelLayout, |
256 channels_, | 257 channels_, |
257 kSampleRateHz, | 258 kSampleRateHz, |
258 kPulseWidthSamples); | 259 kPulseWidthSamples); |
259 | 260 |
260 const std::vector<uint8_t*>& channel_data = input->channel_data(); | 261 const std::vector<uint8_t*>& channel_data = input->channel_data(); |
261 | 262 |
262 // Fill |input| channels. | 263 // Fill |input| channels. |
263 FillWithSquarePulseTrain(kHalfPulseWidthSamples, 0, kPulseWidthSamples, | 264 FillWithSquarePulseTrain(kHalfPulseWidthSamples, 0, kPulseWidthSamples, |
264 reinterpret_cast<float*>(channel_data[0])); | 265 reinterpret_cast<float*>(channel_data[0])); |
265 FillWithSquarePulseTrain(kHalfPulseWidthSamples, kHalfPulseWidthSamples, | 266 FillWithSquarePulseTrain(kHalfPulseWidthSamples, kHalfPulseWidthSamples, |
266 kPulseWidthSamples, | 267 kPulseWidthSamples, |
267 reinterpret_cast<float*>(channel_data[1])); | 268 reinterpret_cast<float*>(channel_data[1])); |
268 | 269 |
269 // A buffer for the output until a complete pulse is created. Then | 270 // A buffer for the output until a complete pulse is created. Then |
270 // reference pulse is compared with this buffer. | 271 // reference pulse is compared with this buffer. |
271 scoped_ptr<AudioBus> pulse_buffer = AudioBus::Create( | 272 std::unique_ptr<AudioBus> pulse_buffer = |
272 channels_, kPulseWidthSamples); | 273 AudioBus::Create(channels_, kPulseWidthSamples); |
273 | 274 |
274 const float kTolerance = 0.000001f; | 275 const float kTolerance = 0.000001f; |
275 // Equivalent of 4 seconds. | 276 // Equivalent of 4 seconds. |
276 const int kNumRequestedPulses = kSampleRateHz * 4 / kPulseWidthSamples; | 277 const int kNumRequestedPulses = kSampleRateHz * 4 / kPulseWidthSamples; |
277 for (int n = 0; n < kNumRequestedPulses; ++n) { | 278 for (int n = 0; n < kNumRequestedPulses; ++n) { |
278 int num_buffered_frames = 0; | 279 int num_buffered_frames = 0; |
279 while (num_buffered_frames < kPulseWidthSamples) { | 280 while (num_buffered_frames < kPulseWidthSamples) { |
280 int num_samples = | 281 int num_samples = |
281 algorithm_.FillBuffer(output.get(), 0, 1, playback_rate); | 282 algorithm_.FillBuffer(output.get(), 0, 1, playback_rate); |
282 ASSERT_LE(num_samples, 1); | 283 ASSERT_LE(num_samples, 1); |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
431 TestPlaybackRate(1.0); | 432 TestPlaybackRate(1.0); |
432 TestPlaybackRate(0.5); | 433 TestPlaybackRate(0.5); |
433 TestPlaybackRate(1.5); | 434 TestPlaybackRate(1.5); |
434 } | 435 } |
435 | 436 |
436 TEST_F(AudioRendererAlgorithmTest, DotProduct) { | 437 TEST_F(AudioRendererAlgorithmTest, DotProduct) { |
437 const int kChannels = 3; | 438 const int kChannels = 3; |
438 const int kFrames = 20; | 439 const int kFrames = 20; |
439 const int kHalfPulseWidth = 2; | 440 const int kHalfPulseWidth = 2; |
440 | 441 |
441 scoped_ptr<AudioBus> a = AudioBus::Create(kChannels, kFrames); | 442 std::unique_ptr<AudioBus> a = AudioBus::Create(kChannels, kFrames); |
442 scoped_ptr<AudioBus> b = AudioBus::Create(kChannels, kFrames); | 443 std::unique_ptr<AudioBus> b = AudioBus::Create(kChannels, kFrames); |
443 | 444 |
444 scoped_ptr<float[]> dot_prod(new float[kChannels]); | 445 std::unique_ptr<float[]> dot_prod(new float[kChannels]); |
445 | 446 |
446 FillWithSquarePulseTrain(kHalfPulseWidth, 0, 0, a.get()); | 447 FillWithSquarePulseTrain(kHalfPulseWidth, 0, 0, a.get()); |
447 FillWithSquarePulseTrain(kHalfPulseWidth, 1, 1, a.get()); | 448 FillWithSquarePulseTrain(kHalfPulseWidth, 1, 1, a.get()); |
448 FillWithSquarePulseTrain(kHalfPulseWidth, 2, 2, a.get()); | 449 FillWithSquarePulseTrain(kHalfPulseWidth, 2, 2, a.get()); |
449 | 450 |
450 FillWithSquarePulseTrain(kHalfPulseWidth, 0, 0, b.get()); | 451 FillWithSquarePulseTrain(kHalfPulseWidth, 0, 0, b.get()); |
451 FillWithSquarePulseTrain(kHalfPulseWidth, 0, 1, b.get()); | 452 FillWithSquarePulseTrain(kHalfPulseWidth, 0, 1, b.get()); |
452 FillWithSquarePulseTrain(kHalfPulseWidth, 0, 2, b.get()); | 453 FillWithSquarePulseTrain(kHalfPulseWidth, 0, 2, b.get()); |
453 | 454 |
454 internal::MultiChannelDotProduct(a.get(), 0, b.get(), 0, kFrames, | 455 internal::MultiChannelDotProduct(a.get(), 0, b.get(), 0, kFrames, |
455 dot_prod.get()); | 456 dot_prod.get()); |
456 | 457 |
457 EXPECT_FLOAT_EQ(kFrames, dot_prod[0]); | 458 EXPECT_FLOAT_EQ(kFrames, dot_prod[0]); |
458 EXPECT_FLOAT_EQ(0, dot_prod[1]); | 459 EXPECT_FLOAT_EQ(0, dot_prod[1]); |
459 EXPECT_FLOAT_EQ(-kFrames, dot_prod[2]); | 460 EXPECT_FLOAT_EQ(-kFrames, dot_prod[2]); |
460 | 461 |
461 internal::MultiChannelDotProduct(a.get(), 4, b.get(), 8, kFrames / 2, | 462 internal::MultiChannelDotProduct(a.get(), 4, b.get(), 8, kFrames / 2, |
462 dot_prod.get()); | 463 dot_prod.get()); |
463 | 464 |
464 EXPECT_FLOAT_EQ(kFrames / 2, dot_prod[0]); | 465 EXPECT_FLOAT_EQ(kFrames / 2, dot_prod[0]); |
465 EXPECT_FLOAT_EQ(0, dot_prod[1]); | 466 EXPECT_FLOAT_EQ(0, dot_prod[1]); |
466 EXPECT_FLOAT_EQ(-kFrames / 2, dot_prod[2]); | 467 EXPECT_FLOAT_EQ(-kFrames / 2, dot_prod[2]); |
467 } | 468 } |
468 | 469 |
469 TEST_F(AudioRendererAlgorithmTest, MovingBlockEnergy) { | 470 TEST_F(AudioRendererAlgorithmTest, MovingBlockEnergy) { |
470 const int kChannels = 2; | 471 const int kChannels = 2; |
471 const int kFrames = 20; | 472 const int kFrames = 20; |
472 const int kFramesPerBlock = 3; | 473 const int kFramesPerBlock = 3; |
473 const int kNumBlocks = kFrames - (kFramesPerBlock - 1); | 474 const int kNumBlocks = kFrames - (kFramesPerBlock - 1); |
474 scoped_ptr<AudioBus> a = AudioBus::Create(kChannels, kFrames); | 475 std::unique_ptr<AudioBus> a = AudioBus::Create(kChannels, kFrames); |
475 scoped_ptr<float[]> energies(new float[kChannels * kNumBlocks]); | 476 std::unique_ptr<float[]> energies(new float[kChannels * kNumBlocks]); |
476 float* ch_left = a->channel(0); | 477 float* ch_left = a->channel(0); |
477 float* ch_right = a->channel(1); | 478 float* ch_right = a->channel(1); |
478 | 479 |
479 // Fill up both channels. | 480 // Fill up both channels. |
480 for (int n = 0; n < kFrames; ++n) { | 481 for (int n = 0; n < kFrames; ++n) { |
481 ch_left[n] = n; | 482 ch_left[n] = n; |
482 ch_right[n] = kFrames - 1 - n; | 483 ch_right[n] = kFrames - 1 - n; |
483 } | 484 } |
484 | 485 |
485 internal::MultiChannelMovingBlockEnergies(a.get(), kFramesPerBlock, | 486 internal::MultiChannelMovingBlockEnergies(a.get(), kFramesPerBlock, |
(...skipping 20 matching lines...) Expand all Loading... |
506 TEST_F(AudioRendererAlgorithmTest, FullAndDecimatedSearch) { | 507 TEST_F(AudioRendererAlgorithmTest, FullAndDecimatedSearch) { |
507 const int kFramesInSearchRegion = 12; | 508 const int kFramesInSearchRegion = 12; |
508 const int kChannels = 2; | 509 const int kChannels = 2; |
509 float ch_0[] = { | 510 float ch_0[] = { |
510 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f }; | 511 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f }; |
511 float ch_1[] = { | 512 float ch_1[] = { |
512 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.1f, 1.0f, 0.1f, 0.0f, 0.0f }; | 513 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.1f, 1.0f, 0.1f, 0.0f, 0.0f }; |
513 ASSERT_EQ(sizeof(ch_0), sizeof(ch_1)); | 514 ASSERT_EQ(sizeof(ch_0), sizeof(ch_1)); |
514 ASSERT_EQ(static_cast<size_t>(kFramesInSearchRegion), | 515 ASSERT_EQ(static_cast<size_t>(kFramesInSearchRegion), |
515 sizeof(ch_0) / sizeof(*ch_0)); | 516 sizeof(ch_0) / sizeof(*ch_0)); |
516 scoped_ptr<AudioBus> search_region = AudioBus::Create(kChannels, | 517 std::unique_ptr<AudioBus> search_region = |
517 kFramesInSearchRegion); | 518 AudioBus::Create(kChannels, kFramesInSearchRegion); |
518 float* ch = search_region->channel(0); | 519 float* ch = search_region->channel(0); |
519 memcpy(ch, ch_0, sizeof(float) * kFramesInSearchRegion); | 520 memcpy(ch, ch_0, sizeof(float) * kFramesInSearchRegion); |
520 ch = search_region->channel(1); | 521 ch = search_region->channel(1); |
521 memcpy(ch, ch_1, sizeof(float) * kFramesInSearchRegion); | 522 memcpy(ch, ch_1, sizeof(float) * kFramesInSearchRegion); |
522 | 523 |
523 const int kFramePerBlock = 4; | 524 const int kFramePerBlock = 4; |
524 float target_0[] = { 1.0f, 1.0f, 1.0f, 0.0f }; | 525 float target_0[] = { 1.0f, 1.0f, 1.0f, 0.0f }; |
525 float target_1[] = { 0.0f, 1.0f, 0.1f, 1.0f }; | 526 float target_1[] = { 0.0f, 1.0f, 0.1f, 1.0f }; |
526 ASSERT_EQ(sizeof(target_0), sizeof(target_1)); | 527 ASSERT_EQ(sizeof(target_0), sizeof(target_1)); |
527 ASSERT_EQ(static_cast<size_t>(kFramePerBlock), | 528 ASSERT_EQ(static_cast<size_t>(kFramePerBlock), |
528 sizeof(target_0) / sizeof(*target_0)); | 529 sizeof(target_0) / sizeof(*target_0)); |
529 | 530 |
530 scoped_ptr<AudioBus> target = AudioBus::Create(kChannels, | 531 std::unique_ptr<AudioBus> target = |
531 kFramePerBlock); | 532 AudioBus::Create(kChannels, kFramePerBlock); |
532 ch = target->channel(0); | 533 ch = target->channel(0); |
533 memcpy(ch, target_0, sizeof(float) * kFramePerBlock); | 534 memcpy(ch, target_0, sizeof(float) * kFramePerBlock); |
534 ch = target->channel(1); | 535 ch = target->channel(1); |
535 memcpy(ch, target_1, sizeof(float) * kFramePerBlock); | 536 memcpy(ch, target_1, sizeof(float) * kFramePerBlock); |
536 | 537 |
537 scoped_ptr<float[]> energy_target(new float[kChannels]); | 538 std::unique_ptr<float[]> energy_target(new float[kChannels]); |
538 | 539 |
539 internal::MultiChannelDotProduct(target.get(), 0, target.get(), 0, | 540 internal::MultiChannelDotProduct(target.get(), 0, target.get(), 0, |
540 kFramePerBlock, energy_target.get()); | 541 kFramePerBlock, energy_target.get()); |
541 | 542 |
542 ASSERT_EQ(3.f, energy_target[0]); | 543 ASSERT_EQ(3.f, energy_target[0]); |
543 ASSERT_EQ(2.01f, energy_target[1]); | 544 ASSERT_EQ(2.01f, energy_target[1]); |
544 | 545 |
545 const int kNumCandidBlocks = kFramesInSearchRegion - (kFramePerBlock - 1); | 546 const int kNumCandidBlocks = kFramesInSearchRegion - (kFramePerBlock - 1); |
546 scoped_ptr<float[]> energy_candid_blocks(new float[kNumCandidBlocks * | 547 std::unique_ptr<float[]> energy_candid_blocks( |
547 kChannels]); | 548 new float[kNumCandidBlocks * kChannels]); |
548 | 549 |
549 internal::MultiChannelMovingBlockEnergies( | 550 internal::MultiChannelMovingBlockEnergies( |
550 search_region.get(), kFramePerBlock, energy_candid_blocks.get()); | 551 search_region.get(), kFramePerBlock, energy_candid_blocks.get()); |
551 | 552 |
552 // Check the energy of the candidate blocks of the first channel. | 553 // Check the energy of the candidate blocks of the first channel. |
553 ASSERT_FLOAT_EQ(0, energy_candid_blocks[0]); | 554 ASSERT_FLOAT_EQ(0, energy_candid_blocks[0]); |
554 ASSERT_FLOAT_EQ(0, energy_candid_blocks[2]); | 555 ASSERT_FLOAT_EQ(0, energy_candid_blocks[2]); |
555 ASSERT_FLOAT_EQ(1, energy_candid_blocks[4]); | 556 ASSERT_FLOAT_EQ(1, energy_candid_blocks[4]); |
556 ASSERT_FLOAT_EQ(2, energy_candid_blocks[6]); | 557 ASSERT_FLOAT_EQ(2, energy_candid_blocks[6]); |
557 ASSERT_FLOAT_EQ(3, energy_candid_blocks[8]); | 558 ASSERT_FLOAT_EQ(3, energy_candid_blocks[8]); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
635 WsolaTest(0.6); | 636 WsolaTest(0.6); |
636 } | 637 } |
637 | 638 |
638 TEST_F(AudioRendererAlgorithmTest, WsolaSpeedup) { | 639 TEST_F(AudioRendererAlgorithmTest, WsolaSpeedup) { |
639 WsolaTest(1.6); | 640 WsolaTest(1.6); |
640 } | 641 } |
641 | 642 |
642 TEST_F(AudioRendererAlgorithmTest, FillBufferOffset) { | 643 TEST_F(AudioRendererAlgorithmTest, FillBufferOffset) { |
643 Initialize(); | 644 Initialize(); |
644 | 645 |
645 scoped_ptr<AudioBus> bus = AudioBus::Create(channels_, kFrameSize); | 646 std::unique_ptr<AudioBus> bus = AudioBus::Create(channels_, kFrameSize); |
646 | 647 |
647 // Verify that the first half of |bus| remains zero and the last half is | 648 // Verify that the first half of |bus| remains zero and the last half is |
648 // filled appropriately at normal, above normal, below normal, and muted | 649 // filled appropriately at normal, above normal, below normal, and muted |
649 // rates. | 650 // rates. |
650 const int kHalfSize = kFrameSize / 2; | 651 const int kHalfSize = kFrameSize / 2; |
651 const float kAudibleRates[] = {1.0f, 2.0f, 0.5f}; | 652 const float kAudibleRates[] = {1.0f, 2.0f, 0.5f}; |
652 for (size_t i = 0; i < arraysize(kAudibleRates); ++i) { | 653 for (size_t i = 0; i < arraysize(kAudibleRates); ++i) { |
653 SCOPED_TRACE(kAudibleRates[i]); | 654 SCOPED_TRACE(kAudibleRates[i]); |
654 bus->Zero(); | 655 bus->Zero(); |
655 | 656 |
(...skipping 14 matching lines...) Expand all Loading... |
670 const int frames_filled = | 671 const int frames_filled = |
671 algorithm_.FillBuffer(bus.get(), kHalfSize, kHalfSize, kMutedRates[i]); | 672 algorithm_.FillBuffer(bus.get(), kHalfSize, kHalfSize, kMutedRates[i]); |
672 ASSERT_EQ(kHalfSize, frames_filled); | 673 ASSERT_EQ(kHalfSize, frames_filled); |
673 ASSERT_FALSE(VerifyAudioData(bus.get(), 0, kHalfSize, 0)); | 674 ASSERT_FALSE(VerifyAudioData(bus.get(), 0, kHalfSize, 0)); |
674 ASSERT_TRUE(VerifyAudioData(bus.get(), kHalfSize, kHalfSize, 0)); | 675 ASSERT_TRUE(VerifyAudioData(bus.get(), kHalfSize, kHalfSize, 0)); |
675 FillAlgorithmQueue(); | 676 FillAlgorithmQueue(); |
676 } | 677 } |
677 } | 678 } |
678 | 679 |
679 } // namespace media | 680 } // namespace media |
OLD | NEW |