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

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
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(
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
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
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
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
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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698