Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(395)

Side by Side Diff: media/audio/win/audio_low_latency_output_win_unittest.cc

Issue 10823100: Adds support for multi-channel output audio for the low-latency path in Windows. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 22 matching lines...) Expand all
33 using ::testing::Gt; 33 using ::testing::Gt;
34 using ::testing::InvokeWithoutArgs; 34 using ::testing::InvokeWithoutArgs;
35 using ::testing::NotNull; 35 using ::testing::NotNull;
36 using ::testing::Return; 36 using ::testing::Return;
37 using base::win::ScopedCOMInitializer; 37 using base::win::ScopedCOMInitializer;
38 38
39 namespace media { 39 namespace media {
40 40
41 static const char kSpeechFile_16b_s_48k[] = "speech_16b_stereo_48kHz.raw"; 41 static const char kSpeechFile_16b_s_48k[] = "speech_16b_stereo_48kHz.raw";
42 static const char kSpeechFile_16b_s_44k[] = "speech_16b_stereo_44kHz.raw"; 42 static const char kSpeechFile_16b_s_44k[] = "speech_16b_stereo_44kHz.raw";
43 static const char kSpeechFile_16b_m_48k[] = "speech_16b_mono_48kHz.raw";
44 static const char kSpeechFile_16b_m_44k[] = "speech_16b_mono_44kHz.raw";
43 static const size_t kFileDurationMs = 20000; 45 static const size_t kFileDurationMs = 20000;
44 static const size_t kNumFileSegments = 2; 46 static const size_t kNumFileSegments = 2;
45 47
46 static const size_t kMaxDeltaSamples = 1000; 48 static const size_t kMaxDeltaSamples = 1000;
47 static const char* kDeltaTimeMsFileName = "delta_times_ms.txt"; 49 static const char* kDeltaTimeMsFileName = "delta_times_ms.txt";
48 50
49 MATCHER_P(HasValidDelay, value, "") { 51 MATCHER_P(HasValidDelay, value, "") {
50 // It is difficult to come up with a perfect test condition for the delay 52 // It is difficult to come up with a perfect test condition for the delay
51 // estimation. For now, verify that the produced output delay is always 53 // estimation. For now, verify that the produced output delay is always
52 // larger than the selected buffer size. 54 // larger than the selected buffer size.
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 AudioOutputStreamWrapper aosw(audio_manager); 243 AudioOutputStreamWrapper aosw(audio_manager);
242 AudioOutputStream* aos = aosw.Create(); 244 AudioOutputStream* aos = aosw.Create();
243 return aos; 245 return aos;
244 } 246 }
245 247
246 // Verify that we can retrieve the current hardware/mixing sample rate 248 // Verify that we can retrieve the current hardware/mixing sample rate
247 // for all supported device roles. The ERole enumeration defines constants 249 // for all supported device roles. The ERole enumeration defines constants
248 // that indicate the role that the system/user has assigned to an audio 250 // that indicate the role that the system/user has assigned to an audio
249 // endpoint device. 251 // endpoint device.
250 // TODO(henrika): modify this test when we support full device enumeration. 252 // TODO(henrika): modify this test when we support full device enumeration.
251 TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestHardwareSampleRate) { 253 TEST(WASAPIAudioOutputStreamTest, HardwareSampleRate) {
252 // Skip this test in exclusive mode since the resulting rate is only utilized 254 // Skip this test in exclusive mode since the resulting rate is only utilized
253 // for shared mode streams. 255 // for shared mode streams.
254 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 256 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
255 if (!CanRunAudioTests(audio_manager.get()) || ExclusiveModeIsEnabled()) 257 if (!CanRunAudioTests(audio_manager.get()) || ExclusiveModeIsEnabled())
256 return; 258 return;
257 259
258 ScopedCOMInitializer com_init(ScopedCOMInitializer::kMTA); 260 ScopedCOMInitializer com_init(ScopedCOMInitializer::kMTA);
259 261
260 // Default device intended for games, system notification sounds, 262 // Default device intended for games, system notification sounds,
261 // and voice commands. 263 // and voice commands.
262 int fs = static_cast<int>( 264 int fs = static_cast<int>(
263 WASAPIAudioOutputStream::HardwareSampleRate(eConsole)); 265 WASAPIAudioOutputStream::HardwareSampleRate(eConsole));
264 EXPECT_GE(fs, 0); 266 EXPECT_GE(fs, 0);
265 267
266 // Default communication device intended for e.g. VoIP communication. 268 // Default communication device intended for e.g. VoIP communication.
267 fs = static_cast<int>( 269 fs = static_cast<int>(
268 WASAPIAudioOutputStream::HardwareSampleRate(eCommunications)); 270 WASAPIAudioOutputStream::HardwareSampleRate(eCommunications));
269 EXPECT_GE(fs, 0); 271 EXPECT_GE(fs, 0);
270 272
271 // Multimedia device for music, movies and live music recording. 273 // Multimedia device for music, movies and live music recording.
272 fs = static_cast<int>( 274 fs = static_cast<int>(
273 WASAPIAudioOutputStream::HardwareSampleRate(eMultimedia)); 275 WASAPIAudioOutputStream::HardwareSampleRate(eMultimedia));
274 EXPECT_GE(fs, 0); 276 EXPECT_GE(fs, 0);
275 } 277 }
276 278
277 // Test Create(), Close() calling sequence. 279 // Test Create(), Close() calling sequence.
278 TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestCreateAndClose) { 280 TEST(WASAPIAudioOutputStreamTest, CreateAndClose) {
279 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 281 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
280 if (!CanRunAudioTests(audio_manager.get())) 282 if (!CanRunAudioTests(audio_manager.get()))
281 return; 283 return;
282 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get()); 284 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get());
283 aos->Close(); 285 aos->Close();
284 } 286 }
285 287
286 // Test Open(), Close() calling sequence. 288 // Verify that the created object is configured to use the same number of
287 TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestOpenAndClose) { 289 // audio channels as is reported by the static HardwareChannelCount() method.
290 TEST(WASAPIAudioOutputStreamTest, HardwareChannelCount) {
288 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 291 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
289 if (!CanRunAudioTests(audio_manager.get())) 292 if (!CanRunAudioTests(audio_manager.get()))
290 return; 293 return;
294
295 ScopedCOMInitializer com_init(ScopedCOMInitializer::kMTA);
296
297 // First, verify that we can read a valid native/hardware channel-count.
298 int hardware_channel_count = WASAPIAudioOutputStream::HardwareChannelCount();
299 EXPECT_GE(hardware_channel_count, 1);
300
301 AudioOutputStreamWrapper aosw(audio_manager.get());
302 WASAPIAudioOutputStream* aos =
303 static_cast<WASAPIAudioOutputStream*>(aosw.Create(CHANNEL_LAYOUT_MONO));
304
305 // Next, ensure that the created output stream object is really using the
306 // hardware channel-count.
307 EXPECT_EQ(hardware_channel_count, aos->endpoint_channel_count());
308 aos->Close();
309
310 // Try to use a non-supported combination of channel configurations if the
311 // number of hardware channels is 2.
312 if (hardware_channel_count == 2) {
313 // It should be possible to create and object even for an invalid channel-
314 // count combination (7.1 -> 2).
315 WASAPIAudioOutputStream* aos =
316 static_cast<WASAPIAudioOutputStream*>(aosw.Create(CHANNEL_LAYOUT_7_1));
317
318 // But an attempt to open a stream shall fail since down-mixing is not
319 // yet supported.
320 EXPECT_FALSE(aos->Open());
321 aos->Close();
322 }
323 }
324
325 // Test Open(), Close() calling sequence.
326 TEST(WASAPIAudioOutputStreamTest, OpenAndClose) {
327 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
328 if (!CanRunAudioTests(audio_manager.get()))
329 return;
291 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get()); 330 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get());
292 EXPECT_TRUE(aos->Open()); 331 EXPECT_TRUE(aos->Open());
293 aos->Close(); 332 aos->Close();
294 } 333 }
295 334
296 // Test Open(), Start(), Close() calling sequence. 335 // Test Open(), Start(), Close() calling sequence.
297 TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestOpenStartAndClose) { 336 TEST(WASAPIAudioOutputStreamTest, OpenStartAndClose) {
298 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 337 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
299 if (!CanRunAudioTests(audio_manager.get())) 338 if (!CanRunAudioTests(audio_manager.get()))
300 return; 339 return;
301 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get()); 340 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get());
302 EXPECT_TRUE(aos->Open()); 341 EXPECT_TRUE(aos->Open());
303 MockAudioSourceCallback source; 342 MockAudioSourceCallback source;
304 EXPECT_CALL(source, OnError(aos, _)) 343 EXPECT_CALL(source, OnError(aos, _))
305 .Times(0); 344 .Times(0);
306 aos->Start(&source); 345 aos->Start(&source);
307 aos->Close(); 346 aos->Close();
308 } 347 }
309 348
310 // Test Open(), Start(), Stop(), Close() calling sequence. 349 // Test Open(), Start(), Stop(), Close() calling sequence.
311 TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestOpenStartStopAndClose) { 350 TEST(WASAPIAudioOutputStreamTest, OpenStartStopAndClose) {
312 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 351 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
313 if (!CanRunAudioTests(audio_manager.get())) 352 if (!CanRunAudioTests(audio_manager.get()))
314 return; 353 return;
315 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get()); 354 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get());
316 EXPECT_TRUE(aos->Open()); 355 EXPECT_TRUE(aos->Open());
317 MockAudioSourceCallback source; 356 MockAudioSourceCallback source;
318 EXPECT_CALL(source, OnError(aos, _)) 357 EXPECT_CALL(source, OnError(aos, _))
319 .Times(0); 358 .Times(0);
320 aos->Start(&source); 359 aos->Start(&source);
321 aos->Stop(); 360 aos->Stop();
322 aos->Close(); 361 aos->Close();
323 } 362 }
324 363
325 // Test SetVolume(), GetVolume() 364 // Test SetVolume(), GetVolume()
326 TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestVolume) { 365 TEST(WASAPIAudioOutputStreamTest, Volume) {
327 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 366 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
328 if (!CanRunAudioTests(audio_manager.get())) 367 if (!CanRunAudioTests(audio_manager.get()))
329 return; 368 return;
330 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get()); 369 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get());
331 370
332 // Initial volume should be full volume (1.0). 371 // Initial volume should be full volume (1.0).
333 double volume = 0.0; 372 double volume = 0.0;
334 aos->GetVolume(&volume); 373 aos->GetVolume(&volume);
335 EXPECT_EQ(1.0, volume); 374 EXPECT_EQ(1.0, volume);
336 375
(...skipping 16 matching lines...) Expand all
353 EXPECT_EQ(1.0, volume); 392 EXPECT_EQ(1.0, volume);
354 393
355 aos->SetVolume(-0.5); 394 aos->SetVolume(-0.5);
356 aos->GetVolume(&volume); 395 aos->GetVolume(&volume);
357 EXPECT_EQ(1.0, volume); 396 EXPECT_EQ(1.0, volume);
358 397
359 aos->Close(); 398 aos->Close();
360 } 399 }
361 400
362 // Test some additional calling sequences. 401 // Test some additional calling sequences.
363 TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestMiscCallingSequences) { 402 TEST(WASAPIAudioOutputStreamTest, MiscCallingSequences) {
364 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 403 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
365 if (!CanRunAudioTests(audio_manager.get())) 404 if (!CanRunAudioTests(audio_manager.get()))
366 return; 405 return;
367 406
368 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get()); 407 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get());
369 WASAPIAudioOutputStream* waos = static_cast<WASAPIAudioOutputStream*>(aos); 408 WASAPIAudioOutputStream* waos = static_cast<WASAPIAudioOutputStream*>(aos);
370 409
371 // Open(), Open() is a valid calling sequence (second call does nothing). 410 // Open(), Open() is a valid calling sequence (second call does nothing).
372 EXPECT_TRUE(aos->Open()); 411 EXPECT_TRUE(aos->Open());
373 EXPECT_TRUE(aos->Open()); 412 EXPECT_TRUE(aos->Open());
(...skipping 19 matching lines...) Expand all
393 EXPECT_FALSE(waos->started()); 432 EXPECT_FALSE(waos->started());
394 aos->Start(&source); 433 aos->Start(&source);
395 EXPECT_TRUE(waos->started()); 434 EXPECT_TRUE(waos->started());
396 aos->Stop(); 435 aos->Stop();
397 EXPECT_FALSE(waos->started()); 436 EXPECT_FALSE(waos->started());
398 437
399 aos->Close(); 438 aos->Close();
400 } 439 }
401 440
402 // Use default packet size (10ms) and verify that rendering starts. 441 // Use default packet size (10ms) and verify that rendering starts.
403 TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestPacketSizeInMilliseconds) { 442 TEST(WASAPIAudioOutputStreamTest, PacketSizeInMilliseconds) {
404 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 443 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
405 if (!CanRunAudioTests(audio_manager.get())) 444 if (!CanRunAudioTests(audio_manager.get()))
406 return; 445 return;
407 446
408 MessageLoopForUI loop; 447 MessageLoopForUI loop;
409 MockAudioSourceCallback source; 448 MockAudioSourceCallback source;
410 449
411 // Create default WASAPI output stream which plays out in stereo using 450 // Create default WASAPI output stream which plays out in stereo using
412 // the shared mixing rate. The default buffer size is 10ms. 451 // the shared mixing rate. The default buffer size is 10ms.
413 AudioOutputStreamWrapper aosw(audio_manager.get()); 452 AudioOutputStreamWrapper aosw(audio_manager.get());
(...skipping 17 matching lines...) Expand all
431 aos->Start(&source); 470 aos->Start(&source);
432 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(), 471 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(),
433 TestTimeouts::action_timeout()); 472 TestTimeouts::action_timeout());
434 loop.Run(); 473 loop.Run();
435 aos->Stop(); 474 aos->Stop();
436 aos->Close(); 475 aos->Close();
437 } 476 }
438 477
439 // Use a fixed packets size (independent of sample rate) and verify 478 // Use a fixed packets size (independent of sample rate) and verify
440 // that rendering starts. 479 // that rendering starts.
441 TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestPacketSizeInSamples) { 480 TEST(WASAPIAudioOutputStreamTest, PacketSizeInSamples) {
442 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 481 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
443 if (!CanRunAudioTests(audio_manager.get())) 482 if (!CanRunAudioTests(audio_manager.get()))
444 return; 483 return;
445 484
446 MessageLoopForUI loop; 485 MessageLoopForUI loop;
447 MockAudioSourceCallback source; 486 MockAudioSourceCallback source;
448 487
449 // Create default WASAPI output stream which plays out in stereo using 488 // Create default WASAPI output stream which reads data in stereo using
450 // the shared mixing rate. The buffer size is set to 1024 samples. 489 // the native mixing rate and channel count. The buffer size is set to
490 // 1024 samples.
451 AudioOutputStreamWrapper aosw(audio_manager.get()); 491 AudioOutputStreamWrapper aosw(audio_manager.get());
452 AudioOutputStream* aos = aosw.Create(1024); 492 AudioOutputStream* aos = aosw.Create(1024);
453 EXPECT_TRUE(aos->Open()); 493 EXPECT_TRUE(aos->Open());
454 494
455 // Derive the expected size in bytes of each packet. 495 // Derive the expected size in bytes of each packet.
456 uint32 bytes_per_packet = aosw.channels() * aosw.samples_per_packet() * 496 uint32 bytes_per_packet = aosw.channels() * aosw.samples_per_packet() *
457 (aosw.bits_per_sample() / 8); 497 (aosw.bits_per_sample() / 8);
458 498
459 // Set up expected minimum delay estimation. 499 // Set up expected minimum delay estimation.
460 AudioBuffersState state(0, bytes_per_packet); 500 AudioBuffersState state(0, bytes_per_packet);
461 501
462 // Ensure that callbacks start correctly. 502 // Ensure that callbacks start correctly.
463 EXPECT_CALL(source, OnMoreData(NotNull(), bytes_per_packet, 503 EXPECT_CALL(source, OnMoreData(NotNull(), bytes_per_packet,
464 HasValidDelay(state))) 504 HasValidDelay(state)))
465 .WillOnce(DoAll( 505 .WillOnce(DoAll(
466 QuitLoop(loop.message_loop_proxy()), 506 QuitLoop(loop.message_loop_proxy()),
467 Return(bytes_per_packet))) 507 Return(bytes_per_packet)))
468 .WillRepeatedly(Return(bytes_per_packet)); 508 .WillRepeatedly(Return(bytes_per_packet));
469 509
470 aos->Start(&source); 510 aos->Start(&source);
471 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(), 511 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(),
472 TestTimeouts::action_timeout()); 512 TestTimeouts::action_timeout());
473 loop.Run(); 513 loop.Run();
474 aos->Stop(); 514 aos->Stop();
475 aos->Close(); 515 aos->Close();
476 } 516 }
477 517
478 TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestMono) { 518 TEST(WASAPIAudioOutputStreamTest, Mono) {
479 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 519 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
480 if (!CanRunAudioTests(audio_manager.get())) 520 if (!CanRunAudioTests(audio_manager.get()))
481 return; 521 return;
482 522
483 MessageLoopForUI loop; 523 MessageLoopForUI loop;
484 MockAudioSourceCallback source; 524 MockAudioSourceCallback source;
485 525
486 // Create default WASAPI output stream which plays out in *mono* using 526 // Create default WASAPI output stream which reads data *mono* using
487 // the shared mixing rate. The default buffer size is 10ms. 527 // the native mixing rate and channel count. The default buffer size is 10ms.
488 AudioOutputStreamWrapper aosw(audio_manager.get()); 528 AudioOutputStreamWrapper aosw(audio_manager.get());
489 AudioOutputStream* aos = aosw.Create(CHANNEL_LAYOUT_MONO); 529 AudioOutputStream* aos = aosw.Create(CHANNEL_LAYOUT_MONO);
530 EXPECT_TRUE(aos->Open());
490 531
491 bool opened = aos->Open();
492 if (!opened) {
493 // It was not possible to open this audio device in mono.
494 // No point in continuing the test so let's break here.
495 LOG(WARNING) << "Mono is not supported. Skipping test.";
496 aos->Close();
497 return;
498 }
499 // Derive the expected size in bytes of each packet. 532 // Derive the expected size in bytes of each packet.
500 uint32 bytes_per_packet = aosw.channels() * aosw.samples_per_packet() * 533 uint32 bytes_per_packet = aosw.channels() * aosw.samples_per_packet() *
501 (aosw.bits_per_sample() / 8); 534 (aosw.bits_per_sample() / 8);
502 535
503 // Set up expected minimum delay estimation. 536 // Set up expected minimum delay estimation.
504 AudioBuffersState state(0, bytes_per_packet); 537 AudioBuffersState state(0, bytes_per_packet);
505 538
506 EXPECT_CALL(source, OnMoreData(NotNull(), bytes_per_packet, 539 EXPECT_CALL(source, OnMoreData(NotNull(), bytes_per_packet,
507 HasValidDelay(state))) 540 HasValidDelay(state)))
508 .WillOnce(DoAll( 541 .WillOnce(DoAll(
509 QuitLoop(loop.message_loop_proxy()), 542 QuitLoop(loop.message_loop_proxy()),
510 Return(bytes_per_packet))) 543 Return(bytes_per_packet)))
511 .WillRepeatedly(Return(bytes_per_packet)); 544 .WillRepeatedly(Return(bytes_per_packet));
512 545
513 aos->Start(&source); 546 aos->Start(&source);
514 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(), 547 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(),
515 TestTimeouts::action_timeout()); 548 TestTimeouts::action_timeout());
516 loop.Run(); 549 loop.Run();
517 aos->Stop(); 550 aos->Stop();
518 aos->Close(); 551 aos->Close();
519 } 552 }
520 553
521 // This test is intended for manual tests and should only be enabled 554 // This test is intended for manual tests and should only be enabled
522 // when it is required to store the captured data on a local file. 555 // when it is required to play out data from a local PCM file.
523 // By default, GTest will print out YOU HAVE 1 DISABLED TEST. 556 // By default, GTest will print out YOU HAVE 1 DISABLED TEST.
524 // To include disabled tests in test execution, just invoke the test program 557 // To include disabled tests in test execution, just invoke the test program
525 // with --gtest_also_run_disabled_tests or set the GTEST_ALSO_RUN_DISABLED_TESTS 558 // with --gtest_also_run_disabled_tests or set the GTEST_ALSO_RUN_DISABLED_TESTS
526 // environment variable to a value greater than 0. 559 // environment variable to a value greater than 0.
527 // The test files are approximately 20 seconds long. 560 // The test files are approximately 20 seconds long.
528 TEST(WinAudioOutputTest, DISABLED_WASAPIAudioOutputStreamReadFromFile) { 561 TEST(WASAPIAudioOutputStreamTest, DISABLED_ReadFromStereoFile) {
529 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 562 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
530 if (!CanRunAudioTests(audio_manager.get())) 563 if (!CanRunAudioTests(audio_manager.get()))
531 return; 564 return;
532 565
533 AudioOutputStreamWrapper aosw(audio_manager.get()); 566 AudioOutputStreamWrapper aosw(audio_manager.get());
534 AudioOutputStream* aos = aosw.Create(); 567 AudioOutputStream* aos = aosw.Create();
535 EXPECT_TRUE(aos->Open()); 568 EXPECT_TRUE(aos->Open());
536 569
537 std::string file_name; 570 std::string file_name;
538 if (aosw.sample_rate() == 48000) { 571 if (aosw.sample_rate() == 48000) {
539 file_name = kSpeechFile_16b_s_48k; 572 file_name = kSpeechFile_16b_s_48k;
540 } else if (aosw.sample_rate() == 44100) { 573 } else if (aosw.sample_rate() == 44100) {
541 file_name = kSpeechFile_16b_s_44k; 574 file_name = kSpeechFile_16b_s_44k;
542 } else if (aosw.sample_rate() == 96000) { 575 } else if (aosw.sample_rate() == 96000) {
543 // Use 48kHz file at 96kHz as well. Will sound like Donald Duck. 576 // Use 48kHz file at 96kHz as well. Will sound like Donald Duck.
544 file_name = kSpeechFile_16b_s_48k; 577 file_name = kSpeechFile_16b_s_48k;
545 } else { 578 } else {
546 FAIL() << "This test supports 44.1, 48kHz and 96kHz only."; 579 FAIL() << "This test supports 44.1, 48kHz and 96kHz only.";
547 return; 580 return;
548 } 581 }
549 ReadFromFileAudioSource file_source(file_name); 582 ReadFromFileAudioSource file_source(file_name);
550 583
584 LOG(INFO) << "File name : " << file_name.c_str();
585 LOG(INFO) << "Sample rate : " << aosw.sample_rate();
586 LOG(INFO) << "Bits per sample: " << aosw.bits_per_sample();
587 LOG(INFO) << "#channels : " << aosw.channels();
588 LOG(INFO) << "File size : " << file_source.file_size();
589 LOG(INFO) << "#file segments : " << kNumFileSegments;
590 LOG(INFO) << ">> Listen to the stereo file while playing...";
591
592 for (int i = 0; i < kNumFileSegments; i++) {
593 // Each segment will start with a short (~20ms) block of zeros, hence
594 // some short glitches might be heard in this test if kNumFileSegments
595 // is larger than one. The exact length of the silence period depends on
596 // the selected sample rate.
597 aos->Start(&file_source);
598 base::PlatformThread::Sleep(
599 base::TimeDelta::FromMilliseconds(kFileDurationMs / kNumFileSegments));
600 aos->Stop();
601 }
602
603 LOG(INFO) << ">> Stereo file playout has stopped.";
604 aos->Close();
605 }
606
607 // Same as the stereo test but reading and playing out a mono file instead.
608 // It means that most likely a 1->2 channel up-mix will be performed.
609 TEST(WASAPIAudioOutputStreamTest, DISABLED_ReadFromMonoFile) {
610 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
611 if (!CanRunAudioTests(audio_manager.get()))
612 return;
613
614 AudioOutputStreamWrapper aosw(audio_manager.get());
615 AudioOutputStream* aos = aosw.Create(CHANNEL_LAYOUT_MONO);
616 EXPECT_TRUE(aos->Open());
617
618 std::string file_name;
619 if (aosw.sample_rate() == 48000) {
620 file_name = kSpeechFile_16b_m_48k;
621 } else if (aosw.sample_rate() == 44100) {
622 file_name = kSpeechFile_16b_m_44k;
623 } else if (aosw.sample_rate() == 96000) {
624 // Use 48kHz file at 96kHz as well. Will sound like Donald Duck.
625 file_name = kSpeechFile_16b_m_48k;
626 } else {
627 FAIL() << "This test supports 44.1, 48kHz and 96kHz only.";
628 return;
629 }
630 ReadFromFileAudioSource file_source(file_name);
631
551 LOG(INFO) << "File name : " << file_name.c_str(); 632 LOG(INFO) << "File name : " << file_name.c_str();
552 LOG(INFO) << "Sample rate : " << aosw.sample_rate(); 633 LOG(INFO) << "Sample rate : " << aosw.sample_rate();
634 LOG(INFO) << "#channels : " << aosw.channels();
553 LOG(INFO) << "File size : " << file_source.file_size(); 635 LOG(INFO) << "File size : " << file_source.file_size();
554 LOG(INFO) << "#file segments: " << kNumFileSegments; 636 LOG(INFO) << "#file segments: " << kNumFileSegments;
555 LOG(INFO) << ">> Listen to the file while playing..."; 637 LOG(INFO) << ">> Listen to the mono file while playing...";
556 638
557 for (int i = 0; i < kNumFileSegments; i++) { 639 for (int i = 0; i < kNumFileSegments; i++) {
558 // Each segment will start with a short (~20ms) block of zeros, hence 640 // Each segment will start with a short (~20ms) block of zeros, hence
559 // some short glitches might be heard in this test if kNumFileSegments 641 // some short glitches might be heard in this test if kNumFileSegments
560 // is larger than one. The exact length of the silence period depends on 642 // is larger than one. The exact length of the silence period depends on
561 // the selected sample rate. 643 // the selected sample rate.
562 aos->Start(&file_source); 644 aos->Start(&file_source);
563 base::PlatformThread::Sleep( 645 base::PlatformThread::Sleep(
564 base::TimeDelta::FromMilliseconds(kFileDurationMs / kNumFileSegments)); 646 base::TimeDelta::FromMilliseconds(kFileDurationMs / kNumFileSegments));
565 aos->Stop(); 647 aos->Stop();
566 } 648 }
567 649
568 LOG(INFO) << ">> File playout has stopped."; 650 LOG(INFO) << ">> Mono file playout has stopped.";
569 aos->Close(); 651 aos->Close();
570 } 652 }
571 653
572 // Verify that we can open the output stream in exclusive mode using a 654 // Verify that we can open the output stream in exclusive mode using a
573 // certain set of audio parameters and a sample rate of 48kHz. 655 // certain set of audio parameters and a sample rate of 48kHz.
574 // The expected outcomes of each setting in this test has been derived 656 // The expected outcomes of each setting in this test has been derived
575 // manually using log outputs (--v=1). 657 // manually using log outputs (--v=1).
576 TEST(WinAudioOutputTest, WASAPIExclusiveModeBufferSizesAt48kHz) { 658 TEST(WASAPIAudioOutputStreamTest, ExclusiveModeBufferSizesAt48kHz) {
577 if (!ExclusiveModeIsEnabled()) 659 if (!ExclusiveModeIsEnabled())
578 return; 660 return;
579 661
580 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 662 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
581 if (!CanRunAudioTests(audio_manager.get())) 663 if (!CanRunAudioTests(audio_manager.get()))
582 return; 664 return;
583 665
584 AudioOutputStreamWrapper aosw(audio_manager.get()); 666 AudioOutputStreamWrapper aosw(audio_manager.get());
585 667
586 // 10ms @ 48kHz shall work. 668 // 10ms @ 48kHz shall work.
(...skipping 30 matching lines...) Expand all
617 // 3.3333ms @ 48kHz <=> smallest possible buffer size we can use. 699 // 3.3333ms @ 48kHz <=> smallest possible buffer size we can use.
618 aos = aosw.Create(48000, 160); 700 aos = aosw.Create(48000, 160);
619 EXPECT_TRUE(aos->Open()); 701 EXPECT_TRUE(aos->Open());
620 aos->Close(); 702 aos->Close();
621 } 703 }
622 704
623 // Verify that we can open the output stream in exclusive mode using a 705 // Verify that we can open the output stream in exclusive mode using a
624 // certain set of audio parameters and a sample rate of 44.1kHz. 706 // certain set of audio parameters and a sample rate of 44.1kHz.
625 // The expected outcomes of each setting in this test has been derived 707 // The expected outcomes of each setting in this test has been derived
626 // manually using log outputs (--v=1). 708 // manually using log outputs (--v=1).
627 TEST(WinAudioOutputTest, WASAPIExclusiveModeBufferSizesAt44kHz) { 709 TEST(WASAPIAudioOutputStreamTest, ExclusiveModeBufferSizesAt44kHz) {
628 if (!ExclusiveModeIsEnabled()) 710 if (!ExclusiveModeIsEnabled())
629 return; 711 return;
630 712
631 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 713 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
632 if (!CanRunAudioTests(audio_manager.get())) 714 if (!CanRunAudioTests(audio_manager.get()))
633 return; 715 return;
634 716
635 AudioOutputStreamWrapper aosw(audio_manager.get()); 717 AudioOutputStreamWrapper aosw(audio_manager.get());
636 718
637 // 10ms @ 44.1kHz does not work due to misalignment. 719 // 10ms @ 44.1kHz does not work due to misalignment.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 aos->Close(); 757 aos->Close();
676 758
677 // 3.6281ms @ 44.1kHz <=> smallest possible buffer size we can use. 759 // 3.6281ms @ 44.1kHz <=> smallest possible buffer size we can use.
678 aos = aosw.Create(44100, 160); 760 aos = aosw.Create(44100, 160);
679 EXPECT_TRUE(aos->Open()); 761 EXPECT_TRUE(aos->Open());
680 aos->Close(); 762 aos->Close();
681 } 763 }
682 764
683 // Verify that we can open and start the output stream in exclusive mode at 765 // Verify that we can open and start the output stream in exclusive mode at
684 // the lowest possible delay at 48kHz. 766 // the lowest possible delay at 48kHz.
685 TEST(WinAudioOutputTest, WASAPIExclusiveModeMinBufferSizeAt48kHz) { 767 TEST(WASAPIAudioOutputStreamTest, ExclusiveModeMinBufferSizeAt48kHz) {
686 if (!ExclusiveModeIsEnabled()) 768 if (!ExclusiveModeIsEnabled())
687 return; 769 return;
688 770
689 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 771 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
690 if (!CanRunAudioTests(audio_manager.get())) 772 if (!CanRunAudioTests(audio_manager.get()))
691 return; 773 return;
692 774
693 MessageLoopForUI loop; 775 MessageLoopForUI loop;
694 MockAudioSourceCallback source; 776 MockAudioSourceCallback source;
695 777
(...skipping 21 matching lines...) Expand all
717 aos->Start(&source); 799 aos->Start(&source);
718 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(), 800 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(),
719 TestTimeouts::action_timeout()); 801 TestTimeouts::action_timeout());
720 loop.Run(); 802 loop.Run();
721 aos->Stop(); 803 aos->Stop();
722 aos->Close(); 804 aos->Close();
723 } 805 }
724 806
725 // Verify that we can open and start the output stream in exclusive mode at 807 // Verify that we can open and start the output stream in exclusive mode at
726 // the lowest possible delay at 44.1kHz. 808 // the lowest possible delay at 44.1kHz.
727 TEST(WinAudioOutputTest, WASAPIExclusiveModeMinBufferSizeAt44kHz) { 809 TEST(WASAPIAudioOutputStreamTest, ExclusiveModeMinBufferSizeAt44kHz) {
728 if (!ExclusiveModeIsEnabled()) 810 if (!ExclusiveModeIsEnabled())
729 return; 811 return;
730 812
731 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 813 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
732 if (!CanRunAudioTests(audio_manager.get())) 814 if (!CanRunAudioTests(audio_manager.get()))
733 return; 815 return;
734 816
735 MessageLoopForUI loop; 817 MessageLoopForUI loop;
736 MockAudioSourceCallback source; 818 MockAudioSourceCallback source;
737 819
(...skipping 20 matching lines...) Expand all
758 840
759 aos->Start(&source); 841 aos->Start(&source);
760 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(), 842 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(),
761 TestTimeouts::action_timeout()); 843 TestTimeouts::action_timeout());
762 loop.Run(); 844 loop.Run();
763 aos->Stop(); 845 aos->Stop();
764 aos->Close(); 846 aos->Close();
765 } 847 }
766 848
767 } // namespace media 849 } // namespace media
OLDNEW
« no previous file with comments | « media/audio/win/audio_low_latency_output_win.cc ('k') | media/test/data/speech_16b_mono_44kHz.raw » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698