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

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

Issue 2008010: Fixes in AlsaPcmOutputStream. (Closed)
Patch Set: - Created 10 years, 7 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
« no previous file with comments | « media/audio/linux/alsa_output.cc ('k') | media/audio/linux/alsa_wrapper.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/logging.h" 5 #include "base/logging.h"
6 #include "base/message_loop.h" 6 #include "base/message_loop.h"
7 #include "base/string_util.h" 7 #include "base/string_util.h"
8 #include "media/audio/linux/alsa_output.h" 8 #include "media/audio/linux/alsa_output.h"
9 #include "media/audio/linux/alsa_wrapper.h" 9 #include "media/audio/linux/alsa_wrapper.h"
10 #include "media/audio/linux/audio_manager_linux.h" 10 #include "media/audio/linux/audio_manager_linux.h"
11 #include "media/base/data_buffer.h"
12 #include "media/base/seekable_buffer.h"
11 #include "testing/gmock/include/gmock/gmock.h" 13 #include "testing/gmock/include/gmock/gmock.h"
12 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
13 15
14 using testing::_; 16 using testing::_;
15 using testing::DoAll; 17 using testing::DoAll;
16 using testing::Eq; 18 using testing::Eq;
17 using testing::InSequence; 19 using testing::InSequence;
18 using testing::Invoke; 20 using testing::Invoke;
19 using testing::Mock; 21 using testing::Mock;
20 using testing::MockFunction; 22 using testing::MockFunction;
(...skipping 18 matching lines...) Expand all
39 MOCK_METHOD1(PcmDrop, int(snd_pcm_t* handle)); 41 MOCK_METHOD1(PcmDrop, int(snd_pcm_t* handle));
40 MOCK_METHOD2(PcmDelay, int(snd_pcm_t* handle, snd_pcm_sframes_t* delay)); 42 MOCK_METHOD2(PcmDelay, int(snd_pcm_t* handle, snd_pcm_sframes_t* delay));
41 MOCK_METHOD3(PcmWritei, snd_pcm_sframes_t(snd_pcm_t* handle, 43 MOCK_METHOD3(PcmWritei, snd_pcm_sframes_t(snd_pcm_t* handle,
42 const void* buffer, 44 const void* buffer,
43 snd_pcm_uframes_t size)); 45 snd_pcm_uframes_t size));
44 MOCK_METHOD3(PcmRecover, int(snd_pcm_t* handle, int err, int silent)); 46 MOCK_METHOD3(PcmRecover, int(snd_pcm_t* handle, int err, int silent));
45 MOCK_METHOD7(PcmSetParams, int(snd_pcm_t* handle, snd_pcm_format_t format, 47 MOCK_METHOD7(PcmSetParams, int(snd_pcm_t* handle, snd_pcm_format_t format,
46 snd_pcm_access_t access, unsigned int channels, 48 snd_pcm_access_t access, unsigned int channels,
47 unsigned int rate, int soft_resample, 49 unsigned int rate, int soft_resample,
48 unsigned int latency)); 50 unsigned int latency));
51 MOCK_METHOD3(PcmGetParams, int(snd_pcm_t* handle, snd_pcm_uframes_t* buffer_si ze,
scherkus (not reviewing) 2010/05/14 21:28:50 >80 chars
52 snd_pcm_uframes_t* period_size));
49 MOCK_METHOD1(PcmName, const char*(snd_pcm_t* handle)); 53 MOCK_METHOD1(PcmName, const char*(snd_pcm_t* handle));
50 MOCK_METHOD1(PcmAvailUpdate, snd_pcm_sframes_t(snd_pcm_t* handle)); 54 MOCK_METHOD1(PcmAvailUpdate, snd_pcm_sframes_t(snd_pcm_t* handle));
51 MOCK_METHOD1(PcmState, snd_pcm_state_t(snd_pcm_t* handle)); 55 MOCK_METHOD1(PcmState, snd_pcm_state_t(snd_pcm_t* handle));
52 56
53 MOCK_METHOD1(StrError, const char*(int errnum)); 57 MOCK_METHOD1(StrError, const char*(int errnum));
54 }; 58 };
55 59
56 class MockAudioSourceCallback : public AudioOutputStream::AudioSourceCallback { 60 class MockAudioSourceCallback : public AudioOutputStream::AudioSourceCallback {
57 public: 61 public:
58 MOCK_METHOD4(OnMoreData, uint32(AudioOutputStream* stream, void* dest, 62 MOCK_METHOD4(OnMoreData, uint32(AudioOutputStream* stream, void* dest,
(...skipping 10 matching lines...) Expand all
69 int sample_rate, 73 int sample_rate,
70 char bits_per_sample)); 74 char bits_per_sample));
71 MOCK_METHOD0(MuteAll, void()); 75 MOCK_METHOD0(MuteAll, void());
72 MOCK_METHOD0(UnMuteAll, void()); 76 MOCK_METHOD0(UnMuteAll, void());
73 77
74 MOCK_METHOD1(ReleaseStream, void(AlsaPcmOutputStream* stream)); 78 MOCK_METHOD1(ReleaseStream, void(AlsaPcmOutputStream* stream));
75 }; 79 };
76 80
77 class AlsaPcmOutputStreamTest : public testing::Test { 81 class AlsaPcmOutputStreamTest : public testing::Test {
78 protected: 82 protected:
79 AlsaPcmOutputStreamTest() 83 AlsaPcmOutputStreamTest() {
80 : packet_(kTestPacketSize + 1) {
81 test_stream_ = CreateStreamWithChannels(kTestChannels); 84 test_stream_ = CreateStreamWithChannels(kTestChannels);
82 packet_.size = kTestPacketSize;
83 } 85 }
84 86
85 virtual ~AlsaPcmOutputStreamTest() { 87 virtual ~AlsaPcmOutputStreamTest() {
86 test_stream_ = NULL; 88 test_stream_ = NULL;
87 } 89 }
88 90
89 AlsaPcmOutputStream* CreateStreamWithChannels(int channels) { 91 AlsaPcmOutputStream* CreateStreamWithChannels(int channels) {
90 return new AlsaPcmOutputStream(kTestDeviceName, 92 return new AlsaPcmOutputStream(kTestDeviceName,
91 kTestFormat, 93 kTestFormat,
92 channels, 94 channels,
93 kTestSampleRate, 95 kTestSampleRate,
94 kTestBitsPerSample, 96 kTestBitsPerSample,
95 &mock_alsa_wrapper_, 97 &mock_alsa_wrapper_,
96 &mock_manager_, 98 &mock_manager_,
97 &message_loop_); 99 &message_loop_);
98 } 100 }
99 101
100 // Helper function to malloc the string returned by DeviceNameHint for NAME. 102 // Helper function to malloc the string returned by DeviceNameHint for NAME.
101 static char* EchoHint(const void* name, Unused) { 103 static char* EchoHint(const void* name, Unused) {
102 return strdup(static_cast<const char*>(name)); 104 return strdup(static_cast<const char*>(name));
103 } 105 }
104 106
105 // Helper function to malloc the string returned by DeviceNameHint for IOID. 107 // Helper function to malloc the string returned by DeviceNameHint for IOID.
106 static char* OutputHint(Unused, Unused) { 108 static char* OutputHint(Unused, Unused) {
107 return strdup("Output"); 109 return strdup("Output");
108 } 110 }
109 111
112 // Helper function to initialize |test_stream_->buffer_|. Must be called
113 // in all tests that use buffer_ without opening the stream.
114 void InitBuffer() {
115 packet_ = new media::DataBuffer(kTestPacketSize);
116 packet_->SetDataSize(kTestPacketSize);
117 test_stream_->buffer_.reset(new media::SeekableBuffer(0, kTestPacketSize));
118 test_stream_->buffer_->Append(packet_.get());
119 }
120
110 static const int kTestChannels; 121 static const int kTestChannels;
111 static const int kTestSampleRate; 122 static const int kTestSampleRate;
112 static const int kTestBitsPerSample; 123 static const int kTestBitsPerSample;
113 static const int kTestBytesPerFrame; 124 static const int kTestBytesPerFrame;
114 static const AudioManager::Format kTestFormat; 125 static const AudioManager::Format kTestFormat;
115 static const char kTestDeviceName[]; 126 static const char kTestDeviceName[];
116 static const char kDummyMessage[]; 127 static const char kDummyMessage[];
117 static const uint32 kTestFramesPerPacket; 128 static const uint32 kTestFramesPerPacket;
118 static const uint32 kTestPacketSize; 129 static const uint32 kTestPacketSize;
119 static const int kTestFailedErrno; 130 static const int kTestFailedErrno;
120 static snd_pcm_t* const kFakeHandle; 131 static snd_pcm_t* const kFakeHandle;
121 132
122 // Used to simulate DeviceNameHint. 133 // Used to simulate DeviceNameHint.
123 static char kSurround40[]; 134 static char kSurround40[];
124 static char kSurround41[]; 135 static char kSurround41[];
125 static char kSurround50[]; 136 static char kSurround50[];
126 static char kSurround51[]; 137 static char kSurround51[];
127 static char kSurround70[]; 138 static char kSurround70[];
128 static char kSurround71[]; 139 static char kSurround71[];
129 static void* kFakeHints[]; 140 static void* kFakeHints[];
130 141
131 StrictMock<MockAlsaWrapper> mock_alsa_wrapper_; 142 StrictMock<MockAlsaWrapper> mock_alsa_wrapper_;
132 StrictMock<MockAudioManagerLinux> mock_manager_; 143 StrictMock<MockAudioManagerLinux> mock_manager_;
133 MessageLoop message_loop_; 144 MessageLoop message_loop_;
134 scoped_refptr<AlsaPcmOutputStream> test_stream_; 145 scoped_refptr<AlsaPcmOutputStream> test_stream_;
135 AlsaPcmOutputStream::Packet packet_; 146 scoped_refptr<media::DataBuffer> packet_;
136 147
137 private: 148 private:
138 DISALLOW_COPY_AND_ASSIGN(AlsaPcmOutputStreamTest); 149 DISALLOW_COPY_AND_ASSIGN(AlsaPcmOutputStreamTest);
139 }; 150 };
140 151
141 const int AlsaPcmOutputStreamTest::kTestChannels = 2; 152 const int AlsaPcmOutputStreamTest::kTestChannels = 2;
142 const int AlsaPcmOutputStreamTest::kTestSampleRate = 153 const int AlsaPcmOutputStreamTest::kTestSampleRate =
143 AudioManager::kAudioCDSampleRate; 154 AudioManager::kAudioCDSampleRate;
144 const int AlsaPcmOutputStreamTest::kTestBitsPerSample = 8; 155 const int AlsaPcmOutputStreamTest::kTestBitsPerSample = 8;
145 const int AlsaPcmOutputStreamTest::kTestBytesPerFrame = 156 const int AlsaPcmOutputStreamTest::kTestBytesPerFrame =
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 // Test that packets which would cause a latency under less than 228 // Test that packets which would cause a latency under less than
218 // AlsaPcmOutputStream::kMinLatencyMicros will get clipped to 229 // AlsaPcmOutputStream::kMinLatencyMicros will get clipped to
219 // AlsaPcmOutputStream::kMinLatencyMicros, 230 // AlsaPcmOutputStream::kMinLatencyMicros,
220 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 231 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
221 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), 232 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle),
222 Return(0))); 233 Return(0)));
223 EXPECT_CALL(mock_alsa_wrapper_, 234 EXPECT_CALL(mock_alsa_wrapper_,
224 PcmSetParams(_, _, _, _, _, _, 235 PcmSetParams(_, _, _, _, _, _,
225 AlsaPcmOutputStream::kMinLatencyMicros)) 236 AlsaPcmOutputStream::kMinLatencyMicros))
226 .WillOnce(Return(0)); 237 .WillOnce(Return(0));
238 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _))
239 .WillOnce(DoAll(SetArgumentPointee<1>(kTestPacketSize),
240 SetArgumentPointee<2>(kTestPacketSize / 2),
241 Return(0)));
227 242
228 ASSERT_TRUE(test_stream_->Open(kMinLatencyPacketSize)); 243 ASSERT_TRUE(test_stream_->Open(kMinLatencyPacketSize));
229 message_loop_.RunAllPending(); 244 message_loop_.RunAllPending();
230 245
231 // Now close it and test that everything was released. 246 // Now close it and test that everything was released.
232 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0)); 247 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0));
233 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) 248 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle))
234 .WillOnce(Return(kTestDeviceName)); 249 .WillOnce(Return(kTestDeviceName));
235 EXPECT_CALL(mock_manager_, ReleaseStream(test_stream_.get())); 250 EXPECT_CALL(mock_manager_, ReleaseStream(test_stream_.get()));
236 test_stream_->Close(); 251 test_stream_->Close();
(...skipping 11 matching lines...) Expand all
248 kTestSampleRate); 263 kTestSampleRate);
249 264
250 // Recreate the stream to reset the state. 265 // Recreate the stream to reset the state.
251 test_stream_ = CreateStreamWithChannels(kTestChannels); 266 test_stream_ = CreateStreamWithChannels(kTestChannels);
252 267
253 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 268 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
254 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); 269 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0)));
255 EXPECT_CALL(mock_alsa_wrapper_, 270 EXPECT_CALL(mock_alsa_wrapper_,
256 PcmSetParams(_, _, _, _, _, _, expected_micros)) 271 PcmSetParams(_, _, _, _, _, _, expected_micros))
257 .WillOnce(Return(0)); 272 .WillOnce(Return(0));
273 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _))
274 .WillOnce(DoAll(SetArgumentPointee<1>(kTestPacketSize),
275 SetArgumentPointee<2>(kTestPacketSize / 2),
276 Return(0)));
258 277
259 ASSERT_TRUE(test_stream_->Open(kOverMinLatencyPacketSize)); 278 ASSERT_TRUE(test_stream_->Open(kOverMinLatencyPacketSize));
260 message_loop_.RunAllPending(); 279 message_loop_.RunAllPending();
261 280
262 // Now close it and test that everything was released. 281 // Now close it and test that everything was released.
263 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) 282 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle))
264 .WillOnce(Return(0)); 283 .WillOnce(Return(0));
265 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) 284 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle))
266 .WillOnce(Return(kTestDeviceName)); 285 .WillOnce(Return(kTestDeviceName));
267 EXPECT_CALL(mock_manager_, ReleaseStream(test_stream_.get())); 286 EXPECT_CALL(mock_manager_, ReleaseStream(test_stream_.get()));
(...skipping 19 matching lines...) Expand all
287 Return(0))); 306 Return(0)));
288 EXPECT_CALL(mock_alsa_wrapper_, 307 EXPECT_CALL(mock_alsa_wrapper_,
289 PcmSetParams(kFakeHandle, 308 PcmSetParams(kFakeHandle,
290 SND_PCM_FORMAT_U8, 309 SND_PCM_FORMAT_U8,
291 SND_PCM_ACCESS_RW_INTERLEAVED, 310 SND_PCM_ACCESS_RW_INTERLEAVED,
292 kTestChannels, 311 kTestChannels,
293 kTestSampleRate, 312 kTestSampleRate,
294 1, 313 1,
295 expected_micros)) 314 expected_micros))
296 .WillOnce(Return(0)); 315 .WillOnce(Return(0));
316 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(kFakeHandle, _, _))
317 .WillOnce(DoAll(SetArgumentPointee<1>(kTestPacketSize),
318 SetArgumentPointee<2>(kTestPacketSize/2),
319 Return(0)));
297 320
298 // Open the stream. 321 // Open the stream.
299 ASSERT_TRUE(test_stream_->Open(kTestPacketSize)); 322 ASSERT_TRUE(test_stream_->Open(kTestPacketSize));
300 message_loop_.RunAllPending(); 323 message_loop_.RunAllPending();
301 324
302 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, 325 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened,
303 test_stream_->shared_data_.state()); 326 test_stream_->shared_data_.state());
304 EXPECT_EQ(kFakeHandle, test_stream_->playback_handle_); 327 EXPECT_EQ(kFakeHandle, test_stream_->playback_handle_);
305 EXPECT_EQ(kTestFramesPerPacket, test_stream_->frames_per_packet_); 328 EXPECT_EQ(kTestFramesPerPacket, test_stream_->frames_per_packet_);
306 EXPECT_TRUE(test_stream_->packet_.get()); 329 EXPECT_TRUE(test_stream_->buffer_.get());
307 EXPECT_FALSE(test_stream_->stop_stream_); 330 EXPECT_FALSE(test_stream_->stop_stream_);
308 331
309 // Now close it and test that everything was released. 332 // Now close it and test that everything was released.
310 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) 333 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle))
311 .WillOnce(Return(0)); 334 .WillOnce(Return(0));
312 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) 335 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle))
313 .WillOnce(Return(kTestDeviceName)); 336 .WillOnce(Return(kTestDeviceName));
314 EXPECT_CALL(mock_manager_, ReleaseStream(test_stream_.get())); 337 EXPECT_CALL(mock_manager_, ReleaseStream(test_stream_.get()));
315 test_stream_->Close(); 338 test_stream_->Close();
316 message_loop_.RunAllPending(); 339 message_loop_.RunAllPending();
317 340
318 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); 341 EXPECT_TRUE(test_stream_->playback_handle_ == NULL);
319 EXPECT_FALSE(test_stream_->packet_.get()); 342 EXPECT_FALSE(test_stream_->buffer_.get());
320 EXPECT_TRUE(test_stream_->stop_stream_); 343 EXPECT_TRUE(test_stream_->stop_stream_);
321 } 344 }
322 345
323 TEST_F(AlsaPcmOutputStreamTest, PcmOpenFailed) { 346 TEST_F(AlsaPcmOutputStreamTest, PcmOpenFailed) {
324 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 347 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
325 .WillOnce(Return(kTestFailedErrno)); 348 .WillOnce(Return(kTestFailedErrno));
326 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) 349 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno))
327 .WillOnce(Return(kDummyMessage)); 350 .WillOnce(Return(kDummyMessage));
328 351
329 // Open still succeeds since PcmOpen is delegated to another thread. 352 // Open still succeeds since PcmOpen is delegated to another thread.
330 ASSERT_TRUE(test_stream_->Open(kTestPacketSize)); 353 ASSERT_TRUE(test_stream_->Open(kTestPacketSize));
331 ASSERT_EQ(AlsaPcmOutputStream::kIsOpened, 354 ASSERT_EQ(AlsaPcmOutputStream::kIsOpened,
332 test_stream_->shared_data_.state()); 355 test_stream_->shared_data_.state());
333 ASSERT_FALSE(test_stream_->stop_stream_); 356 ASSERT_FALSE(test_stream_->stop_stream_);
334 message_loop_.RunAllPending(); 357 message_loop_.RunAllPending();
335 358
336 // Ensure internal state is set for a no-op stream if PcmOpen() failes. 359 // Ensure internal state is set for a no-op stream if PcmOpen() failes.
337 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, 360 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened,
338 test_stream_->shared_data_.state()); 361 test_stream_->shared_data_.state());
339 EXPECT_TRUE(test_stream_->stop_stream_); 362 EXPECT_TRUE(test_stream_->stop_stream_);
340 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); 363 EXPECT_TRUE(test_stream_->playback_handle_ == NULL);
341 EXPECT_FALSE(test_stream_->packet_.get()); 364 EXPECT_FALSE(test_stream_->buffer_.get());
342 365
343 // Close the stream since we opened it to make destruction happy. 366 // Close the stream since we opened it to make destruction happy.
344 EXPECT_CALL(mock_manager_, ReleaseStream(test_stream_.get())); 367 EXPECT_CALL(mock_manager_, ReleaseStream(test_stream_.get()));
345 test_stream_->Close(); 368 test_stream_->Close();
346 message_loop_.RunAllPending(); 369 message_loop_.RunAllPending();
347 } 370 }
348 371
349 TEST_F(AlsaPcmOutputStreamTest, PcmSetParamsFailed) { 372 TEST_F(AlsaPcmOutputStreamTest, PcmSetParamsFailed) {
350 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 373 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
351 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), 374 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle),
(...skipping 13 matching lines...) Expand all
365 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, 388 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened,
366 test_stream_->shared_data_.state()); 389 test_stream_->shared_data_.state());
367 ASSERT_FALSE(test_stream_->stop_stream_); 390 ASSERT_FALSE(test_stream_->stop_stream_);
368 message_loop_.RunAllPending(); 391 message_loop_.RunAllPending();
369 392
370 // Ensure internal state is set for a no-op stream if PcmSetParams() failes. 393 // Ensure internal state is set for a no-op stream if PcmSetParams() failes.
371 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, 394 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened,
372 test_stream_->shared_data_.state()); 395 test_stream_->shared_data_.state());
373 EXPECT_TRUE(test_stream_->stop_stream_); 396 EXPECT_TRUE(test_stream_->stop_stream_);
374 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); 397 EXPECT_TRUE(test_stream_->playback_handle_ == NULL);
375 EXPECT_FALSE(test_stream_->packet_.get()); 398 EXPECT_FALSE(test_stream_->buffer_.get());
376 399
377 // Close the stream since we opened it to make destruction happy. 400 // Close the stream since we opened it to make destruction happy.
378 EXPECT_CALL(mock_manager_, ReleaseStream(test_stream_.get())); 401 EXPECT_CALL(mock_manager_, ReleaseStream(test_stream_.get()));
379 test_stream_->Close(); 402 test_stream_->Close();
380 message_loop_.RunAllPending(); 403 message_loop_.RunAllPending();
381 } 404 }
382 405
383 TEST_F(AlsaPcmOutputStreamTest, StartStop) { 406 TEST_F(AlsaPcmOutputStreamTest, StartStop) {
384 // Open() call opens the playback device, sets the parameters, posts a task 407 // Open() call opens the playback device, sets the parameters, posts a task
385 // with the resulting configuration data, and transitions the object state to 408 // with the resulting configuration data, and transitions the object state to
386 // kIsOpened. 409 // kIsOpened.
387 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 410 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
388 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), 411 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle),
389 Return(0))); 412 Return(0)));
390 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _)) 413 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _))
391 .WillOnce(Return(0)); 414 .WillOnce(Return(0));
415 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _))
416 .WillOnce(DoAll(SetArgumentPointee<1>(kTestPacketSize),
417 SetArgumentPointee<2>(kTestPacketSize / 2),
418 Return(0)));
392 419
393 // Open the stream. 420 // Open the stream.
394 ASSERT_TRUE(test_stream_->Open(kTestPacketSize)); 421 ASSERT_TRUE(test_stream_->Open(kTestPacketSize));
395 message_loop_.RunAllPending(); 422 message_loop_.RunAllPending();
396 423
397 // Expect Device setup. 424 // Expect Device setup.
398 EXPECT_CALL(mock_alsa_wrapper_, PcmDrop(kFakeHandle)) 425 EXPECT_CALL(mock_alsa_wrapper_, PcmDrop(kFakeHandle))
399 .WillOnce(Return(0)); 426 .WillOnce(Return(0));
400 EXPECT_CALL(mock_alsa_wrapper_, PcmPrepare(kFakeHandle)) 427 EXPECT_CALL(mock_alsa_wrapper_, PcmPrepare(kFakeHandle))
401 .WillOnce(Return(0)); 428 .WillOnce(Return(0));
402 429
403 // Expect the pre-roll.
404 MockAudioSourceCallback mock_callback;
405 EXPECT_CALL(mock_alsa_wrapper_, PcmState(kFakeHandle))
406 .Times(2)
407 .WillRepeatedly(Return(SND_PCM_STATE_RUNNING));
408 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(kFakeHandle, _))
409 .Times(2)
410 .WillRepeatedly(DoAll(SetArgumentPointee<1>(0), Return(0)));
411 EXPECT_CALL(mock_callback,
412 OnMoreData(test_stream_.get(), _, kTestPacketSize, 0))
413 .Times(2)
414 .WillRepeatedly(Return(kTestPacketSize));
415 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, _, _))
416 .Times(2)
417 .WillRepeatedly(Return(kTestPacketSize));
418
419 // Expect scheduling. 430 // Expect scheduling.
420 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle)) 431 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle))
421 .WillOnce(Return(1)); 432 .WillOnce(Return(1));
422 433
434 MockAudioSourceCallback mock_callback;
423 test_stream_->Start(&mock_callback); 435 test_stream_->Start(&mock_callback);
424 message_loop_.RunAllPending(); 436 message_loop_.RunAllPending();
425 437
426 EXPECT_CALL(mock_manager_, ReleaseStream(test_stream_.get())); 438 EXPECT_CALL(mock_manager_, ReleaseStream(test_stream_.get()));
427 EXPECT_CALL(mock_callback, OnClose(test_stream_.get())); 439 EXPECT_CALL(mock_callback, OnClose(test_stream_.get()));
428 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) 440 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle))
429 .WillOnce(Return(0)); 441 .WillOnce(Return(0));
430 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) 442 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle))
431 .WillOnce(Return(kTestDeviceName)); 443 .WillOnce(Return(kTestDeviceName));
432 test_stream_->Close(); 444 test_stream_->Close();
433 message_loop_.RunAllPending(); 445 message_loop_.RunAllPending();
434 } 446 }
435 447
436 TEST_F(AlsaPcmOutputStreamTest, WritePacket_FinishedPacket) { 448 TEST_F(AlsaPcmOutputStreamTest, WritePacket_FinishedPacket) {
449 InitBuffer();
450
437 // Nothing should happen. Don't set any expectations and Our strict mocks 451 // Nothing should happen. Don't set any expectations and Our strict mocks
438 // should verify most of this. 452 // should verify most of this.
439 453
440 // Test regular used-up packet. 454 // Test empty buffer.
441 packet_.used = packet_.size; 455 test_stream_->buffer_->Clear();
442 test_stream_->WritePacket(&packet_); 456 test_stream_->WritePacket();
443
444 // Test empty packet.
445 packet_.used = packet_.size = 0;
446 test_stream_->WritePacket(&packet_);
447 } 457 }
448 458
449 TEST_F(AlsaPcmOutputStreamTest, WritePacket_NormalPacket) { 459 TEST_F(AlsaPcmOutputStreamTest, WritePacket_NormalPacket) {
460 InitBuffer();
461
450 // Write a little less than half the data. 462 // Write a little less than half the data.
451 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(_, packet_.buffer.get(), _)) 463 int written = packet_->GetDataSize() / kTestBytesPerFrame / 2 - 1;
452 .WillOnce(Return(packet_.size / kTestBytesPerFrame / 2 - 1)); 464 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(_, packet_->GetData(), _))
465 .WillOnce(Return(written));
453 466
454 test_stream_->WritePacket(&packet_); 467 test_stream_->WritePacket();
455 468
456 ASSERT_EQ(packet_.size / 2 - kTestBytesPerFrame, packet_.used); 469 ASSERT_EQ(test_stream_->buffer_->forward_bytes(),
470 packet_->GetDataSize() - written * kTestBytesPerFrame);
457 471
458 // Write the rest. 472 // Write the rest.
459 EXPECT_CALL(mock_alsa_wrapper_, 473 EXPECT_CALL(mock_alsa_wrapper_,
460 PcmWritei(_, packet_.buffer.get() + packet_.used, _)) 474 PcmWritei(_, packet_->GetData() + written * kTestBytesPerFrame,
461 .WillOnce(Return(packet_.size / kTestBytesPerFrame / 2 + 1)); 475 _))
462 test_stream_->WritePacket(&packet_); 476 .WillOnce(Return(packet_->GetDataSize() / kTestBytesPerFrame - written));
463 EXPECT_EQ(packet_.size, packet_.used); 477 test_stream_->WritePacket();
478 EXPECT_EQ(0u, test_stream_->buffer_->forward_bytes());
464 } 479 }
465 480
466 TEST_F(AlsaPcmOutputStreamTest, WritePacket_WriteFails) { 481 TEST_F(AlsaPcmOutputStreamTest, WritePacket_WriteFails) {
482 InitBuffer();
483
467 // Fail due to a recoverable error and see that PcmRecover code path 484 // Fail due to a recoverable error and see that PcmRecover code path
468 // continues normally. 485 // continues normally.
469 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(_, _, _)) 486 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(_, _, _))
470 .WillOnce(Return(-EINTR)); 487 .WillOnce(Return(-EINTR));
471 EXPECT_CALL(mock_alsa_wrapper_, PcmRecover(_, _, _)) 488 EXPECT_CALL(mock_alsa_wrapper_, PcmRecover(_, _, _))
472 .WillOnce(Return(packet_.size / kTestBytesPerFrame / 2 - 1)); 489 .WillOnce(Return(packet_->GetDataSize() / kTestBytesPerFrame / 2 - 1));
473 490
474 test_stream_->WritePacket(&packet_); 491 test_stream_->WritePacket();
475 492
476 ASSERT_EQ(packet_.size / 2 - kTestBytesPerFrame, packet_.used); 493 ASSERT_EQ(test_stream_->buffer_->forward_bytes(),
494 packet_->GetDataSize() / 2 + kTestBytesPerFrame);
477 495
478 // Fail the next write, and see that stop_stream_ is set. 496 // Fail the next write, and see that stop_stream_ is set.
479 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(_, _, _)) 497 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(_, _, _))
480 .WillOnce(Return(kTestFailedErrno)); 498 .WillOnce(Return(kTestFailedErrno));
481 EXPECT_CALL(mock_alsa_wrapper_, PcmRecover(_, _, _)) 499 EXPECT_CALL(mock_alsa_wrapper_, PcmRecover(_, _, _))
482 .WillOnce(Return(kTestFailedErrno)); 500 .WillOnce(Return(kTestFailedErrno));
483 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) 501 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno))
484 .WillOnce(Return(kDummyMessage)); 502 .WillOnce(Return(kDummyMessage));
485 test_stream_->WritePacket(&packet_); 503 test_stream_->WritePacket();
486 EXPECT_EQ(packet_.size / 2 - kTestBytesPerFrame, packet_.used); 504 EXPECT_EQ(test_stream_->buffer_->forward_bytes(),
505 packet_->GetDataSize() / 2 + kTestBytesPerFrame);
487 EXPECT_TRUE(test_stream_->stop_stream_); 506 EXPECT_TRUE(test_stream_->stop_stream_);
488 } 507 }
489 508
490 TEST_F(AlsaPcmOutputStreamTest, WritePacket_StopStream) { 509 TEST_F(AlsaPcmOutputStreamTest, WritePacket_StopStream) {
510 InitBuffer();
511
491 // No expectations set on the strict mock because nothing should be called. 512 // No expectations set on the strict mock because nothing should be called.
492 test_stream_->stop_stream_ = true; 513 test_stream_->stop_stream_ = true;
493 test_stream_->WritePacket(&packet_); 514 test_stream_->WritePacket();
494 EXPECT_EQ(packet_.size, packet_.used); 515 EXPECT_EQ(0u, test_stream_->buffer_->forward_bytes());
495 } 516 }
496 517
497 TEST_F(AlsaPcmOutputStreamTest, BufferPacket) { 518 TEST_F(AlsaPcmOutputStreamTest, BufferPacket) {
498 packet_.used = packet_.size; 519 InitBuffer();
520 test_stream_->buffer_->Clear();
499 521
500 // Return a partially filled packet. 522 // Return a partially filled packet.
501 MockAudioSourceCallback mock_callback; 523 MockAudioSourceCallback mock_callback;
502 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) 524 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_))
503 .WillOnce(Return(SND_PCM_STATE_RUNNING)); 525 .WillOnce(Return(SND_PCM_STATE_RUNNING));
504 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _)) 526 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _))
505 .WillOnce(DoAll(SetArgumentPointee<1>(1), Return(0))); 527 .WillOnce(DoAll(SetArgumentPointee<1>(1), Return(0)));
506 EXPECT_CALL(mock_callback, 528 EXPECT_CALL(mock_callback,
507 OnMoreData(test_stream_.get(), packet_.buffer.get(), 529 OnMoreData(test_stream_.get(), _, _, kTestBytesPerFrame))
508 packet_.capacity, kTestBytesPerFrame))
509 .WillOnce(Return(10)); 530 .WillOnce(Return(10));
510 531
511 test_stream_->shared_data_.set_source_callback(&mock_callback); 532 test_stream_->shared_data_.set_source_callback(&mock_callback);
512 test_stream_->BufferPacket(&packet_); 533 test_stream_->BufferPacket();
513 534
514 EXPECT_EQ(0u, packet_.used); 535 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes());
515 EXPECT_EQ(10u, packet_.size);
516 } 536 }
517 537
518 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Negative) { 538 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Negative) {
519 packet_.used = packet_.size; 539 InitBuffer();
540 test_stream_->buffer_->Clear();
520 541
521 // Simulate where the underrun has occurred right after checking the delay. 542 // Simulate where the underrun has occurred right after checking the delay.
522 MockAudioSourceCallback mock_callback; 543 MockAudioSourceCallback mock_callback;
523 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) 544 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_))
524 .WillOnce(Return(SND_PCM_STATE_RUNNING)); 545 .WillOnce(Return(SND_PCM_STATE_RUNNING));
525 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _)) 546 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _))
526 .WillOnce(DoAll(SetArgumentPointee<1>(-1), Return(0))); 547 .WillOnce(DoAll(SetArgumentPointee<1>(-1), Return(0)));
527 EXPECT_CALL(mock_callback, 548 EXPECT_CALL(mock_callback,
528 OnMoreData(test_stream_.get(), packet_.buffer.get(), 549 OnMoreData(test_stream_.get(), _, _, 0))
529 packet_.capacity, 0))
530 .WillOnce(Return(10)); 550 .WillOnce(Return(10));
531 551
532 test_stream_->shared_data_.set_source_callback(&mock_callback); 552 test_stream_->shared_data_.set_source_callback(&mock_callback);
533 test_stream_->BufferPacket(&packet_); 553 test_stream_->BufferPacket();
534 554
535 EXPECT_EQ(0u, packet_.used); 555 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes());
536 EXPECT_EQ(10u, packet_.size);
537 } 556 }
538 557
539 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Underrun) { 558 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Underrun) {
540 packet_.used = packet_.size; 559 InitBuffer();
560 test_stream_->buffer_->Clear();
541 561
542 // If ALSA has underrun then we should assume a delay of zero. 562 // If ALSA has underrun then we should assume a delay of zero.
543 MockAudioSourceCallback mock_callback; 563 MockAudioSourceCallback mock_callback;
544 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) 564 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_))
545 .WillOnce(Return(SND_PCM_STATE_XRUN)); 565 .WillOnce(Return(SND_PCM_STATE_XRUN));
546 EXPECT_CALL(mock_callback, 566 EXPECT_CALL(mock_callback,
547 OnMoreData(test_stream_.get(), packet_.buffer.get(), 567 OnMoreData(test_stream_.get(), _, _, 0))
548 packet_.capacity, 0))
549 .WillOnce(Return(10)); 568 .WillOnce(Return(10));
550 569
551 test_stream_->shared_data_.set_source_callback(&mock_callback); 570 test_stream_->shared_data_.set_source_callback(&mock_callback);
552 test_stream_->BufferPacket(&packet_); 571 test_stream_->BufferPacket();
553 572
554 EXPECT_EQ(0u, packet_.used); 573 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes());
555 EXPECT_EQ(10u, packet_.size);
556 } 574 }
557 575
558 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_UnfinishedPacket) { 576 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_FullBuffer) {
577 InitBuffer();
559 // No expectations set on the strict mock because nothing should be called. 578 // No expectations set on the strict mock because nothing should be called.
560 test_stream_->BufferPacket(&packet_); 579 test_stream_->BufferPacket();
561 EXPECT_EQ(0u, packet_.used); 580 EXPECT_EQ(kTestPacketSize, test_stream_->buffer_->forward_bytes());
562 EXPECT_EQ(kTestPacketSize, packet_.size);
563 } 581 }
564 582
565 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_DeviceSelect) { 583 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_DeviceSelect) {
566 // Try channels from 1 -> 9. and see that we get the more specific surroundXX 584 // Try channels from 1 -> 9. and see that we get the more specific surroundXX
567 // device opened for channels 4-8. For all other channels, the device should 585 // device opened for channels 4-8. For all other channels, the device should
568 // default to |AlsaPcmOutputStream::kDefaultDevice|. We should also not 586 // default to |AlsaPcmOutputStream::kDefaultDevice|. We should also not
569 // downmix any channel in this case because downmixing is only defined for 587 // downmix any channel in this case because downmixing is only defined for
570 // channels 4-8, which we are guaranteeing to work. 588 // channels 4-8, which we are guaranteeing to work.
571 // 589 //
572 // Note that the loop starts at "1", so the first parameter is ignored in 590 // Note that the loop starts at "1", so the first parameter is ignored in
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
677 .WillOnce(Return(0)); 695 .WillOnce(Return(0));
678 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) 696 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno))
679 .WillOnce(Return(kDummyMessage)); 697 .WillOnce(Return(kDummyMessage));
680 698
681 test_stream_ = CreateStreamWithChannels(5); 699 test_stream_ = CreateStreamWithChannels(5);
682 EXPECT_TRUE(test_stream_->AutoSelectDevice(5)); 700 EXPECT_TRUE(test_stream_->AutoSelectDevice(5));
683 EXPECT_TRUE(test_stream_->should_downmix_); 701 EXPECT_TRUE(test_stream_->should_downmix_);
684 } 702 }
685 703
686 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_StopStream) { 704 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_StopStream) {
705 InitBuffer();
687 test_stream_->stop_stream_ = true; 706 test_stream_->stop_stream_ = true;
688 test_stream_->BufferPacket(&packet_); 707 test_stream_->BufferPacket();
689 EXPECT_EQ(0u, packet_.used); 708 EXPECT_EQ(0u, test_stream_->buffer_->forward_bytes());
690 EXPECT_EQ(0u, packet_.size);
691 } 709 }
692 710
693 TEST_F(AlsaPcmOutputStreamTest, ScheduleNextWrite) { 711 TEST_F(AlsaPcmOutputStreamTest, ScheduleNextWrite) {
694 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsOpened); 712 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsOpened);
695 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsPlaying); 713 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsPlaying);
696 714
715 InitBuffer();
716
697 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) 717 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_))
698 .WillOnce(Return(10)); 718 .WillOnce(Return(10));
699 test_stream_->ScheduleNextWrite(&packet_); 719 test_stream_->ScheduleNextWrite();
700 720
701 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsClosed); 721 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsClosed);
702 } 722 }
703 723
704 TEST_F(AlsaPcmOutputStreamTest, ScheduleNextWrite_StopStream) { 724 TEST_F(AlsaPcmOutputStreamTest, ScheduleNextWrite_StopStream) {
705 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsOpened); 725 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsOpened);
706 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsPlaying); 726 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsPlaying);
707 727
728 InitBuffer();
729
708 test_stream_->stop_stream_ = true; 730 test_stream_->stop_stream_ = true;
709 test_stream_->ScheduleNextWrite(&packet_); 731 test_stream_->ScheduleNextWrite();
710 732
711 // TODO(ajwong): Find a way to test whether or not another task has been 733 // TODO(ajwong): Find a way to test whether or not another task has been
712 // posted so we can verify that the Alsa code will indeed break the task 734 // posted so we can verify that the Alsa code will indeed break the task
713 // posting loop. 735 // posting loop.
714 736
715 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsClosed); 737 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsClosed);
716 } 738 }
OLDNEW
« no previous file with comments | « media/audio/linux/alsa_output.cc ('k') | media/audio/linux/alsa_wrapper.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698