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

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

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

Powered by Google App Engine
This is Rietveld 408576698