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 |