Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "base/logging.h" | 5 #include "base/logging.h" |
| 6 #include "base/message_loop.h" | 6 #include "base/message_loop.h" |
| 7 #include "base/string_util.h" | 7 #include "base/string_util.h" |
| 8 #include "media/audio/linux/alsa_output.h" | 8 #include "media/audio/linux/alsa_output.h" |
| 9 #include "media/audio/linux/alsa_wrapper.h" | 9 #include "media/audio/linux/alsa_wrapper.h" |
| 10 #include "media/audio/linux/audio_manager_linux.h" | 10 #include "media/audio/linux/audio_manager_linux.h" |
| 11 #include "media/base/data_buffer.h" | |
| 12 #include "media/base/seekable_buffer.h" | |
| 11 #include "testing/gmock/include/gmock/gmock.h" | 13 #include "testing/gmock/include/gmock/gmock.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
| 13 | 15 |
| 14 using testing::_; | 16 using testing::_; |
| 15 using testing::DoAll; | 17 using testing::DoAll; |
| 16 using testing::Eq; | 18 using testing::Eq; |
| 17 using testing::InSequence; | 19 using testing::InSequence; |
| 18 using testing::Invoke; | 20 using testing::Invoke; |
| 19 using testing::Mock; | 21 using testing::Mock; |
| 20 using testing::MockFunction; | 22 using testing::MockFunction; |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 39 MOCK_METHOD1(PcmDrop, int(snd_pcm_t* handle)); | 41 MOCK_METHOD1(PcmDrop, int(snd_pcm_t* handle)); |
| 40 MOCK_METHOD2(PcmDelay, int(snd_pcm_t* handle, snd_pcm_sframes_t* delay)); | 42 MOCK_METHOD2(PcmDelay, int(snd_pcm_t* handle, snd_pcm_sframes_t* delay)); |
| 41 MOCK_METHOD3(PcmWritei, snd_pcm_sframes_t(snd_pcm_t* handle, | 43 MOCK_METHOD3(PcmWritei, snd_pcm_sframes_t(snd_pcm_t* handle, |
| 42 const void* buffer, | 44 const void* buffer, |
| 43 snd_pcm_uframes_t size)); | 45 snd_pcm_uframes_t size)); |
| 44 MOCK_METHOD3(PcmRecover, int(snd_pcm_t* handle, int err, int silent)); | 46 MOCK_METHOD3(PcmRecover, int(snd_pcm_t* handle, int err, int silent)); |
| 45 MOCK_METHOD7(PcmSetParams, int(snd_pcm_t* handle, snd_pcm_format_t format, | 47 MOCK_METHOD7(PcmSetParams, int(snd_pcm_t* handle, snd_pcm_format_t format, |
| 46 snd_pcm_access_t access, unsigned int channels, | 48 snd_pcm_access_t access, unsigned int channels, |
| 47 unsigned int rate, int soft_resample, | 49 unsigned int rate, int soft_resample, |
| 48 unsigned int latency)); | 50 unsigned int latency)); |
| 51 MOCK_METHOD3(PcmGetParams, int(snd_pcm_t* handle, snd_pcm_uframes_t* buffer_si ze, | |
|
scherkus (not reviewing)
2010/05/14 21:28:50
>80 chars
| |
| 52 snd_pcm_uframes_t* period_size)); | |
| 49 MOCK_METHOD1(PcmName, const char*(snd_pcm_t* handle)); | 53 MOCK_METHOD1(PcmName, const char*(snd_pcm_t* handle)); |
| 50 MOCK_METHOD1(PcmAvailUpdate, snd_pcm_sframes_t(snd_pcm_t* handle)); | 54 MOCK_METHOD1(PcmAvailUpdate, snd_pcm_sframes_t(snd_pcm_t* handle)); |
| 51 MOCK_METHOD1(PcmState, snd_pcm_state_t(snd_pcm_t* handle)); | 55 MOCK_METHOD1(PcmState, snd_pcm_state_t(snd_pcm_t* handle)); |
| 52 | 56 |
| 53 MOCK_METHOD1(StrError, const char*(int errnum)); | 57 MOCK_METHOD1(StrError, const char*(int errnum)); |
| 54 }; | 58 }; |
| 55 | 59 |
| 56 class MockAudioSourceCallback : public AudioOutputStream::AudioSourceCallback { | 60 class MockAudioSourceCallback : public AudioOutputStream::AudioSourceCallback { |
| 57 public: | 61 public: |
| 58 MOCK_METHOD4(OnMoreData, uint32(AudioOutputStream* stream, void* dest, | 62 MOCK_METHOD4(OnMoreData, uint32(AudioOutputStream* stream, void* dest, |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 69 int sample_rate, | 73 int sample_rate, |
| 70 char bits_per_sample)); | 74 char bits_per_sample)); |
| 71 MOCK_METHOD0(MuteAll, void()); | 75 MOCK_METHOD0(MuteAll, void()); |
| 72 MOCK_METHOD0(UnMuteAll, void()); | 76 MOCK_METHOD0(UnMuteAll, void()); |
| 73 | 77 |
| 74 MOCK_METHOD1(ReleaseStream, void(AlsaPcmOutputStream* stream)); | 78 MOCK_METHOD1(ReleaseStream, void(AlsaPcmOutputStream* stream)); |
| 75 }; | 79 }; |
| 76 | 80 |
| 77 class AlsaPcmOutputStreamTest : public testing::Test { | 81 class AlsaPcmOutputStreamTest : public testing::Test { |
| 78 protected: | 82 protected: |
| 79 AlsaPcmOutputStreamTest() | 83 AlsaPcmOutputStreamTest() { |
| 80 : packet_(kTestPacketSize + 1) { | |
| 81 test_stream_ = CreateStreamWithChannels(kTestChannels); | 84 test_stream_ = CreateStreamWithChannels(kTestChannels); |
| 82 packet_.size = kTestPacketSize; | |
| 83 } | 85 } |
| 84 | 86 |
| 85 virtual ~AlsaPcmOutputStreamTest() { | 87 virtual ~AlsaPcmOutputStreamTest() { |
| 86 test_stream_ = NULL; | 88 test_stream_ = NULL; |
| 87 } | 89 } |
| 88 | 90 |
| 89 AlsaPcmOutputStream* CreateStreamWithChannels(int channels) { | 91 AlsaPcmOutputStream* CreateStreamWithChannels(int channels) { |
| 90 return new AlsaPcmOutputStream(kTestDeviceName, | 92 return new AlsaPcmOutputStream(kTestDeviceName, |
| 91 kTestFormat, | 93 kTestFormat, |
| 92 channels, | 94 channels, |
| 93 kTestSampleRate, | 95 kTestSampleRate, |
| 94 kTestBitsPerSample, | 96 kTestBitsPerSample, |
| 95 &mock_alsa_wrapper_, | 97 &mock_alsa_wrapper_, |
| 96 &mock_manager_, | 98 &mock_manager_, |
| 97 &message_loop_); | 99 &message_loop_); |
| 98 } | 100 } |
| 99 | 101 |
| 100 // Helper function to malloc the string returned by DeviceNameHint for NAME. | 102 // Helper function to malloc the string returned by DeviceNameHint for NAME. |
| 101 static char* EchoHint(const void* name, Unused) { | 103 static char* EchoHint(const void* name, Unused) { |
| 102 return strdup(static_cast<const char*>(name)); | 104 return strdup(static_cast<const char*>(name)); |
| 103 } | 105 } |
| 104 | 106 |
| 105 // Helper function to malloc the string returned by DeviceNameHint for IOID. | 107 // Helper function to malloc the string returned by DeviceNameHint for IOID. |
| 106 static char* OutputHint(Unused, Unused) { | 108 static char* OutputHint(Unused, Unused) { |
| 107 return strdup("Output"); | 109 return strdup("Output"); |
| 108 } | 110 } |
| 109 | 111 |
| 112 // Helper function to initialize |test_stream_->buffer_|. Must be called | |
| 113 // in all tests that use buffer_ without opening the stream. | |
| 114 void InitBuffer() { | |
| 115 packet_ = new media::DataBuffer(kTestPacketSize); | |
| 116 packet_->SetDataSize(kTestPacketSize); | |
| 117 test_stream_->buffer_.reset(new media::SeekableBuffer(0, kTestPacketSize)); | |
| 118 test_stream_->buffer_->Append(packet_.get()); | |
| 119 } | |
| 120 | |
| 110 static const int kTestChannels; | 121 static const int kTestChannels; |
| 111 static const int kTestSampleRate; | 122 static const int kTestSampleRate; |
| 112 static const int kTestBitsPerSample; | 123 static const int kTestBitsPerSample; |
| 113 static const int kTestBytesPerFrame; | 124 static const int kTestBytesPerFrame; |
| 114 static const AudioManager::Format kTestFormat; | 125 static const AudioManager::Format kTestFormat; |
| 115 static const char kTestDeviceName[]; | 126 static const char kTestDeviceName[]; |
| 116 static const char kDummyMessage[]; | 127 static const char kDummyMessage[]; |
| 117 static const uint32 kTestFramesPerPacket; | 128 static const uint32 kTestFramesPerPacket; |
| 118 static const uint32 kTestPacketSize; | 129 static const uint32 kTestPacketSize; |
| 119 static const int kTestFailedErrno; | 130 static const int kTestFailedErrno; |
| 120 static snd_pcm_t* const kFakeHandle; | 131 static snd_pcm_t* const kFakeHandle; |
| 121 | 132 |
| 122 // Used to simulate DeviceNameHint. | 133 // Used to simulate DeviceNameHint. |
| 123 static char kSurround40[]; | 134 static char kSurround40[]; |
| 124 static char kSurround41[]; | 135 static char kSurround41[]; |
| 125 static char kSurround50[]; | 136 static char kSurround50[]; |
| 126 static char kSurround51[]; | 137 static char kSurround51[]; |
| 127 static char kSurround70[]; | 138 static char kSurround70[]; |
| 128 static char kSurround71[]; | 139 static char kSurround71[]; |
| 129 static void* kFakeHints[]; | 140 static void* kFakeHints[]; |
| 130 | 141 |
| 131 StrictMock<MockAlsaWrapper> mock_alsa_wrapper_; | 142 StrictMock<MockAlsaWrapper> mock_alsa_wrapper_; |
| 132 StrictMock<MockAudioManagerLinux> mock_manager_; | 143 StrictMock<MockAudioManagerLinux> mock_manager_; |
| 133 MessageLoop message_loop_; | 144 MessageLoop message_loop_; |
| 134 scoped_refptr<AlsaPcmOutputStream> test_stream_; | 145 scoped_refptr<AlsaPcmOutputStream> test_stream_; |
| 135 AlsaPcmOutputStream::Packet packet_; | 146 scoped_refptr<media::DataBuffer> packet_; |
| 136 | 147 |
| 137 private: | 148 private: |
| 138 DISALLOW_COPY_AND_ASSIGN(AlsaPcmOutputStreamTest); | 149 DISALLOW_COPY_AND_ASSIGN(AlsaPcmOutputStreamTest); |
| 139 }; | 150 }; |
| 140 | 151 |
| 141 const int AlsaPcmOutputStreamTest::kTestChannels = 2; | 152 const int AlsaPcmOutputStreamTest::kTestChannels = 2; |
| 142 const int AlsaPcmOutputStreamTest::kTestSampleRate = | 153 const int AlsaPcmOutputStreamTest::kTestSampleRate = |
| 143 AudioManager::kAudioCDSampleRate; | 154 AudioManager::kAudioCDSampleRate; |
| 144 const int AlsaPcmOutputStreamTest::kTestBitsPerSample = 8; | 155 const int AlsaPcmOutputStreamTest::kTestBitsPerSample = 8; |
| 145 const int AlsaPcmOutputStreamTest::kTestBytesPerFrame = | 156 const int AlsaPcmOutputStreamTest::kTestBytesPerFrame = |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 217 // Test that packets which would cause a latency under less than | 228 // Test that packets which would cause a latency under less than |
| 218 // AlsaPcmOutputStream::kMinLatencyMicros will get clipped to | 229 // AlsaPcmOutputStream::kMinLatencyMicros will get clipped to |
| 219 // AlsaPcmOutputStream::kMinLatencyMicros, | 230 // AlsaPcmOutputStream::kMinLatencyMicros, |
| 220 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) | 231 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) |
| 221 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), | 232 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), |
| 222 Return(0))); | 233 Return(0))); |
| 223 EXPECT_CALL(mock_alsa_wrapper_, | 234 EXPECT_CALL(mock_alsa_wrapper_, |
| 224 PcmSetParams(_, _, _, _, _, _, | 235 PcmSetParams(_, _, _, _, _, _, |
| 225 AlsaPcmOutputStream::kMinLatencyMicros)) | 236 AlsaPcmOutputStream::kMinLatencyMicros)) |
| 226 .WillOnce(Return(0)); | 237 .WillOnce(Return(0)); |
| 238 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) | |
| 239 .WillOnce(DoAll(SetArgumentPointee<1>(kTestPacketSize), | |
| 240 SetArgumentPointee<2>(kTestPacketSize / 2), | |
| 241 Return(0))); | |
| 227 | 242 |
| 228 ASSERT_TRUE(test_stream_->Open(kMinLatencyPacketSize)); | 243 ASSERT_TRUE(test_stream_->Open(kMinLatencyPacketSize)); |
| 229 message_loop_.RunAllPending(); | 244 message_loop_.RunAllPending(); |
| 230 | 245 |
| 231 // Now close it and test that everything was released. | 246 // Now close it and test that everything was released. |
| 232 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0)); | 247 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0)); |
| 233 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) | 248 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) |
| 234 .WillOnce(Return(kTestDeviceName)); | 249 .WillOnce(Return(kTestDeviceName)); |
| 235 EXPECT_CALL(mock_manager_, ReleaseStream(test_stream_.get())); | 250 EXPECT_CALL(mock_manager_, ReleaseStream(test_stream_.get())); |
| 236 test_stream_->Close(); | 251 test_stream_->Close(); |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 248 kTestSampleRate); | 263 kTestSampleRate); |
| 249 | 264 |
| 250 // Recreate the stream to reset the state. | 265 // Recreate the stream to reset the state. |
| 251 test_stream_ = CreateStreamWithChannels(kTestChannels); | 266 test_stream_ = CreateStreamWithChannels(kTestChannels); |
| 252 | 267 |
| 253 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) | 268 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) |
| 254 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); | 269 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); |
| 255 EXPECT_CALL(mock_alsa_wrapper_, | 270 EXPECT_CALL(mock_alsa_wrapper_, |
| 256 PcmSetParams(_, _, _, _, _, _, expected_micros)) | 271 PcmSetParams(_, _, _, _, _, _, expected_micros)) |
| 257 .WillOnce(Return(0)); | 272 .WillOnce(Return(0)); |
| 273 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) | |
| 274 .WillOnce(DoAll(SetArgumentPointee<1>(kTestPacketSize), | |
| 275 SetArgumentPointee<2>(kTestPacketSize / 2), | |
| 276 Return(0))); | |
| 258 | 277 |
| 259 ASSERT_TRUE(test_stream_->Open(kOverMinLatencyPacketSize)); | 278 ASSERT_TRUE(test_stream_->Open(kOverMinLatencyPacketSize)); |
| 260 message_loop_.RunAllPending(); | 279 message_loop_.RunAllPending(); |
| 261 | 280 |
| 262 // Now close it and test that everything was released. | 281 // Now close it and test that everything was released. |
| 263 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) | 282 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) |
| 264 .WillOnce(Return(0)); | 283 .WillOnce(Return(0)); |
| 265 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) | 284 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) |
| 266 .WillOnce(Return(kTestDeviceName)); | 285 .WillOnce(Return(kTestDeviceName)); |
| 267 EXPECT_CALL(mock_manager_, ReleaseStream(test_stream_.get())); | 286 EXPECT_CALL(mock_manager_, ReleaseStream(test_stream_.get())); |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 287 Return(0))); | 306 Return(0))); |
| 288 EXPECT_CALL(mock_alsa_wrapper_, | 307 EXPECT_CALL(mock_alsa_wrapper_, |
| 289 PcmSetParams(kFakeHandle, | 308 PcmSetParams(kFakeHandle, |
| 290 SND_PCM_FORMAT_U8, | 309 SND_PCM_FORMAT_U8, |
| 291 SND_PCM_ACCESS_RW_INTERLEAVED, | 310 SND_PCM_ACCESS_RW_INTERLEAVED, |
| 292 kTestChannels, | 311 kTestChannels, |
| 293 kTestSampleRate, | 312 kTestSampleRate, |
| 294 1, | 313 1, |
| 295 expected_micros)) | 314 expected_micros)) |
| 296 .WillOnce(Return(0)); | 315 .WillOnce(Return(0)); |
| 316 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(kFakeHandle, _, _)) | |
| 317 .WillOnce(DoAll(SetArgumentPointee<1>(kTestPacketSize), | |
| 318 SetArgumentPointee<2>(kTestPacketSize/2), | |
| 319 Return(0))); | |
| 297 | 320 |
| 298 // Open the stream. | 321 // Open the stream. |
| 299 ASSERT_TRUE(test_stream_->Open(kTestPacketSize)); | 322 ASSERT_TRUE(test_stream_->Open(kTestPacketSize)); |
| 300 message_loop_.RunAllPending(); | 323 message_loop_.RunAllPending(); |
| 301 | 324 |
| 302 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, | 325 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, |
| 303 test_stream_->shared_data_.state()); | 326 test_stream_->shared_data_.state()); |
| 304 EXPECT_EQ(kFakeHandle, test_stream_->playback_handle_); | 327 EXPECT_EQ(kFakeHandle, test_stream_->playback_handle_); |
| 305 EXPECT_EQ(kTestFramesPerPacket, test_stream_->frames_per_packet_); | 328 EXPECT_EQ(kTestFramesPerPacket, test_stream_->frames_per_packet_); |
| 306 EXPECT_TRUE(test_stream_->packet_.get()); | 329 EXPECT_TRUE(test_stream_->buffer_.get()); |
| 307 EXPECT_FALSE(test_stream_->stop_stream_); | 330 EXPECT_FALSE(test_stream_->stop_stream_); |
| 308 | 331 |
| 309 // Now close it and test that everything was released. | 332 // Now close it and test that everything was released. |
| 310 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) | 333 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) |
| 311 .WillOnce(Return(0)); | 334 .WillOnce(Return(0)); |
| 312 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) | 335 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) |
| 313 .WillOnce(Return(kTestDeviceName)); | 336 .WillOnce(Return(kTestDeviceName)); |
| 314 EXPECT_CALL(mock_manager_, ReleaseStream(test_stream_.get())); | 337 EXPECT_CALL(mock_manager_, ReleaseStream(test_stream_.get())); |
| 315 test_stream_->Close(); | 338 test_stream_->Close(); |
| 316 message_loop_.RunAllPending(); | 339 message_loop_.RunAllPending(); |
| 317 | 340 |
| 318 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); | 341 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); |
| 319 EXPECT_FALSE(test_stream_->packet_.get()); | 342 EXPECT_FALSE(test_stream_->buffer_.get()); |
| 320 EXPECT_TRUE(test_stream_->stop_stream_); | 343 EXPECT_TRUE(test_stream_->stop_stream_); |
| 321 } | 344 } |
| 322 | 345 |
| 323 TEST_F(AlsaPcmOutputStreamTest, PcmOpenFailed) { | 346 TEST_F(AlsaPcmOutputStreamTest, PcmOpenFailed) { |
| 324 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) | 347 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) |
| 325 .WillOnce(Return(kTestFailedErrno)); | 348 .WillOnce(Return(kTestFailedErrno)); |
| 326 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) | 349 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) |
| 327 .WillOnce(Return(kDummyMessage)); | 350 .WillOnce(Return(kDummyMessage)); |
| 328 | 351 |
| 329 // Open still succeeds since PcmOpen is delegated to another thread. | 352 // Open still succeeds since PcmOpen is delegated to another thread. |
| 330 ASSERT_TRUE(test_stream_->Open(kTestPacketSize)); | 353 ASSERT_TRUE(test_stream_->Open(kTestPacketSize)); |
| 331 ASSERT_EQ(AlsaPcmOutputStream::kIsOpened, | 354 ASSERT_EQ(AlsaPcmOutputStream::kIsOpened, |
| 332 test_stream_->shared_data_.state()); | 355 test_stream_->shared_data_.state()); |
| 333 ASSERT_FALSE(test_stream_->stop_stream_); | 356 ASSERT_FALSE(test_stream_->stop_stream_); |
| 334 message_loop_.RunAllPending(); | 357 message_loop_.RunAllPending(); |
| 335 | 358 |
| 336 // Ensure internal state is set for a no-op stream if PcmOpen() failes. | 359 // Ensure internal state is set for a no-op stream if PcmOpen() failes. |
| 337 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, | 360 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, |
| 338 test_stream_->shared_data_.state()); | 361 test_stream_->shared_data_.state()); |
| 339 EXPECT_TRUE(test_stream_->stop_stream_); | 362 EXPECT_TRUE(test_stream_->stop_stream_); |
| 340 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); | 363 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); |
| 341 EXPECT_FALSE(test_stream_->packet_.get()); | 364 EXPECT_FALSE(test_stream_->buffer_.get()); |
| 342 | 365 |
| 343 // Close the stream since we opened it to make destruction happy. | 366 // Close the stream since we opened it to make destruction happy. |
| 344 EXPECT_CALL(mock_manager_, ReleaseStream(test_stream_.get())); | 367 EXPECT_CALL(mock_manager_, ReleaseStream(test_stream_.get())); |
| 345 test_stream_->Close(); | 368 test_stream_->Close(); |
| 346 message_loop_.RunAllPending(); | 369 message_loop_.RunAllPending(); |
| 347 } | 370 } |
| 348 | 371 |
| 349 TEST_F(AlsaPcmOutputStreamTest, PcmSetParamsFailed) { | 372 TEST_F(AlsaPcmOutputStreamTest, PcmSetParamsFailed) { |
| 350 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) | 373 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) |
| 351 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), | 374 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 365 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, | 388 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, |
| 366 test_stream_->shared_data_.state()); | 389 test_stream_->shared_data_.state()); |
| 367 ASSERT_FALSE(test_stream_->stop_stream_); | 390 ASSERT_FALSE(test_stream_->stop_stream_); |
| 368 message_loop_.RunAllPending(); | 391 message_loop_.RunAllPending(); |
| 369 | 392 |
| 370 // Ensure internal state is set for a no-op stream if PcmSetParams() failes. | 393 // Ensure internal state is set for a no-op stream if PcmSetParams() failes. |
| 371 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, | 394 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, |
| 372 test_stream_->shared_data_.state()); | 395 test_stream_->shared_data_.state()); |
| 373 EXPECT_TRUE(test_stream_->stop_stream_); | 396 EXPECT_TRUE(test_stream_->stop_stream_); |
| 374 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); | 397 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); |
| 375 EXPECT_FALSE(test_stream_->packet_.get()); | 398 EXPECT_FALSE(test_stream_->buffer_.get()); |
| 376 | 399 |
| 377 // Close the stream since we opened it to make destruction happy. | 400 // Close the stream since we opened it to make destruction happy. |
| 378 EXPECT_CALL(mock_manager_, ReleaseStream(test_stream_.get())); | 401 EXPECT_CALL(mock_manager_, ReleaseStream(test_stream_.get())); |
| 379 test_stream_->Close(); | 402 test_stream_->Close(); |
| 380 message_loop_.RunAllPending(); | 403 message_loop_.RunAllPending(); |
| 381 } | 404 } |
| 382 | 405 |
| 383 TEST_F(AlsaPcmOutputStreamTest, StartStop) { | 406 TEST_F(AlsaPcmOutputStreamTest, StartStop) { |
| 384 // Open() call opens the playback device, sets the parameters, posts a task | 407 // Open() call opens the playback device, sets the parameters, posts a task |
| 385 // with the resulting configuration data, and transitions the object state to | 408 // with the resulting configuration data, and transitions the object state to |
| 386 // kIsOpened. | 409 // kIsOpened. |
| 387 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) | 410 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) |
| 388 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), | 411 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), |
| 389 Return(0))); | 412 Return(0))); |
| 390 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _)) | 413 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _)) |
| 391 .WillOnce(Return(0)); | 414 .WillOnce(Return(0)); |
| 415 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) | |
| 416 .WillOnce(DoAll(SetArgumentPointee<1>(kTestPacketSize), | |
| 417 SetArgumentPointee<2>(kTestPacketSize / 2), | |
| 418 Return(0))); | |
| 392 | 419 |
| 393 // Open the stream. | 420 // Open the stream. |
| 394 ASSERT_TRUE(test_stream_->Open(kTestPacketSize)); | 421 ASSERT_TRUE(test_stream_->Open(kTestPacketSize)); |
| 395 message_loop_.RunAllPending(); | 422 message_loop_.RunAllPending(); |
| 396 | 423 |
| 397 // Expect Device setup. | 424 // Expect Device setup. |
| 398 EXPECT_CALL(mock_alsa_wrapper_, PcmDrop(kFakeHandle)) | 425 EXPECT_CALL(mock_alsa_wrapper_, PcmDrop(kFakeHandle)) |
| 399 .WillOnce(Return(0)); | 426 .WillOnce(Return(0)); |
| 400 EXPECT_CALL(mock_alsa_wrapper_, PcmPrepare(kFakeHandle)) | 427 EXPECT_CALL(mock_alsa_wrapper_, PcmPrepare(kFakeHandle)) |
| 401 .WillOnce(Return(0)); | 428 .WillOnce(Return(0)); |
| 402 | 429 |
| 403 // Expect the pre-roll. | |
| 404 MockAudioSourceCallback mock_callback; | |
| 405 EXPECT_CALL(mock_alsa_wrapper_, PcmState(kFakeHandle)) | |
| 406 .Times(2) | |
| 407 .WillRepeatedly(Return(SND_PCM_STATE_RUNNING)); | |
| 408 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(kFakeHandle, _)) | |
| 409 .Times(2) | |
| 410 .WillRepeatedly(DoAll(SetArgumentPointee<1>(0), Return(0))); | |
| 411 EXPECT_CALL(mock_callback, | |
| 412 OnMoreData(test_stream_.get(), _, kTestPacketSize, 0)) | |
| 413 .Times(2) | |
| 414 .WillRepeatedly(Return(kTestPacketSize)); | |
| 415 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, _, _)) | |
| 416 .Times(2) | |
| 417 .WillRepeatedly(Return(kTestPacketSize)); | |
| 418 | |
| 419 // Expect scheduling. | 430 // Expect scheduling. |
| 420 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle)) | 431 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle)) |
| 421 .WillOnce(Return(1)); | 432 .WillOnce(Return(1)); |
| 422 | 433 |
| 434 MockAudioSourceCallback mock_callback; | |
| 423 test_stream_->Start(&mock_callback); | 435 test_stream_->Start(&mock_callback); |
| 424 message_loop_.RunAllPending(); | 436 message_loop_.RunAllPending(); |
| 425 | 437 |
| 426 EXPECT_CALL(mock_manager_, ReleaseStream(test_stream_.get())); | 438 EXPECT_CALL(mock_manager_, ReleaseStream(test_stream_.get())); |
| 427 EXPECT_CALL(mock_callback, OnClose(test_stream_.get())); | 439 EXPECT_CALL(mock_callback, OnClose(test_stream_.get())); |
| 428 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) | 440 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) |
| 429 .WillOnce(Return(0)); | 441 .WillOnce(Return(0)); |
| 430 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) | 442 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) |
| 431 .WillOnce(Return(kTestDeviceName)); | 443 .WillOnce(Return(kTestDeviceName)); |
| 432 test_stream_->Close(); | 444 test_stream_->Close(); |
| 433 message_loop_.RunAllPending(); | 445 message_loop_.RunAllPending(); |
| 434 } | 446 } |
| 435 | 447 |
| 436 TEST_F(AlsaPcmOutputStreamTest, WritePacket_FinishedPacket) { | 448 TEST_F(AlsaPcmOutputStreamTest, WritePacket_FinishedPacket) { |
| 449 InitBuffer(); | |
| 450 | |
| 437 // Nothing should happen. Don't set any expectations and Our strict mocks | 451 // Nothing should happen. Don't set any expectations and Our strict mocks |
| 438 // should verify most of this. | 452 // should verify most of this. |
| 439 | 453 |
| 440 // Test regular used-up packet. | 454 // Test empty buffer. |
| 441 packet_.used = packet_.size; | 455 test_stream_->buffer_->Clear(); |
| 442 test_stream_->WritePacket(&packet_); | 456 test_stream_->WritePacket(); |
| 443 | |
| 444 // Test empty packet. | |
| 445 packet_.used = packet_.size = 0; | |
| 446 test_stream_->WritePacket(&packet_); | |
| 447 } | 457 } |
| 448 | 458 |
| 449 TEST_F(AlsaPcmOutputStreamTest, WritePacket_NormalPacket) { | 459 TEST_F(AlsaPcmOutputStreamTest, WritePacket_NormalPacket) { |
| 460 InitBuffer(); | |
| 461 | |
| 450 // Write a little less than half the data. | 462 // Write a little less than half the data. |
| 451 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(_, packet_.buffer.get(), _)) | 463 int written = packet_->GetDataSize() / kTestBytesPerFrame / 2 - 1; |
| 452 .WillOnce(Return(packet_.size / kTestBytesPerFrame / 2 - 1)); | 464 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(_, packet_->GetData(), _)) |
| 465 .WillOnce(Return(written)); | |
| 453 | 466 |
| 454 test_stream_->WritePacket(&packet_); | 467 test_stream_->WritePacket(); |
| 455 | 468 |
| 456 ASSERT_EQ(packet_.size / 2 - kTestBytesPerFrame, packet_.used); | 469 ASSERT_EQ(test_stream_->buffer_->forward_bytes(), |
| 470 packet_->GetDataSize() - written * kTestBytesPerFrame); | |
| 457 | 471 |
| 458 // Write the rest. | 472 // Write the rest. |
| 459 EXPECT_CALL(mock_alsa_wrapper_, | 473 EXPECT_CALL(mock_alsa_wrapper_, |
| 460 PcmWritei(_, packet_.buffer.get() + packet_.used, _)) | 474 PcmWritei(_, packet_->GetData() + written * kTestBytesPerFrame, |
| 461 .WillOnce(Return(packet_.size / kTestBytesPerFrame / 2 + 1)); | 475 _)) |
| 462 test_stream_->WritePacket(&packet_); | 476 .WillOnce(Return(packet_->GetDataSize() / kTestBytesPerFrame - written)); |
| 463 EXPECT_EQ(packet_.size, packet_.used); | 477 test_stream_->WritePacket(); |
| 478 EXPECT_EQ(0u, test_stream_->buffer_->forward_bytes()); | |
| 464 } | 479 } |
| 465 | 480 |
| 466 TEST_F(AlsaPcmOutputStreamTest, WritePacket_WriteFails) { | 481 TEST_F(AlsaPcmOutputStreamTest, WritePacket_WriteFails) { |
| 482 InitBuffer(); | |
| 483 | |
| 467 // Fail due to a recoverable error and see that PcmRecover code path | 484 // Fail due to a recoverable error and see that PcmRecover code path |
| 468 // continues normally. | 485 // continues normally. |
| 469 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(_, _, _)) | 486 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(_, _, _)) |
| 470 .WillOnce(Return(-EINTR)); | 487 .WillOnce(Return(-EINTR)); |
| 471 EXPECT_CALL(mock_alsa_wrapper_, PcmRecover(_, _, _)) | 488 EXPECT_CALL(mock_alsa_wrapper_, PcmRecover(_, _, _)) |
| 472 .WillOnce(Return(packet_.size / kTestBytesPerFrame / 2 - 1)); | 489 .WillOnce(Return(packet_->GetDataSize() / kTestBytesPerFrame / 2 - 1)); |
| 473 | 490 |
| 474 test_stream_->WritePacket(&packet_); | 491 test_stream_->WritePacket(); |
| 475 | 492 |
| 476 ASSERT_EQ(packet_.size / 2 - kTestBytesPerFrame, packet_.used); | 493 ASSERT_EQ(test_stream_->buffer_->forward_bytes(), |
| 494 packet_->GetDataSize() / 2 + kTestBytesPerFrame); | |
| 477 | 495 |
| 478 // Fail the next write, and see that stop_stream_ is set. | 496 // Fail the next write, and see that stop_stream_ is set. |
| 479 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(_, _, _)) | 497 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(_, _, _)) |
| 480 .WillOnce(Return(kTestFailedErrno)); | 498 .WillOnce(Return(kTestFailedErrno)); |
| 481 EXPECT_CALL(mock_alsa_wrapper_, PcmRecover(_, _, _)) | 499 EXPECT_CALL(mock_alsa_wrapper_, PcmRecover(_, _, _)) |
| 482 .WillOnce(Return(kTestFailedErrno)); | 500 .WillOnce(Return(kTestFailedErrno)); |
| 483 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) | 501 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) |
| 484 .WillOnce(Return(kDummyMessage)); | 502 .WillOnce(Return(kDummyMessage)); |
| 485 test_stream_->WritePacket(&packet_); | 503 test_stream_->WritePacket(); |
| 486 EXPECT_EQ(packet_.size / 2 - kTestBytesPerFrame, packet_.used); | 504 EXPECT_EQ(test_stream_->buffer_->forward_bytes(), |
| 505 packet_->GetDataSize() / 2 + kTestBytesPerFrame); | |
| 487 EXPECT_TRUE(test_stream_->stop_stream_); | 506 EXPECT_TRUE(test_stream_->stop_stream_); |
| 488 } | 507 } |
| 489 | 508 |
| 490 TEST_F(AlsaPcmOutputStreamTest, WritePacket_StopStream) { | 509 TEST_F(AlsaPcmOutputStreamTest, WritePacket_StopStream) { |
| 510 InitBuffer(); | |
| 511 | |
| 491 // No expectations set on the strict mock because nothing should be called. | 512 // No expectations set on the strict mock because nothing should be called. |
| 492 test_stream_->stop_stream_ = true; | 513 test_stream_->stop_stream_ = true; |
| 493 test_stream_->WritePacket(&packet_); | 514 test_stream_->WritePacket(); |
| 494 EXPECT_EQ(packet_.size, packet_.used); | 515 EXPECT_EQ(0u, test_stream_->buffer_->forward_bytes()); |
| 495 } | 516 } |
| 496 | 517 |
| 497 TEST_F(AlsaPcmOutputStreamTest, BufferPacket) { | 518 TEST_F(AlsaPcmOutputStreamTest, BufferPacket) { |
| 498 packet_.used = packet_.size; | 519 InitBuffer(); |
| 520 test_stream_->buffer_->Clear(); | |
| 499 | 521 |
| 500 // Return a partially filled packet. | 522 // Return a partially filled packet. |
| 501 MockAudioSourceCallback mock_callback; | 523 MockAudioSourceCallback mock_callback; |
| 502 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) | 524 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) |
| 503 .WillOnce(Return(SND_PCM_STATE_RUNNING)); | 525 .WillOnce(Return(SND_PCM_STATE_RUNNING)); |
| 504 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _)) | 526 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _)) |
| 505 .WillOnce(DoAll(SetArgumentPointee<1>(1), Return(0))); | 527 .WillOnce(DoAll(SetArgumentPointee<1>(1), Return(0))); |
| 506 EXPECT_CALL(mock_callback, | 528 EXPECT_CALL(mock_callback, |
| 507 OnMoreData(test_stream_.get(), packet_.buffer.get(), | 529 OnMoreData(test_stream_.get(), _, _, kTestBytesPerFrame)) |
| 508 packet_.capacity, kTestBytesPerFrame)) | |
| 509 .WillOnce(Return(10)); | 530 .WillOnce(Return(10)); |
| 510 | 531 |
| 511 test_stream_->shared_data_.set_source_callback(&mock_callback); | 532 test_stream_->shared_data_.set_source_callback(&mock_callback); |
| 512 test_stream_->BufferPacket(&packet_); | 533 test_stream_->BufferPacket(); |
| 513 | 534 |
| 514 EXPECT_EQ(0u, packet_.used); | 535 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes()); |
| 515 EXPECT_EQ(10u, packet_.size); | |
| 516 } | 536 } |
| 517 | 537 |
| 518 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Negative) { | 538 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Negative) { |
| 519 packet_.used = packet_.size; | 539 InitBuffer(); |
| 540 test_stream_->buffer_->Clear(); | |
| 520 | 541 |
| 521 // Simulate where the underrun has occurred right after checking the delay. | 542 // Simulate where the underrun has occurred right after checking the delay. |
| 522 MockAudioSourceCallback mock_callback; | 543 MockAudioSourceCallback mock_callback; |
| 523 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) | 544 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) |
| 524 .WillOnce(Return(SND_PCM_STATE_RUNNING)); | 545 .WillOnce(Return(SND_PCM_STATE_RUNNING)); |
| 525 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _)) | 546 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _)) |
| 526 .WillOnce(DoAll(SetArgumentPointee<1>(-1), Return(0))); | 547 .WillOnce(DoAll(SetArgumentPointee<1>(-1), Return(0))); |
| 527 EXPECT_CALL(mock_callback, | 548 EXPECT_CALL(mock_callback, |
| 528 OnMoreData(test_stream_.get(), packet_.buffer.get(), | 549 OnMoreData(test_stream_.get(), _, _, 0)) |
| 529 packet_.capacity, 0)) | |
| 530 .WillOnce(Return(10)); | 550 .WillOnce(Return(10)); |
| 531 | 551 |
| 532 test_stream_->shared_data_.set_source_callback(&mock_callback); | 552 test_stream_->shared_data_.set_source_callback(&mock_callback); |
| 533 test_stream_->BufferPacket(&packet_); | 553 test_stream_->BufferPacket(); |
| 534 | 554 |
| 535 EXPECT_EQ(0u, packet_.used); | 555 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes()); |
| 536 EXPECT_EQ(10u, packet_.size); | |
| 537 } | 556 } |
| 538 | 557 |
| 539 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Underrun) { | 558 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Underrun) { |
| 540 packet_.used = packet_.size; | 559 InitBuffer(); |
| 560 test_stream_->buffer_->Clear(); | |
| 541 | 561 |
| 542 // If ALSA has underrun then we should assume a delay of zero. | 562 // If ALSA has underrun then we should assume a delay of zero. |
| 543 MockAudioSourceCallback mock_callback; | 563 MockAudioSourceCallback mock_callback; |
| 544 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) | 564 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) |
| 545 .WillOnce(Return(SND_PCM_STATE_XRUN)); | 565 .WillOnce(Return(SND_PCM_STATE_XRUN)); |
| 546 EXPECT_CALL(mock_callback, | 566 EXPECT_CALL(mock_callback, |
| 547 OnMoreData(test_stream_.get(), packet_.buffer.get(), | 567 OnMoreData(test_stream_.get(), _, _, 0)) |
| 548 packet_.capacity, 0)) | |
| 549 .WillOnce(Return(10)); | 568 .WillOnce(Return(10)); |
| 550 | 569 |
| 551 test_stream_->shared_data_.set_source_callback(&mock_callback); | 570 test_stream_->shared_data_.set_source_callback(&mock_callback); |
| 552 test_stream_->BufferPacket(&packet_); | 571 test_stream_->BufferPacket(); |
| 553 | 572 |
| 554 EXPECT_EQ(0u, packet_.used); | 573 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes()); |
| 555 EXPECT_EQ(10u, packet_.size); | |
| 556 } | 574 } |
| 557 | 575 |
| 558 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_UnfinishedPacket) { | 576 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_FullBuffer) { |
| 577 InitBuffer(); | |
| 559 // No expectations set on the strict mock because nothing should be called. | 578 // No expectations set on the strict mock because nothing should be called. |
| 560 test_stream_->BufferPacket(&packet_); | 579 test_stream_->BufferPacket(); |
| 561 EXPECT_EQ(0u, packet_.used); | 580 EXPECT_EQ(kTestPacketSize, test_stream_->buffer_->forward_bytes()); |
| 562 EXPECT_EQ(kTestPacketSize, packet_.size); | |
| 563 } | 581 } |
| 564 | 582 |
| 565 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_DeviceSelect) { | 583 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_DeviceSelect) { |
| 566 // Try channels from 1 -> 9. and see that we get the more specific surroundXX | 584 // Try channels from 1 -> 9. and see that we get the more specific surroundXX |
| 567 // device opened for channels 4-8. For all other channels, the device should | 585 // device opened for channels 4-8. For all other channels, the device should |
| 568 // default to |AlsaPcmOutputStream::kDefaultDevice|. We should also not | 586 // default to |AlsaPcmOutputStream::kDefaultDevice|. We should also not |
| 569 // downmix any channel in this case because downmixing is only defined for | 587 // downmix any channel in this case because downmixing is only defined for |
| 570 // channels 4-8, which we are guaranteeing to work. | 588 // channels 4-8, which we are guaranteeing to work. |
| 571 // | 589 // |
| 572 // Note that the loop starts at "1", so the first parameter is ignored in | 590 // Note that the loop starts at "1", so the first parameter is ignored in |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 677 .WillOnce(Return(0)); | 695 .WillOnce(Return(0)); |
| 678 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) | 696 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) |
| 679 .WillOnce(Return(kDummyMessage)); | 697 .WillOnce(Return(kDummyMessage)); |
| 680 | 698 |
| 681 test_stream_ = CreateStreamWithChannels(5); | 699 test_stream_ = CreateStreamWithChannels(5); |
| 682 EXPECT_TRUE(test_stream_->AutoSelectDevice(5)); | 700 EXPECT_TRUE(test_stream_->AutoSelectDevice(5)); |
| 683 EXPECT_TRUE(test_stream_->should_downmix_); | 701 EXPECT_TRUE(test_stream_->should_downmix_); |
| 684 } | 702 } |
| 685 | 703 |
| 686 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_StopStream) { | 704 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_StopStream) { |
| 705 InitBuffer(); | |
| 687 test_stream_->stop_stream_ = true; | 706 test_stream_->stop_stream_ = true; |
| 688 test_stream_->BufferPacket(&packet_); | 707 test_stream_->BufferPacket(); |
| 689 EXPECT_EQ(0u, packet_.used); | 708 EXPECT_EQ(0u, test_stream_->buffer_->forward_bytes()); |
| 690 EXPECT_EQ(0u, packet_.size); | |
| 691 } | 709 } |
| 692 | 710 |
| 693 TEST_F(AlsaPcmOutputStreamTest, ScheduleNextWrite) { | 711 TEST_F(AlsaPcmOutputStreamTest, ScheduleNextWrite) { |
| 694 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsOpened); | 712 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsOpened); |
| 695 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsPlaying); | 713 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsPlaying); |
| 696 | 714 |
| 715 InitBuffer(); | |
| 716 | |
| 697 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) | 717 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) |
| 698 .WillOnce(Return(10)); | 718 .WillOnce(Return(10)); |
| 699 test_stream_->ScheduleNextWrite(&packet_); | 719 test_stream_->ScheduleNextWrite(); |
| 700 | 720 |
| 701 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsClosed); | 721 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsClosed); |
| 702 } | 722 } |
| 703 | 723 |
| 704 TEST_F(AlsaPcmOutputStreamTest, ScheduleNextWrite_StopStream) { | 724 TEST_F(AlsaPcmOutputStreamTest, ScheduleNextWrite_StopStream) { |
| 705 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsOpened); | 725 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsOpened); |
| 706 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsPlaying); | 726 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsPlaying); |
| 707 | 727 |
| 728 InitBuffer(); | |
| 729 | |
| 708 test_stream_->stop_stream_ = true; | 730 test_stream_->stop_stream_ = true; |
| 709 test_stream_->ScheduleNextWrite(&packet_); | 731 test_stream_->ScheduleNextWrite(); |
| 710 | 732 |
| 711 // TODO(ajwong): Find a way to test whether or not another task has been | 733 // TODO(ajwong): Find a way to test whether or not another task has been |
| 712 // posted so we can verify that the Alsa code will indeed break the task | 734 // posted so we can verify that the Alsa code will indeed break the task |
| 713 // posting loop. | 735 // posting loop. |
| 714 | 736 |
| 715 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsClosed); | 737 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsClosed); |
| 716 } | 738 } |
| OLD | NEW |