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

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

Issue 9570014: Move some generic functions to AudioManagerBase to be inherited by platform-specific AudioManager*** (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: small changes on the code, ready for review Created 8 years, 9 months 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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/stringprintf.h" 6 #include "base/stringprintf.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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 uint8* dest, uint32 max_size, 71 uint8* dest, uint32 max_size,
72 AudioBuffersState buffers_state)); 72 AudioBuffersState buffers_state));
73 MOCK_METHOD2(OnError, void(AudioOutputStream* stream, int code)); 73 MOCK_METHOD2(OnError, void(AudioOutputStream* stream, int code));
74 }; 74 };
75 75
76 class MockAudioManagerLinux : public AudioManagerLinux { 76 class MockAudioManagerLinux : public AudioManagerLinux {
77 public: 77 public:
78 MOCK_METHOD0(Init, void()); 78 MOCK_METHOD0(Init, void());
79 MOCK_METHOD0(HasAudioOutputDevices, bool()); 79 MOCK_METHOD0(HasAudioOutputDevices, bool());
80 MOCK_METHOD0(HasAudioInputDevices, bool()); 80 MOCK_METHOD0(HasAudioInputDevices, bool());
81 MOCK_METHOD1(MakeAudioOutputStream, AudioOutputStream*(
82 const AudioParameters& params));
83 MOCK_METHOD2(MakeAudioInputStream, AudioInputStream*(
84 const AudioParameters& params, const std::string& device_id));
85 MOCK_METHOD0(MuteAll, void()); 81 MOCK_METHOD0(MuteAll, void());
86 MOCK_METHOD0(UnMuteAll, void()); 82 MOCK_METHOD0(UnMuteAll, void());
87 MOCK_METHOD1(ReleaseOutputStream, void(AudioOutputStream* stream)); 83 MOCK_METHOD0(GetMaxAudioOutputStreamsAllowed, int());
84 MOCK_METHOD1(MakeAudioLinearOutputStream, AudioOutputStream*(
85 const AudioParameters& params));
86 MOCK_METHOD1(MakeAudioLowLatencyOutputStream, AudioOutputStream*(
87 const AudioParameters& params));
88 MOCK_METHOD2(MakeAudioLinearOutputStream, AudioInputStream*(
89 const AudioParameters& params, const std::string& device_id));
90 MOCK_METHOD2(MakeAudioLowLatencyInputStream, AudioInputStream*(
91 const AudioParameters& params, const std::string& device_id));
92
93 // We need to override this function because we want to skip the checking
94 // the number of active streams.
95 virtual void ReleaseOutputStream(AudioOutputStream* stream) OVERRIDE {
96 DCHECK(stream);
97 delete stream;
98 }
88 99
89 // We don't mock this method since all tests will do the same thing 100 // We don't mock this method since all tests will do the same thing
90 // and use the current message loop. 101 // and use the current message loop.
91 virtual scoped_refptr<base::MessageLoopProxy> GetMessageLoop() OVERRIDE { 102 virtual scoped_refptr<base::MessageLoopProxy> GetMessageLoop() OVERRIDE {
92 return MessageLoop::current()->message_loop_proxy(); 103 return MessageLoop::current()->message_loop_proxy();
93 } 104 }
94 }; 105 };
95 106
96 class AlsaPcmOutputStreamTest : public testing::Test { 107 class AlsaPcmOutputStreamTest : public testing::Test {
97 protected: 108 protected:
98 AlsaPcmOutputStreamTest() { 109 AlsaPcmOutputStreamTest() {
99 mock_manager_.reset(new StrictMock<MockAudioManagerLinux>()); 110 mock_manager_.reset(new StrictMock<MockAudioManagerLinux>());
100 test_stream_.reset(CreateStream(kTestChannelLayout)); 111 test_stream_ = CreateStream(kTestChannelLayout);
101 } 112 }
102 113
103 virtual ~AlsaPcmOutputStreamTest() { 114 virtual ~AlsaPcmOutputStreamTest() {
104 test_stream_.reset(NULL); 115 test_stream_ = NULL;
105 } 116 }
106 117
107 AlsaPcmOutputStream* CreateStream(ChannelLayout layout) { 118 AlsaPcmOutputStream* CreateStream(ChannelLayout layout) {
108 return CreateStream(layout, kTestFramesPerPacket); 119 return CreateStream(layout, kTestFramesPerPacket);
109 } 120 }
110 121
111 AlsaPcmOutputStream* CreateStream(ChannelLayout layout, 122 AlsaPcmOutputStream* CreateStream(ChannelLayout layout,
112 int32 samples_per_packet) { 123 int32 samples_per_packet) {
113 AudioParameters params(kTestFormat, layout, kTestSampleRate, 124 AudioParameters params(kTestFormat, layout, kTestSampleRate,
114 kTestBitsPerSample, samples_per_packet); 125 kTestBitsPerSample, samples_per_packet);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 static char kSurround41[]; 169 static char kSurround41[];
159 static char kSurround50[]; 170 static char kSurround50[];
160 static char kSurround51[]; 171 static char kSurround51[];
161 static char kSurround70[]; 172 static char kSurround70[];
162 static char kSurround71[]; 173 static char kSurround71[];
163 static void* kFakeHints[]; 174 static void* kFakeHints[];
164 175
165 StrictMock<MockAlsaWrapper> mock_alsa_wrapper_; 176 StrictMock<MockAlsaWrapper> mock_alsa_wrapper_;
166 scoped_ptr<StrictMock<MockAudioManagerLinux> > mock_manager_; 177 scoped_ptr<StrictMock<MockAudioManagerLinux> > mock_manager_;
167 MessageLoop message_loop_; 178 MessageLoop message_loop_;
168 scoped_ptr<AlsaPcmOutputStream> test_stream_; 179 AlsaPcmOutputStream* test_stream_;
169 scoped_refptr<media::DataBuffer> packet_; 180 scoped_refptr<media::DataBuffer> packet_;
170 181
171 private: 182 private:
172 DISALLOW_COPY_AND_ASSIGN(AlsaPcmOutputStreamTest); 183 DISALLOW_COPY_AND_ASSIGN(AlsaPcmOutputStreamTest);
173 }; 184 };
174 185
175 const ChannelLayout AlsaPcmOutputStreamTest::kTestChannelLayout = 186 const ChannelLayout AlsaPcmOutputStreamTest::kTestChannelLayout =
176 CHANNEL_LAYOUT_STEREO; 187 CHANNEL_LAYOUT_STEREO;
177 const int AlsaPcmOutputStreamTest::kTestSampleRate = 188 const int AlsaPcmOutputStreamTest::kTestSampleRate =
178 AudioParameters::kAudioCDSampleRate; 189 AudioParameters::kAudioCDSampleRate;
(...skipping 20 matching lines...) Expand all
199 char AlsaPcmOutputStreamTest::kSurround70[] = "surround70:CARD=foo,DEV=0"; 210 char AlsaPcmOutputStreamTest::kSurround70[] = "surround70:CARD=foo,DEV=0";
200 char AlsaPcmOutputStreamTest::kSurround71[] = "surround71:CARD=foo,DEV=0"; 211 char AlsaPcmOutputStreamTest::kSurround71[] = "surround71:CARD=foo,DEV=0";
201 void* AlsaPcmOutputStreamTest::kFakeHints[] = { 212 void* AlsaPcmOutputStreamTest::kFakeHints[] = {
202 kSurround40, kSurround41, kSurround50, kSurround51, 213 kSurround40, kSurround41, kSurround50, kSurround51,
203 kSurround70, kSurround71, NULL }; 214 kSurround70, kSurround71, NULL };
204 215
205 TEST_F(AlsaPcmOutputStreamTest, ConstructedState) { 216 TEST_F(AlsaPcmOutputStreamTest, ConstructedState) {
206 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream_->state()); 217 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream_->state());
207 218
208 // Should support mono. 219 // Should support mono.
209 test_stream_.reset(CreateStream(CHANNEL_LAYOUT_MONO)); 220 test_stream_ = CreateStream(CHANNEL_LAYOUT_MONO);
210 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream_->state()); 221 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream_->state());
211 222
212 // Should support multi-channel. 223 // Should support multi-channel.
213 test_stream_.reset(CreateStream(CHANNEL_LAYOUT_SURROUND)); 224 test_stream_ = CreateStream(CHANNEL_LAYOUT_SURROUND);
214 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream_->state()); 225 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream_->state());
215 226
216 // Bad bits per sample. 227 // Bad bits per sample.
217 AudioParameters bad_bps_params(kTestFormat, kTestChannelLayout, 228 AudioParameters bad_bps_params(kTestFormat, kTestChannelLayout,
218 kTestSampleRate, kTestBitsPerSample - 1, 229 kTestSampleRate, kTestBitsPerSample - 1,
219 kTestFramesPerPacket); 230 kTestFramesPerPacket);
220 test_stream_.reset(new AlsaPcmOutputStream(kTestDeviceName, 231 test_stream_ = new AlsaPcmOutputStream(kTestDeviceName,
221 bad_bps_params, 232 bad_bps_params,
222 &mock_alsa_wrapper_, 233 &mock_alsa_wrapper_,
223 mock_manager_.get())); 234 mock_manager_.get());
224 EXPECT_EQ(AlsaPcmOutputStream::kInError, test_stream_->state()); 235 EXPECT_EQ(AlsaPcmOutputStream::kInError, test_stream_->state());
225 236
226 // Bad format. 237 // Bad format.
227 AudioParameters bad_format_params( 238 AudioParameters bad_format_params(
228 AudioParameters::AUDIO_LAST_FORMAT, kTestChannelLayout, kTestSampleRate, 239 AudioParameters::AUDIO_LAST_FORMAT, kTestChannelLayout, kTestSampleRate,
229 kTestBitsPerSample, kTestFramesPerPacket); 240 kTestBitsPerSample, kTestFramesPerPacket);
230 test_stream_.reset(new AlsaPcmOutputStream(kTestDeviceName, 241 test_stream_ = new AlsaPcmOutputStream(kTestDeviceName,
231 bad_format_params, 242 bad_format_params,
232 &mock_alsa_wrapper_, 243 &mock_alsa_wrapper_,
233 mock_manager_.get())); 244 mock_manager_.get());
234 EXPECT_EQ(AlsaPcmOutputStream::kInError, test_stream_->state()); 245 EXPECT_EQ(AlsaPcmOutputStream::kInError, test_stream_->state());
235 } 246 }
236 247
237 TEST_F(AlsaPcmOutputStreamTest, LatencyFloor) { 248 TEST_F(AlsaPcmOutputStreamTest, LatencyFloor) {
238 const double kMicrosPerFrame = 249 const double kMicrosPerFrame =
239 static_cast<double>(1000000) / kTestSampleRate; 250 static_cast<double>(1000000) / kTestSampleRate;
240 const double kPacketFramesInMinLatency = 251 const double kPacketFramesInMinLatency =
241 AlsaPcmOutputStream::kMinLatencyMicros / kMicrosPerFrame / 2.0; 252 AlsaPcmOutputStream::kMinLatencyMicros / kMicrosPerFrame / 2.0;
242 253
243 // Test that packets which would cause a latency under less than 254 // Test that packets which would cause a latency under less than
244 // AlsaPcmOutputStream::kMinLatencyMicros will get clipped to 255 // AlsaPcmOutputStream::kMinLatencyMicros will get clipped to
245 // AlsaPcmOutputStream::kMinLatencyMicros, 256 // AlsaPcmOutputStream::kMinLatencyMicros,
246 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 257 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
247 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), 258 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle),
248 Return(0))); 259 Return(0)));
249 EXPECT_CALL(mock_alsa_wrapper_, 260 EXPECT_CALL(mock_alsa_wrapper_,
250 PcmSetParams(_, _, _, _, _, _, 261 PcmSetParams(_, _, _, _, _, _,
251 AlsaPcmOutputStream::kMinLatencyMicros)) 262 AlsaPcmOutputStream::kMinLatencyMicros))
252 .WillOnce(Return(0)); 263 .WillOnce(Return(0));
253 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) 264 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _))
254 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), 265 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket),
255 SetArgumentPointee<2>(kTestFramesPerPacket / 2), 266 SetArgumentPointee<2>(kTestFramesPerPacket / 2),
256 Return(0))); 267 Return(0)));
257 268
258 test_stream_.reset(CreateStream(kTestChannelLayout, 269 test_stream_ = CreateStream(kTestChannelLayout, kPacketFramesInMinLatency);
259 kPacketFramesInMinLatency));
260 ASSERT_TRUE(test_stream_->Open()); 270 ASSERT_TRUE(test_stream_->Open());
261 271
262 // Now close it and test that everything was released. 272 // Now close it and test that everything was released.
263 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0)); 273 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0));
264 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) 274 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle))
265 .WillOnce(Return(kTestDeviceName)); 275 .WillOnce(Return(kTestDeviceName));
266 EXPECT_CALL(mock_manager(), ReleaseOutputStream(test_stream_.get()));
267 test_stream_->Close(); 276 test_stream_->Close();
268 277
269 Mock::VerifyAndClear(&mock_alsa_wrapper_); 278 Mock::VerifyAndClear(&mock_alsa_wrapper_);
270 Mock::VerifyAndClear(mock_manager_.get()); 279 Mock::VerifyAndClear(mock_manager_.get());
271 280
272 // Test that having more packets ends up with a latency based on packet size. 281 // Test that having more packets ends up with a latency based on packet size.
273 const int kOverMinLatencyPacketSize = kPacketFramesInMinLatency + 1; 282 const int kOverMinLatencyPacketSize = kPacketFramesInMinLatency + 1;
274 int64 expected_micros = 2 * AlsaPcmOutputStream::FramesToMicros( 283 int64 expected_micros = 2 * AlsaPcmOutputStream::FramesToMicros(
275 kOverMinLatencyPacketSize, kTestSampleRate); 284 kOverMinLatencyPacketSize, kTestSampleRate);
276 285
277 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 286 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
278 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); 287 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0)));
279 EXPECT_CALL(mock_alsa_wrapper_, 288 EXPECT_CALL(mock_alsa_wrapper_,
280 PcmSetParams(_, _, _, _, _, _, expected_micros)) 289 PcmSetParams(_, _, _, _, _, _, expected_micros))
281 .WillOnce(Return(0)); 290 .WillOnce(Return(0));
282 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) 291 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _))
283 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), 292 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket),
284 SetArgumentPointee<2>(kTestFramesPerPacket / 2), 293 SetArgumentPointee<2>(kTestFramesPerPacket / 2),
285 Return(0))); 294 Return(0)));
286 295
287 test_stream_.reset(CreateStream(kTestChannelLayout, 296 test_stream_ = CreateStream(kTestChannelLayout, kOverMinLatencyPacketSize);
288 kOverMinLatencyPacketSize));
289 ASSERT_TRUE(test_stream_->Open()); 297 ASSERT_TRUE(test_stream_->Open());
290 298
291 // Now close it and test that everything was released. 299 // Now close it and test that everything was released.
292 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) 300 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle))
293 .WillOnce(Return(0)); 301 .WillOnce(Return(0));
294 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) 302 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle))
295 .WillOnce(Return(kTestDeviceName)); 303 .WillOnce(Return(kTestDeviceName));
296 EXPECT_CALL(mock_manager(), ReleaseOutputStream(test_stream_.get()));
297 test_stream_->Close(); 304 test_stream_->Close();
298 305
299 Mock::VerifyAndClear(&mock_alsa_wrapper_); 306 Mock::VerifyAndClear(&mock_alsa_wrapper_);
300 Mock::VerifyAndClear(mock_manager_.get()); 307 Mock::VerifyAndClear(mock_manager_.get());
301 } 308 }
302 309
303 TEST_F(AlsaPcmOutputStreamTest, OpenClose) { 310 TEST_F(AlsaPcmOutputStreamTest, OpenClose) {
304 int64 expected_micros = 2 * 311 int64 expected_micros = 2 *
305 AlsaPcmOutputStream::FramesToMicros(kTestPacketSize / kTestBytesPerFrame, 312 AlsaPcmOutputStream::FramesToMicros(kTestPacketSize / kTestBytesPerFrame,
306 kTestSampleRate); 313 kTestSampleRate);
(...skipping 27 matching lines...) Expand all
334 EXPECT_EQ(kFakeHandle, test_stream_->playback_handle_); 341 EXPECT_EQ(kFakeHandle, test_stream_->playback_handle_);
335 EXPECT_EQ(kTestFramesPerPacket, test_stream_->frames_per_packet_); 342 EXPECT_EQ(kTestFramesPerPacket, test_stream_->frames_per_packet_);
336 EXPECT_TRUE(test_stream_->buffer_.get()); 343 EXPECT_TRUE(test_stream_->buffer_.get());
337 EXPECT_FALSE(test_stream_->stop_stream_); 344 EXPECT_FALSE(test_stream_->stop_stream_);
338 345
339 // Now close it and test that everything was released. 346 // Now close it and test that everything was released.
340 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) 347 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle))
341 .WillOnce(Return(0)); 348 .WillOnce(Return(0));
342 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) 349 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle))
343 .WillOnce(Return(kTestDeviceName)); 350 .WillOnce(Return(kTestDeviceName));
344 EXPECT_CALL(mock_manager(), ReleaseOutputStream(test_stream_.get()));
345 test_stream_->Close(); 351 test_stream_->Close();
346
347 EXPECT_TRUE(test_stream_->playback_handle_ == NULL);
348 EXPECT_FALSE(test_stream_->buffer_.get());
349 EXPECT_TRUE(test_stream_->stop_stream_);
350 } 352 }
351 353
352 TEST_F(AlsaPcmOutputStreamTest, PcmOpenFailed) { 354 TEST_F(AlsaPcmOutputStreamTest, PcmOpenFailed) {
353 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 355 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
354 .WillOnce(Return(kTestFailedErrno)); 356 .WillOnce(Return(kTestFailedErrno));
355 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) 357 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno))
356 .WillOnce(Return(kDummyMessage)); 358 .WillOnce(Return(kDummyMessage));
357 359
358 ASSERT_FALSE(test_stream_->Open()); 360 ASSERT_FALSE(test_stream_->Open());
359 ASSERT_EQ(AlsaPcmOutputStream::kInError, test_stream_->state()); 361 ASSERT_EQ(AlsaPcmOutputStream::kInError, test_stream_->state());
360 362
361 // Ensure internal state is set for a no-op stream if PcmOpen() failes. 363 // Ensure internal state is set for a no-op stream if PcmOpen() failes.
362 EXPECT_TRUE(test_stream_->stop_stream_); 364 EXPECT_TRUE(test_stream_->stop_stream_);
363 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); 365 EXPECT_TRUE(test_stream_->playback_handle_ == NULL);
364 EXPECT_FALSE(test_stream_->buffer_.get()); 366 EXPECT_FALSE(test_stream_->buffer_.get());
365 367
366 // Close the stream since we opened it to make destruction happy. 368 // Close the stream since we opened it to make destruction happy.
367 EXPECT_CALL(mock_manager(), ReleaseOutputStream(test_stream_.get()));
368 test_stream_->Close(); 369 test_stream_->Close();
369 } 370 }
370 371
371 TEST_F(AlsaPcmOutputStreamTest, PcmSetParamsFailed) { 372 TEST_F(AlsaPcmOutputStreamTest, PcmSetParamsFailed) {
372 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 373 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
373 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), 374 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle),
374 Return(0))); 375 Return(0)));
375 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _)) 376 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _))
376 .WillOnce(Return(kTestFailedErrno)); 377 .WillOnce(Return(kTestFailedErrno));
377 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) 378 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle))
378 .WillOnce(Return(0)); 379 .WillOnce(Return(0));
379 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) 380 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle))
380 .WillOnce(Return(kTestDeviceName)); 381 .WillOnce(Return(kTestDeviceName));
381 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) 382 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno))
382 .WillOnce(Return(kDummyMessage)); 383 .WillOnce(Return(kDummyMessage));
383 384
384 // If open fails, the stream stays in kCreated because it has effectively had 385 // If open fails, the stream stays in kCreated because it has effectively had
385 // no changes. 386 // no changes.
386 ASSERT_FALSE(test_stream_->Open()); 387 ASSERT_FALSE(test_stream_->Open());
387 EXPECT_EQ(AlsaPcmOutputStream::kInError, test_stream_->state()); 388 EXPECT_EQ(AlsaPcmOutputStream::kInError, test_stream_->state());
388 389
389 // Ensure internal state is set for a no-op stream if PcmSetParams() failes. 390 // Ensure internal state is set for a no-op stream if PcmSetParams() failes.
390 EXPECT_TRUE(test_stream_->stop_stream_); 391 EXPECT_TRUE(test_stream_->stop_stream_);
391 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); 392 EXPECT_TRUE(test_stream_->playback_handle_ == NULL);
392 EXPECT_FALSE(test_stream_->buffer_.get()); 393 EXPECT_FALSE(test_stream_->buffer_.get());
393 394
394 // Close the stream since we opened it to make destruction happy. 395 // Close the stream since we opened it to make destruction happy.
395 EXPECT_CALL(mock_manager(), ReleaseOutputStream(test_stream_.get()));
396 test_stream_->Close(); 396 test_stream_->Close();
397 } 397 }
398 398
399 TEST_F(AlsaPcmOutputStreamTest, StartStop) { 399 TEST_F(AlsaPcmOutputStreamTest, StartStop) {
400 // Open() call opens the playback device, sets the parameters, posts a task 400 // Open() call opens the playback device, sets the parameters, posts a task
401 // with the resulting configuration data, and transitions the object state to 401 // with the resulting configuration data, and transitions the object state to
402 // kIsOpened. 402 // kIsOpened.
403 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 403 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
404 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), 404 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle),
405 Return(0))); 405 Return(0)));
(...skipping 15 matching lines...) Expand all
421 421
422 // Expect the pre-roll. 422 // Expect the pre-roll.
423 MockAudioSourceCallback mock_callback; 423 MockAudioSourceCallback mock_callback;
424 EXPECT_CALL(mock_alsa_wrapper_, PcmState(kFakeHandle)) 424 EXPECT_CALL(mock_alsa_wrapper_, PcmState(kFakeHandle))
425 .Times(3) 425 .Times(3)
426 .WillRepeatedly(Return(SND_PCM_STATE_RUNNING)); 426 .WillRepeatedly(Return(SND_PCM_STATE_RUNNING));
427 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(kFakeHandle, _)) 427 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(kFakeHandle, _))
428 .Times(2) 428 .Times(2)
429 .WillRepeatedly(DoAll(SetArgumentPointee<1>(0), Return(0))); 429 .WillRepeatedly(DoAll(SetArgumentPointee<1>(0), Return(0)));
430 EXPECT_CALL(mock_callback, 430 EXPECT_CALL(mock_callback,
431 OnMoreData(test_stream_.get(), _, kTestPacketSize, _)) 431 OnMoreData(test_stream_, _, kTestPacketSize, _))
432 .Times(2) 432 .Times(2)
433 .WillOnce(Return(kTestPacketSize)) 433 .WillOnce(Return(kTestPacketSize))
434 .WillOnce(Return(0)); 434 .WillOnce(Return(0));
435 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, _, _)) 435 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, _, _))
436 .WillOnce(Return(kTestFramesPerPacket)); 436 .WillOnce(Return(kTestFramesPerPacket));
437 437
438 // Expect scheduling. 438 // Expect scheduling.
439 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle)) 439 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle))
440 .Times(AtLeast(3)) 440 .Times(AtLeast(3))
441 .WillOnce(Return(kTestFramesPerPacket)) // Buffer is empty. 441 .WillOnce(Return(kTestFramesPerPacket)) // Buffer is empty.
442 .WillOnce(Return(kTestFramesPerPacket)) 442 .WillOnce(Return(kTestFramesPerPacket))
443 .WillRepeatedly(DoAll(InvokeWithoutArgs(&message_loop_, 443 .WillRepeatedly(DoAll(InvokeWithoutArgs(&message_loop_,
444 &MessageLoop::QuitNow), 444 &MessageLoop::QuitNow),
445 Return(0))); // Buffer is full. 445 Return(0))); // Buffer is full.
446 446
447 test_stream_->Start(&mock_callback); 447 test_stream_->Start(&mock_callback);
448 message_loop_.RunAllPending(); 448 message_loop_.RunAllPending();
449 449
450 EXPECT_CALL(mock_manager(), ReleaseOutputStream(test_stream_.get()));
451 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) 450 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle))
452 .WillOnce(Return(0)); 451 .WillOnce(Return(0));
453 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) 452 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle))
454 .WillOnce(Return(kTestDeviceName)); 453 .WillOnce(Return(kTestDeviceName));
455 test_stream_->Close(); 454 test_stream_->Close();
456 } 455 }
457 456
458 TEST_F(AlsaPcmOutputStreamTest, WritePacket_FinishedPacket) { 457 TEST_F(AlsaPcmOutputStreamTest, WritePacket_FinishedPacket) {
459 InitBuffer(); 458 InitBuffer();
460 459
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
532 MockAudioSourceCallback mock_callback; 531 MockAudioSourceCallback mock_callback;
533 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) 532 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_))
534 .WillOnce(Return(SND_PCM_STATE_RUNNING)); 533 .WillOnce(Return(SND_PCM_STATE_RUNNING));
535 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _)) 534 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _))
536 .WillOnce(DoAll(SetArgumentPointee<1>(1), Return(0))); 535 .WillOnce(DoAll(SetArgumentPointee<1>(1), Return(0)));
537 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) 536 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_))
538 .WillRepeatedly(Return(0)); // Buffer is full. 537 .WillRepeatedly(Return(0)); // Buffer is full.
539 538
540 // Return a partially filled packet. 539 // Return a partially filled packet.
541 EXPECT_CALL(mock_callback, 540 EXPECT_CALL(mock_callback,
542 OnMoreData(test_stream_.get(), _, _, _)) 541 OnMoreData(test_stream_, _, _, _))
543 .WillOnce(Return(10)); 542 .WillOnce(Return(10));
544 543
545 bool source_exhausted; 544 bool source_exhausted;
546 test_stream_->set_source_callback(&mock_callback); 545 test_stream_->set_source_callback(&mock_callback);
547 test_stream_->packet_size_ = kTestPacketSize; 546 test_stream_->packet_size_ = kTestPacketSize;
548 test_stream_->BufferPacket(&source_exhausted); 547 test_stream_->BufferPacket(&source_exhausted);
549 548
550 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes()); 549 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes());
551 EXPECT_FALSE(source_exhausted); 550 EXPECT_FALSE(source_exhausted);
552 } 551 }
553 552
554 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Negative) { 553 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Negative) {
555 InitBuffer(); 554 InitBuffer();
556 test_stream_->buffer_->Clear(); 555 test_stream_->buffer_->Clear();
557 556
558 // Simulate where the underrun has occurred right after checking the delay. 557 // Simulate where the underrun has occurred right after checking the delay.
559 MockAudioSourceCallback mock_callback; 558 MockAudioSourceCallback mock_callback;
560 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) 559 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_))
561 .WillOnce(Return(SND_PCM_STATE_RUNNING)); 560 .WillOnce(Return(SND_PCM_STATE_RUNNING));
562 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _)) 561 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _))
563 .WillOnce(DoAll(SetArgumentPointee<1>(-1), Return(0))); 562 .WillOnce(DoAll(SetArgumentPointee<1>(-1), Return(0)));
564 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) 563 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_))
565 .WillRepeatedly(Return(0)); // Buffer is full. 564 .WillRepeatedly(Return(0)); // Buffer is full.
566 EXPECT_CALL(mock_callback, 565 EXPECT_CALL(mock_callback,
567 OnMoreData(test_stream_.get(), _, _, _)) 566 OnMoreData(test_stream_, _, _, _))
568 .WillOnce(Return(10)); 567 .WillOnce(Return(10));
569 568
570 bool source_exhausted; 569 bool source_exhausted;
571 test_stream_->set_source_callback(&mock_callback); 570 test_stream_->set_source_callback(&mock_callback);
572 test_stream_->packet_size_ = kTestPacketSize; 571 test_stream_->packet_size_ = kTestPacketSize;
573 test_stream_->BufferPacket(&source_exhausted); 572 test_stream_->BufferPacket(&source_exhausted);
574 573
575 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes()); 574 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes());
576 EXPECT_FALSE(source_exhausted); 575 EXPECT_FALSE(source_exhausted);
577 } 576 }
578 577
579 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Underrun) { 578 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Underrun) {
580 InitBuffer(); 579 InitBuffer();
581 test_stream_->buffer_->Clear(); 580 test_stream_->buffer_->Clear();
582 581
583 // If ALSA has underrun then we should assume a delay of zero. 582 // If ALSA has underrun then we should assume a delay of zero.
584 MockAudioSourceCallback mock_callback; 583 MockAudioSourceCallback mock_callback;
585 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) 584 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_))
586 .WillOnce(Return(SND_PCM_STATE_XRUN)); 585 .WillOnce(Return(SND_PCM_STATE_XRUN));
587 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) 586 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_))
588 .WillRepeatedly(Return(0)); // Buffer is full. 587 .WillRepeatedly(Return(0)); // Buffer is full.
589 EXPECT_CALL(mock_callback, 588 EXPECT_CALL(mock_callback,
590 OnMoreData(test_stream_.get(), _, _, AllOf( 589 OnMoreData(test_stream_, _, _, AllOf(
591 Field(&AudioBuffersState::pending_bytes, 0), 590 Field(&AudioBuffersState::pending_bytes, 0),
592 Field(&AudioBuffersState::hardware_delay_bytes, 0)))) 591 Field(&AudioBuffersState::hardware_delay_bytes, 0))))
593 .WillOnce(Return(10)); 592 .WillOnce(Return(10));
594 593
595 bool source_exhausted; 594 bool source_exhausted;
596 test_stream_->set_source_callback(&mock_callback); 595 test_stream_->set_source_callback(&mock_callback);
597 test_stream_->packet_size_ = kTestPacketSize; 596 test_stream_->packet_size_ = kTestPacketSize;
598 test_stream_->BufferPacket(&source_exhausted); 597 test_stream_->BufferPacket(&source_exhausted);
599 598
600 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes()); 599 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes());
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
663 PcmSetParams(kFakeHandle, _, _, i, _, _, _)) 662 PcmSetParams(kFakeHandle, _, _, i, _, _, _))
664 .WillOnce(Return(0)); 663 .WillOnce(Return(0));
665 664
666 // The parameters are specified by ALSA documentation, and are in constants 665 // The parameters are specified by ALSA documentation, and are in constants
667 // in the implementation files. 666 // in the implementation files.
668 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("IOID"))) 667 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("IOID")))
669 .WillRepeatedly(Invoke(OutputHint)); 668 .WillRepeatedly(Invoke(OutputHint));
670 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("NAME"))) 669 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("NAME")))
671 .WillRepeatedly(Invoke(EchoHint)); 670 .WillRepeatedly(Invoke(EchoHint));
672 671
673 test_stream_.reset(CreateStream(kExpectedLayouts[i])); 672 test_stream_ = CreateStream(kExpectedLayouts[i]);
674 EXPECT_TRUE(test_stream_->AutoSelectDevice(i)); 673 EXPECT_TRUE(test_stream_->AutoSelectDevice(i));
675 EXPECT_EQ(kExpectedDownmix[i], test_stream_->should_downmix_); 674 EXPECT_EQ(kExpectedDownmix[i], test_stream_->should_downmix_);
676 675
677 Mock::VerifyAndClearExpectations(&mock_alsa_wrapper_); 676 Mock::VerifyAndClearExpectations(&mock_alsa_wrapper_);
678 Mock::VerifyAndClearExpectations(mock_manager_.get()); 677 Mock::VerifyAndClearExpectations(mock_manager_.get());
679 } 678 }
680 } 679 }
681 680
682 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_FallbackDevices) { 681 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_FallbackDevices) {
683 using std::string; 682 using std::string;
(...skipping 29 matching lines...) Expand all
713 InSequence s; 712 InSequence s;
714 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(first_try.c_str()), _, _)) 713 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(first_try.c_str()), _, _))
715 .WillOnce(Return(kTestFailedErrno)); 714 .WillOnce(Return(kTestFailedErrno));
716 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(second_try.c_str()), _, _)) 715 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(second_try.c_str()), _, _))
717 .WillOnce(Return(kTestFailedErrno)); 716 .WillOnce(Return(kTestFailedErrno));
718 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(third_try.c_str()), _, _)) 717 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(third_try.c_str()), _, _))
719 .WillOnce(Return(kTestFailedErrno)); 718 .WillOnce(Return(kTestFailedErrno));
720 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(fourth_try.c_str()), _, _)) 719 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(fourth_try.c_str()), _, _))
721 .WillOnce(Return(kTestFailedErrno)); 720 .WillOnce(Return(kTestFailedErrno));
722 721
723 test_stream_.reset(CreateStream(CHANNEL_LAYOUT_5POINT0)); 722 test_stream_ = CreateStream(CHANNEL_LAYOUT_5POINT0);
724 EXPECT_FALSE(test_stream_->AutoSelectDevice(5)); 723 EXPECT_FALSE(test_stream_->AutoSelectDevice(5));
725 } 724 }
726 725
727 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_HintFail) { 726 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_HintFail) {
728 // Should get |kDefaultDevice|, and force a 2-channel downmix on a failure to 727 // Should get |kDefaultDevice|, and force a 2-channel downmix on a failure to
729 // enumerate devices. 728 // enumerate devices.
730 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameHint(_, _, _)) 729 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameHint(_, _, _))
731 .WillRepeatedly(Return(kTestFailedErrno)); 730 .WillRepeatedly(Return(kTestFailedErrno));
732 EXPECT_CALL(mock_alsa_wrapper_, 731 EXPECT_CALL(mock_alsa_wrapper_,
733 PcmOpen(_, StrEq(AlsaPcmOutputStream::kDefaultDevice), _, _)) 732 PcmOpen(_, StrEq(AlsaPcmOutputStream::kDefaultDevice), _, _))
734 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); 733 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0)));
735 EXPECT_CALL(mock_alsa_wrapper_, 734 EXPECT_CALL(mock_alsa_wrapper_,
736 PcmSetParams(kFakeHandle, _, _, 2, _, _, _)) 735 PcmSetParams(kFakeHandle, _, _, 2, _, _, _))
737 .WillOnce(Return(0)); 736 .WillOnce(Return(0));
738 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) 737 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno))
739 .WillOnce(Return(kDummyMessage)); 738 .WillOnce(Return(kDummyMessage));
740 739
741 test_stream_.reset(CreateStream(CHANNEL_LAYOUT_5POINT0)); 740 test_stream_ = CreateStream(CHANNEL_LAYOUT_5POINT0);
742 EXPECT_TRUE(test_stream_->AutoSelectDevice(5)); 741 EXPECT_TRUE(test_stream_->AutoSelectDevice(5));
743 EXPECT_TRUE(test_stream_->should_downmix_); 742 EXPECT_TRUE(test_stream_->should_downmix_);
744 } 743 }
745 744
746 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_StopStream) { 745 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_StopStream) {
747 InitBuffer(); 746 InitBuffer();
748 test_stream_->stop_stream_ = true; 747 test_stream_->stop_stream_ = true;
749 bool source_exhausted; 748 bool source_exhausted;
750 test_stream_->BufferPacket(&source_exhausted); 749 test_stream_->BufferPacket(&source_exhausted);
751 EXPECT_EQ(0u, test_stream_->buffer_->forward_bytes()); 750 EXPECT_EQ(0u, test_stream_->buffer_->forward_bytes());
(...skipping 29 matching lines...) Expand all
781 780
782 test_stream_->stop_stream_ = true; 781 test_stream_->stop_stream_ = true;
783 test_stream_->ScheduleNextWrite(true); 782 test_stream_->ScheduleNextWrite(true);
784 783
785 // TODO(ajwong): Find a way to test whether or not another task has been 784 // TODO(ajwong): Find a way to test whether or not another task has been
786 // posted so we can verify that the Alsa code will indeed break the task 785 // posted so we can verify that the Alsa code will indeed break the task
787 // posting loop. 786 // posting loop.
788 787
789 test_stream_->TransitionTo(AlsaPcmOutputStream::kIsClosed); 788 test_stream_->TransitionTo(AlsaPcmOutputStream::kIsClosed);
790 } 789 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698