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