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