| 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/bind.h" | |
| 10 #include "base/environment.h" | 9 #include "base/environment.h" |
| 11 #include "base/files/file_util.h" | 10 #include "base/files/file_util.h" |
| 12 #include "base/memory/scoped_ptr.h" | 11 #include "base/memory/scoped_ptr.h" |
| 13 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
| 14 #include "base/path_service.h" | 13 #include "base/path_service.h" |
| 15 #include "base/test/test_timeouts.h" | 14 #include "base/test/test_timeouts.h" |
| 16 #include "base/time/time.h" | 15 #include "base/time/time.h" |
| 17 #include "base/win/scoped_com_initializer.h" | 16 #include "base/win/scoped_com_initializer.h" |
| 18 #include "media/audio/audio_io.h" | 17 #include "media/audio/audio_io.h" |
| 19 #include "media/audio/audio_manager.h" | 18 #include "media/audio/audio_manager.h" |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 }; | 219 }; |
| 221 | 220 |
| 222 // Convenience method which creates a default AudioOutputStream object. | 221 // Convenience method which creates a default AudioOutputStream object. |
| 223 static AudioOutputStream* CreateDefaultAudioOutputStream( | 222 static AudioOutputStream* CreateDefaultAudioOutputStream( |
| 224 AudioManager* audio_manager) { | 223 AudioManager* audio_manager) { |
| 225 AudioOutputStreamWrapper aosw(audio_manager); | 224 AudioOutputStreamWrapper aosw(audio_manager); |
| 226 AudioOutputStream* aos = aosw.Create(); | 225 AudioOutputStream* aos = aosw.Create(); |
| 227 return aos; | 226 return aos; |
| 228 } | 227 } |
| 229 | 228 |
| 230 class WASAPIAudioOutputStreamTest : public testing::Test { | |
| 231 public: | |
| 232 WASAPIAudioOutputStreamTest() | |
| 233 : audio_manager_(AudioManager::CreateForTesting()) {} | |
| 234 ~WASAPIAudioOutputStreamTest() override {} | |
| 235 | |
| 236 protected: | |
| 237 ScopedCOMInitializer com_init_; | |
| 238 scoped_ptr<AudioManager> audio_manager_; | |
| 239 }; | |
| 240 | |
| 241 // Verify that we can retrieve the current hardware/mixing sample rate | 229 // Verify that we can retrieve the current hardware/mixing sample rate |
| 242 // for the default audio device. | 230 // for the default audio device. |
| 243 // TODO(henrika): modify this test when we support full device enumeration. | 231 // TODO(henrika): modify this test when we support full device enumeration. |
| 244 TEST_F(WASAPIAudioOutputStreamTest, HardwareSampleRate) { | 232 TEST(WASAPIAudioOutputStreamTest, HardwareSampleRate) { |
| 245 // Skip this test in exclusive mode since the resulting rate is only utilized | 233 // Skip this test in exclusive mode since the resulting rate is only utilized |
| 246 // for shared mode streams. | 234 // for shared mode streams. |
| 247 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager_.get()) && | 235 scoped_ptr<AudioManager> audio_manager(AudioManager::CreateForTesting()); |
| 236 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager.get()) && |
| 248 ExclusiveModeIsEnabled()); | 237 ExclusiveModeIsEnabled()); |
| 249 | 238 |
| 250 // Default device intended for games, system notification sounds, | 239 // Default device intended for games, system notification sounds, |
| 251 // and voice commands. | 240 // and voice commands. |
| 252 int fs = static_cast<int>( | 241 int fs = static_cast<int>( |
| 253 WASAPIAudioOutputStream::HardwareSampleRate(std::string())); | 242 WASAPIAudioOutputStream::HardwareSampleRate(std::string())); |
| 254 EXPECT_GE(fs, 0); | 243 EXPECT_GE(fs, 0); |
| 255 } | 244 } |
| 256 | 245 |
| 257 // Test Create(), Close() calling sequence. | 246 // Test Create(), Close() calling sequence. |
| 258 TEST_F(WASAPIAudioOutputStreamTest, CreateAndClose) { | 247 TEST(WASAPIAudioOutputStreamTest, CreateAndClose) { |
| 259 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager_.get())); | 248 scoped_ptr<AudioManager> audio_manager(AudioManager::CreateForTesting()); |
| 260 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager_.get()); | 249 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager.get())); |
| 250 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get()); |
| 261 aos->Close(); | 251 aos->Close(); |
| 262 } | 252 } |
| 263 | 253 |
| 264 // Test Open(), Close() calling sequence. | 254 // Test Open(), Close() calling sequence. |
| 265 TEST_F(WASAPIAudioOutputStreamTest, OpenAndClose) { | 255 TEST(WASAPIAudioOutputStreamTest, OpenAndClose) { |
| 266 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager_.get())); | 256 scoped_ptr<AudioManager> audio_manager(AudioManager::CreateForTesting()); |
| 267 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager_.get()); | 257 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager.get())); |
| 258 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get()); |
| 268 EXPECT_TRUE(aos->Open()); | 259 EXPECT_TRUE(aos->Open()); |
| 269 aos->Close(); | 260 aos->Close(); |
| 270 } | 261 } |
| 271 | 262 |
| 272 // Test Open(), Start(), Close() calling sequence. | 263 // Test Open(), Start(), Close() calling sequence. |
| 273 TEST_F(WASAPIAudioOutputStreamTest, OpenStartAndClose) { | 264 TEST(WASAPIAudioOutputStreamTest, OpenStartAndClose) { |
| 274 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager_.get())); | 265 scoped_ptr<AudioManager> audio_manager(AudioManager::CreateForTesting()); |
| 275 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager_.get()); | 266 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager.get())); |
| 267 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get()); |
| 276 EXPECT_TRUE(aos->Open()); | 268 EXPECT_TRUE(aos->Open()); |
| 277 MockAudioSourceCallback source; | 269 MockAudioSourceCallback source; |
| 278 EXPECT_CALL(source, OnError(aos)) | 270 EXPECT_CALL(source, OnError(aos)) |
| 279 .Times(0); | 271 .Times(0); |
| 280 aos->Start(&source); | 272 aos->Start(&source); |
| 281 aos->Close(); | 273 aos->Close(); |
| 282 } | 274 } |
| 283 | 275 |
| 284 // Test Open(), Start(), Stop(), Close() calling sequence. | 276 // Test Open(), Start(), Stop(), Close() calling sequence. |
| 285 TEST_F(WASAPIAudioOutputStreamTest, OpenStartStopAndClose) { | 277 TEST(WASAPIAudioOutputStreamTest, OpenStartStopAndClose) { |
| 286 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager_.get())); | 278 scoped_ptr<AudioManager> audio_manager(AudioManager::CreateForTesting()); |
| 287 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager_.get()); | 279 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager.get())); |
| 280 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get()); |
| 288 EXPECT_TRUE(aos->Open()); | 281 EXPECT_TRUE(aos->Open()); |
| 289 MockAudioSourceCallback source; | 282 MockAudioSourceCallback source; |
| 290 EXPECT_CALL(source, OnError(aos)) | 283 EXPECT_CALL(source, OnError(aos)) |
| 291 .Times(0); | 284 .Times(0); |
| 292 aos->Start(&source); | 285 aos->Start(&source); |
| 293 aos->Stop(); | 286 aos->Stop(); |
| 294 aos->Close(); | 287 aos->Close(); |
| 295 } | 288 } |
| 296 | 289 |
| 297 // Test SetVolume(), GetVolume() | 290 // Test SetVolume(), GetVolume() |
| 298 TEST_F(WASAPIAudioOutputStreamTest, Volume) { | 291 TEST(WASAPIAudioOutputStreamTest, Volume) { |
| 299 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager_.get())); | 292 scoped_ptr<AudioManager> audio_manager(AudioManager::CreateForTesting()); |
| 300 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager_.get()); | 293 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager.get())); |
| 294 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get()); |
| 301 | 295 |
| 302 // Initial volume should be full volume (1.0). | 296 // Initial volume should be full volume (1.0). |
| 303 double volume = 0.0; | 297 double volume = 0.0; |
| 304 aos->GetVolume(&volume); | 298 aos->GetVolume(&volume); |
| 305 EXPECT_EQ(1.0, volume); | 299 EXPECT_EQ(1.0, volume); |
| 306 | 300 |
| 307 // Verify some valid volume settings. | 301 // Verify some valid volume settings. |
| 308 aos->SetVolume(0.0); | 302 aos->SetVolume(0.0); |
| 309 aos->GetVolume(&volume); | 303 aos->GetVolume(&volume); |
| 310 EXPECT_EQ(0.0, volume); | 304 EXPECT_EQ(0.0, volume); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 323 EXPECT_EQ(1.0, volume); | 317 EXPECT_EQ(1.0, volume); |
| 324 | 318 |
| 325 aos->SetVolume(-0.5); | 319 aos->SetVolume(-0.5); |
| 326 aos->GetVolume(&volume); | 320 aos->GetVolume(&volume); |
| 327 EXPECT_EQ(1.0, volume); | 321 EXPECT_EQ(1.0, volume); |
| 328 | 322 |
| 329 aos->Close(); | 323 aos->Close(); |
| 330 } | 324 } |
| 331 | 325 |
| 332 // Test some additional calling sequences. | 326 // Test some additional calling sequences. |
| 333 TEST_F(WASAPIAudioOutputStreamTest, MiscCallingSequences) { | 327 TEST(WASAPIAudioOutputStreamTest, MiscCallingSequences) { |
| 334 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager_.get())); | 328 scoped_ptr<AudioManager> audio_manager(AudioManager::CreateForTesting()); |
| 329 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager.get())); |
| 335 | 330 |
| 336 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager_.get()); | 331 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get()); |
| 337 WASAPIAudioOutputStream* waos = static_cast<WASAPIAudioOutputStream*>(aos); | 332 WASAPIAudioOutputStream* waos = static_cast<WASAPIAudioOutputStream*>(aos); |
| 338 | 333 |
| 339 // Open(), Open() is a valid calling sequence (second call does nothing). | 334 // Open(), Open() is a valid calling sequence (second call does nothing). |
| 340 EXPECT_TRUE(aos->Open()); | 335 EXPECT_TRUE(aos->Open()); |
| 341 EXPECT_TRUE(aos->Open()); | 336 EXPECT_TRUE(aos->Open()); |
| 342 | 337 |
| 343 MockAudioSourceCallback source; | 338 MockAudioSourceCallback source; |
| 344 | 339 |
| 345 // Start(), Start() is a valid calling sequence (second call does nothing). | 340 // Start(), Start() is a valid calling sequence (second call does nothing). |
| 346 aos->Start(&source); | 341 aos->Start(&source); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 361 EXPECT_FALSE(waos->started()); | 356 EXPECT_FALSE(waos->started()); |
| 362 aos->Start(&source); | 357 aos->Start(&source); |
| 363 EXPECT_TRUE(waos->started()); | 358 EXPECT_TRUE(waos->started()); |
| 364 aos->Stop(); | 359 aos->Stop(); |
| 365 EXPECT_FALSE(waos->started()); | 360 EXPECT_FALSE(waos->started()); |
| 366 | 361 |
| 367 aos->Close(); | 362 aos->Close(); |
| 368 } | 363 } |
| 369 | 364 |
| 370 // Use preferred packet size and verify that rendering starts. | 365 // Use preferred packet size and verify that rendering starts. |
| 371 TEST_F(WASAPIAudioOutputStreamTest, ValidPacketSize) { | 366 TEST(WASAPIAudioOutputStreamTest, ValidPacketSize) { |
| 372 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager_.get())); | 367 scoped_ptr<AudioManager> audio_manager(AudioManager::CreateForTesting()); |
| 368 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager.get())); |
| 373 | 369 |
| 374 base::MessageLoopForUI loop; | 370 base::MessageLoopForUI loop; |
| 375 MockAudioSourceCallback source; | 371 MockAudioSourceCallback source; |
| 376 | 372 |
| 377 // Create default WASAPI output stream which plays out in stereo using | 373 // Create default WASAPI output stream which plays out in stereo using |
| 378 // the shared mixing rate. The default buffer size is 10ms. | 374 // the shared mixing rate. The default buffer size is 10ms. |
| 379 AudioOutputStreamWrapper aosw(audio_manager_.get()); | 375 AudioOutputStreamWrapper aosw(audio_manager.get()); |
| 380 AudioOutputStream* aos = aosw.Create(); | 376 AudioOutputStream* aos = aosw.Create(); |
| 381 EXPECT_TRUE(aos->Open()); | 377 EXPECT_TRUE(aos->Open()); |
| 382 | 378 |
| 383 // Derive the expected size in bytes of each packet. | 379 // Derive the expected size in bytes of each packet. |
| 384 uint32 bytes_per_packet = aosw.channels() * aosw.samples_per_packet() * | 380 uint32 bytes_per_packet = aosw.channels() * aosw.samples_per_packet() * |
| 385 (aosw.bits_per_sample() / 8); | 381 (aosw.bits_per_sample() / 8); |
| 386 | 382 |
| 387 // Wait for the first callback and verify its parameters. | 383 // Wait for the first callback and verify its parameters. |
| 388 EXPECT_CALL(source, OnMoreData(NotNull(), HasValidDelay(bytes_per_packet))) | 384 EXPECT_CALL(source, OnMoreData(NotNull(), HasValidDelay(bytes_per_packet))) |
| 389 .WillOnce(DoAll( | 385 .WillOnce(DoAll( |
| 390 QuitLoop(loop.message_loop_proxy()), | 386 QuitLoop(loop.message_loop_proxy()), |
| 391 Return(aosw.samples_per_packet()))); | 387 Return(aosw.samples_per_packet()))); |
| 392 | 388 |
| 393 aos->Start(&source); | 389 aos->Start(&source); |
| 394 loop.PostDelayedTask(FROM_HERE, base::MessageLoop::QuitClosure(), | 390 loop.PostDelayedTask(FROM_HERE, base::MessageLoop::QuitClosure(), |
| 395 TestTimeouts::action_timeout()); | 391 TestTimeouts::action_timeout()); |
| 396 loop.Run(); | 392 loop.Run(); |
| 397 aos->Stop(); | 393 aos->Stop(); |
| 398 aos->Close(); | 394 aos->Close(); |
| 399 } | 395 } |
| 400 | 396 |
| 401 // This test is intended for manual tests and should only be enabled | 397 // This test is intended for manual tests and should only be enabled |
| 402 // when it is required to play out data from a local PCM file. | 398 // when it is required to play out data from a local PCM file. |
| 403 // By default, GTest will print out YOU HAVE 1 DISABLED TEST. | 399 // By default, GTest will print out YOU HAVE 1 DISABLED TEST. |
| 404 // To include disabled tests in test execution, just invoke the test program | 400 // To include disabled tests in test execution, just invoke the test program |
| 405 // with --gtest_also_run_disabled_tests or set the GTEST_ALSO_RUN_DISABLED_TESTS | 401 // with --gtest_also_run_disabled_tests or set the GTEST_ALSO_RUN_DISABLED_TESTS |
| 406 // environment variable to a value greater than 0. | 402 // environment variable to a value greater than 0. |
| 407 // The test files are approximately 20 seconds long. | 403 // The test files are approximately 20 seconds long. |
| 408 TEST_F(WASAPIAudioOutputStreamTest, DISABLED_ReadFromStereoFile) { | 404 TEST(WASAPIAudioOutputStreamTest, DISABLED_ReadFromStereoFile) { |
| 409 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager_.get())); | 405 scoped_ptr<AudioManager> audio_manager(AudioManager::CreateForTesting()); |
| 406 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager.get())); |
| 410 | 407 |
| 411 AudioOutputStreamWrapper aosw(audio_manager_.get()); | 408 AudioOutputStreamWrapper aosw(audio_manager.get()); |
| 412 AudioOutputStream* aos = aosw.Create(); | 409 AudioOutputStream* aos = aosw.Create(); |
| 413 EXPECT_TRUE(aos->Open()); | 410 EXPECT_TRUE(aos->Open()); |
| 414 | 411 |
| 415 std::string file_name; | 412 std::string file_name; |
| 416 if (aosw.sample_rate() == 48000) { | 413 if (aosw.sample_rate() == 48000) { |
| 417 file_name = kSpeechFile_16b_s_48k; | 414 file_name = kSpeechFile_16b_s_48k; |
| 418 } else if (aosw.sample_rate() == 44100) { | 415 } else if (aosw.sample_rate() == 44100) { |
| 419 file_name = kSpeechFile_16b_s_44k; | 416 file_name = kSpeechFile_16b_s_44k; |
| 420 } else if (aosw.sample_rate() == 96000) { | 417 } else if (aosw.sample_rate() == 96000) { |
| 421 // Use 48kHz file at 96kHz as well. Will sound like Donald Duck. | 418 // Use 48kHz file at 96kHz as well. Will sound like Donald Duck. |
| (...skipping 24 matching lines...) Expand all Loading... |
| 446 } | 443 } |
| 447 | 444 |
| 448 DVLOG(0) << ">> Stereo file playout has stopped."; | 445 DVLOG(0) << ">> Stereo file playout has stopped."; |
| 449 aos->Close(); | 446 aos->Close(); |
| 450 } | 447 } |
| 451 | 448 |
| 452 // Verify that we can open the output stream in exclusive mode using a | 449 // Verify that we can open the output stream in exclusive mode using a |
| 453 // certain set of audio parameters and a sample rate of 48kHz. | 450 // certain set of audio parameters and a sample rate of 48kHz. |
| 454 // The expected outcomes of each setting in this test has been derived | 451 // The expected outcomes of each setting in this test has been derived |
| 455 // manually using log outputs (--v=1). | 452 // manually using log outputs (--v=1). |
| 456 TEST_F(WASAPIAudioOutputStreamTest, ExclusiveModeBufferSizesAt48kHz) { | 453 TEST(WASAPIAudioOutputStreamTest, ExclusiveModeBufferSizesAt48kHz) { |
| 457 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager_.get()) && | 454 scoped_ptr<AudioManager> audio_manager(AudioManager::CreateForTesting()); |
| 455 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager.get()) && |
| 458 ExclusiveModeIsEnabled()); | 456 ExclusiveModeIsEnabled()); |
| 459 | 457 |
| 460 AudioOutputStreamWrapper aosw(audio_manager_.get()); | 458 AudioOutputStreamWrapper aosw(audio_manager.get()); |
| 461 | 459 |
| 462 // 10ms @ 48kHz shall work. | 460 // 10ms @ 48kHz shall work. |
| 463 // 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 |
| 464 // 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. |
| 465 AudioOutputStream* aos = aosw.Create(48000, 480); | 463 AudioOutputStream* aos = aosw.Create(48000, 480); |
| 466 EXPECT_TRUE(aos->Open()); | 464 EXPECT_TRUE(aos->Open()); |
| 467 aos->Close(); | 465 aos->Close(); |
| 468 | 466 |
| 469 // 5ms @ 48kHz does not work due to misalignment. | 467 // 5ms @ 48kHz does not work due to misalignment. |
| 470 // This test will propose an aligned buffer size of 5.3333ms. | 468 // This test will propose an aligned buffer size of 5.3333ms. |
| (...skipping 22 matching lines...) Expand all Loading... |
| 493 // 3.3333ms @ 48kHz <=> smallest possible buffer size we can use. | 491 // 3.3333ms @ 48kHz <=> smallest possible buffer size we can use. |
| 494 aos = aosw.Create(48000, 160); | 492 aos = aosw.Create(48000, 160); |
| 495 EXPECT_TRUE(aos->Open()); | 493 EXPECT_TRUE(aos->Open()); |
| 496 aos->Close(); | 494 aos->Close(); |
| 497 } | 495 } |
| 498 | 496 |
| 499 // 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 |
| 500 // 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. |
| 501 // 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 |
| 502 // manually using log outputs (--v=1). | 500 // manually using log outputs (--v=1). |
| 503 TEST_F(WASAPIAudioOutputStreamTest, ExclusiveModeBufferSizesAt44kHz) { | 501 TEST(WASAPIAudioOutputStreamTest, ExclusiveModeBufferSizesAt44kHz) { |
| 504 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager_.get()) && | 502 scoped_ptr<AudioManager> audio_manager(AudioManager::CreateForTesting()); |
| 503 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager.get()) && |
| 505 ExclusiveModeIsEnabled()); | 504 ExclusiveModeIsEnabled()); |
| 506 | 505 |
| 507 AudioOutputStreamWrapper aosw(audio_manager_.get()); | 506 AudioOutputStreamWrapper aosw(audio_manager.get()); |
| 508 | 507 |
| 509 // 10ms @ 44.1kHz does not work due to misalignment. | 508 // 10ms @ 44.1kHz does not work due to misalignment. |
| 510 // This test will propose an aligned buffer size of 10.1587ms. | 509 // This test will propose an aligned buffer size of 10.1587ms. |
| 511 AudioOutputStream* aos = aosw.Create(44100, 441); | 510 AudioOutputStream* aos = aosw.Create(44100, 441); |
| 512 EXPECT_FALSE(aos->Open()); | 511 EXPECT_FALSE(aos->Open()); |
| 513 aos->Close(); | 512 aos->Close(); |
| 514 | 513 |
| 515 // 10.1587ms @ 44.1kHz shall work (see test above). | 514 // 10.1587ms @ 44.1kHz shall work (see test above). |
| 516 aos = aosw.Create(44100, 448); | 515 aos = aosw.Create(44100, 448); |
| 517 EXPECT_TRUE(aos->Open()); | 516 EXPECT_TRUE(aos->Open()); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 547 aos->Close(); | 546 aos->Close(); |
| 548 | 547 |
| 549 // 3.6281ms @ 44.1kHz <=> smallest possible buffer size we can use. | 548 // 3.6281ms @ 44.1kHz <=> smallest possible buffer size we can use. |
| 550 aos = aosw.Create(44100, 160); | 549 aos = aosw.Create(44100, 160); |
| 551 EXPECT_TRUE(aos->Open()); | 550 EXPECT_TRUE(aos->Open()); |
| 552 aos->Close(); | 551 aos->Close(); |
| 553 } | 552 } |
| 554 | 553 |
| 555 // Verify that we can open and start the output stream in exclusive mode at | 554 // Verify that we can open and start the output stream in exclusive mode at |
| 556 // the lowest possible delay at 48kHz. | 555 // the lowest possible delay at 48kHz. |
| 557 TEST_F(WASAPIAudioOutputStreamTest, ExclusiveModeMinBufferSizeAt48kHz) { | 556 TEST(WASAPIAudioOutputStreamTest, ExclusiveModeMinBufferSizeAt48kHz) { |
| 558 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager_.get()) && | 557 scoped_ptr<AudioManager> audio_manager(AudioManager::CreateForTesting()); |
| 558 ABORT_AUDIO_TEST_IF_NOT(HasCoreAudioAndOutputDevices(audio_manager.get()) && |
| 559 ExclusiveModeIsEnabled()); | 559 ExclusiveModeIsEnabled()); |
| 560 | 560 |
| 561 base::MessageLoopForUI loop; | 561 base::MessageLoopForUI loop; |
| 562 MockAudioSourceCallback source; | 562 MockAudioSourceCallback source; |
| 563 | 563 |
| 564 // Create exclusive-mode WASAPI output stream which plays out in stereo | 564 // Create exclusive-mode WASAPI output stream which plays out in stereo |
| 565 // using the minimum buffer size at 48kHz sample rate. | 565 // using the minimum buffer size at 48kHz sample rate. |
| 566 AudioOutputStreamWrapper aosw(audio_manager_.get()); | 566 AudioOutputStreamWrapper aosw(audio_manager.get()); |
| 567 AudioOutputStream* aos = aosw.Create(48000, 160); | 567 AudioOutputStream* aos = aosw.Create(48000, 160); |
| 568 EXPECT_TRUE(aos->Open()); | 568 EXPECT_TRUE(aos->Open()); |
| 569 | 569 |
| 570 // Derive the expected size in bytes of each packet. | 570 // Derive the expected size in bytes of each packet. |
| 571 uint32 bytes_per_packet = aosw.channels() * aosw.samples_per_packet() * | 571 uint32 bytes_per_packet = aosw.channels() * aosw.samples_per_packet() * |
| 572 (aosw.bits_per_sample() / 8); | 572 (aosw.bits_per_sample() / 8); |
| 573 | 573 |
| 574 // Wait for the first callback and verify its parameters. | 574 // Wait for the first callback and verify its parameters. |
| 575 EXPECT_CALL(source, OnMoreData(NotNull(), HasValidDelay(bytes_per_packet))) | 575 EXPECT_CALL(source, OnMoreData(NotNull(), HasValidDelay(bytes_per_packet))) |
| 576 .WillOnce(DoAll( | 576 .WillOnce(DoAll( |
| 577 QuitLoop(loop.message_loop_proxy()), | 577 QuitLoop(loop.message_loop_proxy()), |
| 578 Return(aosw.samples_per_packet()))) | 578 Return(aosw.samples_per_packet()))) |
| 579 .WillRepeatedly(Return(aosw.samples_per_packet())); | 579 .WillRepeatedly(Return(aosw.samples_per_packet())); |
| 580 | 580 |
| 581 aos->Start(&source); | 581 aos->Start(&source); |
| 582 loop.PostDelayedTask(FROM_HERE, base::MessageLoop::QuitClosure(), | 582 loop.PostDelayedTask(FROM_HERE, base::MessageLoop::QuitClosure(), |
| 583 TestTimeouts::action_timeout()); | 583 TestTimeouts::action_timeout()); |
| 584 loop.Run(); | 584 loop.Run(); |
| 585 aos->Stop(); | 585 aos->Stop(); |
| 586 aos->Close(); | 586 aos->Close(); |
| 587 } | 587 } |
| 588 | 588 |
| 589 // Verify that we can open and start the output stream in exclusive mode at | 589 // Verify that we can open and start the output stream in exclusive mode at |
| 590 // the lowest possible delay at 44.1kHz. | 590 // the lowest possible delay at 44.1kHz. |
| 591 TEST_F(WASAPIAudioOutputStreamTest, ExclusiveModeMinBufferSizeAt44kHz) { | 591 TEST(WASAPIAudioOutputStreamTest, ExclusiveModeMinBufferSizeAt44kHz) { |
| 592 ABORT_AUDIO_TEST_IF_NOT(ExclusiveModeIsEnabled()); | 592 ABORT_AUDIO_TEST_IF_NOT(ExclusiveModeIsEnabled()); |
| 593 scoped_ptr<AudioManager> audio_manager(AudioManager::CreateForTesting()); |
| 593 | 594 |
| 594 base::MessageLoopForUI loop; | 595 base::MessageLoopForUI loop; |
| 595 MockAudioSourceCallback source; | 596 MockAudioSourceCallback source; |
| 596 | 597 |
| 597 // Create exclusive-mode WASAPI output stream which plays out in stereo | 598 // Create exclusive-mode WASAPI output stream which plays out in stereo |
| 598 // using the minimum buffer size at 44.1kHz sample rate. | 599 // using the minimum buffer size at 44.1kHz sample rate. |
| 599 AudioOutputStreamWrapper aosw(audio_manager_.get()); | 600 AudioOutputStreamWrapper aosw(audio_manager.get()); |
| 600 AudioOutputStream* aos = aosw.Create(44100, 160); | 601 AudioOutputStream* aos = aosw.Create(44100, 160); |
| 601 EXPECT_TRUE(aos->Open()); | 602 EXPECT_TRUE(aos->Open()); |
| 602 | 603 |
| 603 // Derive the expected size in bytes of each packet. | 604 // Derive the expected size in bytes of each packet. |
| 604 uint32 bytes_per_packet = aosw.channels() * aosw.samples_per_packet() * | 605 uint32 bytes_per_packet = aosw.channels() * aosw.samples_per_packet() * |
| 605 (aosw.bits_per_sample() / 8); | 606 (aosw.bits_per_sample() / 8); |
| 606 | 607 |
| 607 // Wait for the first callback and verify its parameters. | 608 // Wait for the first callback and verify its parameters. |
| 608 EXPECT_CALL(source, OnMoreData(NotNull(), HasValidDelay(bytes_per_packet))) | 609 EXPECT_CALL(source, OnMoreData(NotNull(), HasValidDelay(bytes_per_packet))) |
| 609 .WillOnce(DoAll( | 610 .WillOnce(DoAll( |
| 610 QuitLoop(loop.message_loop_proxy()), | 611 QuitLoop(loop.message_loop_proxy()), |
| 611 Return(aosw.samples_per_packet()))) | 612 Return(aosw.samples_per_packet()))) |
| 612 .WillRepeatedly(Return(aosw.samples_per_packet())); | 613 .WillRepeatedly(Return(aosw.samples_per_packet())); |
| 613 | 614 |
| 614 aos->Start(&source); | 615 aos->Start(&source); |
| 615 loop.PostDelayedTask(FROM_HERE, base::MessageLoop::QuitClosure(), | 616 loop.PostDelayedTask(FROM_HERE, base::MessageLoop::QuitClosure(), |
| 616 TestTimeouts::action_timeout()); | 617 TestTimeouts::action_timeout()); |
| 617 loop.Run(); | 618 loop.Run(); |
| 618 aos->Stop(); | 619 aos->Stop(); |
| 619 aos->Close(); | 620 aos->Close(); |
| 620 } | 621 } |
| 621 | 622 |
| 622 } // namespace media | 623 } // namespace media |
| OLD | NEW |