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

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

Issue 7117001: Simplify AlsaPcmOutputStream and AudioManagerLinux. Code was thread-safe, but now (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: '' Created 9 years, 6 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_output.cc ('k') | media/audio/linux/audio_manager_linux.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 AudioParameters params)); 84 AudioParameters params));
85 MOCK_METHOD0(MuteAll, void()); 85 MOCK_METHOD0(MuteAll, void());
86 MOCK_METHOD0(UnMuteAll, void()); 86 MOCK_METHOD0(UnMuteAll, void());
87 87
88 MOCK_METHOD1(ReleaseOutputStream, void(AlsaPcmOutputStream* stream)); 88 MOCK_METHOD1(ReleaseOutputStream, void(AlsaPcmOutputStream* stream));
89 }; 89 };
90 90
91 class AlsaPcmOutputStreamTest : public testing::Test { 91 class AlsaPcmOutputStreamTest : public testing::Test {
92 protected: 92 protected:
93 AlsaPcmOutputStreamTest() { 93 AlsaPcmOutputStreamTest() {
94 test_stream_ = CreateStream(kTestChannelLayout); 94 test_stream_.reset(CreateStream(kTestChannelLayout));
95 } 95 }
96 96
97 virtual ~AlsaPcmOutputStreamTest() { 97 virtual ~AlsaPcmOutputStreamTest() {
98 test_stream_ = NULL; 98 test_stream_.reset(NULL);
99 } 99 }
100 100
101 AlsaPcmOutputStream* CreateStream(ChannelLayout layout) { 101 AlsaPcmOutputStream* CreateStream(ChannelLayout layout) {
102 return CreateStream(layout, kTestFramesPerPacket); 102 return CreateStream(layout, kTestFramesPerPacket);
103 } 103 }
104 104
105 AlsaPcmOutputStream* CreateStream(ChannelLayout layout, 105 AlsaPcmOutputStream* CreateStream(ChannelLayout layout,
106 int32 samples_per_packet) { 106 int32 samples_per_packet) {
107 AudioParameters params(kTestFormat, layout, kTestSampleRate, 107 AudioParameters params(kTestFormat, layout, kTestSampleRate,
108 kTestBitsPerSample, samples_per_packet); 108 kTestBitsPerSample, samples_per_packet);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
149 static char kSurround41[]; 149 static char kSurround41[];
150 static char kSurround50[]; 150 static char kSurround50[];
151 static char kSurround51[]; 151 static char kSurround51[];
152 static char kSurround70[]; 152 static char kSurround70[];
153 static char kSurround71[]; 153 static char kSurround71[];
154 static void* kFakeHints[]; 154 static void* kFakeHints[];
155 155
156 StrictMock<MockAlsaWrapper> mock_alsa_wrapper_; 156 StrictMock<MockAlsaWrapper> mock_alsa_wrapper_;
157 StrictMock<MockAudioManagerLinux> mock_manager_; 157 StrictMock<MockAudioManagerLinux> mock_manager_;
158 MessageLoop message_loop_; 158 MessageLoop message_loop_;
159 scoped_refptr<AlsaPcmOutputStream> test_stream_; 159 scoped_ptr<AlsaPcmOutputStream> test_stream_;
160 scoped_refptr<media::DataBuffer> packet_; 160 scoped_refptr<media::DataBuffer> packet_;
161 161
162 private: 162 private:
163 DISALLOW_COPY_AND_ASSIGN(AlsaPcmOutputStreamTest); 163 DISALLOW_COPY_AND_ASSIGN(AlsaPcmOutputStreamTest);
164 }; 164 };
165 165
166 const ChannelLayout AlsaPcmOutputStreamTest::kTestChannelLayout = 166 const ChannelLayout AlsaPcmOutputStreamTest::kTestChannelLayout =
167 CHANNEL_LAYOUT_STEREO; 167 CHANNEL_LAYOUT_STEREO;
168 const int AlsaPcmOutputStreamTest::kTestSampleRate = 168 const int AlsaPcmOutputStreamTest::kTestSampleRate =
169 AudioParameters::kAudioCDSampleRate; 169 AudioParameters::kAudioCDSampleRate;
(...skipping 17 matching lines...) Expand all
187 char AlsaPcmOutputStreamTest::kSurround41[] = "surround41:CARD=foo,DEV=0"; 187 char AlsaPcmOutputStreamTest::kSurround41[] = "surround41:CARD=foo,DEV=0";
188 char AlsaPcmOutputStreamTest::kSurround50[] = "surround50:CARD=foo,DEV=0"; 188 char AlsaPcmOutputStreamTest::kSurround50[] = "surround50:CARD=foo,DEV=0";
189 char AlsaPcmOutputStreamTest::kSurround51[] = "surround51:CARD=foo,DEV=0"; 189 char AlsaPcmOutputStreamTest::kSurround51[] = "surround51:CARD=foo,DEV=0";
190 char AlsaPcmOutputStreamTest::kSurround70[] = "surround70:CARD=foo,DEV=0"; 190 char AlsaPcmOutputStreamTest::kSurround70[] = "surround70:CARD=foo,DEV=0";
191 char AlsaPcmOutputStreamTest::kSurround71[] = "surround71:CARD=foo,DEV=0"; 191 char AlsaPcmOutputStreamTest::kSurround71[] = "surround71:CARD=foo,DEV=0";
192 void* AlsaPcmOutputStreamTest::kFakeHints[] = { 192 void* AlsaPcmOutputStreamTest::kFakeHints[] = {
193 kSurround40, kSurround41, kSurround50, kSurround51, 193 kSurround40, kSurround41, kSurround50, kSurround51,
194 kSurround70, kSurround71, NULL }; 194 kSurround70, kSurround71, NULL };
195 195
196 TEST_F(AlsaPcmOutputStreamTest, ConstructedState) { 196 TEST_F(AlsaPcmOutputStreamTest, ConstructedState) {
197 EXPECT_EQ(AlsaPcmOutputStream::kCreated, 197 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream_->state());
198 test_stream_->shared_data_.state());
199 198
200 // Should support mono. 199 // Should support mono.
201 test_stream_ = CreateStream(CHANNEL_LAYOUT_MONO); 200 test_stream_.reset(CreateStream(CHANNEL_LAYOUT_MONO));
202 EXPECT_EQ(AlsaPcmOutputStream::kCreated, 201 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream_->state());
203 test_stream_->shared_data_.state());
204 202
205 // Should support multi-channel. 203 // Should support multi-channel.
206 test_stream_ = CreateStream(CHANNEL_LAYOUT_SURROUND); 204 test_stream_.reset(CreateStream(CHANNEL_LAYOUT_SURROUND));
207 EXPECT_EQ(AlsaPcmOutputStream::kCreated, 205 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream_->state());
208 test_stream_->shared_data_.state());
209 206
210 // Bad bits per sample. 207 // Bad bits per sample.
211 AudioParameters bad_bps_params(kTestFormat, kTestChannelLayout, 208 AudioParameters bad_bps_params(kTestFormat, kTestChannelLayout,
212 kTestSampleRate, kTestBitsPerSample - 1, 209 kTestSampleRate, kTestBitsPerSample - 1,
213 kTestFramesPerPacket); 210 kTestFramesPerPacket);
214 test_stream_ = new AlsaPcmOutputStream(kTestDeviceName, 211 test_stream_.reset(new AlsaPcmOutputStream(kTestDeviceName,
215 bad_bps_params, 212 bad_bps_params,
216 &mock_alsa_wrapper_, 213 &mock_alsa_wrapper_,
217 &mock_manager_, 214 &mock_manager_,
218 &message_loop_); 215 &message_loop_));
219 EXPECT_EQ(AlsaPcmOutputStream::kInError, 216 EXPECT_EQ(AlsaPcmOutputStream::kInError, test_stream_->state());
220 test_stream_->shared_data_.state());
221 217
222 // Bad format. 218 // Bad format.
223 AudioParameters bad_format_params( 219 AudioParameters bad_format_params(
224 AudioParameters::AUDIO_LAST_FORMAT, kTestChannelLayout, kTestSampleRate, 220 AudioParameters::AUDIO_LAST_FORMAT, kTestChannelLayout, kTestSampleRate,
225 kTestBitsPerSample, kTestFramesPerPacket); 221 kTestBitsPerSample, kTestFramesPerPacket);
226 test_stream_ = new AlsaPcmOutputStream(kTestDeviceName, 222 test_stream_.reset(new AlsaPcmOutputStream(kTestDeviceName,
227 bad_format_params, 223 bad_format_params,
228 &mock_alsa_wrapper_, 224 &mock_alsa_wrapper_,
229 &mock_manager_, 225 &mock_manager_,
230 &message_loop_); 226 &message_loop_));
231 EXPECT_EQ(AlsaPcmOutputStream::kInError, 227 EXPECT_EQ(AlsaPcmOutputStream::kInError, test_stream_->state());
232 test_stream_->shared_data_.state());
233 } 228 }
234 229
235 TEST_F(AlsaPcmOutputStreamTest, LatencyFloor) { 230 TEST_F(AlsaPcmOutputStreamTest, LatencyFloor) {
236 const double kMicrosPerFrame = 231 const double kMicrosPerFrame =
237 static_cast<double>(1000000) / kTestSampleRate; 232 static_cast<double>(1000000) / kTestSampleRate;
238 const double kPacketFramesInMinLatency = 233 const double kPacketFramesInMinLatency =
239 AlsaPcmOutputStream::kMinLatencyMicros / kMicrosPerFrame / 2.0; 234 AlsaPcmOutputStream::kMinLatencyMicros / kMicrosPerFrame / 2.0;
240 235
241 // Test that packets which would cause a latency under less than 236 // Test that packets which would cause a latency under less than
242 // AlsaPcmOutputStream::kMinLatencyMicros will get clipped to 237 // AlsaPcmOutputStream::kMinLatencyMicros will get clipped to
243 // AlsaPcmOutputStream::kMinLatencyMicros, 238 // AlsaPcmOutputStream::kMinLatencyMicros,
244 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 239 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
245 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), 240 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle),
246 Return(0))); 241 Return(0)));
247 EXPECT_CALL(mock_alsa_wrapper_, 242 EXPECT_CALL(mock_alsa_wrapper_,
248 PcmSetParams(_, _, _, _, _, _, 243 PcmSetParams(_, _, _, _, _, _,
249 AlsaPcmOutputStream::kMinLatencyMicros)) 244 AlsaPcmOutputStream::kMinLatencyMicros))
250 .WillOnce(Return(0)); 245 .WillOnce(Return(0));
251 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) 246 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _))
252 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), 247 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket),
253 SetArgumentPointee<2>(kTestFramesPerPacket / 2), 248 SetArgumentPointee<2>(kTestFramesPerPacket / 2),
254 Return(0))); 249 Return(0)));
255 250
256 test_stream_ = CreateStream(kTestChannelLayout, kPacketFramesInMinLatency); 251 test_stream_.reset(CreateStream(kTestChannelLayout,
252 kPacketFramesInMinLatency));
257 ASSERT_TRUE(test_stream_->Open()); 253 ASSERT_TRUE(test_stream_->Open());
258 message_loop_.RunAllPending(); 254 message_loop_.RunAllPending();
259 255
260 // Now close it and test that everything was released. 256 // Now close it and test that everything was released.
261 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0)); 257 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0));
262 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) 258 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle))
263 .WillOnce(Return(kTestDeviceName)); 259 .WillOnce(Return(kTestDeviceName));
264 EXPECT_CALL(mock_manager_, ReleaseOutputStream(test_stream_.get())); 260 EXPECT_CALL(mock_manager_, ReleaseOutputStream(test_stream_.get()));
265 test_stream_->Close(); 261 test_stream_->Close();
266 message_loop_.RunAllPending(); 262 message_loop_.RunAllPending();
267 263
268 Mock::VerifyAndClear(&mock_alsa_wrapper_); 264 Mock::VerifyAndClear(&mock_alsa_wrapper_);
269 Mock::VerifyAndClear(&mock_manager_); 265 Mock::VerifyAndClear(&mock_manager_);
270 266
271 // Test that having more packets ends up with a latency based on packet size. 267 // Test that having more packets ends up with a latency based on packet size.
272 const int kOverMinLatencyPacketSize = kPacketFramesInMinLatency + 1; 268 const int kOverMinLatencyPacketSize = kPacketFramesInMinLatency + 1;
273 int64 expected_micros = 2 * AlsaPcmOutputStream::FramesToMicros( 269 int64 expected_micros = 2 * AlsaPcmOutputStream::FramesToMicros(
274 kOverMinLatencyPacketSize, kTestSampleRate); 270 kOverMinLatencyPacketSize, kTestSampleRate);
275 271
276 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 272 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
277 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); 273 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0)));
278 EXPECT_CALL(mock_alsa_wrapper_, 274 EXPECT_CALL(mock_alsa_wrapper_,
279 PcmSetParams(_, _, _, _, _, _, expected_micros)) 275 PcmSetParams(_, _, _, _, _, _, expected_micros))
280 .WillOnce(Return(0)); 276 .WillOnce(Return(0));
281 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) 277 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _))
282 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), 278 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket),
283 SetArgumentPointee<2>(kTestFramesPerPacket / 2), 279 SetArgumentPointee<2>(kTestFramesPerPacket / 2),
284 Return(0))); 280 Return(0)));
285 281
286 test_stream_ = CreateStream(kTestChannelLayout, kOverMinLatencyPacketSize); 282 test_stream_.reset(CreateStream(kTestChannelLayout,
283 kOverMinLatencyPacketSize));
287 ASSERT_TRUE(test_stream_->Open()); 284 ASSERT_TRUE(test_stream_->Open());
288 message_loop_.RunAllPending(); 285 message_loop_.RunAllPending();
289 286
290 // Now close it and test that everything was released. 287 // Now close it and test that everything was released.
291 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) 288 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle))
292 .WillOnce(Return(0)); 289 .WillOnce(Return(0));
293 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) 290 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle))
294 .WillOnce(Return(kTestDeviceName)); 291 .WillOnce(Return(kTestDeviceName));
295 EXPECT_CALL(mock_manager_, ReleaseOutputStream(test_stream_.get())); 292 EXPECT_CALL(mock_manager_, ReleaseOutputStream(test_stream_.get()));
296 test_stream_->Close(); 293 test_stream_->Close();
(...skipping 27 matching lines...) Expand all
324 .WillOnce(Return(0)); 321 .WillOnce(Return(0));
325 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(kFakeHandle, _, _)) 322 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(kFakeHandle, _, _))
326 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), 323 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket),
327 SetArgumentPointee<2>(kTestFramesPerPacket / 2), 324 SetArgumentPointee<2>(kTestFramesPerPacket / 2),
328 Return(0))); 325 Return(0)));
329 326
330 // Open the stream. 327 // Open the stream.
331 ASSERT_TRUE(test_stream_->Open()); 328 ASSERT_TRUE(test_stream_->Open());
332 message_loop_.RunAllPending(); 329 message_loop_.RunAllPending();
333 330
334 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, 331 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, test_stream_->state());
335 test_stream_->shared_data_.state());
336 EXPECT_EQ(kFakeHandle, test_stream_->playback_handle_); 332 EXPECT_EQ(kFakeHandle, test_stream_->playback_handle_);
337 EXPECT_EQ(kTestFramesPerPacket, test_stream_->frames_per_packet_); 333 EXPECT_EQ(kTestFramesPerPacket, test_stream_->frames_per_packet_);
338 EXPECT_TRUE(test_stream_->buffer_.get()); 334 EXPECT_TRUE(test_stream_->buffer_.get());
339 EXPECT_FALSE(test_stream_->stop_stream_); 335 EXPECT_FALSE(test_stream_->stop_stream_);
340 336
341 // Now close it and test that everything was released. 337 // Now close it and test that everything was released.
342 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) 338 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle))
343 .WillOnce(Return(0)); 339 .WillOnce(Return(0));
344 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) 340 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle))
345 .WillOnce(Return(kTestDeviceName)); 341 .WillOnce(Return(kTestDeviceName));
346 EXPECT_CALL(mock_manager_, ReleaseOutputStream(test_stream_.get())); 342 EXPECT_CALL(mock_manager_, ReleaseOutputStream(test_stream_.get()));
347 test_stream_->Close(); 343 test_stream_->Close();
348 message_loop_.RunAllPending(); 344 message_loop_.RunAllPending();
349 345
350 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); 346 EXPECT_TRUE(test_stream_->playback_handle_ == NULL);
351 EXPECT_FALSE(test_stream_->buffer_.get()); 347 EXPECT_FALSE(test_stream_->buffer_.get());
352 EXPECT_TRUE(test_stream_->stop_stream_); 348 EXPECT_TRUE(test_stream_->stop_stream_);
353 } 349 }
354 350
355 TEST_F(AlsaPcmOutputStreamTest, PcmOpenFailed) { 351 TEST_F(AlsaPcmOutputStreamTest, PcmOpenFailed) {
356 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 352 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
357 .WillOnce(Return(kTestFailedErrno)); 353 .WillOnce(Return(kTestFailedErrno));
358 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) 354 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno))
359 .WillOnce(Return(kDummyMessage)); 355 .WillOnce(Return(kDummyMessage));
360 356
361 // Open still succeeds since PcmOpen is delegated to another thread. 357 // Open still succeeds since PcmOpen is delegated to another thread.
362 ASSERT_TRUE(test_stream_->Open()); 358 ASSERT_TRUE(test_stream_->Open());
363 ASSERT_EQ(AlsaPcmOutputStream::kIsOpened, 359 ASSERT_EQ(AlsaPcmOutputStream::kIsOpened, test_stream_->state());
364 test_stream_->shared_data_.state());
365 ASSERT_FALSE(test_stream_->stop_stream_); 360 ASSERT_FALSE(test_stream_->stop_stream_);
366 message_loop_.RunAllPending(); 361 message_loop_.RunAllPending();
367 362
368 // 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.
369 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, 364 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, test_stream_->state());
370 test_stream_->shared_data_.state());
371 EXPECT_TRUE(test_stream_->stop_stream_); 365 EXPECT_TRUE(test_stream_->stop_stream_);
372 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); 366 EXPECT_TRUE(test_stream_->playback_handle_ == NULL);
373 EXPECT_FALSE(test_stream_->buffer_.get()); 367 EXPECT_FALSE(test_stream_->buffer_.get());
374 368
375 // Close the stream since we opened it to make destruction happy. 369 // Close the stream since we opened it to make destruction happy.
376 EXPECT_CALL(mock_manager_, ReleaseOutputStream(test_stream_.get())); 370 EXPECT_CALL(mock_manager_, ReleaseOutputStream(test_stream_.get()));
377 test_stream_->Close(); 371 test_stream_->Close();
378 message_loop_.RunAllPending(); 372 message_loop_.RunAllPending();
379 } 373 }
380 374
381 TEST_F(AlsaPcmOutputStreamTest, PcmSetParamsFailed) { 375 TEST_F(AlsaPcmOutputStreamTest, PcmSetParamsFailed) {
382 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 376 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
383 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), 377 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle),
384 Return(0))); 378 Return(0)));
385 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _)) 379 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _))
386 .WillOnce(Return(kTestFailedErrno)); 380 .WillOnce(Return(kTestFailedErrno));
387 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) 381 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle))
388 .WillOnce(Return(0)); 382 .WillOnce(Return(0));
389 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) 383 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle))
390 .WillOnce(Return(kTestDeviceName)); 384 .WillOnce(Return(kTestDeviceName));
391 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) 385 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno))
392 .WillOnce(Return(kDummyMessage)); 386 .WillOnce(Return(kDummyMessage));
393 387
394 // If open fails, the stream stays in kCreated because it has effectively had 388 // If open fails, the stream stays in kCreated because it has effectively had
395 // no changes. 389 // no changes.
396 ASSERT_TRUE(test_stream_->Open()); 390 ASSERT_TRUE(test_stream_->Open());
397 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, 391 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, test_stream_->state());
398 test_stream_->shared_data_.state());
399 ASSERT_FALSE(test_stream_->stop_stream_); 392 ASSERT_FALSE(test_stream_->stop_stream_);
400 message_loop_.RunAllPending(); 393 message_loop_.RunAllPending();
401 394
402 // Ensure internal state is set for a no-op stream if PcmSetParams() failes. 395 // Ensure internal state is set for a no-op stream if PcmSetParams() failes.
403 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, 396 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, test_stream_->state());
404 test_stream_->shared_data_.state());
405 EXPECT_TRUE(test_stream_->stop_stream_); 397 EXPECT_TRUE(test_stream_->stop_stream_);
406 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); 398 EXPECT_TRUE(test_stream_->playback_handle_ == NULL);
407 EXPECT_FALSE(test_stream_->buffer_.get()); 399 EXPECT_FALSE(test_stream_->buffer_.get());
408 400
409 // Close the stream since we opened it to make destruction happy. 401 // Close the stream since we opened it to make destruction happy.
410 EXPECT_CALL(mock_manager_, ReleaseOutputStream(test_stream_.get())); 402 EXPECT_CALL(mock_manager_, ReleaseOutputStream(test_stream_.get()));
411 test_stream_->Close(); 403 test_stream_->Close();
412 message_loop_.RunAllPending(); 404 message_loop_.RunAllPending();
413 } 405 }
414 406
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
554 .WillOnce(DoAll(SetArgumentPointee<1>(1), Return(0))); 546 .WillOnce(DoAll(SetArgumentPointee<1>(1), Return(0)));
555 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) 547 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_))
556 .WillRepeatedly(Return(0)); // Buffer is full. 548 .WillRepeatedly(Return(0)); // Buffer is full.
557 549
558 // Return a partially filled packet. 550 // Return a partially filled packet.
559 EXPECT_CALL(mock_callback, 551 EXPECT_CALL(mock_callback,
560 OnMoreData(test_stream_.get(), _, _, _)) 552 OnMoreData(test_stream_.get(), _, _, _))
561 .WillOnce(Return(10)); 553 .WillOnce(Return(10));
562 554
563 bool source_exhausted; 555 bool source_exhausted;
564 test_stream_->shared_data_.set_source_callback(&mock_callback); 556 test_stream_->set_source_callback(&mock_callback);
565 test_stream_->packet_size_ = kTestPacketSize; 557 test_stream_->packet_size_ = kTestPacketSize;
566 test_stream_->BufferPacket(&source_exhausted); 558 test_stream_->BufferPacket(&source_exhausted);
567 559
568 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes()); 560 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes());
569 EXPECT_FALSE(source_exhausted); 561 EXPECT_FALSE(source_exhausted);
570 } 562 }
571 563
572 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Negative) { 564 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Negative) {
573 InitBuffer(); 565 InitBuffer();
574 test_stream_->buffer_->Clear(); 566 test_stream_->buffer_->Clear();
575 567
576 // Simulate where the underrun has occurred right after checking the delay. 568 // Simulate where the underrun has occurred right after checking the delay.
577 MockAudioSourceCallback mock_callback; 569 MockAudioSourceCallback mock_callback;
578 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) 570 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_))
579 .WillOnce(Return(SND_PCM_STATE_RUNNING)); 571 .WillOnce(Return(SND_PCM_STATE_RUNNING));
580 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _)) 572 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _))
581 .WillOnce(DoAll(SetArgumentPointee<1>(-1), Return(0))); 573 .WillOnce(DoAll(SetArgumentPointee<1>(-1), Return(0)));
582 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) 574 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_))
583 .WillRepeatedly(Return(0)); // Buffer is full. 575 .WillRepeatedly(Return(0)); // Buffer is full.
584 EXPECT_CALL(mock_callback, 576 EXPECT_CALL(mock_callback,
585 OnMoreData(test_stream_.get(), _, _, _)) 577 OnMoreData(test_stream_.get(), _, _, _))
586 .WillOnce(Return(10)); 578 .WillOnce(Return(10));
587 579
588 bool source_exhausted; 580 bool source_exhausted;
589 test_stream_->shared_data_.set_source_callback(&mock_callback); 581 test_stream_->set_source_callback(&mock_callback);
590 test_stream_->packet_size_ = kTestPacketSize; 582 test_stream_->packet_size_ = kTestPacketSize;
591 test_stream_->BufferPacket(&source_exhausted); 583 test_stream_->BufferPacket(&source_exhausted);
592 584
593 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes()); 585 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes());
594 EXPECT_FALSE(source_exhausted); 586 EXPECT_FALSE(source_exhausted);
595 } 587 }
596 588
597 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Underrun) { 589 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Underrun) {
598 InitBuffer(); 590 InitBuffer();
599 test_stream_->buffer_->Clear(); 591 test_stream_->buffer_->Clear();
600 592
601 // If ALSA has underrun then we should assume a delay of zero. 593 // If ALSA has underrun then we should assume a delay of zero.
602 MockAudioSourceCallback mock_callback; 594 MockAudioSourceCallback mock_callback;
603 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) 595 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_))
604 .WillOnce(Return(SND_PCM_STATE_XRUN)); 596 .WillOnce(Return(SND_PCM_STATE_XRUN));
605 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) 597 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_))
606 .WillRepeatedly(Return(0)); // Buffer is full. 598 .WillRepeatedly(Return(0)); // Buffer is full.
607 EXPECT_CALL(mock_callback, 599 EXPECT_CALL(mock_callback,
608 OnMoreData(test_stream_.get(), _, _, AllOf( 600 OnMoreData(test_stream_.get(), _, _, AllOf(
609 Field(&AudioBuffersState::pending_bytes, 0), 601 Field(&AudioBuffersState::pending_bytes, 0),
610 Field(&AudioBuffersState::hardware_delay_bytes, 0)))) 602 Field(&AudioBuffersState::hardware_delay_bytes, 0))))
611 .WillOnce(Return(10)); 603 .WillOnce(Return(10));
612 604
613 bool source_exhausted; 605 bool source_exhausted;
614 test_stream_->shared_data_.set_source_callback(&mock_callback); 606 test_stream_->set_source_callback(&mock_callback);
615 test_stream_->packet_size_ = kTestPacketSize; 607 test_stream_->packet_size_ = kTestPacketSize;
616 test_stream_->BufferPacket(&source_exhausted); 608 test_stream_->BufferPacket(&source_exhausted);
617 609
618 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes()); 610 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes());
619 EXPECT_FALSE(source_exhausted); 611 EXPECT_FALSE(source_exhausted);
620 } 612 }
621 613
622 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_FullBuffer) { 614 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_FullBuffer) {
623 InitBuffer(); 615 InitBuffer();
624 // No expectations set on the strict mock because nothing should be called. 616 // No expectations set on the strict mock because nothing should be called.
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
681 PcmSetParams(kFakeHandle, _, _, i, _, _, _)) 673 PcmSetParams(kFakeHandle, _, _, i, _, _, _))
682 .WillOnce(Return(0)); 674 .WillOnce(Return(0));
683 675
684 // The parameters are specified by ALSA documentation, and are in constants 676 // The parameters are specified by ALSA documentation, and are in constants
685 // in the implementation files. 677 // in the implementation files.
686 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("IOID"))) 678 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("IOID")))
687 .WillRepeatedly(Invoke(OutputHint)); 679 .WillRepeatedly(Invoke(OutputHint));
688 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("NAME"))) 680 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("NAME")))
689 .WillRepeatedly(Invoke(EchoHint)); 681 .WillRepeatedly(Invoke(EchoHint));
690 682
691 test_stream_ = CreateStream(kExpectedLayouts[i]); 683 test_stream_.reset(CreateStream(kExpectedLayouts[i]));
692 EXPECT_TRUE(test_stream_->AutoSelectDevice(i)); 684 EXPECT_TRUE(test_stream_->AutoSelectDevice(i));
693 EXPECT_EQ(kExpectedDownmix[i], test_stream_->should_downmix_); 685 EXPECT_EQ(kExpectedDownmix[i], test_stream_->should_downmix_);
694 686
695 Mock::VerifyAndClearExpectations(&mock_alsa_wrapper_); 687 Mock::VerifyAndClearExpectations(&mock_alsa_wrapper_);
696 Mock::VerifyAndClearExpectations(&mock_manager_); 688 Mock::VerifyAndClearExpectations(&mock_manager_);
697 } 689 }
698 } 690 }
699 691
700 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_FallbackDevices) { 692 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_FallbackDevices) {
701 using std::string; 693 using std::string;
(...skipping 29 matching lines...) Expand all
731 InSequence s; 723 InSequence s;
732 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(first_try.c_str()), _, _)) 724 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(first_try.c_str()), _, _))
733 .WillOnce(Return(kTestFailedErrno)); 725 .WillOnce(Return(kTestFailedErrno));
734 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(second_try.c_str()), _, _)) 726 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(second_try.c_str()), _, _))
735 .WillOnce(Return(kTestFailedErrno)); 727 .WillOnce(Return(kTestFailedErrno));
736 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(third_try.c_str()), _, _)) 728 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(third_try.c_str()), _, _))
737 .WillOnce(Return(kTestFailedErrno)); 729 .WillOnce(Return(kTestFailedErrno));
738 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(fourth_try.c_str()), _, _)) 730 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(fourth_try.c_str()), _, _))
739 .WillOnce(Return(kTestFailedErrno)); 731 .WillOnce(Return(kTestFailedErrno));
740 732
741 test_stream_ = CreateStream(CHANNEL_LAYOUT_5POINT0); 733 test_stream_.reset(CreateStream(CHANNEL_LAYOUT_5POINT0));
742 EXPECT_FALSE(test_stream_->AutoSelectDevice(5)); 734 EXPECT_FALSE(test_stream_->AutoSelectDevice(5));
743 } 735 }
744 736
745 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_HintFail) { 737 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_HintFail) {
746 // Should get |kDefaultDevice|, and force a 2-channel downmix on a failure to 738 // Should get |kDefaultDevice|, and force a 2-channel downmix on a failure to
747 // enumerate devices. 739 // enumerate devices.
748 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameHint(_, _, _)) 740 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameHint(_, _, _))
749 .WillRepeatedly(Return(kTestFailedErrno)); 741 .WillRepeatedly(Return(kTestFailedErrno));
750 EXPECT_CALL(mock_alsa_wrapper_, 742 EXPECT_CALL(mock_alsa_wrapper_,
751 PcmOpen(_, StrEq(AlsaPcmOutputStream::kDefaultDevice), _, _)) 743 PcmOpen(_, StrEq(AlsaPcmOutputStream::kDefaultDevice), _, _))
752 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); 744 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0)));
753 EXPECT_CALL(mock_alsa_wrapper_, 745 EXPECT_CALL(mock_alsa_wrapper_,
754 PcmSetParams(kFakeHandle, _, _, 2, _, _, _)) 746 PcmSetParams(kFakeHandle, _, _, 2, _, _, _))
755 .WillOnce(Return(0)); 747 .WillOnce(Return(0));
756 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) 748 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno))
757 .WillOnce(Return(kDummyMessage)); 749 .WillOnce(Return(kDummyMessage));
758 750
759 test_stream_ = CreateStream(CHANNEL_LAYOUT_5POINT0); 751 test_stream_.reset(CreateStream(CHANNEL_LAYOUT_5POINT0));
760 EXPECT_TRUE(test_stream_->AutoSelectDevice(5)); 752 EXPECT_TRUE(test_stream_->AutoSelectDevice(5));
761 EXPECT_TRUE(test_stream_->should_downmix_); 753 EXPECT_TRUE(test_stream_->should_downmix_);
762 } 754 }
763 755
764 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_StopStream) { 756 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_StopStream) {
765 InitBuffer(); 757 InitBuffer();
766 test_stream_->stop_stream_ = true; 758 test_stream_->stop_stream_ = true;
767 bool source_exhausted; 759 bool source_exhausted;
768 test_stream_->BufferPacket(&source_exhausted); 760 test_stream_->BufferPacket(&source_exhausted);
769 EXPECT_EQ(0u, test_stream_->buffer_->forward_bytes()); 761 EXPECT_EQ(0u, test_stream_->buffer_->forward_bytes());
770 EXPECT_TRUE(source_exhausted); 762 EXPECT_TRUE(source_exhausted);
771 } 763 }
772 764
773 TEST_F(AlsaPcmOutputStreamTest, ScheduleNextWrite) { 765 TEST_F(AlsaPcmOutputStreamTest, ScheduleNextWrite) {
774 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsOpened); 766 test_stream_->TransitionTo(AlsaPcmOutputStream::kIsOpened);
775 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsPlaying); 767 test_stream_->TransitionTo(AlsaPcmOutputStream::kIsPlaying);
776 768
777 InitBuffer(); 769 InitBuffer();
778 770
779 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) 771 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_))
780 .WillOnce(Return(10)); 772 .WillOnce(Return(10));
781 test_stream_->ScheduleNextWrite(false); 773 test_stream_->ScheduleNextWrite(false);
782 774
783 // TODO(sergeyu): Figure out how to check that the task has been added to the 775 // TODO(sergeyu): Figure out how to check that the task has been added to the
784 // message loop. 776 // message loop.
785 777
786 // Cleanup the message queue. Currently ~MessageQueue() doesn't free pending 778 // Cleanup the message queue. Currently ~MessageQueue() doesn't free pending
787 // tasks unless running on valgrind. The code below is needed to keep 779 // tasks unless running on valgrind. The code below is needed to keep
788 // heapcheck happy. 780 // heapcheck happy.
789 test_stream_->stop_stream_ = true; 781 test_stream_->stop_stream_ = true;
790 message_loop_.RunAllPending(); 782 message_loop_.RunAllPending();
791 783
792 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsClosed); 784 test_stream_->TransitionTo(AlsaPcmOutputStream::kIsClosed);
793 } 785 }
794 786
795 TEST_F(AlsaPcmOutputStreamTest, ScheduleNextWrite_StopStream) { 787 TEST_F(AlsaPcmOutputStreamTest, ScheduleNextWrite_StopStream) {
796 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsOpened); 788 test_stream_->TransitionTo(AlsaPcmOutputStream::kIsOpened);
797 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsPlaying); 789 test_stream_->TransitionTo(AlsaPcmOutputStream::kIsPlaying);
798 790
799 InitBuffer(); 791 InitBuffer();
800 792
801 test_stream_->stop_stream_ = true; 793 test_stream_->stop_stream_ = true;
802 test_stream_->ScheduleNextWrite(true); 794 test_stream_->ScheduleNextWrite(true);
803 795
804 // TODO(ajwong): Find a way to test whether or not another task has been 796 // TODO(ajwong): Find a way to test whether or not another task has been
805 // posted so we can verify that the Alsa code will indeed break the task 797 // posted so we can verify that the Alsa code will indeed break the task
806 // posting loop. 798 // posting loop.
807 799
808 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsClosed); 800 test_stream_->TransitionTo(AlsaPcmOutputStream::kIsClosed);
809 } 801 }
OLDNEW
« no previous file with comments | « media/audio/linux/alsa_output.cc ('k') | media/audio/linux/audio_manager_linux.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698