Index: media/audio/linux/alsa_output_unittest.cc |
diff --git a/media/audio/linux/alsa_output_unittest.cc b/media/audio/linux/alsa_output_unittest.cc |
index 3dcc6106e52a1ac24b50e76d2b684b97854f483e..598ca985b798453f4e6e715b183b2c6864339afb 100644 |
--- a/media/audio/linux/alsa_output_unittest.cc |
+++ b/media/audio/linux/alsa_output_unittest.cc |
@@ -47,6 +47,7 @@ class MockAlsaWrapper : public AlsaWrapper { |
unsigned int latency)); |
MOCK_METHOD1(PcmName, const char*(snd_pcm_t* handle)); |
MOCK_METHOD1(PcmAvailUpdate, snd_pcm_sframes_t (snd_pcm_t* handle)); |
+ MOCK_METHOD1(PcmState, snd_pcm_state_t (snd_pcm_t* handle)); |
MOCK_METHOD1(StrError, const char*(int errnum)); |
}; |
@@ -400,6 +401,9 @@ TEST_F(AlsaPcmOutputStreamTest, StartStop) { |
// Expect the pre-roll. |
MockAudioSourceCallback mock_callback; |
+ EXPECT_CALL(mock_alsa_wrapper_, PcmState(kFakeHandle)) |
+ .Times(2) |
+ .WillRepeatedly(Return(SND_PCM_STATE_RUNNING)); |
EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(kFakeHandle, _)) |
.Times(2) |
.WillRepeatedly(DoAll(SetArgumentPointee<1>(0), Return(0))); |
@@ -494,6 +498,8 @@ TEST_F(AlsaPcmOutputStreamTest, BufferPacket) { |
// Return a partially filled packet. |
MockAudioSourceCallback mock_callback; |
+ EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) |
+ .WillOnce(Return(SND_PCM_STATE_RUNNING)); |
EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _)) |
.WillOnce(DoAll(SetArgumentPointee<1>(1), Return(0))); |
EXPECT_CALL(mock_callback, |
@@ -508,6 +514,46 @@ TEST_F(AlsaPcmOutputStreamTest, BufferPacket) { |
EXPECT_EQ(10u, packet_.size); |
} |
+TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Negative) { |
+ packet_.used = packet_.size; |
+ |
+ // Simulate where the underrun has occurred right after checking the delay. |
+ MockAudioSourceCallback mock_callback; |
+ EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) |
+ .WillOnce(Return(SND_PCM_STATE_RUNNING)); |
+ EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _)) |
+ .WillOnce(DoAll(SetArgumentPointee<1>(-1), Return(0))); |
+ EXPECT_CALL(mock_callback, |
+ OnMoreData(test_stream_.get(), packet_.buffer.get(), |
+ packet_.capacity, 0)) |
+ .WillOnce(Return(10)); |
+ |
+ test_stream_->shared_data_.set_source_callback(&mock_callback); |
+ test_stream_->BufferPacket(&packet_); |
+ |
+ EXPECT_EQ(0u, packet_.used); |
+ EXPECT_EQ(10u, packet_.size); |
+} |
+ |
+TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Underrun) { |
+ packet_.used = packet_.size; |
+ |
+ // If ALSA has underrun then we should assume a delay of zero. |
+ MockAudioSourceCallback mock_callback; |
+ EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) |
+ .WillOnce(Return(SND_PCM_STATE_XRUN)); |
+ EXPECT_CALL(mock_callback, |
+ OnMoreData(test_stream_.get(), packet_.buffer.get(), |
+ packet_.capacity, 0)) |
+ .WillOnce(Return(10)); |
+ |
+ test_stream_->shared_data_.set_source_callback(&mock_callback); |
+ test_stream_->BufferPacket(&packet_); |
+ |
+ EXPECT_EQ(0u, packet_.used); |
+ EXPECT_EQ(10u, packet_.size); |
+} |
+ |
TEST_F(AlsaPcmOutputStreamTest, BufferPacket_UnfinishedPacket) { |
// No expectations set on the strict mock because nothing should be called. |
test_stream_->BufferPacket(&packet_); |