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/message_loop.h" | 5 #include "base/message_loop.h" |
6 #include "base/string_util.h" | 6 #include "base/string_util.h" |
7 #include "media/audio/linux/alsa_output.h" | 7 #include "media/audio/linux/alsa_output.h" |
8 #include "media/audio/linux/alsa_wrapper.h" | 8 #include "media/audio/linux/alsa_wrapper.h" |
9 #include "media/audio/linux/audio_manager_linux.h" | 9 #include "media/audio/linux/audio_manager_linux.h" |
10 #include "media/base/data_buffer.h" | 10 #include "media/base/data_buffer.h" |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 MOCK_METHOD1(PcmStart, int(snd_pcm_t* handle)); | 63 MOCK_METHOD1(PcmStart, int(snd_pcm_t* handle)); |
64 | 64 |
65 MOCK_METHOD1(StrError, const char*(int errnum)); | 65 MOCK_METHOD1(StrError, const char*(int errnum)); |
66 }; | 66 }; |
67 | 67 |
68 class MockAudioSourceCallback : public AudioOutputStream::AudioSourceCallback { | 68 class MockAudioSourceCallback : public AudioOutputStream::AudioSourceCallback { |
69 public: | 69 public: |
70 MOCK_METHOD4(OnMoreData, uint32(AudioOutputStream* stream, | 70 MOCK_METHOD4(OnMoreData, uint32(AudioOutputStream* stream, |
71 uint8* dest, uint32 max_size, | 71 uint8* dest, uint32 max_size, |
72 AudioBuffersState buffers_state)); | 72 AudioBuffersState buffers_state)); |
73 MOCK_METHOD1(OnClose, void(AudioOutputStream* stream)); | |
74 MOCK_METHOD2(OnError, void(AudioOutputStream* stream, int code)); | 73 MOCK_METHOD2(OnError, void(AudioOutputStream* stream, int code)); |
75 }; | 74 }; |
76 | 75 |
77 class MockAudioManagerLinux : public AudioManagerLinux { | 76 class MockAudioManagerLinux : public AudioManagerLinux { |
78 public: | 77 public: |
79 MOCK_METHOD0(Init, void()); | 78 MOCK_METHOD0(Init, void()); |
80 MOCK_METHOD0(HasAudioOutputDevices, bool()); | 79 MOCK_METHOD0(HasAudioOutputDevices, bool()); |
81 MOCK_METHOD0(HasAudioInputDevices, bool()); | 80 MOCK_METHOD0(HasAudioInputDevices, bool()); |
82 MOCK_METHOD1(MakeAudioOutputStream, AudioOutputStream*( | 81 MOCK_METHOD1(MakeAudioOutputStream, AudioOutputStream*( |
83 AudioParameters params)); | 82 AudioParameters params)); |
84 MOCK_METHOD5(MakeAudioInputStream, AudioInputStream*( | 83 MOCK_METHOD5(MakeAudioInputStream, AudioInputStream*( |
85 AudioParameters::Format format, | 84 AudioParameters::Format format, |
86 int channels, | 85 int channels, |
87 int sample_rate, | 86 int sample_rate, |
88 char bits_per_sample, | 87 char bits_per_sample, |
89 uint32 samples_per_packet)); | 88 uint32 samples_per_packet)); |
90 MOCK_METHOD0(MuteAll, void()); | 89 MOCK_METHOD0(MuteAll, void()); |
91 MOCK_METHOD0(UnMuteAll, void()); | 90 MOCK_METHOD0(UnMuteAll, void()); |
92 | 91 |
93 MOCK_METHOD1(ReleaseOutputStream, void(AlsaPcmOutputStream* stream)); | 92 MOCK_METHOD1(ReleaseOutputStream, void(AlsaPcmOutputStream* stream)); |
94 }; | 93 }; |
95 | 94 |
96 class AlsaPcmOutputStreamTest : public testing::Test { | 95 class AlsaPcmOutputStreamTest : public testing::Test { |
97 protected: | 96 protected: |
98 AlsaPcmOutputStreamTest() { | 97 AlsaPcmOutputStreamTest() { |
99 test_stream_ = CreateStreamWithChannels(kTestChannels); | 98 test_stream_ = CreateStream(kTestChannels); |
100 } | 99 } |
101 | 100 |
102 virtual ~AlsaPcmOutputStreamTest() { | 101 virtual ~AlsaPcmOutputStreamTest() { |
103 test_stream_ = NULL; | 102 test_stream_ = NULL; |
104 } | 103 } |
105 | 104 |
106 AlsaPcmOutputStream* CreateStreamWithChannels(int channels) { | 105 AlsaPcmOutputStream* CreateStream(int channels) { |
| 106 return CreateStream(channels, kTestFramesPerPacket); |
| 107 } |
| 108 |
| 109 AlsaPcmOutputStream* CreateStream(int channels, int32 samples_per_packet) { |
107 AudioParameters params(kTestFormat, channels, kTestSampleRate, | 110 AudioParameters params(kTestFormat, channels, kTestSampleRate, |
108 kTestBitsPerSample); | 111 kTestBitsPerSample, samples_per_packet); |
109 return new AlsaPcmOutputStream(kTestDeviceName, | 112 return new AlsaPcmOutputStream(kTestDeviceName, |
110 params, | 113 params, |
111 &mock_alsa_wrapper_, | 114 &mock_alsa_wrapper_, |
112 &mock_manager_, | 115 &mock_manager_, |
113 &message_loop_); | 116 &message_loop_); |
114 } | 117 } |
115 | 118 |
116 // Helper function to malloc the string returned by DeviceNameHint for NAME. | 119 // Helper function to malloc the string returned by DeviceNameHint for NAME. |
117 static char* EchoHint(const void* name, Unused) { | 120 static char* EchoHint(const void* name, Unused) { |
118 return strdup(static_cast<const char*>(name)); | 121 return strdup(static_cast<const char*>(name)); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 char AlsaPcmOutputStreamTest::kSurround71[] = "surround71:CARD=foo,DEV=0"; | 193 char AlsaPcmOutputStreamTest::kSurround71[] = "surround71:CARD=foo,DEV=0"; |
191 void* AlsaPcmOutputStreamTest::kFakeHints[] = { | 194 void* AlsaPcmOutputStreamTest::kFakeHints[] = { |
192 kSurround40, kSurround41, kSurround50, kSurround51, | 195 kSurround40, kSurround41, kSurround50, kSurround51, |
193 kSurround70, kSurround71, NULL }; | 196 kSurround70, kSurround71, NULL }; |
194 | 197 |
195 TEST_F(AlsaPcmOutputStreamTest, ConstructedState) { | 198 TEST_F(AlsaPcmOutputStreamTest, ConstructedState) { |
196 EXPECT_EQ(AlsaPcmOutputStream::kCreated, | 199 EXPECT_EQ(AlsaPcmOutputStream::kCreated, |
197 test_stream_->shared_data_.state()); | 200 test_stream_->shared_data_.state()); |
198 | 201 |
199 // Should support mono. | 202 // Should support mono. |
200 test_stream_ = CreateStreamWithChannels(1); | 203 test_stream_ = CreateStream(1); |
201 EXPECT_EQ(AlsaPcmOutputStream::kCreated, | 204 EXPECT_EQ(AlsaPcmOutputStream::kCreated, |
202 test_stream_->shared_data_.state()); | 205 test_stream_->shared_data_.state()); |
203 | 206 |
204 // Should support multi-channel. | 207 // Should support multi-channel. |
205 test_stream_ = CreateStreamWithChannels(3); | 208 test_stream_ = CreateStream(3); |
206 EXPECT_EQ(AlsaPcmOutputStream::kCreated, | 209 EXPECT_EQ(AlsaPcmOutputStream::kCreated, |
207 test_stream_->shared_data_.state()); | 210 test_stream_->shared_data_.state()); |
208 | 211 |
209 // Bad bits per sample. | 212 // Bad bits per sample. |
210 AudioParameters bad_bps_params(kTestFormat, kTestChannels, | 213 AudioParameters bad_bps_params(kTestFormat, kTestChannels, |
211 kTestSampleRate, kTestBitsPerSample - 1); | 214 kTestSampleRate, kTestBitsPerSample - 1, |
| 215 kTestFramesPerPacket); |
212 test_stream_ = new AlsaPcmOutputStream(kTestDeviceName, | 216 test_stream_ = new AlsaPcmOutputStream(kTestDeviceName, |
213 bad_bps_params, | 217 bad_bps_params, |
214 &mock_alsa_wrapper_, | 218 &mock_alsa_wrapper_, |
215 &mock_manager_, | 219 &mock_manager_, |
216 &message_loop_); | 220 &message_loop_); |
217 EXPECT_EQ(AlsaPcmOutputStream::kInError, | 221 EXPECT_EQ(AlsaPcmOutputStream::kInError, |
218 test_stream_->shared_data_.state()); | 222 test_stream_->shared_data_.state()); |
219 | 223 |
220 // Bad format. | 224 // Bad format. |
221 AudioParameters bad_format_params( | 225 AudioParameters bad_format_params( |
222 AudioParameters::AUDIO_LAST_FORMAT, kTestChannels, | 226 AudioParameters::AUDIO_LAST_FORMAT, kTestChannels, |
223 kTestSampleRate, kTestBitsPerSample); | 227 kTestSampleRate, kTestBitsPerSample, kTestFramesPerPacket); |
224 test_stream_ = new AlsaPcmOutputStream(kTestDeviceName, | 228 test_stream_ = new AlsaPcmOutputStream(kTestDeviceName, |
225 bad_format_params, | 229 bad_format_params, |
226 &mock_alsa_wrapper_, | 230 &mock_alsa_wrapper_, |
227 &mock_manager_, | 231 &mock_manager_, |
228 &message_loop_); | 232 &message_loop_); |
229 EXPECT_EQ(AlsaPcmOutputStream::kInError, | 233 EXPECT_EQ(AlsaPcmOutputStream::kInError, |
230 test_stream_->shared_data_.state()); | 234 test_stream_->shared_data_.state()); |
231 } | 235 } |
232 | 236 |
233 TEST_F(AlsaPcmOutputStreamTest, LatencyFloor) { | 237 TEST_F(AlsaPcmOutputStreamTest, LatencyFloor) { |
234 const double kMicrosPerFrame = | 238 const double kMicrosPerFrame = |
235 static_cast<double>(1000000) / kTestSampleRate; | 239 static_cast<double>(1000000) / kTestSampleRate; |
236 const double kPacketFramesInMinLatency = | 240 const double kPacketFramesInMinLatency = |
237 AlsaPcmOutputStream::kMinLatencyMicros / kMicrosPerFrame / 2.0; | 241 AlsaPcmOutputStream::kMinLatencyMicros / kMicrosPerFrame / 2.0; |
238 const int kMinLatencyPacketSize = | |
239 static_cast<int>(kPacketFramesInMinLatency * kTestBytesPerFrame); | |
240 | 242 |
241 // Test that packets which would cause a latency under less than | 243 // Test that packets which would cause a latency under less than |
242 // AlsaPcmOutputStream::kMinLatencyMicros will get clipped to | 244 // AlsaPcmOutputStream::kMinLatencyMicros will get clipped to |
243 // AlsaPcmOutputStream::kMinLatencyMicros, | 245 // AlsaPcmOutputStream::kMinLatencyMicros, |
244 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) | 246 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) |
245 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), | 247 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), |
246 Return(0))); | 248 Return(0))); |
247 EXPECT_CALL(mock_alsa_wrapper_, | 249 EXPECT_CALL(mock_alsa_wrapper_, |
248 PcmSetParams(_, _, _, _, _, _, | 250 PcmSetParams(_, _, _, _, _, _, |
249 AlsaPcmOutputStream::kMinLatencyMicros)) | 251 AlsaPcmOutputStream::kMinLatencyMicros)) |
250 .WillOnce(Return(0)); | 252 .WillOnce(Return(0)); |
251 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) | 253 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) |
252 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), | 254 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), |
253 SetArgumentPointee<2>(kTestFramesPerPacket / 2), | 255 SetArgumentPointee<2>(kTestFramesPerPacket / 2), |
254 Return(0))); | 256 Return(0))); |
255 | 257 |
256 ASSERT_TRUE(test_stream_->Open(kMinLatencyPacketSize)); | 258 test_stream_ = CreateStream(kTestChannels, kPacketFramesInMinLatency); |
| 259 ASSERT_TRUE(test_stream_->Open()); |
257 message_loop_.RunAllPending(); | 260 message_loop_.RunAllPending(); |
258 | 261 |
259 // Now close it and test that everything was released. | 262 // Now close it and test that everything was released. |
260 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0)); | 263 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0)); |
261 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) | 264 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) |
262 .WillOnce(Return(kTestDeviceName)); | 265 .WillOnce(Return(kTestDeviceName)); |
263 EXPECT_CALL(mock_manager_, ReleaseOutputStream(test_stream_.get())); | 266 EXPECT_CALL(mock_manager_, ReleaseOutputStream(test_stream_.get())); |
264 test_stream_->Close(); | 267 test_stream_->Close(); |
265 message_loop_.RunAllPending(); | 268 message_loop_.RunAllPending(); |
266 | 269 |
267 Mock::VerifyAndClear(&mock_alsa_wrapper_); | 270 Mock::VerifyAndClear(&mock_alsa_wrapper_); |
268 Mock::VerifyAndClear(&mock_manager_); | 271 Mock::VerifyAndClear(&mock_manager_); |
269 | 272 |
270 // Test that having more packets ends up with a latency based on packet size. | 273 // Test that having more packets ends up with a latency based on packet size. |
271 const int kOverMinLatencyPacketSize = | 274 const int kOverMinLatencyPacketSize = kPacketFramesInMinLatency + 1; |
272 (kPacketFramesInMinLatency + 1) * kTestBytesPerFrame; | 275 int64 expected_micros = 2 * AlsaPcmOutputStream::FramesToMicros( |
273 int64 expected_micros = 2 * | 276 kOverMinLatencyPacketSize, kTestSampleRate); |
274 AlsaPcmOutputStream::FramesToMicros( | |
275 kOverMinLatencyPacketSize / kTestBytesPerFrame, | |
276 kTestSampleRate); | |
277 | |
278 // Recreate the stream to reset the state. | |
279 test_stream_ = CreateStreamWithChannels(kTestChannels); | |
280 | 277 |
281 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) | 278 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) |
282 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); | 279 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); |
283 EXPECT_CALL(mock_alsa_wrapper_, | 280 EXPECT_CALL(mock_alsa_wrapper_, |
284 PcmSetParams(_, _, _, _, _, _, expected_micros)) | 281 PcmSetParams(_, _, _, _, _, _, expected_micros)) |
285 .WillOnce(Return(0)); | 282 .WillOnce(Return(0)); |
286 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) | 283 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) |
287 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), | 284 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), |
288 SetArgumentPointee<2>(kTestFramesPerPacket / 2), | 285 SetArgumentPointee<2>(kTestFramesPerPacket / 2), |
289 Return(0))); | 286 Return(0))); |
290 | 287 |
291 ASSERT_TRUE(test_stream_->Open(kOverMinLatencyPacketSize)); | 288 test_stream_ = CreateStream(kTestChannels, kOverMinLatencyPacketSize); |
| 289 ASSERT_TRUE(test_stream_->Open()); |
292 message_loop_.RunAllPending(); | 290 message_loop_.RunAllPending(); |
293 | 291 |
294 // Now close it and test that everything was released. | 292 // Now close it and test that everything was released. |
295 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) | 293 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) |
296 .WillOnce(Return(0)); | 294 .WillOnce(Return(0)); |
297 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) | 295 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) |
298 .WillOnce(Return(kTestDeviceName)); | 296 .WillOnce(Return(kTestDeviceName)); |
299 EXPECT_CALL(mock_manager_, ReleaseOutputStream(test_stream_.get())); | 297 EXPECT_CALL(mock_manager_, ReleaseOutputStream(test_stream_.get())); |
300 test_stream_->Close(); | 298 test_stream_->Close(); |
301 message_loop_.RunAllPending(); | 299 message_loop_.RunAllPending(); |
(...skipping 23 matching lines...) Expand all Loading... |
325 kTestSampleRate, | 323 kTestSampleRate, |
326 1, | 324 1, |
327 expected_micros)) | 325 expected_micros)) |
328 .WillOnce(Return(0)); | 326 .WillOnce(Return(0)); |
329 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(kFakeHandle, _, _)) | 327 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(kFakeHandle, _, _)) |
330 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), | 328 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), |
331 SetArgumentPointee<2>(kTestFramesPerPacket / 2), | 329 SetArgumentPointee<2>(kTestFramesPerPacket / 2), |
332 Return(0))); | 330 Return(0))); |
333 | 331 |
334 // Open the stream. | 332 // Open the stream. |
335 ASSERT_TRUE(test_stream_->Open(kTestPacketSize)); | 333 ASSERT_TRUE(test_stream_->Open()); |
336 message_loop_.RunAllPending(); | 334 message_loop_.RunAllPending(); |
337 | 335 |
338 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, | 336 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, |
339 test_stream_->shared_data_.state()); | 337 test_stream_->shared_data_.state()); |
340 EXPECT_EQ(kFakeHandle, test_stream_->playback_handle_); | 338 EXPECT_EQ(kFakeHandle, test_stream_->playback_handle_); |
341 EXPECT_EQ(kTestFramesPerPacket, test_stream_->frames_per_packet_); | 339 EXPECT_EQ(kTestFramesPerPacket, test_stream_->frames_per_packet_); |
342 EXPECT_TRUE(test_stream_->buffer_.get()); | 340 EXPECT_TRUE(test_stream_->buffer_.get()); |
343 EXPECT_FALSE(test_stream_->stop_stream_); | 341 EXPECT_FALSE(test_stream_->stop_stream_); |
344 | 342 |
345 // Now close it and test that everything was released. | 343 // Now close it and test that everything was released. |
(...skipping 10 matching lines...) Expand all Loading... |
356 EXPECT_TRUE(test_stream_->stop_stream_); | 354 EXPECT_TRUE(test_stream_->stop_stream_); |
357 } | 355 } |
358 | 356 |
359 TEST_F(AlsaPcmOutputStreamTest, PcmOpenFailed) { | 357 TEST_F(AlsaPcmOutputStreamTest, PcmOpenFailed) { |
360 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) | 358 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) |
361 .WillOnce(Return(kTestFailedErrno)); | 359 .WillOnce(Return(kTestFailedErrno)); |
362 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) | 360 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) |
363 .WillOnce(Return(kDummyMessage)); | 361 .WillOnce(Return(kDummyMessage)); |
364 | 362 |
365 // Open still succeeds since PcmOpen is delegated to another thread. | 363 // Open still succeeds since PcmOpen is delegated to another thread. |
366 ASSERT_TRUE(test_stream_->Open(kTestPacketSize)); | 364 ASSERT_TRUE(test_stream_->Open()); |
367 ASSERT_EQ(AlsaPcmOutputStream::kIsOpened, | 365 ASSERT_EQ(AlsaPcmOutputStream::kIsOpened, |
368 test_stream_->shared_data_.state()); | 366 test_stream_->shared_data_.state()); |
369 ASSERT_FALSE(test_stream_->stop_stream_); | 367 ASSERT_FALSE(test_stream_->stop_stream_); |
370 message_loop_.RunAllPending(); | 368 message_loop_.RunAllPending(); |
371 | 369 |
372 // Ensure internal state is set for a no-op stream if PcmOpen() failes. | 370 // Ensure internal state is set for a no-op stream if PcmOpen() failes. |
373 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, | 371 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, |
374 test_stream_->shared_data_.state()); | 372 test_stream_->shared_data_.state()); |
375 EXPECT_TRUE(test_stream_->stop_stream_); | 373 EXPECT_TRUE(test_stream_->stop_stream_); |
376 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); | 374 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); |
(...skipping 13 matching lines...) Expand all Loading... |
390 .WillOnce(Return(kTestFailedErrno)); | 388 .WillOnce(Return(kTestFailedErrno)); |
391 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) | 389 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) |
392 .WillOnce(Return(0)); | 390 .WillOnce(Return(0)); |
393 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) | 391 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) |
394 .WillOnce(Return(kTestDeviceName)); | 392 .WillOnce(Return(kTestDeviceName)); |
395 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) | 393 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) |
396 .WillOnce(Return(kDummyMessage)); | 394 .WillOnce(Return(kDummyMessage)); |
397 | 395 |
398 // If open fails, the stream stays in kCreated because it has effectively had | 396 // If open fails, the stream stays in kCreated because it has effectively had |
399 // no changes. | 397 // no changes. |
400 ASSERT_TRUE(test_stream_->Open(kTestPacketSize)); | 398 ASSERT_TRUE(test_stream_->Open()); |
401 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, | 399 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, |
402 test_stream_->shared_data_.state()); | 400 test_stream_->shared_data_.state()); |
403 ASSERT_FALSE(test_stream_->stop_stream_); | 401 ASSERT_FALSE(test_stream_->stop_stream_); |
404 message_loop_.RunAllPending(); | 402 message_loop_.RunAllPending(); |
405 | 403 |
406 // Ensure internal state is set for a no-op stream if PcmSetParams() failes. | 404 // Ensure internal state is set for a no-op stream if PcmSetParams() failes. |
407 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, | 405 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, |
408 test_stream_->shared_data_.state()); | 406 test_stream_->shared_data_.state()); |
409 EXPECT_TRUE(test_stream_->stop_stream_); | 407 EXPECT_TRUE(test_stream_->stop_stream_); |
410 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); | 408 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); |
(...skipping 13 matching lines...) Expand all Loading... |
424 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), | 422 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), |
425 Return(0))); | 423 Return(0))); |
426 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _)) | 424 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _)) |
427 .WillOnce(Return(0)); | 425 .WillOnce(Return(0)); |
428 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) | 426 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) |
429 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), | 427 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), |
430 SetArgumentPointee<2>(kTestFramesPerPacket / 2), | 428 SetArgumentPointee<2>(kTestFramesPerPacket / 2), |
431 Return(0))); | 429 Return(0))); |
432 | 430 |
433 // Open the stream. | 431 // Open the stream. |
434 ASSERT_TRUE(test_stream_->Open(kTestPacketSize)); | 432 ASSERT_TRUE(test_stream_->Open()); |
435 message_loop_.RunAllPending(); | 433 message_loop_.RunAllPending(); |
436 | 434 |
437 // Expect Device setup. | 435 // Expect Device setup. |
438 EXPECT_CALL(mock_alsa_wrapper_, PcmDrop(kFakeHandle)) | 436 EXPECT_CALL(mock_alsa_wrapper_, PcmDrop(kFakeHandle)) |
439 .WillOnce(Return(0)); | 437 .WillOnce(Return(0)); |
440 EXPECT_CALL(mock_alsa_wrapper_, PcmPrepare(kFakeHandle)) | 438 EXPECT_CALL(mock_alsa_wrapper_, PcmPrepare(kFakeHandle)) |
441 .WillOnce(Return(0)); | 439 .WillOnce(Return(0)); |
442 | 440 |
443 // Expect the pre-roll. | 441 // Expect the pre-roll. |
444 MockAudioSourceCallback mock_callback; | 442 MockAudioSourceCallback mock_callback; |
(...skipping 17 matching lines...) Expand all Loading... |
462 .WillOnce(Return(kTestFramesPerPacket)) // Buffer is empty. | 460 .WillOnce(Return(kTestFramesPerPacket)) // Buffer is empty. |
463 .WillOnce(Return(kTestFramesPerPacket)) | 461 .WillOnce(Return(kTestFramesPerPacket)) |
464 .WillRepeatedly(DoAll(InvokeWithoutArgs(&message_loop_, | 462 .WillRepeatedly(DoAll(InvokeWithoutArgs(&message_loop_, |
465 &MessageLoop::QuitNow), | 463 &MessageLoop::QuitNow), |
466 Return(0))); // Buffer is full. | 464 Return(0))); // Buffer is full. |
467 | 465 |
468 test_stream_->Start(&mock_callback); | 466 test_stream_->Start(&mock_callback); |
469 message_loop_.RunAllPending(); | 467 message_loop_.RunAllPending(); |
470 | 468 |
471 EXPECT_CALL(mock_manager_, ReleaseOutputStream(test_stream_.get())); | 469 EXPECT_CALL(mock_manager_, ReleaseOutputStream(test_stream_.get())); |
472 EXPECT_CALL(mock_callback, OnClose(test_stream_.get())); | |
473 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) | 470 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) |
474 .WillOnce(Return(0)); | 471 .WillOnce(Return(0)); |
475 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) | 472 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) |
476 .WillOnce(Return(kTestDeviceName)); | 473 .WillOnce(Return(kTestDeviceName)); |
477 test_stream_->Close(); | 474 test_stream_->Close(); |
478 message_loop_.RunAllPending(); | 475 message_loop_.RunAllPending(); |
479 } | 476 } |
480 | 477 |
481 TEST_F(AlsaPcmOutputStreamTest, WritePacket_FinishedPacket) { | 478 TEST_F(AlsaPcmOutputStreamTest, WritePacket_FinishedPacket) { |
482 InitBuffer(); | 479 InitBuffer(); |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
677 .WillOnce(Return(0)); | 674 .WillOnce(Return(0)); |
678 | 675 |
679 // The parameters are specified by ALSA documentation, and are in constants | 676 // The parameters are specified by ALSA documentation, and are in constants |
680 // in the implementation files. | 677 // in the implementation files. |
681 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("IOID"))) | 678 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("IOID"))) |
682 .WillRepeatedly(Invoke(OutputHint)); | 679 .WillRepeatedly(Invoke(OutputHint)); |
683 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("NAME"))) | 680 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("NAME"))) |
684 .WillRepeatedly(Invoke(EchoHint)); | 681 .WillRepeatedly(Invoke(EchoHint)); |
685 | 682 |
686 | 683 |
687 test_stream_ = CreateStreamWithChannels(i); | 684 test_stream_ = CreateStream(i); |
688 EXPECT_TRUE(test_stream_->AutoSelectDevice(i)); | 685 EXPECT_TRUE(test_stream_->AutoSelectDevice(i)); |
689 EXPECT_EQ(kExpectedDownmix[i], test_stream_->should_downmix_); | 686 EXPECT_EQ(kExpectedDownmix[i], test_stream_->should_downmix_); |
690 | 687 |
691 Mock::VerifyAndClearExpectations(&mock_alsa_wrapper_); | 688 Mock::VerifyAndClearExpectations(&mock_alsa_wrapper_); |
692 Mock::VerifyAndClearExpectations(&mock_manager_); | 689 Mock::VerifyAndClearExpectations(&mock_manager_); |
693 } | 690 } |
694 } | 691 } |
695 | 692 |
696 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_FallbackDevices) { | 693 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_FallbackDevices) { |
697 using std::string; | 694 using std::string; |
(...skipping 29 matching lines...) Expand all Loading... |
727 InSequence s; | 724 InSequence s; |
728 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(first_try.c_str()), _, _)) | 725 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(first_try.c_str()), _, _)) |
729 .WillOnce(Return(kTestFailedErrno)); | 726 .WillOnce(Return(kTestFailedErrno)); |
730 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(second_try.c_str()), _, _)) | 727 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(second_try.c_str()), _, _)) |
731 .WillOnce(Return(kTestFailedErrno)); | 728 .WillOnce(Return(kTestFailedErrno)); |
732 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(third_try.c_str()), _, _)) | 729 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(third_try.c_str()), _, _)) |
733 .WillOnce(Return(kTestFailedErrno)); | 730 .WillOnce(Return(kTestFailedErrno)); |
734 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(fourth_try.c_str()), _, _)) | 731 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(fourth_try.c_str()), _, _)) |
735 .WillOnce(Return(kTestFailedErrno)); | 732 .WillOnce(Return(kTestFailedErrno)); |
736 | 733 |
737 test_stream_ = CreateStreamWithChannels(5); | 734 test_stream_ = CreateStream(5); |
738 EXPECT_FALSE(test_stream_->AutoSelectDevice(5)); | 735 EXPECT_FALSE(test_stream_->AutoSelectDevice(5)); |
739 } | 736 } |
740 | 737 |
741 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_HintFail) { | 738 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_HintFail) { |
742 // Should get |kDefaultDevice|, and force a 2-channel downmix on a failure to | 739 // Should get |kDefaultDevice|, and force a 2-channel downmix on a failure to |
743 // enumerate devices. | 740 // enumerate devices. |
744 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameHint(_, _, _)) | 741 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameHint(_, _, _)) |
745 .WillRepeatedly(Return(kTestFailedErrno)); | 742 .WillRepeatedly(Return(kTestFailedErrno)); |
746 EXPECT_CALL(mock_alsa_wrapper_, | 743 EXPECT_CALL(mock_alsa_wrapper_, |
747 PcmOpen(_, StrEq(AlsaPcmOutputStream::kDefaultDevice), _, _)) | 744 PcmOpen(_, StrEq(AlsaPcmOutputStream::kDefaultDevice), _, _)) |
748 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); | 745 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); |
749 EXPECT_CALL(mock_alsa_wrapper_, | 746 EXPECT_CALL(mock_alsa_wrapper_, |
750 PcmSetParams(kFakeHandle, _, _, 2, _, _, _)) | 747 PcmSetParams(kFakeHandle, _, _, 2, _, _, _)) |
751 .WillOnce(Return(0)); | 748 .WillOnce(Return(0)); |
752 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) | 749 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) |
753 .WillOnce(Return(kDummyMessage)); | 750 .WillOnce(Return(kDummyMessage)); |
754 | 751 |
755 test_stream_ = CreateStreamWithChannels(5); | 752 test_stream_ = CreateStream(5); |
756 EXPECT_TRUE(test_stream_->AutoSelectDevice(5)); | 753 EXPECT_TRUE(test_stream_->AutoSelectDevice(5)); |
757 EXPECT_TRUE(test_stream_->should_downmix_); | 754 EXPECT_TRUE(test_stream_->should_downmix_); |
758 } | 755 } |
759 | 756 |
760 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_StopStream) { | 757 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_StopStream) { |
761 InitBuffer(); | 758 InitBuffer(); |
762 test_stream_->stop_stream_ = true; | 759 test_stream_->stop_stream_ = true; |
763 bool source_exhausted; | 760 bool source_exhausted; |
764 test_stream_->BufferPacket(&source_exhausted); | 761 test_stream_->BufferPacket(&source_exhausted); |
765 EXPECT_EQ(0u, test_stream_->buffer_->forward_bytes()); | 762 EXPECT_EQ(0u, test_stream_->buffer_->forward_bytes()); |
(...skipping 30 matching lines...) Expand all Loading... |
796 | 793 |
797 test_stream_->stop_stream_ = true; | 794 test_stream_->stop_stream_ = true; |
798 test_stream_->ScheduleNextWrite(true); | 795 test_stream_->ScheduleNextWrite(true); |
799 | 796 |
800 // TODO(ajwong): Find a way to test whether or not another task has been | 797 // TODO(ajwong): Find a way to test whether or not another task has been |
801 // posted so we can verify that the Alsa code will indeed break the task | 798 // posted so we can verify that the Alsa code will indeed break the task |
802 // posting loop. | 799 // posting loop. |
803 | 800 |
804 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsClosed); | 801 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsClosed); |
805 } | 802 } |
OLD | NEW |