Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: media/audio/linux/alsa_output_unittest.cc

Issue 4661001: Simplified AudioOutputStream interface. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: - Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « media/audio/linux/alsa_output.cc ('k') | media/audio/linux/audio_manager_linux.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « media/audio/linux/alsa_output.cc ('k') | media/audio/linux/audio_manager_linux.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698