| 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 |