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/files/file_util.h" | 10 #include "base/files/file_util.h" |
(...skipping 19 matching lines...) Expand all Loading... |
30 using ::testing::_; | 30 using ::testing::_; |
31 using ::testing::AnyNumber; | 31 using ::testing::AnyNumber; |
32 using ::testing::AtLeast; | 32 using ::testing::AtLeast; |
33 using ::testing::Between; | 33 using ::testing::Between; |
34 using ::testing::CreateFunctor; | 34 using ::testing::CreateFunctor; |
35 using ::testing::DoAll; | 35 using ::testing::DoAll; |
36 using ::testing::Gt; | 36 using ::testing::Gt; |
37 using ::testing::InvokeWithoutArgs; | 37 using ::testing::InvokeWithoutArgs; |
38 using ::testing::NotNull; | 38 using ::testing::NotNull; |
39 using ::testing::Return; | 39 using ::testing::Return; |
40 using base::win::ScopedCOMInitializer; | |
41 | 40 |
42 namespace media { | 41 namespace media { |
43 | 42 |
44 static const char kSpeechFile_16b_s_48k[] = "speech_16b_stereo_48kHz.raw"; | 43 static const char kSpeechFile_16b_s_48k[] = "speech_16b_stereo_48kHz.raw"; |
45 static const char kSpeechFile_16b_s_44k[] = "speech_16b_stereo_44kHz.raw"; | 44 static const char kSpeechFile_16b_s_44k[] = "speech_16b_stereo_44kHz.raw"; |
46 static const size_t kFileDurationMs = 20000; | 45 static const size_t kFileDurationMs = 20000; |
47 static const size_t kNumFileSegments = 2; | 46 static const size_t kNumFileSegments = 2; |
48 static const int kBitsPerSample = 16; | 47 static const int kBitsPerSample = 16; |
49 static const size_t kMaxDeltaSamples = 1000; | 48 static const size_t kMaxDeltaSamples = 1000; |
50 static const char kDeltaTimeMsFileName[] = "delta_times_ms.txt"; | 49 static const char kDeltaTimeMsFileName[] = "delta_times_ms.txt"; |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 AudioOutputStream* aos = aosw.Create(); | 223 AudioOutputStream* aos = aosw.Create(); |
225 return aos; | 224 return aos; |
226 } | 225 } |
227 | 226 |
228 // Verify that we can retrieve the current hardware/mixing sample rate | 227 // Verify that we can retrieve the current hardware/mixing sample rate |
229 // for the default audio device. | 228 // for the default audio device. |
230 // TODO(henrika): modify this test when we support full device enumeration. | 229 // TODO(henrika): modify this test when we support full device enumeration. |
231 TEST(WASAPIAudioOutputStreamTest, HardwareSampleRate) { | 230 TEST(WASAPIAudioOutputStreamTest, HardwareSampleRate) { |
232 // Skip this test in exclusive mode since the resulting rate is only utilized | 231 // Skip this test in exclusive mode since the resulting rate is only utilized |
233 // for shared mode streams. | 232 // for shared mode streams. |
| 233 if (ExclusiveModeIsEnabled()) |
| 234 return; |
234 scoped_ptr<AudioManager> audio_manager(AudioManager::CreateForTesting()); | 235 scoped_ptr<AudioManager> audio_manager(AudioManager::CreateForTesting()); |
235 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager.get()) && | 236 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager.get())); |
236 ExclusiveModeIsEnabled()); | |
237 | 237 |
238 // Default device intended for games, system notification sounds, | 238 // Default device intended for games, system notification sounds, |
239 // and voice commands. | 239 // and voice commands. |
240 int fs = static_cast<int>( | 240 int fs = static_cast<int>( |
241 WASAPIAudioOutputStream::HardwareSampleRate(std::string())); | 241 WASAPIAudioOutputStream::HardwareSampleRate(std::string())); |
242 EXPECT_GE(fs, 0); | 242 EXPECT_GE(fs, 0); |
243 } | 243 } |
244 | 244 |
245 // Test Create(), Close() calling sequence. | 245 // Test Create(), Close() calling sequence. |
246 TEST(WASAPIAudioOutputStreamTest, CreateAndClose) { | 246 TEST(WASAPIAudioOutputStreamTest, CreateAndClose) { |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
442 } | 442 } |
443 | 443 |
444 DVLOG(0) << ">> Stereo file playout has stopped."; | 444 DVLOG(0) << ">> Stereo file playout has stopped."; |
445 aos->Close(); | 445 aos->Close(); |
446 } | 446 } |
447 | 447 |
448 // Verify that we can open the output stream in exclusive mode using a | 448 // Verify that we can open the output stream in exclusive mode using a |
449 // certain set of audio parameters and a sample rate of 48kHz. | 449 // certain set of audio parameters and a sample rate of 48kHz. |
450 // The expected outcomes of each setting in this test has been derived | 450 // The expected outcomes of each setting in this test has been derived |
451 // manually using log outputs (--v=1). | 451 // manually using log outputs (--v=1). |
452 TEST(WASAPIAudioOutputStreamTest, ExclusiveModeBufferSizesAt48kHz) { | 452 // It's disabled by default because a flag is required to enable exclusive mode. |
| 453 TEST(WASAPIAudioOutputStreamTest, DISABLED_ExclusiveModeBufferSizesAt48kHz) { |
453 scoped_ptr<AudioManager> audio_manager(AudioManager::CreateForTesting()); | 454 scoped_ptr<AudioManager> audio_manager(AudioManager::CreateForTesting()); |
454 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager.get()) && | 455 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager.get()) && |
455 ExclusiveModeIsEnabled()); | 456 ExclusiveModeIsEnabled()); |
456 | 457 |
457 AudioOutputStreamWrapper aosw(audio_manager.get()); | 458 AudioOutputStreamWrapper aosw(audio_manager.get()); |
458 | 459 |
459 // 10ms @ 48kHz shall work. | 460 // 10ms @ 48kHz shall work. |
460 // Note that, this is the same size as we can use for shared-mode streaming | 461 // Note that, this is the same size as we can use for shared-mode streaming |
461 // but here the endpoint buffer delay is only 10ms instead of 20ms. | 462 // but here the endpoint buffer delay is only 10ms instead of 20ms. |
462 AudioOutputStream* aos = aosw.Create(48000, 480); | 463 AudioOutputStream* aos = aosw.Create(48000, 480); |
(...skipping 27 matching lines...) Expand all Loading... |
490 // 3.3333ms @ 48kHz <=> smallest possible buffer size we can use. | 491 // 3.3333ms @ 48kHz <=> smallest possible buffer size we can use. |
491 aos = aosw.Create(48000, 160); | 492 aos = aosw.Create(48000, 160); |
492 EXPECT_TRUE(aos->Open()); | 493 EXPECT_TRUE(aos->Open()); |
493 aos->Close(); | 494 aos->Close(); |
494 } | 495 } |
495 | 496 |
496 // Verify that we can open the output stream in exclusive mode using a | 497 // Verify that we can open the output stream in exclusive mode using a |
497 // certain set of audio parameters and a sample rate of 44.1kHz. | 498 // certain set of audio parameters and a sample rate of 44.1kHz. |
498 // The expected outcomes of each setting in this test has been derived | 499 // The expected outcomes of each setting in this test has been derived |
499 // manually using log outputs (--v=1). | 500 // manually using log outputs (--v=1). |
500 TEST(WASAPIAudioOutputStreamTest, ExclusiveModeBufferSizesAt44kHz) { | 501 // It's disabled by default because a flag is required to enable exclusive mode. |
| 502 TEST(WASAPIAudioOutputStreamTest, DISABLED_ExclusiveModeBufferSizesAt44kHz) { |
501 scoped_ptr<AudioManager> audio_manager(AudioManager::CreateForTesting()); | 503 scoped_ptr<AudioManager> audio_manager(AudioManager::CreateForTesting()); |
502 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager.get()) && | 504 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager.get()) && |
503 ExclusiveModeIsEnabled()); | 505 ExclusiveModeIsEnabled()); |
504 | 506 |
505 AudioOutputStreamWrapper aosw(audio_manager.get()); | 507 AudioOutputStreamWrapper aosw(audio_manager.get()); |
506 | 508 |
507 // 10ms @ 44.1kHz does not work due to misalignment. | 509 // 10ms @ 44.1kHz does not work due to misalignment. |
508 // This test will propose an aligned buffer size of 10.1587ms. | 510 // This test will propose an aligned buffer size of 10.1587ms. |
509 AudioOutputStream* aos = aosw.Create(44100, 441); | 511 AudioOutputStream* aos = aosw.Create(44100, 441); |
510 EXPECT_FALSE(aos->Open()); | 512 EXPECT_FALSE(aos->Open()); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
545 aos->Close(); | 547 aos->Close(); |
546 | 548 |
547 // 3.6281ms @ 44.1kHz <=> smallest possible buffer size we can use. | 549 // 3.6281ms @ 44.1kHz <=> smallest possible buffer size we can use. |
548 aos = aosw.Create(44100, 160); | 550 aos = aosw.Create(44100, 160); |
549 EXPECT_TRUE(aos->Open()); | 551 EXPECT_TRUE(aos->Open()); |
550 aos->Close(); | 552 aos->Close(); |
551 } | 553 } |
552 | 554 |
553 // Verify that we can open and start the output stream in exclusive mode at | 555 // Verify that we can open and start the output stream in exclusive mode at |
554 // the lowest possible delay at 48kHz. | 556 // the lowest possible delay at 48kHz. |
555 TEST(WASAPIAudioOutputStreamTest, ExclusiveModeMinBufferSizeAt48kHz) { | 557 // It's disabled by default because a flag is required to enable exclusive mode. |
| 558 TEST(WASAPIAudioOutputStreamTest, DISABLED_ExclusiveModeMinBufferSizeAt48kHz) { |
556 scoped_ptr<AudioManager> audio_manager(AudioManager::CreateForTesting()); | 559 scoped_ptr<AudioManager> audio_manager(AudioManager::CreateForTesting()); |
557 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager.get()) && | 560 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager.get()) && |
558 ExclusiveModeIsEnabled()); | 561 ExclusiveModeIsEnabled()); |
559 | 562 |
560 base::MessageLoopForUI loop; | 563 base::MessageLoopForUI loop; |
561 MockAudioSourceCallback source; | 564 MockAudioSourceCallback source; |
562 | 565 |
563 // Create exclusive-mode WASAPI output stream which plays out in stereo | 566 // Create exclusive-mode WASAPI output stream which plays out in stereo |
564 // using the minimum buffer size at 48kHz sample rate. | 567 // using the minimum buffer size at 48kHz sample rate. |
565 AudioOutputStreamWrapper aosw(audio_manager.get()); | 568 AudioOutputStreamWrapper aosw(audio_manager.get()); |
(...skipping 14 matching lines...) Expand all Loading... |
580 aos->Start(&source); | 583 aos->Start(&source); |
581 loop.PostDelayedTask(FROM_HERE, base::MessageLoop::QuitClosure(), | 584 loop.PostDelayedTask(FROM_HERE, base::MessageLoop::QuitClosure(), |
582 TestTimeouts::action_timeout()); | 585 TestTimeouts::action_timeout()); |
583 loop.Run(); | 586 loop.Run(); |
584 aos->Stop(); | 587 aos->Stop(); |
585 aos->Close(); | 588 aos->Close(); |
586 } | 589 } |
587 | 590 |
588 // Verify that we can open and start the output stream in exclusive mode at | 591 // Verify that we can open and start the output stream in exclusive mode at |
589 // the lowest possible delay at 44.1kHz. | 592 // the lowest possible delay at 44.1kHz. |
590 TEST(WASAPIAudioOutputStreamTest, ExclusiveModeMinBufferSizeAt44kHz) { | 593 // It's disabled by default because a flag is required to enable exclusive mode. |
| 594 TEST(WASAPIAudioOutputStreamTest, DISABLED_ExclusiveModeMinBufferSizeAt44kHz) { |
591 ABORT_AUDIO_TEST_IF_NOT(ExclusiveModeIsEnabled()); | 595 ABORT_AUDIO_TEST_IF_NOT(ExclusiveModeIsEnabled()); |
592 scoped_ptr<AudioManager> audio_manager(AudioManager::CreateForTesting()); | 596 scoped_ptr<AudioManager> audio_manager(AudioManager::CreateForTesting()); |
593 | 597 |
594 base::MessageLoopForUI loop; | 598 base::MessageLoopForUI loop; |
595 MockAudioSourceCallback source; | 599 MockAudioSourceCallback source; |
596 | 600 |
597 // Create exclusive-mode WASAPI output stream which plays out in stereo | 601 // Create exclusive-mode WASAPI output stream which plays out in stereo |
598 // using the minimum buffer size at 44.1kHz sample rate. | 602 // using the minimum buffer size at 44.1kHz sample rate. |
599 AudioOutputStreamWrapper aosw(audio_manager.get()); | 603 AudioOutputStreamWrapper aosw(audio_manager.get()); |
600 AudioOutputStream* aos = aosw.Create(44100, 160); | 604 AudioOutputStream* aos = aosw.Create(44100, 160); |
(...skipping 12 matching lines...) Expand all Loading... |
613 | 617 |
614 aos->Start(&source); | 618 aos->Start(&source); |
615 loop.PostDelayedTask(FROM_HERE, base::MessageLoop::QuitClosure(), | 619 loop.PostDelayedTask(FROM_HERE, base::MessageLoop::QuitClosure(), |
616 TestTimeouts::action_timeout()); | 620 TestTimeouts::action_timeout()); |
617 loop.Run(); | 621 loop.Run(); |
618 aos->Stop(); | 622 aos->Stop(); |
619 aos->Close(); | 623 aos->Close(); |
620 } | 624 } |
621 | 625 |
622 } // namespace media | 626 } // namespace media |
OLD | NEW |