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

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: 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
« no previous file with comments | « media/audio/linux/alsa_input.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) 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 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
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_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());
no longer working on chromium 2012/03/01 16:02:19 Question to Tommi: We don't use these mock functio
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())); 276 // EXPECT_CALL(mock_manager(), ReleaseOutputStream(test_stream_));
267 test_stream_->Close(); 277 test_stream_->Close();
268 278
269 Mock::VerifyAndClear(&mock_alsa_wrapper_); 279 Mock::VerifyAndClear(&mock_alsa_wrapper_);
270 Mock::VerifyAndClear(mock_manager_.get()); 280 Mock::VerifyAndClear(mock_manager_.get());
271 281
272 // Test that having more packets ends up with a latency based on packet size. 282 // Test that having more packets ends up with a latency based on packet size.
273 const int kOverMinLatencyPacketSize = kPacketFramesInMinLatency + 1; 283 const int kOverMinLatencyPacketSize = kPacketFramesInMinLatency + 1;
274 int64 expected_micros = 2 * AlsaPcmOutputStream::FramesToMicros( 284 int64 expected_micros = 2 * AlsaPcmOutputStream::FramesToMicros(
275 kOverMinLatencyPacketSize, kTestSampleRate); 285 kOverMinLatencyPacketSize, kTestSampleRate);
276 286
277 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 287 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
278 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); 288 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0)));
279 EXPECT_CALL(mock_alsa_wrapper_, 289 EXPECT_CALL(mock_alsa_wrapper_,
280 PcmSetParams(_, _, _, _, _, _, expected_micros)) 290 PcmSetParams(_, _, _, _, _, _, expected_micros))
281 .WillOnce(Return(0)); 291 .WillOnce(Return(0));
282 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) 292 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _))
283 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), 293 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket),
284 SetArgumentPointee<2>(kTestFramesPerPacket / 2), 294 SetArgumentPointee<2>(kTestFramesPerPacket / 2),
285 Return(0))); 295 Return(0)));
286 296
287 test_stream_.reset(CreateStream(kTestChannelLayout, 297 test_stream_ = CreateStream(kTestChannelLayout, kOverMinLatencyPacketSize);
288 kOverMinLatencyPacketSize));
289 ASSERT_TRUE(test_stream_->Open()); 298 ASSERT_TRUE(test_stream_->Open());
290 299
291 // Now close it and test that everything was released. 300 // Now close it and test that everything was released.
292 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) 301 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle))
293 .WillOnce(Return(0)); 302 .WillOnce(Return(0));
294 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) 303 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle))
295 .WillOnce(Return(kTestDeviceName)); 304 .WillOnce(Return(kTestDeviceName));
296 EXPECT_CALL(mock_manager(), ReleaseOutputStream(test_stream_.get()));
297 test_stream_->Close(); 305 test_stream_->Close();
298 306
299 Mock::VerifyAndClear(&mock_alsa_wrapper_); 307 Mock::VerifyAndClear(&mock_alsa_wrapper_);
300 Mock::VerifyAndClear(mock_manager_.get()); 308 Mock::VerifyAndClear(mock_manager_.get());
301 } 309 }
302 310
303 TEST_F(AlsaPcmOutputStreamTest, OpenClose) { 311 TEST_F(AlsaPcmOutputStreamTest, OpenClose) {
304 int64 expected_micros = 2 * 312 int64 expected_micros = 2 *
305 AlsaPcmOutputStream::FramesToMicros(kTestPacketSize / kTestBytesPerFrame, 313 AlsaPcmOutputStream::FramesToMicros(kTestPacketSize / kTestBytesPerFrame,
306 kTestSampleRate); 314 kTestSampleRate);
(...skipping 27 matching lines...) Expand all
334 EXPECT_EQ(kFakeHandle, test_stream_->playback_handle_); 342 EXPECT_EQ(kFakeHandle, test_stream_->playback_handle_);
335 EXPECT_EQ(kTestFramesPerPacket, test_stream_->frames_per_packet_); 343 EXPECT_EQ(kTestFramesPerPacket, test_stream_->frames_per_packet_);
336 EXPECT_TRUE(test_stream_->buffer_.get()); 344 EXPECT_TRUE(test_stream_->buffer_.get());
337 EXPECT_FALSE(test_stream_->stop_stream_); 345 EXPECT_FALSE(test_stream_->stop_stream_);
338 346
339 // Now close it and test that everything was released. 347 // Now close it and test that everything was released.
340 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) 348 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle))
341 .WillOnce(Return(0)); 349 .WillOnce(Return(0));
342 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) 350 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle))
343 .WillOnce(Return(kTestDeviceName)); 351 .WillOnce(Return(kTestDeviceName));
344 EXPECT_CALL(mock_manager(), ReleaseOutputStream(test_stream_.get()));
345 test_stream_->Close(); 352 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 } 353 }
351 354
352 TEST_F(AlsaPcmOutputStreamTest, PcmOpenFailed) { 355 TEST_F(AlsaPcmOutputStreamTest, PcmOpenFailed) {
353 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 356 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
354 .WillOnce(Return(kTestFailedErrno)); 357 .WillOnce(Return(kTestFailedErrno));
355 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) 358 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno))
356 .WillOnce(Return(kDummyMessage)); 359 .WillOnce(Return(kDummyMessage));
357 360
358 ASSERT_FALSE(test_stream_->Open()); 361 ASSERT_FALSE(test_stream_->Open());
359 ASSERT_EQ(AlsaPcmOutputStream::kInError, test_stream_->state()); 362 ASSERT_EQ(AlsaPcmOutputStream::kInError, test_stream_->state());
360 363
361 // Ensure internal state is set for a no-op stream if PcmOpen() failes. 364 // Ensure internal state is set for a no-op stream if PcmOpen() failes.
362 EXPECT_TRUE(test_stream_->stop_stream_); 365 EXPECT_TRUE(test_stream_->stop_stream_);
363 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); 366 EXPECT_TRUE(test_stream_->playback_handle_ == NULL);
364 EXPECT_FALSE(test_stream_->buffer_.get()); 367 EXPECT_FALSE(test_stream_->buffer_.get());
365 368
366 // Close the stream since we opened it to make destruction happy. 369 // Close the stream since we opened it to make destruction happy.
367 EXPECT_CALL(mock_manager(), ReleaseOutputStream(test_stream_.get()));
368 test_stream_->Close(); 370 test_stream_->Close();
369 } 371 }
370 372
371 TEST_F(AlsaPcmOutputStreamTest, PcmSetParamsFailed) { 373 TEST_F(AlsaPcmOutputStreamTest, PcmSetParamsFailed) {
372 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 374 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
373 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), 375 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle),
374 Return(0))); 376 Return(0)));
375 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _)) 377 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _))
376 .WillOnce(Return(kTestFailedErrno)); 378 .WillOnce(Return(kTestFailedErrno));
377 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) 379 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle))
378 .WillOnce(Return(0)); 380 .WillOnce(Return(0));
379 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) 381 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle))
380 .WillOnce(Return(kTestDeviceName)); 382 .WillOnce(Return(kTestDeviceName));
381 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) 383 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno))
382 .WillOnce(Return(kDummyMessage)); 384 .WillOnce(Return(kDummyMessage));
383 385
384 // If open fails, the stream stays in kCreated because it has effectively had 386 // If open fails, the stream stays in kCreated because it has effectively had
385 // no changes. 387 // no changes.
386 ASSERT_FALSE(test_stream_->Open()); 388 ASSERT_FALSE(test_stream_->Open());
387 EXPECT_EQ(AlsaPcmOutputStream::kInError, test_stream_->state()); 389 EXPECT_EQ(AlsaPcmOutputStream::kInError, test_stream_->state());
388 390
389 // Ensure internal state is set for a no-op stream if PcmSetParams() failes. 391 // Ensure internal state is set for a no-op stream if PcmSetParams() failes.
390 EXPECT_TRUE(test_stream_->stop_stream_); 392 EXPECT_TRUE(test_stream_->stop_stream_);
391 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); 393 EXPECT_TRUE(test_stream_->playback_handle_ == NULL);
392 EXPECT_FALSE(test_stream_->buffer_.get()); 394 EXPECT_FALSE(test_stream_->buffer_.get());
393 395
394 // Close the stream since we opened it to make destruction happy. 396 // Close the stream since we opened it to make destruction happy.
395 EXPECT_CALL(mock_manager(), ReleaseOutputStream(test_stream_.get()));
396 test_stream_->Close(); 397 test_stream_->Close();
397 } 398 }
398 399
399 TEST_F(AlsaPcmOutputStreamTest, StartStop) { 400 TEST_F(AlsaPcmOutputStreamTest, StartStop) {
400 // Open() call opens the playback device, sets the parameters, posts a task 401 // Open() call opens the playback device, sets the parameters, posts a task
401 // with the resulting configuration data, and transitions the object state to 402 // with the resulting configuration data, and transitions the object state to
402 // kIsOpened. 403 // kIsOpened.
403 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 404 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
404 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), 405 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle),
405 Return(0))); 406 Return(0)));
(...skipping 15 matching lines...) Expand all
421 422
422 // Expect the pre-roll. 423 // Expect the pre-roll.
423 MockAudioSourceCallback mock_callback; 424 MockAudioSourceCallback mock_callback;
424 EXPECT_CALL(mock_alsa_wrapper_, PcmState(kFakeHandle)) 425 EXPECT_CALL(mock_alsa_wrapper_, PcmState(kFakeHandle))
425 .Times(3) 426 .Times(3)
426 .WillRepeatedly(Return(SND_PCM_STATE_RUNNING)); 427 .WillRepeatedly(Return(SND_PCM_STATE_RUNNING));
427 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(kFakeHandle, _)) 428 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(kFakeHandle, _))
428 .Times(2) 429 .Times(2)
429 .WillRepeatedly(DoAll(SetArgumentPointee<1>(0), Return(0))); 430 .WillRepeatedly(DoAll(SetArgumentPointee<1>(0), Return(0)));
430 EXPECT_CALL(mock_callback, 431 EXPECT_CALL(mock_callback,
431 OnMoreData(test_stream_.get(), _, kTestPacketSize, _)) 432 OnMoreData(test_stream_, _, kTestPacketSize, _))
432 .Times(2) 433 .Times(2)
433 .WillOnce(Return(kTestPacketSize)) 434 .WillOnce(Return(kTestPacketSize))
434 .WillOnce(Return(0)); 435 .WillOnce(Return(0));
435 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, _, _)) 436 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, _, _))
436 .WillOnce(Return(kTestFramesPerPacket)); 437 .WillOnce(Return(kTestFramesPerPacket));
437 438
438 // Expect scheduling. 439 // Expect scheduling.
439 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle)) 440 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle))
440 .Times(AtLeast(3)) 441 .Times(AtLeast(3))
441 .WillOnce(Return(kTestFramesPerPacket)) // Buffer is empty. 442 .WillOnce(Return(kTestFramesPerPacket)) // Buffer is empty.
442 .WillOnce(Return(kTestFramesPerPacket)) 443 .WillOnce(Return(kTestFramesPerPacket))
443 .WillRepeatedly(DoAll(InvokeWithoutArgs(&message_loop_, 444 .WillRepeatedly(DoAll(InvokeWithoutArgs(&message_loop_,
444 &MessageLoop::QuitNow), 445 &MessageLoop::QuitNow),
445 Return(0))); // Buffer is full. 446 Return(0))); // Buffer is full.
446 447
447 test_stream_->Start(&mock_callback); 448 test_stream_->Start(&mock_callback);
448 message_loop_.RunAllPending(); 449 message_loop_.RunAllPending();
449 450
450 EXPECT_CALL(mock_manager(), ReleaseOutputStream(test_stream_.get()));
451 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) 451 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle))
452 .WillOnce(Return(0)); 452 .WillOnce(Return(0));
453 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) 453 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle))
454 .WillOnce(Return(kTestDeviceName)); 454 .WillOnce(Return(kTestDeviceName));
455 test_stream_->Close(); 455 test_stream_->Close();
456 } 456 }
457 457
458 TEST_F(AlsaPcmOutputStreamTest, WritePacket_FinishedPacket) { 458 TEST_F(AlsaPcmOutputStreamTest, WritePacket_FinishedPacket) {
459 InitBuffer(); 459 InitBuffer();
460 460
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
532 MockAudioSourceCallback mock_callback; 532 MockAudioSourceCallback mock_callback;
533 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) 533 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_))
534 .WillOnce(Return(SND_PCM_STATE_RUNNING)); 534 .WillOnce(Return(SND_PCM_STATE_RUNNING));
535 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _)) 535 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _))
536 .WillOnce(DoAll(SetArgumentPointee<1>(1), Return(0))); 536 .WillOnce(DoAll(SetArgumentPointee<1>(1), Return(0)));
537 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) 537 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_))
538 .WillRepeatedly(Return(0)); // Buffer is full. 538 .WillRepeatedly(Return(0)); // Buffer is full.
539 539
540 // Return a partially filled packet. 540 // Return a partially filled packet.
541 EXPECT_CALL(mock_callback, 541 EXPECT_CALL(mock_callback,
542 OnMoreData(test_stream_.get(), _, _, _)) 542 OnMoreData(test_stream_, _, _, _))
543 .WillOnce(Return(10)); 543 .WillOnce(Return(10));
544 544
545 bool source_exhausted; 545 bool source_exhausted;
546 test_stream_->set_source_callback(&mock_callback); 546 test_stream_->set_source_callback(&mock_callback);
547 test_stream_->packet_size_ = kTestPacketSize; 547 test_stream_->packet_size_ = kTestPacketSize;
548 test_stream_->BufferPacket(&source_exhausted); 548 test_stream_->BufferPacket(&source_exhausted);
549 549
550 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes()); 550 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes());
551 EXPECT_FALSE(source_exhausted); 551 EXPECT_FALSE(source_exhausted);
552 } 552 }
553 553
554 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Negative) { 554 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Negative) {
555 InitBuffer(); 555 InitBuffer();
556 test_stream_->buffer_->Clear(); 556 test_stream_->buffer_->Clear();
557 557
558 // Simulate where the underrun has occurred right after checking the delay. 558 // Simulate where the underrun has occurred right after checking the delay.
559 MockAudioSourceCallback mock_callback; 559 MockAudioSourceCallback mock_callback;
560 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) 560 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_))
561 .WillOnce(Return(SND_PCM_STATE_RUNNING)); 561 .WillOnce(Return(SND_PCM_STATE_RUNNING));
562 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _)) 562 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _))
563 .WillOnce(DoAll(SetArgumentPointee<1>(-1), Return(0))); 563 .WillOnce(DoAll(SetArgumentPointee<1>(-1), Return(0)));
564 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) 564 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_))
565 .WillRepeatedly(Return(0)); // Buffer is full. 565 .WillRepeatedly(Return(0)); // Buffer is full.
566 EXPECT_CALL(mock_callback, 566 EXPECT_CALL(mock_callback,
567 OnMoreData(test_stream_.get(), _, _, _)) 567 OnMoreData(test_stream_, _, _, _))
568 .WillOnce(Return(10)); 568 .WillOnce(Return(10));
569 569
570 bool source_exhausted; 570 bool source_exhausted;
571 test_stream_->set_source_callback(&mock_callback); 571 test_stream_->set_source_callback(&mock_callback);
572 test_stream_->packet_size_ = kTestPacketSize; 572 test_stream_->packet_size_ = kTestPacketSize;
573 test_stream_->BufferPacket(&source_exhausted); 573 test_stream_->BufferPacket(&source_exhausted);
574 574
575 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes()); 575 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes());
576 EXPECT_FALSE(source_exhausted); 576 EXPECT_FALSE(source_exhausted);
577 } 577 }
578 578
579 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Underrun) { 579 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Underrun) {
580 InitBuffer(); 580 InitBuffer();
581 test_stream_->buffer_->Clear(); 581 test_stream_->buffer_->Clear();
582 582
583 // If ALSA has underrun then we should assume a delay of zero. 583 // If ALSA has underrun then we should assume a delay of zero.
584 MockAudioSourceCallback mock_callback; 584 MockAudioSourceCallback mock_callback;
585 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) 585 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_))
586 .WillOnce(Return(SND_PCM_STATE_XRUN)); 586 .WillOnce(Return(SND_PCM_STATE_XRUN));
587 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) 587 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_))
588 .WillRepeatedly(Return(0)); // Buffer is full. 588 .WillRepeatedly(Return(0)); // Buffer is full.
589 EXPECT_CALL(mock_callback, 589 EXPECT_CALL(mock_callback,
590 OnMoreData(test_stream_.get(), _, _, AllOf( 590 OnMoreData(test_stream_, _, _, AllOf(
591 Field(&AudioBuffersState::pending_bytes, 0), 591 Field(&AudioBuffersState::pending_bytes, 0),
592 Field(&AudioBuffersState::hardware_delay_bytes, 0)))) 592 Field(&AudioBuffersState::hardware_delay_bytes, 0))))
593 .WillOnce(Return(10)); 593 .WillOnce(Return(10));
594 594
595 bool source_exhausted; 595 bool source_exhausted;
596 test_stream_->set_source_callback(&mock_callback); 596 test_stream_->set_source_callback(&mock_callback);
597 test_stream_->packet_size_ = kTestPacketSize; 597 test_stream_->packet_size_ = kTestPacketSize;
598 test_stream_->BufferPacket(&source_exhausted); 598 test_stream_->BufferPacket(&source_exhausted);
599 599
600 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes()); 600 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes());
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
663 PcmSetParams(kFakeHandle, _, _, i, _, _, _)) 663 PcmSetParams(kFakeHandle, _, _, i, _, _, _))
664 .WillOnce(Return(0)); 664 .WillOnce(Return(0));
665 665
666 // The parameters are specified by ALSA documentation, and are in constants 666 // The parameters are specified by ALSA documentation, and are in constants
667 // in the implementation files. 667 // in the implementation files.
668 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("IOID"))) 668 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("IOID")))
669 .WillRepeatedly(Invoke(OutputHint)); 669 .WillRepeatedly(Invoke(OutputHint));
670 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("NAME"))) 670 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("NAME")))
671 .WillRepeatedly(Invoke(EchoHint)); 671 .WillRepeatedly(Invoke(EchoHint));
672 672
673 test_stream_.reset(CreateStream(kExpectedLayouts[i])); 673 test_stream_ = CreateStream(kExpectedLayouts[i]);
674 EXPECT_TRUE(test_stream_->AutoSelectDevice(i)); 674 EXPECT_TRUE(test_stream_->AutoSelectDevice(i));
675 EXPECT_EQ(kExpectedDownmix[i], test_stream_->should_downmix_); 675 EXPECT_EQ(kExpectedDownmix[i], test_stream_->should_downmix_);
676 676
677 Mock::VerifyAndClearExpectations(&mock_alsa_wrapper_); 677 Mock::VerifyAndClearExpectations(&mock_alsa_wrapper_);
678 Mock::VerifyAndClearExpectations(mock_manager_.get()); 678 Mock::VerifyAndClearExpectations(mock_manager_.get());
679 } 679 }
680 } 680 }
681 681
682 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_FallbackDevices) { 682 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_FallbackDevices) {
683 using std::string; 683 using std::string;
(...skipping 29 matching lines...) Expand all
713 InSequence s; 713 InSequence s;
714 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(first_try.c_str()), _, _)) 714 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(first_try.c_str()), _, _))
715 .WillOnce(Return(kTestFailedErrno)); 715 .WillOnce(Return(kTestFailedErrno));
716 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(second_try.c_str()), _, _)) 716 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(second_try.c_str()), _, _))
717 .WillOnce(Return(kTestFailedErrno)); 717 .WillOnce(Return(kTestFailedErrno));
718 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(third_try.c_str()), _, _)) 718 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(third_try.c_str()), _, _))
719 .WillOnce(Return(kTestFailedErrno)); 719 .WillOnce(Return(kTestFailedErrno));
720 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(fourth_try.c_str()), _, _)) 720 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(fourth_try.c_str()), _, _))
721 .WillOnce(Return(kTestFailedErrno)); 721 .WillOnce(Return(kTestFailedErrno));
722 722
723 test_stream_.reset(CreateStream(CHANNEL_LAYOUT_5POINT0)); 723 test_stream_ = CreateStream(CHANNEL_LAYOUT_5POINT0);
724 EXPECT_FALSE(test_stream_->AutoSelectDevice(5)); 724 EXPECT_FALSE(test_stream_->AutoSelectDevice(5));
725 } 725 }
726 726
727 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_HintFail) { 727 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_HintFail) {
728 // Should get |kDefaultDevice|, and force a 2-channel downmix on a failure to 728 // Should get |kDefaultDevice|, and force a 2-channel downmix on a failure to
729 // enumerate devices. 729 // enumerate devices.
730 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameHint(_, _, _)) 730 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameHint(_, _, _))
731 .WillRepeatedly(Return(kTestFailedErrno)); 731 .WillRepeatedly(Return(kTestFailedErrno));
732 EXPECT_CALL(mock_alsa_wrapper_, 732 EXPECT_CALL(mock_alsa_wrapper_,
733 PcmOpen(_, StrEq(AlsaPcmOutputStream::kDefaultDevice), _, _)) 733 PcmOpen(_, StrEq(AlsaPcmOutputStream::kDefaultDevice), _, _))
734 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); 734 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0)));
735 EXPECT_CALL(mock_alsa_wrapper_, 735 EXPECT_CALL(mock_alsa_wrapper_,
736 PcmSetParams(kFakeHandle, _, _, 2, _, _, _)) 736 PcmSetParams(kFakeHandle, _, _, 2, _, _, _))
737 .WillOnce(Return(0)); 737 .WillOnce(Return(0));
738 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) 738 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno))
739 .WillOnce(Return(kDummyMessage)); 739 .WillOnce(Return(kDummyMessage));
740 740
741 test_stream_.reset(CreateStream(CHANNEL_LAYOUT_5POINT0)); 741 test_stream_ = CreateStream(CHANNEL_LAYOUT_5POINT0);
742 EXPECT_TRUE(test_stream_->AutoSelectDevice(5)); 742 EXPECT_TRUE(test_stream_->AutoSelectDevice(5));
743 EXPECT_TRUE(test_stream_->should_downmix_); 743 EXPECT_TRUE(test_stream_->should_downmix_);
744 } 744 }
745 745
746 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_StopStream) { 746 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_StopStream) {
747 InitBuffer(); 747 InitBuffer();
748 test_stream_->stop_stream_ = true; 748 test_stream_->stop_stream_ = true;
749 bool source_exhausted; 749 bool source_exhausted;
750 test_stream_->BufferPacket(&source_exhausted); 750 test_stream_->BufferPacket(&source_exhausted);
751 EXPECT_EQ(0u, test_stream_->buffer_->forward_bytes()); 751 EXPECT_EQ(0u, test_stream_->buffer_->forward_bytes());
(...skipping 29 matching lines...) Expand all
781 781
782 test_stream_->stop_stream_ = true; 782 test_stream_->stop_stream_ = true;
783 test_stream_->ScheduleNextWrite(true); 783 test_stream_->ScheduleNextWrite(true);
784 784
785 // TODO(ajwong): Find a way to test whether or not another task has been 785 // 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 786 // posted so we can verify that the Alsa code will indeed break the task
787 // posting loop. 787 // posting loop.
788 788
789 test_stream_->TransitionTo(AlsaPcmOutputStream::kIsClosed); 789 test_stream_->TransitionTo(AlsaPcmOutputStream::kIsClosed);
790 } 790 }
OLDNEW
« no previous file with comments | « media/audio/linux/alsa_input.cc ('k') | media/audio/linux/audio_manager_linux.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698