OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 <stdint.h> | 5 #include <stdint.h> |
6 | 6 |
7 #include "base/macros.h" | 7 #include "base/macros.h" |
8 #include "base/memory/ptr_util.h" | 8 #include "base/memory/ptr_util.h" |
9 #include "base/run_loop.h" | 9 #include "base/run_loop.h" |
10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
(...skipping 16 matching lines...) Expand all Loading... |
27 using testing::AllOf; | 27 using testing::AllOf; |
28 using testing::AtLeast; | 28 using testing::AtLeast; |
29 using testing::DoAll; | 29 using testing::DoAll; |
30 using testing::Field; | 30 using testing::Field; |
31 using testing::InSequence; | 31 using testing::InSequence; |
32 using testing::Invoke; | 32 using testing::Invoke; |
33 using testing::InvokeWithoutArgs; | 33 using testing::InvokeWithoutArgs; |
34 using testing::Mock; | 34 using testing::Mock; |
35 using testing::MockFunction; | 35 using testing::MockFunction; |
36 using testing::Return; | 36 using testing::Return; |
37 using testing::SetArgumentPointee; | 37 using testing::SetArgPointee; |
38 using testing::StrictMock; | 38 using testing::StrictMock; |
39 using testing::StrEq; | 39 using testing::StrEq; |
40 using testing::Unused; | 40 using testing::Unused; |
41 | 41 |
42 namespace media { | 42 namespace media { |
43 | 43 |
44 class MockAlsaWrapper : public AlsaWrapper { | 44 class MockAlsaWrapper : public AlsaWrapper { |
45 public: | 45 public: |
46 MOCK_METHOD3(DeviceNameHint, int(int card, | 46 MOCK_METHOD3(DeviceNameHint, int(int card, |
47 const char* iface, | 47 const char* iface, |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 TEST_F(AlsaPcmOutputStreamTest, LatencyFloor) { | 252 TEST_F(AlsaPcmOutputStreamTest, LatencyFloor) { |
253 const double kMicrosPerFrame = | 253 const double kMicrosPerFrame = |
254 static_cast<double>(1000000) / kTestSampleRate; | 254 static_cast<double>(1000000) / kTestSampleRate; |
255 const double kPacketFramesInMinLatency = | 255 const double kPacketFramesInMinLatency = |
256 AlsaPcmOutputStream::kMinLatencyMicros / kMicrosPerFrame / 2.0; | 256 AlsaPcmOutputStream::kMinLatencyMicros / kMicrosPerFrame / 2.0; |
257 | 257 |
258 // Test that packets which would cause a latency under less than | 258 // Test that packets which would cause a latency under less than |
259 // AlsaPcmOutputStream::kMinLatencyMicros will get clipped to | 259 // AlsaPcmOutputStream::kMinLatencyMicros will get clipped to |
260 // AlsaPcmOutputStream::kMinLatencyMicros, | 260 // AlsaPcmOutputStream::kMinLatencyMicros, |
261 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) | 261 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) |
262 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), | 262 .WillOnce(DoAll(SetArgPointee<0>(kFakeHandle), Return(0))); |
263 Return(0))); | |
264 EXPECT_CALL(mock_alsa_wrapper_, | 263 EXPECT_CALL(mock_alsa_wrapper_, |
265 PcmSetParams(_, _, _, _, _, _, | 264 PcmSetParams(_, _, _, _, _, _, |
266 AlsaPcmOutputStream::kMinLatencyMicros)) | 265 AlsaPcmOutputStream::kMinLatencyMicros)) |
267 .WillOnce(Return(0)); | 266 .WillOnce(Return(0)); |
268 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) | 267 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) |
269 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), | 268 .WillOnce(DoAll(SetArgPointee<1>(kTestFramesPerPacket), |
270 SetArgumentPointee<2>(kTestFramesPerPacket / 2), | 269 SetArgPointee<2>(kTestFramesPerPacket / 2), Return(0))); |
271 Return(0))); | |
272 | 270 |
273 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout, | 271 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout, |
274 kPacketFramesInMinLatency); | 272 kPacketFramesInMinLatency); |
275 ASSERT_TRUE(test_stream->Open()); | 273 ASSERT_TRUE(test_stream->Open()); |
276 | 274 |
277 // Now close it and test that everything was released. | 275 // Now close it and test that everything was released. |
278 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0)); | 276 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0)); |
279 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) | 277 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) |
280 .WillOnce(Return(kTestDeviceName)); | 278 .WillOnce(Return(kTestDeviceName)); |
281 test_stream->Close(); | 279 test_stream->Close(); |
282 | 280 |
283 Mock::VerifyAndClear(&mock_alsa_wrapper_); | 281 Mock::VerifyAndClear(&mock_alsa_wrapper_); |
284 Mock::VerifyAndClear(mock_manager_.get()); | 282 Mock::VerifyAndClear(mock_manager_.get()); |
285 | 283 |
286 // Test that having more packets ends up with a latency based on packet size. | 284 // Test that having more packets ends up with a latency based on packet size. |
287 const int kOverMinLatencyPacketSize = kPacketFramesInMinLatency + 1; | 285 const int kOverMinLatencyPacketSize = kPacketFramesInMinLatency + 1; |
288 int64_t expected_micros = AudioTimestampHelper::FramesToTime( | 286 int64_t expected_micros = AudioTimestampHelper::FramesToTime( |
289 kOverMinLatencyPacketSize * 2, kTestSampleRate) | 287 kOverMinLatencyPacketSize * 2, kTestSampleRate) |
290 .InMicroseconds(); | 288 .InMicroseconds(); |
291 | 289 |
292 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) | 290 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) |
293 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); | 291 .WillOnce(DoAll(SetArgPointee<0>(kFakeHandle), Return(0))); |
294 EXPECT_CALL(mock_alsa_wrapper_, | 292 EXPECT_CALL(mock_alsa_wrapper_, |
295 PcmSetParams(_, _, _, _, _, _, expected_micros)) | 293 PcmSetParams(_, _, _, _, _, _, expected_micros)) |
296 .WillOnce(Return(0)); | 294 .WillOnce(Return(0)); |
297 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) | 295 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) |
298 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), | 296 .WillOnce(DoAll(SetArgPointee<1>(kTestFramesPerPacket), |
299 SetArgumentPointee<2>(kTestFramesPerPacket / 2), | 297 SetArgPointee<2>(kTestFramesPerPacket / 2), Return(0))); |
300 Return(0))); | |
301 | 298 |
302 test_stream = CreateStream(kTestChannelLayout, | 299 test_stream = CreateStream(kTestChannelLayout, |
303 kOverMinLatencyPacketSize); | 300 kOverMinLatencyPacketSize); |
304 ASSERT_TRUE(test_stream->Open()); | 301 ASSERT_TRUE(test_stream->Open()); |
305 | 302 |
306 // Now close it and test that everything was released. | 303 // Now close it and test that everything was released. |
307 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) | 304 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) |
308 .WillOnce(Return(0)); | 305 .WillOnce(Return(0)); |
309 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) | 306 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) |
310 .WillOnce(Return(kTestDeviceName)); | 307 .WillOnce(Return(kTestDeviceName)); |
311 test_stream->Close(); | 308 test_stream->Close(); |
312 | 309 |
313 Mock::VerifyAndClear(&mock_alsa_wrapper_); | 310 Mock::VerifyAndClear(&mock_alsa_wrapper_); |
314 Mock::VerifyAndClear(mock_manager_.get()); | 311 Mock::VerifyAndClear(mock_manager_.get()); |
315 } | 312 } |
316 | 313 |
317 TEST_F(AlsaPcmOutputStreamTest, OpenClose) { | 314 TEST_F(AlsaPcmOutputStreamTest, OpenClose) { |
318 int64_t expected_micros = AudioTimestampHelper::FramesToTime( | 315 int64_t expected_micros = AudioTimestampHelper::FramesToTime( |
319 2 * kTestFramesPerPacket, kTestSampleRate) | 316 2 * kTestFramesPerPacket, kTestSampleRate) |
320 .InMicroseconds(); | 317 .InMicroseconds(); |
321 | 318 |
322 // Open() call opens the playback device, sets the parameters, posts a task | 319 // Open() call opens the playback device, sets the parameters, posts a task |
323 // with the resulting configuration data, and transitions the object state to | 320 // with the resulting configuration data, and transitions the object state to |
324 // kIsOpened. | 321 // kIsOpened. |
325 EXPECT_CALL(mock_alsa_wrapper_, | 322 EXPECT_CALL(mock_alsa_wrapper_, |
326 PcmOpen(_, StrEq(kTestDeviceName), | 323 PcmOpen(_, StrEq(kTestDeviceName), SND_PCM_STREAM_PLAYBACK, |
327 SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) | 324 SND_PCM_NONBLOCK)) |
328 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), | 325 .WillOnce(DoAll(SetArgPointee<0>(kFakeHandle), Return(0))); |
329 Return(0))); | |
330 EXPECT_CALL(mock_alsa_wrapper_, | 326 EXPECT_CALL(mock_alsa_wrapper_, |
331 PcmSetParams(kFakeHandle, | 327 PcmSetParams(kFakeHandle, |
332 SND_PCM_FORMAT_U8, | 328 SND_PCM_FORMAT_U8, |
333 SND_PCM_ACCESS_RW_INTERLEAVED, | 329 SND_PCM_ACCESS_RW_INTERLEAVED, |
334 ChannelLayoutToChannelCount(kTestChannelLayout), | 330 ChannelLayoutToChannelCount(kTestChannelLayout), |
335 kTestSampleRate, | 331 kTestSampleRate, |
336 1, | 332 1, |
337 expected_micros)) | 333 expected_micros)) |
338 .WillOnce(Return(0)); | 334 .WillOnce(Return(0)); |
339 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(kFakeHandle, _, _)) | 335 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(kFakeHandle, _, _)) |
340 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), | 336 .WillOnce(DoAll(SetArgPointee<1>(kTestFramesPerPacket), |
341 SetArgumentPointee<2>(kTestFramesPerPacket / 2), | 337 SetArgPointee<2>(kTestFramesPerPacket / 2), Return(0))); |
342 Return(0))); | |
343 | 338 |
344 // Open the stream. | 339 // Open the stream. |
345 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); | 340 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); |
346 ASSERT_TRUE(test_stream->Open()); | 341 ASSERT_TRUE(test_stream->Open()); |
347 | 342 |
348 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, test_stream->state()); | 343 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, test_stream->state()); |
349 EXPECT_EQ(kFakeHandle, test_stream->playback_handle_); | 344 EXPECT_EQ(kFakeHandle, test_stream->playback_handle_); |
350 EXPECT_EQ(kTestFramesPerPacket, test_stream->frames_per_packet_); | 345 EXPECT_EQ(kTestFramesPerPacket, test_stream->frames_per_packet_); |
351 EXPECT_TRUE(test_stream->buffer_.get()); | 346 EXPECT_TRUE(test_stream->buffer_.get()); |
352 EXPECT_FALSE(test_stream->stop_stream_); | 347 EXPECT_FALSE(test_stream->stop_stream_); |
(...skipping 20 matching lines...) Expand all Loading... |
373 EXPECT_TRUE(test_stream->stop_stream_); | 368 EXPECT_TRUE(test_stream->stop_stream_); |
374 EXPECT_TRUE(test_stream->playback_handle_ == NULL); | 369 EXPECT_TRUE(test_stream->playback_handle_ == NULL); |
375 EXPECT_FALSE(test_stream->buffer_.get()); | 370 EXPECT_FALSE(test_stream->buffer_.get()); |
376 | 371 |
377 // Close the stream since we opened it to make destruction happy. | 372 // Close the stream since we opened it to make destruction happy. |
378 test_stream->Close(); | 373 test_stream->Close(); |
379 } | 374 } |
380 | 375 |
381 TEST_F(AlsaPcmOutputStreamTest, PcmSetParamsFailed) { | 376 TEST_F(AlsaPcmOutputStreamTest, PcmSetParamsFailed) { |
382 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) | 377 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) |
383 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), | 378 .WillOnce(DoAll(SetArgPointee<0>(kFakeHandle), Return(0))); |
384 Return(0))); | |
385 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _)) | 379 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _)) |
386 .WillOnce(Return(kTestFailedErrno)); | 380 .WillOnce(Return(kTestFailedErrno)); |
387 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) | 381 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) |
388 .WillOnce(Return(0)); | 382 .WillOnce(Return(0)); |
389 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) | 383 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) |
390 .WillOnce(Return(kTestDeviceName)); | 384 .WillOnce(Return(kTestDeviceName)); |
391 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) | 385 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) |
392 .WillOnce(Return(kDummyMessage)); | 386 .WillOnce(Return(kDummyMessage)); |
393 | 387 |
394 // If open fails, the stream stays in kCreated because it has effectively had | 388 // If open fails, the stream stays in kCreated because it has effectively had |
395 // no changes. | 389 // no changes. |
396 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); | 390 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); |
397 ASSERT_FALSE(test_stream->Open()); | 391 ASSERT_FALSE(test_stream->Open()); |
398 EXPECT_EQ(AlsaPcmOutputStream::kInError, test_stream->state()); | 392 EXPECT_EQ(AlsaPcmOutputStream::kInError, test_stream->state()); |
399 | 393 |
400 // Ensure internal state is set for a no-op stream if PcmSetParams() failes. | 394 // Ensure internal state is set for a no-op stream if PcmSetParams() failes. |
401 EXPECT_TRUE(test_stream->stop_stream_); | 395 EXPECT_TRUE(test_stream->stop_stream_); |
402 EXPECT_TRUE(test_stream->playback_handle_ == NULL); | 396 EXPECT_TRUE(test_stream->playback_handle_ == NULL); |
403 EXPECT_FALSE(test_stream->buffer_.get()); | 397 EXPECT_FALSE(test_stream->buffer_.get()); |
404 | 398 |
405 // Close the stream since we opened it to make destruction happy. | 399 // Close the stream since we opened it to make destruction happy. |
406 test_stream->Close(); | 400 test_stream->Close(); |
407 } | 401 } |
408 | 402 |
409 TEST_F(AlsaPcmOutputStreamTest, StartStop) { | 403 TEST_F(AlsaPcmOutputStreamTest, StartStop) { |
410 // Open() call opens the playback device, sets the parameters, posts a task | 404 // Open() call opens the playback device, sets the parameters, posts a task |
411 // with the resulting configuration data, and transitions the object state to | 405 // with the resulting configuration data, and transitions the object state to |
412 // kIsOpened. | 406 // kIsOpened. |
413 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) | 407 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) |
414 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), | 408 .WillOnce(DoAll(SetArgPointee<0>(kFakeHandle), Return(0))); |
415 Return(0))); | |
416 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _)) | 409 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _)) |
417 .WillOnce(Return(0)); | 410 .WillOnce(Return(0)); |
418 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) | 411 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) |
419 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), | 412 .WillOnce(DoAll(SetArgPointee<1>(kTestFramesPerPacket), |
420 SetArgumentPointee<2>(kTestFramesPerPacket / 2), | 413 SetArgPointee<2>(kTestFramesPerPacket / 2), Return(0))); |
421 Return(0))); | |
422 | 414 |
423 // Open the stream. | 415 // Open the stream. |
424 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); | 416 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); |
425 ASSERT_TRUE(test_stream->Open()); | 417 ASSERT_TRUE(test_stream->Open()); |
426 base::SimpleTestTickClock* const tick_clock = new base::SimpleTestTickClock(); | 418 base::SimpleTestTickClock* const tick_clock = new base::SimpleTestTickClock(); |
427 tick_clock->SetNowTicks(base::TimeTicks::Now()); | 419 tick_clock->SetNowTicks(base::TimeTicks::Now()); |
428 test_stream->SetTickClockForTesting(base::WrapUnique(tick_clock)); | 420 test_stream->SetTickClockForTesting(base::WrapUnique(tick_clock)); |
429 | 421 |
430 // Expect Device setup. | 422 // Expect Device setup. |
431 EXPECT_CALL(mock_alsa_wrapper_, PcmDrop(kFakeHandle)) | 423 EXPECT_CALL(mock_alsa_wrapper_, PcmDrop(kFakeHandle)) |
432 .WillOnce(Return(0)); | 424 .WillOnce(Return(0)); |
433 EXPECT_CALL(mock_alsa_wrapper_, PcmPrepare(kFakeHandle)) | 425 EXPECT_CALL(mock_alsa_wrapper_, PcmPrepare(kFakeHandle)) |
434 .WillOnce(Return(0)); | 426 .WillOnce(Return(0)); |
435 | 427 |
436 // Expect the pre-roll. | 428 // Expect the pre-roll. |
437 MockAudioSourceCallback mock_callback; | 429 MockAudioSourceCallback mock_callback; |
438 EXPECT_CALL(mock_alsa_wrapper_, PcmState(kFakeHandle)) | 430 EXPECT_CALL(mock_alsa_wrapper_, PcmState(kFakeHandle)) |
439 .WillRepeatedly(Return(SND_PCM_STATE_RUNNING)); | 431 .WillRepeatedly(Return(SND_PCM_STATE_RUNNING)); |
440 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(kFakeHandle, _)) | 432 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(kFakeHandle, _)) |
441 .WillRepeatedly(DoAll(SetArgumentPointee<1>(0), Return(0))); | 433 .WillRepeatedly(DoAll(SetArgPointee<1>(0), Return(0))); |
442 EXPECT_CALL(mock_callback, | 434 EXPECT_CALL(mock_callback, |
443 OnMoreData(base::TimeDelta(), tick_clock->NowTicks(), 0, _)) | 435 OnMoreData(base::TimeDelta(), tick_clock->NowTicks(), 0, _)) |
444 .WillRepeatedly(DoAll(ClearBuffer(), Return(kTestFramesPerPacket))); | 436 .WillRepeatedly(DoAll(ClearBuffer(), Return(kTestFramesPerPacket))); |
445 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, _, _)) | 437 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, _, _)) |
446 .WillRepeatedly(Return(kTestFramesPerPacket)); | 438 .WillRepeatedly(Return(kTestFramesPerPacket)); |
447 | 439 |
448 // Expect scheduling. | 440 // Expect scheduling. |
449 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle)) | 441 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle)) |
450 .Times(AtLeast(2)) | 442 .Times(AtLeast(2)) |
451 .WillRepeatedly(Return(kTestFramesPerPacket)); | 443 .WillRepeatedly(Return(kTestFramesPerPacket)); |
(...skipping 23 matching lines...) Expand all Loading... |
475 | 467 |
476 // Test empty buffer. | 468 // Test empty buffer. |
477 test_stream->buffer_->Clear(); | 469 test_stream->buffer_->Clear(); |
478 test_stream->WritePacket(); | 470 test_stream->WritePacket(); |
479 test_stream->Close(); | 471 test_stream->Close(); |
480 } | 472 } |
481 | 473 |
482 TEST_F(AlsaPcmOutputStreamTest, WritePacket_NormalPacket) { | 474 TEST_F(AlsaPcmOutputStreamTest, WritePacket_NormalPacket) { |
483 // We need to open the stream before writing data to ALSA. | 475 // We need to open the stream before writing data to ALSA. |
484 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) | 476 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) |
485 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), | 477 .WillOnce(DoAll(SetArgPointee<0>(kFakeHandle), Return(0))); |
486 Return(0))); | |
487 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _)) | 478 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _)) |
488 .WillOnce(Return(0)); | 479 .WillOnce(Return(0)); |
489 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) | 480 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) |
490 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), | 481 .WillOnce(DoAll(SetArgPointee<1>(kTestFramesPerPacket), |
491 SetArgumentPointee<2>(kTestFramesPerPacket / 2), | 482 SetArgPointee<2>(kTestFramesPerPacket / 2), Return(0))); |
492 Return(0))); | |
493 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); | 483 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); |
494 ASSERT_TRUE(test_stream->Open()); | 484 ASSERT_TRUE(test_stream->Open()); |
495 InitBuffer(test_stream); | 485 InitBuffer(test_stream); |
496 test_stream->TransitionTo(AlsaPcmOutputStream::kIsPlaying); | 486 test_stream->TransitionTo(AlsaPcmOutputStream::kIsPlaying); |
497 | 487 |
498 // Write a little less than half the data. | 488 // Write a little less than half the data. |
499 int written = packet_->data_size() / kTestBytesPerFrame / 2 - 1; | 489 int written = packet_->data_size() / kTestBytesPerFrame / 2 - 1; |
500 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle)) | 490 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle)) |
501 .WillOnce(Return(written)); | 491 .WillOnce(Return(written)); |
502 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, packet_->data(), _)) | 492 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, packet_->data(), _)) |
(...skipping 19 matching lines...) Expand all Loading... |
522 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) | 512 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) |
523 .WillOnce(Return(0)); | 513 .WillOnce(Return(0)); |
524 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) | 514 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) |
525 .WillOnce(Return(kTestDeviceName)); | 515 .WillOnce(Return(kTestDeviceName)); |
526 test_stream->Close(); | 516 test_stream->Close(); |
527 } | 517 } |
528 | 518 |
529 TEST_F(AlsaPcmOutputStreamTest, WritePacket_WriteFails) { | 519 TEST_F(AlsaPcmOutputStreamTest, WritePacket_WriteFails) { |
530 // We need to open the stream before writing data to ALSA. | 520 // We need to open the stream before writing data to ALSA. |
531 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) | 521 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) |
532 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), | 522 .WillOnce(DoAll(SetArgPointee<0>(kFakeHandle), Return(0))); |
533 Return(0))); | |
534 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _)) | 523 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _)) |
535 .WillOnce(Return(0)); | 524 .WillOnce(Return(0)); |
536 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) | 525 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) |
537 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), | 526 .WillOnce(DoAll(SetArgPointee<1>(kTestFramesPerPacket), |
538 SetArgumentPointee<2>(kTestFramesPerPacket / 2), | 527 SetArgPointee<2>(kTestFramesPerPacket / 2), Return(0))); |
539 Return(0))); | |
540 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); | 528 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); |
541 ASSERT_TRUE(test_stream->Open()); | 529 ASSERT_TRUE(test_stream->Open()); |
542 InitBuffer(test_stream); | 530 InitBuffer(test_stream); |
543 test_stream->TransitionTo(AlsaPcmOutputStream::kIsPlaying); | 531 test_stream->TransitionTo(AlsaPcmOutputStream::kIsPlaying); |
544 | 532 |
545 // Fail due to a recoverable error and see that PcmRecover code path | 533 // Fail due to a recoverable error and see that PcmRecover code path |
546 // continues normally. | 534 // continues normally. |
547 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle)) | 535 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle)) |
548 .WillOnce(Return(kTestFramesPerPacket)); | 536 .WillOnce(Return(kTestFramesPerPacket)); |
549 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, _, _)) | 537 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, _, _)) |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
594 base::SimpleTestTickClock* const tick_clock = new base::SimpleTestTickClock(); | 582 base::SimpleTestTickClock* const tick_clock = new base::SimpleTestTickClock(); |
595 tick_clock->SetNowTicks(base::TimeTicks::Now()); | 583 tick_clock->SetNowTicks(base::TimeTicks::Now()); |
596 test_stream->SetTickClockForTesting(base::WrapUnique(tick_clock)); | 584 test_stream->SetTickClockForTesting(base::WrapUnique(tick_clock)); |
597 InitBuffer(test_stream); | 585 InitBuffer(test_stream); |
598 test_stream->buffer_->Clear(); | 586 test_stream->buffer_->Clear(); |
599 | 587 |
600 MockAudioSourceCallback mock_callback; | 588 MockAudioSourceCallback mock_callback; |
601 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) | 589 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) |
602 .WillOnce(Return(SND_PCM_STATE_RUNNING)); | 590 .WillOnce(Return(SND_PCM_STATE_RUNNING)); |
603 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _)) | 591 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _)) |
604 .WillOnce(DoAll(SetArgumentPointee<1>(1), Return(0))); | 592 .WillOnce(DoAll(SetArgPointee<1>(1), Return(0))); |
605 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) | 593 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) |
606 .WillRepeatedly(Return(0)); // Buffer is full. | 594 .WillRepeatedly(Return(0)); // Buffer is full. |
607 | 595 |
608 // Return a partially filled packet. | 596 // Return a partially filled packet. |
609 EXPECT_CALL(mock_callback, | 597 EXPECT_CALL(mock_callback, |
610 OnMoreData(base::TimeDelta(), tick_clock->NowTicks(), 0, _)) | 598 OnMoreData(base::TimeDelta(), tick_clock->NowTicks(), 0, _)) |
611 .WillOnce(DoAll(ClearBuffer(), Return(kTestFramesPerPacket / 2))); | 599 .WillOnce(DoAll(ClearBuffer(), Return(kTestFramesPerPacket / 2))); |
612 | 600 |
613 bool source_exhausted; | 601 bool source_exhausted; |
614 test_stream->set_source_callback(&mock_callback); | 602 test_stream->set_source_callback(&mock_callback); |
(...skipping 11 matching lines...) Expand all Loading... |
626 tick_clock->SetNowTicks(base::TimeTicks::Now()); | 614 tick_clock->SetNowTicks(base::TimeTicks::Now()); |
627 test_stream->SetTickClockForTesting(base::WrapUnique(tick_clock)); | 615 test_stream->SetTickClockForTesting(base::WrapUnique(tick_clock)); |
628 InitBuffer(test_stream); | 616 InitBuffer(test_stream); |
629 test_stream->buffer_->Clear(); | 617 test_stream->buffer_->Clear(); |
630 | 618 |
631 // Simulate where the underrun has occurred right after checking the delay. | 619 // Simulate where the underrun has occurred right after checking the delay. |
632 MockAudioSourceCallback mock_callback; | 620 MockAudioSourceCallback mock_callback; |
633 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) | 621 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) |
634 .WillOnce(Return(SND_PCM_STATE_RUNNING)); | 622 .WillOnce(Return(SND_PCM_STATE_RUNNING)); |
635 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _)) | 623 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _)) |
636 .WillOnce(DoAll(SetArgumentPointee<1>(-1), Return(0))); | 624 .WillOnce(DoAll(SetArgPointee<1>(-1), Return(0))); |
637 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) | 625 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) |
638 .WillRepeatedly(Return(0)); // Buffer is full. | 626 .WillRepeatedly(Return(0)); // Buffer is full. |
639 EXPECT_CALL(mock_callback, | 627 EXPECT_CALL(mock_callback, |
640 OnMoreData(base::TimeDelta(), tick_clock->NowTicks(), 0, _)) | 628 OnMoreData(base::TimeDelta(), tick_clock->NowTicks(), 0, _)) |
641 .WillOnce(DoAll(ClearBuffer(), Return(kTestFramesPerPacket / 2))); | 629 .WillOnce(DoAll(ClearBuffer(), Return(kTestFramesPerPacket / 2))); |
642 | 630 |
643 bool source_exhausted; | 631 bool source_exhausted; |
644 test_stream->set_source_callback(&mock_callback); | 632 test_stream->set_source_callback(&mock_callback); |
645 test_stream->packet_size_ = kTestPacketSize; | 633 test_stream->packet_size_ = kTestPacketSize; |
646 test_stream->BufferPacket(&source_exhausted); | 634 test_stream->BufferPacket(&source_exhausted); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
723 if (i == 3 || i == 4 || i == 5) // invalid number of channels | 711 if (i == 3 || i == 4 || i == 5) // invalid number of channels |
724 continue; | 712 continue; |
725 SCOPED_TRACE(base::StringPrintf("Attempting %d Channel", i)); | 713 SCOPED_TRACE(base::StringPrintf("Attempting %d Channel", i)); |
726 | 714 |
727 // Hints will only be grabbed for channel numbers that have non-default | 715 // Hints will only be grabbed for channel numbers that have non-default |
728 // devices associated with them. | 716 // devices associated with them. |
729 if (kExpectedDeviceName[i] != AlsaPcmOutputStream::kDefaultDevice) { | 717 if (kExpectedDeviceName[i] != AlsaPcmOutputStream::kDefaultDevice) { |
730 // The DeviceNameHint and DeviceNameFreeHint need to be paired to avoid a | 718 // The DeviceNameHint and DeviceNameFreeHint need to be paired to avoid a |
731 // memory leak. | 719 // memory leak. |
732 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameHint(_, _, _)) | 720 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameHint(_, _, _)) |
733 .WillOnce(DoAll(SetArgumentPointee<2>(&kFakeHints[0]), Return(0))); | 721 .WillOnce(DoAll(SetArgPointee<2>(&kFakeHints[0]), Return(0))); |
734 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameFreeHint(&kFakeHints[0])) | 722 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameFreeHint(&kFakeHints[0])) |
735 .Times(1); | 723 .Times(1); |
736 } | 724 } |
737 | 725 |
738 EXPECT_CALL(mock_alsa_wrapper_, | 726 EXPECT_CALL(mock_alsa_wrapper_, |
739 PcmOpen(_, StrEq(kExpectedDeviceName[i]), _, _)) | 727 PcmOpen(_, StrEq(kExpectedDeviceName[i]), _, _)) |
740 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); | 728 .WillOnce(DoAll(SetArgPointee<0>(kFakeHandle), Return(0))); |
741 EXPECT_CALL(mock_alsa_wrapper_, | 729 EXPECT_CALL(mock_alsa_wrapper_, |
742 PcmSetParams(kFakeHandle, _, _, i, _, _, _)) | 730 PcmSetParams(kFakeHandle, _, _, i, _, _, _)) |
743 .WillOnce(Return(0)); | 731 .WillOnce(Return(0)); |
744 | 732 |
745 // The parameters are specified by ALSA documentation, and are in constants | 733 // The parameters are specified by ALSA documentation, and are in constants |
746 // in the implementation files. | 734 // in the implementation files. |
747 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("IOID"))) | 735 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("IOID"))) |
748 .WillRepeatedly(Invoke(OutputHint)); | 736 .WillRepeatedly(Invoke(OutputHint)); |
749 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("NAME"))) | 737 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("NAME"))) |
750 .WillRepeatedly(Invoke(EchoHint)); | 738 .WillRepeatedly(Invoke(EchoHint)); |
(...skipping 26 matching lines...) Expand all Loading... |
777 const string first_try = kSurround50; | 765 const string first_try = kSurround50; |
778 const string second_try = string(AlsaPcmOutputStream::kPlugPrefix) + | 766 const string second_try = string(AlsaPcmOutputStream::kPlugPrefix) + |
779 kSurround50; | 767 kSurround50; |
780 const string third_try = string(AlsaPcmOutputStream::kPlugPrefix) + | 768 const string third_try = string(AlsaPcmOutputStream::kPlugPrefix) + |
781 kGenericSurround50; | 769 kGenericSurround50; |
782 const string fourth_try = AlsaPcmOutputStream::kDefaultDevice; | 770 const string fourth_try = AlsaPcmOutputStream::kDefaultDevice; |
783 const string fifth_try = string(AlsaPcmOutputStream::kPlugPrefix) + | 771 const string fifth_try = string(AlsaPcmOutputStream::kPlugPrefix) + |
784 AlsaPcmOutputStream::kDefaultDevice; | 772 AlsaPcmOutputStream::kDefaultDevice; |
785 | 773 |
786 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameHint(_, _, _)) | 774 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameHint(_, _, _)) |
787 .WillOnce(DoAll(SetArgumentPointee<2>(&kFakeHints[0]), Return(0))); | 775 .WillOnce(DoAll(SetArgPointee<2>(&kFakeHints[0]), Return(0))); |
788 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameFreeHint(&kFakeHints[0])) | 776 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameFreeHint(&kFakeHints[0])) |
789 .Times(1); | 777 .Times(1); |
790 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("IOID"))) | 778 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("IOID"))) |
791 .WillRepeatedly(Invoke(OutputHint)); | 779 .WillRepeatedly(Invoke(OutputHint)); |
792 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("NAME"))) | 780 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("NAME"))) |
793 .WillRepeatedly(Invoke(EchoHint)); | 781 .WillRepeatedly(Invoke(EchoHint)); |
794 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) | 782 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) |
795 .WillRepeatedly(Return(kDummyMessage)); | 783 .WillRepeatedly(Return(kDummyMessage)); |
796 | 784 |
797 InSequence s; | 785 InSequence s; |
(...skipping 13 matching lines...) Expand all Loading... |
811 test_stream->Close(); | 799 test_stream->Close(); |
812 } | 800 } |
813 | 801 |
814 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_HintFail) { | 802 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_HintFail) { |
815 // Should get |kDefaultDevice|, and force a 2-channel downmix on a failure to | 803 // Should get |kDefaultDevice|, and force a 2-channel downmix on a failure to |
816 // enumerate devices. | 804 // enumerate devices. |
817 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameHint(_, _, _)) | 805 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameHint(_, _, _)) |
818 .WillRepeatedly(Return(kTestFailedErrno)); | 806 .WillRepeatedly(Return(kTestFailedErrno)); |
819 EXPECT_CALL(mock_alsa_wrapper_, | 807 EXPECT_CALL(mock_alsa_wrapper_, |
820 PcmOpen(_, StrEq(AlsaPcmOutputStream::kDefaultDevice), _, _)) | 808 PcmOpen(_, StrEq(AlsaPcmOutputStream::kDefaultDevice), _, _)) |
821 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); | 809 .WillOnce(DoAll(SetArgPointee<0>(kFakeHandle), Return(0))); |
822 EXPECT_CALL(mock_alsa_wrapper_, | 810 EXPECT_CALL(mock_alsa_wrapper_, |
823 PcmSetParams(kFakeHandle, _, _, 2, _, _, _)) | 811 PcmSetParams(kFakeHandle, _, _, 2, _, _, _)) |
824 .WillOnce(Return(0)); | 812 .WillOnce(Return(0)); |
825 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) | 813 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) |
826 .WillOnce(Return(kDummyMessage)); | 814 .WillOnce(Return(kDummyMessage)); |
827 | 815 |
828 AlsaPcmOutputStream* test_stream = CreateStream(CHANNEL_LAYOUT_5_0); | 816 AlsaPcmOutputStream* test_stream = CreateStream(CHANNEL_LAYOUT_5_0); |
829 EXPECT_TRUE(test_stream->AutoSelectDevice(5)); | 817 EXPECT_TRUE(test_stream->AutoSelectDevice(5)); |
830 EXPECT_TRUE(test_stream->channel_mixer_); | 818 EXPECT_TRUE(test_stream->channel_mixer_); |
831 test_stream->Close(); | 819 test_stream->Close(); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
878 | 866 |
879 // TODO(ajwong): Find a way to test whether or not another task has been | 867 // TODO(ajwong): Find a way to test whether or not another task has been |
880 // posted so we can verify that the Alsa code will indeed break the task | 868 // posted so we can verify that the Alsa code will indeed break the task |
881 // posting loop. | 869 // posting loop. |
882 | 870 |
883 test_stream->TransitionTo(AlsaPcmOutputStream::kIsClosed); | 871 test_stream->TransitionTo(AlsaPcmOutputStream::kIsClosed); |
884 test_stream->Close(); | 872 test_stream->Close(); |
885 } | 873 } |
886 | 874 |
887 } // namespace media | 875 } // namespace media |
OLD | NEW |