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

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: Added more mixing cases and improved the tests 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
288 // Verify that the created object is configured to use the same number of
289 // audio channels as is reported by the static HardwareChannelCount() method.
290 TEST(WASAPIAudioOutputStreamTest, HardwareChannelCount) {
291 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
292 if (!CanRunAudioTests(audio_manager.get()))
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 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get());
302 WASAPIAudioOutputStream* aosw = static_cast<WASAPIAudioOutputStream*>(aos);
303
304 // Next, ensure that the created output stream object is really using the
305 // hardware channel-count.
306 EXPECT_EQ(hardware_channel_count, aosw->endpoint_channel_count());
307 aos->Close();
308 }
309
286 // Test Open(), Close() calling sequence. 310 // Test Open(), Close() calling sequence.
287 TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestOpenAndClose) { 311 TEST(WASAPIAudioOutputStreamTest, OpenAndClose) {
288 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 312 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
289 if (!CanRunAudioTests(audio_manager.get())) 313 if (!CanRunAudioTests(audio_manager.get()))
290 return; 314 return;
291 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get()); 315 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get());
292 EXPECT_TRUE(aos->Open()); 316 EXPECT_TRUE(aos->Open());
293 aos->Close(); 317 aos->Close();
294 } 318 }
295 319
296 // Test Open(), Start(), Close() calling sequence. 320 // Test Open(), Start(), Close() calling sequence.
297 TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestOpenStartAndClose) { 321 TEST(WASAPIAudioOutputStreamTest, OpenStartAndClose) {
298 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 322 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
299 if (!CanRunAudioTests(audio_manager.get())) 323 if (!CanRunAudioTests(audio_manager.get()))
300 return; 324 return;
301 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get()); 325 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get());
302 EXPECT_TRUE(aos->Open()); 326 EXPECT_TRUE(aos->Open());
303 MockAudioSourceCallback source; 327 MockAudioSourceCallback source;
304 EXPECT_CALL(source, OnError(aos, _)) 328 EXPECT_CALL(source, OnError(aos, _))
305 .Times(0); 329 .Times(0);
306 aos->Start(&source); 330 aos->Start(&source);
307 aos->Close(); 331 aos->Close();
308 } 332 }
309 333
310 // Test Open(), Start(), Stop(), Close() calling sequence. 334 // Test Open(), Start(), Stop(), Close() calling sequence.
311 TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestOpenStartStopAndClose) { 335 TEST(WASAPIAudioOutputStreamTest, OpenStartStopAndClose) {
312 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 336 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
313 if (!CanRunAudioTests(audio_manager.get())) 337 if (!CanRunAudioTests(audio_manager.get()))
314 return; 338 return;
315 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get()); 339 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get());
316 EXPECT_TRUE(aos->Open()); 340 EXPECT_TRUE(aos->Open());
317 MockAudioSourceCallback source; 341 MockAudioSourceCallback source;
318 EXPECT_CALL(source, OnError(aos, _)) 342 EXPECT_CALL(source, OnError(aos, _))
319 .Times(0); 343 .Times(0);
320 aos->Start(&source); 344 aos->Start(&source);
321 aos->Stop(); 345 aos->Stop();
322 aos->Close(); 346 aos->Close();
323 } 347 }
324 348
325 // Test SetVolume(), GetVolume() 349 // Test SetVolume(), GetVolume()
326 TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestVolume) { 350 TEST(WASAPIAudioOutputStreamTest, Volume) {
327 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 351 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
328 if (!CanRunAudioTests(audio_manager.get())) 352 if (!CanRunAudioTests(audio_manager.get()))
329 return; 353 return;
330 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get()); 354 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get());
331 355
332 // Initial volume should be full volume (1.0). 356 // Initial volume should be full volume (1.0).
333 double volume = 0.0; 357 double volume = 0.0;
334 aos->GetVolume(&volume); 358 aos->GetVolume(&volume);
335 EXPECT_EQ(1.0, volume); 359 EXPECT_EQ(1.0, volume);
336 360
(...skipping 16 matching lines...) Expand all
353 EXPECT_EQ(1.0, volume); 377 EXPECT_EQ(1.0, volume);
354 378
355 aos->SetVolume(-0.5); 379 aos->SetVolume(-0.5);
356 aos->GetVolume(&volume); 380 aos->GetVolume(&volume);
357 EXPECT_EQ(1.0, volume); 381 EXPECT_EQ(1.0, volume);
358 382
359 aos->Close(); 383 aos->Close();
360 } 384 }
361 385
362 // Test some additional calling sequences. 386 // Test some additional calling sequences.
363 TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestMiscCallingSequences) { 387 TEST(WASAPIAudioOutputStreamTest, MiscCallingSequences) {
364 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 388 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
365 if (!CanRunAudioTests(audio_manager.get())) 389 if (!CanRunAudioTests(audio_manager.get()))
366 return; 390 return;
367 391
368 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get()); 392 AudioOutputStream* aos = CreateDefaultAudioOutputStream(audio_manager.get());
369 WASAPIAudioOutputStream* waos = static_cast<WASAPIAudioOutputStream*>(aos); 393 WASAPIAudioOutputStream* waos = static_cast<WASAPIAudioOutputStream*>(aos);
370 394
371 // Open(), Open() is a valid calling sequence (second call does nothing). 395 // Open(), Open() is a valid calling sequence (second call does nothing).
372 EXPECT_TRUE(aos->Open()); 396 EXPECT_TRUE(aos->Open());
373 EXPECT_TRUE(aos->Open()); 397 EXPECT_TRUE(aos->Open());
(...skipping 19 matching lines...) Expand all
393 EXPECT_FALSE(waos->started()); 417 EXPECT_FALSE(waos->started());
394 aos->Start(&source); 418 aos->Start(&source);
395 EXPECT_TRUE(waos->started()); 419 EXPECT_TRUE(waos->started());
396 aos->Stop(); 420 aos->Stop();
397 EXPECT_FALSE(waos->started()); 421 EXPECT_FALSE(waos->started());
398 422
399 aos->Close(); 423 aos->Close();
400 } 424 }
401 425
402 // Use default packet size (10ms) and verify that rendering starts. 426 // Use default packet size (10ms) and verify that rendering starts.
403 TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestPacketSizeInMilliseconds) { 427 TEST(WASAPIAudioOutputStreamTest, PacketSizeInMilliseconds) {
404 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 428 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
405 if (!CanRunAudioTests(audio_manager.get())) 429 if (!CanRunAudioTests(audio_manager.get()))
406 return; 430 return;
407 431
408 MessageLoopForUI loop; 432 MessageLoopForUI loop;
409 MockAudioSourceCallback source; 433 MockAudioSourceCallback source;
410 434
411 // Create default WASAPI output stream which plays out in stereo using 435 // Create default WASAPI output stream which plays out in stereo using
412 // the shared mixing rate. The default buffer size is 10ms. 436 // the shared mixing rate. The default buffer size is 10ms.
413 AudioOutputStreamWrapper aosw(audio_manager.get()); 437 AudioOutputStreamWrapper aosw(audio_manager.get());
(...skipping 17 matching lines...) Expand all
431 aos->Start(&source); 455 aos->Start(&source);
432 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(), 456 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(),
433 TestTimeouts::action_timeout()); 457 TestTimeouts::action_timeout());
434 loop.Run(); 458 loop.Run();
435 aos->Stop(); 459 aos->Stop();
436 aos->Close(); 460 aos->Close();
437 } 461 }
438 462
439 // Use a fixed packets size (independent of sample rate) and verify 463 // Use a fixed packets size (independent of sample rate) and verify
440 // that rendering starts. 464 // that rendering starts.
441 TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestPacketSizeInSamples) { 465 TEST(WASAPIAudioOutputStreamTest, PacketSizeInSamples) {
442 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 466 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
443 if (!CanRunAudioTests(audio_manager.get())) 467 if (!CanRunAudioTests(audio_manager.get()))
444 return; 468 return;
445 469
446 MessageLoopForUI loop; 470 MessageLoopForUI loop;
447 MockAudioSourceCallback source; 471 MockAudioSourceCallback source;
448 472
449 // Create default WASAPI output stream which plays out in stereo using 473 // Create default WASAPI output stream which reads data in stereo using
450 // the shared mixing rate. The buffer size is set to 1024 samples. 474 // the native mixing rate and channel count. The buffer size is set to
475 // 1024 samples.
451 AudioOutputStreamWrapper aosw(audio_manager.get()); 476 AudioOutputStreamWrapper aosw(audio_manager.get());
452 AudioOutputStream* aos = aosw.Create(1024); 477 AudioOutputStream* aos = aosw.Create(1024);
453 EXPECT_TRUE(aos->Open()); 478 EXPECT_TRUE(aos->Open());
454 479
455 // Derive the expected size in bytes of each packet. 480 // Derive the expected size in bytes of each packet.
456 uint32 bytes_per_packet = aosw.channels() * aosw.samples_per_packet() * 481 uint32 bytes_per_packet = aosw.channels() * aosw.samples_per_packet() *
457 (aosw.bits_per_sample() / 8); 482 (aosw.bits_per_sample() / 8);
458 483
459 // Set up expected minimum delay estimation. 484 // Set up expected minimum delay estimation.
460 AudioBuffersState state(0, bytes_per_packet); 485 AudioBuffersState state(0, bytes_per_packet);
461 486
462 // Ensure that callbacks start correctly. 487 // Ensure that callbacks start correctly.
463 EXPECT_CALL(source, OnMoreData(NotNull(), bytes_per_packet, 488 EXPECT_CALL(source, OnMoreData(NotNull(), bytes_per_packet,
464 HasValidDelay(state))) 489 HasValidDelay(state)))
465 .WillOnce(DoAll( 490 .WillOnce(DoAll(
466 QuitLoop(loop.message_loop_proxy()), 491 QuitLoop(loop.message_loop_proxy()),
467 Return(bytes_per_packet))) 492 Return(bytes_per_packet)))
468 .WillRepeatedly(Return(bytes_per_packet)); 493 .WillRepeatedly(Return(bytes_per_packet));
469 494
470 aos->Start(&source); 495 aos->Start(&source);
471 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(), 496 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(),
472 TestTimeouts::action_timeout()); 497 TestTimeouts::action_timeout());
473 loop.Run(); 498 loop.Run();
474 aos->Stop(); 499 aos->Stop();
475 aos->Close(); 500 aos->Close();
476 } 501 }
477 502
478 TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestMono) { 503 TEST(WASAPIAudioOutputStreamTest, Mono) {
479 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 504 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
480 if (!CanRunAudioTests(audio_manager.get())) 505 if (!CanRunAudioTests(audio_manager.get()))
481 return; 506 return;
482 507
483 MessageLoopForUI loop; 508 MessageLoopForUI loop;
484 MockAudioSourceCallback source; 509 MockAudioSourceCallback source;
485 510
486 // Create default WASAPI output stream which plays out in *mono* using 511 // Create default WASAPI output stream which reads data *mono* using
487 // the shared mixing rate. The default buffer size is 10ms. 512 // the native mixing rate and channel count. The default buffer size is 10ms.
488 AudioOutputStreamWrapper aosw(audio_manager.get()); 513 AudioOutputStreamWrapper aosw(audio_manager.get());
489 AudioOutputStream* aos = aosw.Create(CHANNEL_LAYOUT_MONO); 514 AudioOutputStream* aos = aosw.Create(CHANNEL_LAYOUT_MONO);
515 EXPECT_TRUE(aos->Open());
490 516
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. 517 // Derive the expected size in bytes of each packet.
500 uint32 bytes_per_packet = aosw.channels() * aosw.samples_per_packet() * 518 uint32 bytes_per_packet = aosw.channels() * aosw.samples_per_packet() *
501 (aosw.bits_per_sample() / 8); 519 (aosw.bits_per_sample() / 8);
502 520
503 // Set up expected minimum delay estimation. 521 // Set up expected minimum delay estimation.
504 AudioBuffersState state(0, bytes_per_packet); 522 AudioBuffersState state(0, bytes_per_packet);
505 523
506 EXPECT_CALL(source, OnMoreData(NotNull(), bytes_per_packet, 524 EXPECT_CALL(source, OnMoreData(NotNull(), bytes_per_packet,
507 HasValidDelay(state))) 525 HasValidDelay(state)))
508 .WillOnce(DoAll( 526 .WillOnce(DoAll(
509 QuitLoop(loop.message_loop_proxy()), 527 QuitLoop(loop.message_loop_proxy()),
510 Return(bytes_per_packet))) 528 Return(bytes_per_packet)))
511 .WillRepeatedly(Return(bytes_per_packet)); 529 .WillRepeatedly(Return(bytes_per_packet));
512 530
513 aos->Start(&source); 531 aos->Start(&source);
514 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(), 532 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(),
515 TestTimeouts::action_timeout()); 533 TestTimeouts::action_timeout());
516 loop.Run(); 534 loop.Run();
517 aos->Stop(); 535 aos->Stop();
518 aos->Close(); 536 aos->Close();
519 } 537 }
520 538
521 // This test is intended for manual tests and should only be enabled 539 // 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. 540 // 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. 541 // By default, GTest will print out YOU HAVE 1 DISABLED TEST.
524 // To include disabled tests in test execution, just invoke the test program 542 // 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 543 // with --gtest_also_run_disabled_tests or set the GTEST_ALSO_RUN_DISABLED_TESTS
526 // environment variable to a value greater than 0. 544 // environment variable to a value greater than 0.
527 // The test files are approximately 20 seconds long. 545 // The test files are approximately 20 seconds long.
528 TEST(WinAudioOutputTest, DISABLED_WASAPIAudioOutputStreamReadFromFile) { 546 TEST(WASAPIAudioOutputStreamTest, DISABLED_ReadFromStereoFile) {
529 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 547 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
530 if (!CanRunAudioTests(audio_manager.get())) 548 if (!CanRunAudioTests(audio_manager.get()))
531 return; 549 return;
532 550
533 AudioOutputStreamWrapper aosw(audio_manager.get()); 551 AudioOutputStreamWrapper aosw(audio_manager.get());
534 AudioOutputStream* aos = aosw.Create(); 552 AudioOutputStream* aos = aosw.Create();
535 EXPECT_TRUE(aos->Open()); 553 EXPECT_TRUE(aos->Open());
536 554
537 std::string file_name; 555 std::string file_name;
538 if (aosw.sample_rate() == 48000) { 556 if (aosw.sample_rate() == 48000) {
539 file_name = kSpeechFile_16b_s_48k; 557 file_name = kSpeechFile_16b_s_48k;
540 } else if (aosw.sample_rate() == 44100) { 558 } else if (aosw.sample_rate() == 44100) {
541 file_name = kSpeechFile_16b_s_44k; 559 file_name = kSpeechFile_16b_s_44k;
542 } else if (aosw.sample_rate() == 96000) { 560 } else if (aosw.sample_rate() == 96000) {
543 // Use 48kHz file at 96kHz as well. Will sound like Donald Duck. 561 // Use 48kHz file at 96kHz as well. Will sound like Donald Duck.
544 file_name = kSpeechFile_16b_s_48k; 562 file_name = kSpeechFile_16b_s_48k;
545 } else { 563 } else {
546 FAIL() << "This test supports 44.1, 48kHz and 96kHz only."; 564 FAIL() << "This test supports 44.1, 48kHz and 96kHz only.";
547 return; 565 return;
548 } 566 }
549 ReadFromFileAudioSource file_source(file_name); 567 ReadFromFileAudioSource file_source(file_name);
550 568
551 LOG(INFO) << "File name : " << file_name.c_str(); 569 LOG(INFO) << "File name : " << file_name.c_str();
552 LOG(INFO) << "Sample rate : " << aosw.sample_rate(); 570 LOG(INFO) << "Sample rate : " << aosw.sample_rate();
571 LOG(INFO) << "#channels : " << aosw.channels();
553 LOG(INFO) << "File size : " << file_source.file_size(); 572 LOG(INFO) << "File size : " << file_source.file_size();
554 LOG(INFO) << "#file segments: " << kNumFileSegments; 573 LOG(INFO) << "#file segments: " << kNumFileSegments;
555 LOG(INFO) << ">> Listen to the file while playing..."; 574 LOG(INFO) << ">> Listen to the stereo file while playing...";
556 575
557 for (int i = 0; i < kNumFileSegments; i++) { 576 for (int i = 0; i < kNumFileSegments; i++) {
558 // Each segment will start with a short (~20ms) block of zeros, hence 577 // Each segment will start with a short (~20ms) block of zeros, hence
559 // some short glitches might be heard in this test if kNumFileSegments 578 // 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 579 // is larger than one. The exact length of the silence period depends on
561 // the selected sample rate. 580 // the selected sample rate.
562 aos->Start(&file_source); 581 aos->Start(&file_source);
563 base::PlatformThread::Sleep( 582 base::PlatformThread::Sleep(
564 base::TimeDelta::FromMilliseconds(kFileDurationMs / kNumFileSegments)); 583 base::TimeDelta::FromMilliseconds(kFileDurationMs / kNumFileSegments));
565 aos->Stop(); 584 aos->Stop();
566 } 585 }
567 586
568 LOG(INFO) << ">> File playout has stopped."; 587 LOG(INFO) << ">> Stereo file playout has stopped.";
569 aos->Close(); 588 aos->Close();
570 } 589 }
571 590
591 // Same as the stereo test but reading and playing out a mono file instead.
592 // It means that most likely a 1->2 channel up-mix will be performed.
593 TEST(WASAPIAudioOutputStreamTest, DISABLED_ReadFromMonoFile) {
594 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
595 if (!CanRunAudioTests(audio_manager.get()))
596 return;
597
598 AudioOutputStreamWrapper aosw(audio_manager.get());
599 AudioOutputStream* aos = aosw.Create(CHANNEL_LAYOUT_MONO);
600 EXPECT_TRUE(aos->Open());
601
602 std::string file_name;
603 if (aosw.sample_rate() == 48000) {
604 file_name = kSpeechFile_16b_m_48k;
605 } else if (aosw.sample_rate() == 44100) {
606 file_name = kSpeechFile_16b_m_44k;
607 } else if (aosw.sample_rate() == 96000) {
608 // Use 48kHz file at 96kHz as well. Will sound like Donald Duck.
609 file_name = kSpeechFile_16b_m_48k;
610 } else {
611 FAIL() << "This test supports 44.1, 48kHz and 96kHz only.";
612 return;
613 }
614 ReadFromFileAudioSource file_source(file_name);
615
616 LOG(INFO) << "File name : " << file_name.c_str();
617 LOG(INFO) << "Sample rate : " << aosw.sample_rate();
618 LOG(INFO) << "#channels : " << aosw.channels();
619 LOG(INFO) << "File size : " << file_source.file_size();
620 LOG(INFO) << "#file segments: " << kNumFileSegments;
621 LOG(INFO) << ">> Listen to the mono file while playing...";
622
623 for (int i = 0; i < kNumFileSegments; i++) {
624 // Each segment will start with a short (~20ms) block of zeros, hence
625 // some short glitches might be heard in this test if kNumFileSegments
626 // is larger than one. The exact length of the silence period depends on
627 // the selected sample rate.
628 aos->Start(&file_source);
629 base::PlatformThread::Sleep(
630 base::TimeDelta::FromMilliseconds(kFileDurationMs / kNumFileSegments));
631 aos->Stop();
632 }
633
634 LOG(INFO) << ">> Mono file playout has stopped.";
635 aos->Close();
636 }
637
572 // Verify that we can open the output stream in exclusive mode using a 638 // 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. 639 // certain set of audio parameters and a sample rate of 48kHz.
574 // The expected outcomes of each setting in this test has been derived 640 // The expected outcomes of each setting in this test has been derived
575 // manually using log outputs (--v=1). 641 // manually using log outputs (--v=1).
576 TEST(WinAudioOutputTest, WASAPIExclusiveModeBufferSizesAt48kHz) { 642 TEST(WASAPIAudioOutputStreamTest, ExclusiveModeBufferSizesAt48kHz) {
577 if (!ExclusiveModeIsEnabled()) 643 if (!ExclusiveModeIsEnabled())
578 return; 644 return;
579 645
580 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 646 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
581 if (!CanRunAudioTests(audio_manager.get())) 647 if (!CanRunAudioTests(audio_manager.get()))
582 return; 648 return;
583 649
584 AudioOutputStreamWrapper aosw(audio_manager.get()); 650 AudioOutputStreamWrapper aosw(audio_manager.get());
585 651
586 // 10ms @ 48kHz shall work. 652 // 10ms @ 48kHz shall work.
(...skipping 30 matching lines...) Expand all
617 // 3.3333ms @ 48kHz <=> smallest possible buffer size we can use. 683 // 3.3333ms @ 48kHz <=> smallest possible buffer size we can use.
618 aos = aosw.Create(48000, 160); 684 aos = aosw.Create(48000, 160);
619 EXPECT_TRUE(aos->Open()); 685 EXPECT_TRUE(aos->Open());
620 aos->Close(); 686 aos->Close();
621 } 687 }
622 688
623 // Verify that we can open the output stream in exclusive mode using a 689 // 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. 690 // 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 691 // The expected outcomes of each setting in this test has been derived
626 // manually using log outputs (--v=1). 692 // manually using log outputs (--v=1).
627 TEST(WinAudioOutputTest, WASAPIExclusiveModeBufferSizesAt44kHz) { 693 TEST(WASAPIAudioOutputStreamTest, ExclusiveModeBufferSizesAt44kHz) {
628 if (!ExclusiveModeIsEnabled()) 694 if (!ExclusiveModeIsEnabled())
629 return; 695 return;
630 696
631 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 697 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
632 if (!CanRunAudioTests(audio_manager.get())) 698 if (!CanRunAudioTests(audio_manager.get()))
633 return; 699 return;
634 700
635 AudioOutputStreamWrapper aosw(audio_manager.get()); 701 AudioOutputStreamWrapper aosw(audio_manager.get());
636 702
637 // 10ms @ 44.1kHz does not work due to misalignment. 703 // 10ms @ 44.1kHz does not work due to misalignment.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 aos->Close(); 741 aos->Close();
676 742
677 // 3.6281ms @ 44.1kHz <=> smallest possible buffer size we can use. 743 // 3.6281ms @ 44.1kHz <=> smallest possible buffer size we can use.
678 aos = aosw.Create(44100, 160); 744 aos = aosw.Create(44100, 160);
679 EXPECT_TRUE(aos->Open()); 745 EXPECT_TRUE(aos->Open());
680 aos->Close(); 746 aos->Close();
681 } 747 }
682 748
683 // Verify that we can open and start the output stream in exclusive mode at 749 // Verify that we can open and start the output stream in exclusive mode at
684 // the lowest possible delay at 48kHz. 750 // the lowest possible delay at 48kHz.
685 TEST(WinAudioOutputTest, WASAPIExclusiveModeMinBufferSizeAt48kHz) { 751 TEST(WASAPIAudioOutputStreamTest, ExclusiveModeMinBufferSizeAt48kHz) {
686 if (!ExclusiveModeIsEnabled()) 752 if (!ExclusiveModeIsEnabled())
687 return; 753 return;
688 754
689 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 755 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
690 if (!CanRunAudioTests(audio_manager.get())) 756 if (!CanRunAudioTests(audio_manager.get()))
691 return; 757 return;
692 758
693 MessageLoopForUI loop; 759 MessageLoopForUI loop;
694 MockAudioSourceCallback source; 760 MockAudioSourceCallback source;
695 761
(...skipping 21 matching lines...) Expand all
717 aos->Start(&source); 783 aos->Start(&source);
718 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(), 784 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(),
719 TestTimeouts::action_timeout()); 785 TestTimeouts::action_timeout());
720 loop.Run(); 786 loop.Run();
721 aos->Stop(); 787 aos->Stop();
722 aos->Close(); 788 aos->Close();
723 } 789 }
724 790
725 // Verify that we can open and start the output stream in exclusive mode at 791 // Verify that we can open and start the output stream in exclusive mode at
726 // the lowest possible delay at 44.1kHz. 792 // the lowest possible delay at 44.1kHz.
727 TEST(WinAudioOutputTest, WASAPIExclusiveModeMinBufferSizeAt44kHz) { 793 TEST(WASAPIAudioOutputStreamTest, ExclusiveModeMinBufferSizeAt44kHz) {
728 if (!ExclusiveModeIsEnabled()) 794 if (!ExclusiveModeIsEnabled())
729 return; 795 return;
730 796
731 scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); 797 scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
732 if (!CanRunAudioTests(audio_manager.get())) 798 if (!CanRunAudioTests(audio_manager.get()))
733 return; 799 return;
734 800
735 MessageLoopForUI loop; 801 MessageLoopForUI loop;
736 MockAudioSourceCallback source; 802 MockAudioSourceCallback source;
737 803
(...skipping 20 matching lines...) Expand all
758 824
759 aos->Start(&source); 825 aos->Start(&source);
760 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(), 826 loop.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(),
761 TestTimeouts::action_timeout()); 827 TestTimeouts::action_timeout());
762 loop.Run(); 828 loop.Run();
763 aos->Stop(); 829 aos->Stop();
764 aos->Close(); 830 aos->Close();
765 } 831 }
766 832
767 } // namespace media 833 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698