| 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 <windows.h> | 5 #include <windows.h> |
| 6 #include <mmsystem.h> | 6 #include <mmsystem.h> |
| 7 | 7 |
| 8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
| 9 #include "base/environment.h" | 9 #include "base/environment.h" |
| 10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 46 | 46 |
| 47 MATCHER_P(HasValidDelay, value, "") { | 47 MATCHER_P(HasValidDelay, value, "") { |
| 48 // It is difficult to come up with a perfect test condition for the delay | 48 // It is difficult to come up with a perfect test condition for the delay |
| 49 // estimation. For now, verify that the produced output delay is always | 49 // estimation. For now, verify that the produced output delay is always |
| 50 // larger than the selected buffer size. | 50 // larger than the selected buffer size. |
| 51 return arg.hardware_delay_bytes > value.hardware_delay_bytes; | 51 return arg.hardware_delay_bytes > value.hardware_delay_bytes; |
| 52 } | 52 } |
| 53 | 53 |
| 54 class MockAudioSourceCallback : public AudioOutputStream::AudioSourceCallback { | 54 class MockAudioSourceCallback : public AudioOutputStream::AudioSourceCallback { |
| 55 public: | 55 public: |
| 56 MOCK_METHOD4(OnMoreData, uint32(AudioOutputStream* stream, | 56 MOCK_METHOD3(OnMoreData, uint32(uint8* dest, |
| 57 uint8* dest, | |
| 58 uint32 max_size, | 57 uint32 max_size, |
| 59 AudioBuffersState buffers_state)); | 58 AudioBuffersState buffers_state)); |
| 60 MOCK_METHOD2(OnError, void(AudioOutputStream* stream, int code)); | 59 MOCK_METHOD2(OnError, void(AudioOutputStream* stream, int code)); |
| 61 }; | 60 }; |
| 62 | 61 |
| 63 // This audio source implementation should be used for manual tests only since | 62 // This audio source implementation should be used for manual tests only since |
| 64 // it takes about 20 seconds to play out a file. | 63 // it takes about 20 seconds to play out a file. |
| 65 class ReadFromFileAudioSource : public AudioOutputStream::AudioSourceCallback { | 64 class ReadFromFileAudioSource : public AudioOutputStream::AudioSourceCallback { |
| 66 public: | 65 public: |
| 67 explicit ReadFromFileAudioSource(const std::string& name) | 66 explicit ReadFromFileAudioSource(const std::string& name) |
| (...skipping 28 matching lines...) Expand all Loading... |
| 96 size_t elements_written = 0; | 95 size_t elements_written = 0; |
| 97 while (elements_written < elements_to_write_) { | 96 while (elements_written < elements_to_write_) { |
| 98 fprintf(text_file_, "%d\n", delta_times_[elements_written]); | 97 fprintf(text_file_, "%d\n", delta_times_[elements_written]); |
| 99 ++elements_written; | 98 ++elements_written; |
| 100 } | 99 } |
| 101 | 100 |
| 102 file_util::CloseFile(text_file_); | 101 file_util::CloseFile(text_file_); |
| 103 } | 102 } |
| 104 | 103 |
| 105 // AudioOutputStream::AudioSourceCallback implementation. | 104 // AudioOutputStream::AudioSourceCallback implementation. |
| 106 virtual uint32 OnMoreData(AudioOutputStream* stream, | 105 virtual uint32 OnMoreData(uint8* dest, |
| 107 uint8* dest, | |
| 108 uint32 max_size, | 106 uint32 max_size, |
| 109 AudioBuffersState buffers_state) { | 107 AudioBuffersState buffers_state) { |
| 110 // Store time difference between two successive callbacks in an array. | 108 // Store time difference between two successive callbacks in an array. |
| 111 // These values will be written to a file in the destructor. | 109 // These values will be written to a file in the destructor. |
| 112 int diff = (base::Time::Now() - previous_call_time_).InMilliseconds(); | 110 int diff = (base::Time::Now() - previous_call_time_).InMilliseconds(); |
| 113 previous_call_time_ = base::Time::Now(); | 111 previous_call_time_ = base::Time::Now(); |
| 114 if (elements_to_write_ < kMaxDeltaSamples) { | 112 if (elements_to_write_ < kMaxDeltaSamples) { |
| 115 delta_times_[elements_to_write_] = diff; | 113 delta_times_[elements_to_write_] = diff; |
| 116 ++elements_to_write_; | 114 ++elements_to_write_; |
| 117 } | 115 } |
| (...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 393 EXPECT_TRUE(aos->Open()); | 391 EXPECT_TRUE(aos->Open()); |
| 394 | 392 |
| 395 // Derive the expected size in bytes of each packet. | 393 // Derive the expected size in bytes of each packet. |
| 396 uint32 bytes_per_packet = aosw.channels() * aosw.samples_per_packet() * | 394 uint32 bytes_per_packet = aosw.channels() * aosw.samples_per_packet() * |
| 397 (aosw.bits_per_sample() / 8); | 395 (aosw.bits_per_sample() / 8); |
| 398 | 396 |
| 399 // Set up expected minimum delay estimation. | 397 // Set up expected minimum delay estimation. |
| 400 AudioBuffersState state(0, bytes_per_packet); | 398 AudioBuffersState state(0, bytes_per_packet); |
| 401 | 399 |
| 402 // Wait for the first callback and verify its parameters. | 400 // Wait for the first callback and verify its parameters. |
| 403 EXPECT_CALL(source, OnMoreData(aos, NotNull(), bytes_per_packet, | 401 EXPECT_CALL(source, OnMoreData(NotNull(), bytes_per_packet, |
| 404 HasValidDelay(state))) | 402 HasValidDelay(state))) |
| 405 .WillOnce( | 403 .WillOnce( |
| 406 DoAll( | 404 DoAll( |
| 407 InvokeWithoutArgs( | 405 InvokeWithoutArgs( |
| 408 CreateFunctor(&QuitMessageLoop, proxy.get())), | 406 CreateFunctor(&QuitMessageLoop, proxy.get())), |
| 409 Return(bytes_per_packet))); | 407 Return(bytes_per_packet))); |
| 410 | 408 |
| 411 aos->Start(&source); | 409 aos->Start(&source); |
| 412 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(), | 410 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(), |
| 413 TestTimeouts::action_timeout()); | 411 TestTimeouts::action_timeout()); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 435 EXPECT_TRUE(aos->Open()); | 433 EXPECT_TRUE(aos->Open()); |
| 436 | 434 |
| 437 // Derive the expected size in bytes of each packet. | 435 // Derive the expected size in bytes of each packet. |
| 438 uint32 bytes_per_packet = aosw.channels() * aosw.samples_per_packet() * | 436 uint32 bytes_per_packet = aosw.channels() * aosw.samples_per_packet() * |
| 439 (aosw.bits_per_sample() / 8); | 437 (aosw.bits_per_sample() / 8); |
| 440 | 438 |
| 441 // Set up expected minimum delay estimation. | 439 // Set up expected minimum delay estimation. |
| 442 AudioBuffersState state(0, bytes_per_packet); | 440 AudioBuffersState state(0, bytes_per_packet); |
| 443 | 441 |
| 444 // Wait for the first callback and verify its parameters. | 442 // Wait for the first callback and verify its parameters. |
| 445 EXPECT_CALL(source, OnMoreData(aos, NotNull(), bytes_per_packet, | 443 EXPECT_CALL(source, OnMoreData(NotNull(), bytes_per_packet, |
| 446 HasValidDelay(state))) | 444 HasValidDelay(state))) |
| 447 .WillOnce( | 445 .WillOnce( |
| 448 DoAll( | 446 DoAll( |
| 449 InvokeWithoutArgs( | 447 InvokeWithoutArgs( |
| 450 CreateFunctor(&QuitMessageLoop, proxy.get())), | 448 CreateFunctor(&QuitMessageLoop, proxy.get())), |
| 451 Return(bytes_per_packet))); | 449 Return(bytes_per_packet))); |
| 452 | 450 |
| 453 aos->Start(&source); | 451 aos->Start(&source); |
| 454 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(), | 452 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(), |
| 455 TestTimeouts::action_timeout()); | 453 TestTimeouts::action_timeout()); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 481 aos->Close(); | 479 aos->Close(); |
| 482 return; | 480 return; |
| 483 } | 481 } |
| 484 // Derive the expected size in bytes of each packet. | 482 // Derive the expected size in bytes of each packet. |
| 485 uint32 bytes_per_packet = aosw.channels() * aosw.samples_per_packet() * | 483 uint32 bytes_per_packet = aosw.channels() * aosw.samples_per_packet() * |
| 486 (aosw.bits_per_sample() / 8); | 484 (aosw.bits_per_sample() / 8); |
| 487 | 485 |
| 488 // Set up expected minimum delay estimation. | 486 // Set up expected minimum delay estimation. |
| 489 AudioBuffersState state(0, bytes_per_packet); | 487 AudioBuffersState state(0, bytes_per_packet); |
| 490 | 488 |
| 491 EXPECT_CALL(source, OnMoreData(aos, NotNull(), bytes_per_packet, | 489 EXPECT_CALL(source, OnMoreData(NotNull(), bytes_per_packet, |
| 492 HasValidDelay(state))) | 490 HasValidDelay(state))) |
| 493 .WillOnce( | 491 .WillOnce( |
| 494 DoAll( | 492 DoAll( |
| 495 InvokeWithoutArgs( | 493 InvokeWithoutArgs( |
| 496 CreateFunctor(&QuitMessageLoop, proxy.get())), | 494 CreateFunctor(&QuitMessageLoop, proxy.get())), |
| 497 Return(bytes_per_packet))); | 495 Return(bytes_per_packet))); |
| 498 | 496 |
| 499 aos->Start(&source); | 497 aos->Start(&source); |
| 500 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(), | 498 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(), |
| 501 TestTimeouts::action_timeout()); | 499 TestTimeouts::action_timeout()); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 542 aos->Start(&file_source); | 540 aos->Start(&file_source); |
| 543 base::PlatformThread::Sleep( | 541 base::PlatformThread::Sleep( |
| 544 base::TimeDelta::FromMilliseconds(kFileDurationMs)); | 542 base::TimeDelta::FromMilliseconds(kFileDurationMs)); |
| 545 aos->Stop(); | 543 aos->Stop(); |
| 546 | 544 |
| 547 LOG(INFO) << ">> File playout has stopped."; | 545 LOG(INFO) << ">> File playout has stopped."; |
| 548 aos->Close(); | 546 aos->Close(); |
| 549 } | 547 } |
| 550 | 548 |
| 551 } // namespace media | 549 } // namespace media |
| OLD | NEW |