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

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

Issue 17315021: Refactored DataBuffer to use unix_hacker style methods. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fixed remaining style issues Created 7 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
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/strings/stringprintf.h" 6 #include "base/strings/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 14 matching lines...) Expand all
25 using testing::Return; 25 using testing::Return;
26 using testing::SetArgumentPointee; 26 using testing::SetArgumentPointee;
27 using testing::StrictMock; 27 using testing::StrictMock;
28 using testing::StrEq; 28 using testing::StrEq;
29 using testing::Unused; 29 using testing::Unused;
30 30
31 namespace media { 31 namespace media {
32 32
33 class MockAlsaWrapper : public AlsaWrapper { 33 class MockAlsaWrapper : public AlsaWrapper {
34 public: 34 public:
35 MOCK_METHOD3(DeviceNameHint, int(int card, 35 MOCK_METHOD3(DeviceNameHint, int(int card, const char* iface, void*** hints));
36 const char* iface,
37 void*** hints));
38 MOCK_METHOD2(DeviceNameGetHint, char*(const void* hint, const char* id)); 36 MOCK_METHOD2(DeviceNameGetHint, char*(const void* hint, const char* id));
39 MOCK_METHOD1(DeviceNameFreeHint, int(void** hints)); 37 MOCK_METHOD1(DeviceNameFreeHint, int(void** hints));
40 38
41 MOCK_METHOD4(PcmOpen, int(snd_pcm_t** handle, const char* name, 39 MOCK_METHOD4(PcmOpen, int(snd_pcm_t** handle, const char* name,
42 snd_pcm_stream_t stream, int mode)); 40 snd_pcm_stream_t stream, int mode));
43 MOCK_METHOD1(PcmClose, int(snd_pcm_t* handle)); 41 MOCK_METHOD1(PcmClose, int(snd_pcm_t* handle));
44 MOCK_METHOD1(PcmPrepare, int(snd_pcm_t* handle)); 42 MOCK_METHOD1(PcmPrepare, int(snd_pcm_t* handle));
45 MOCK_METHOD1(PcmDrop, int(snd_pcm_t* handle)); 43 MOCK_METHOD1(PcmDrop, int(snd_pcm_t* handle));
46 MOCK_METHOD2(PcmDelay, int(snd_pcm_t* handle, snd_pcm_sframes_t* delay)); 44 MOCK_METHOD2(PcmDelay, int(snd_pcm_t* handle, snd_pcm_sframes_t* delay));
47 MOCK_METHOD3(PcmWritei, snd_pcm_sframes_t(snd_pcm_t* handle, 45 MOCK_METHOD3(PcmWritei,
48 const void* buffer, 46 snd_pcm_sframes_t(snd_pcm_t* handle, const void* buffer,
49 snd_pcm_uframes_t size)); 47 snd_pcm_uframes_t size));
50 MOCK_METHOD3(PcmReadi, snd_pcm_sframes_t(snd_pcm_t* handle, 48 MOCK_METHOD3(PcmReadi, snd_pcm_sframes_t(snd_pcm_t* handle, void* buffer,
51 void* buffer,
52 snd_pcm_uframes_t size)); 49 snd_pcm_uframes_t size));
53 MOCK_METHOD3(PcmRecover, int(snd_pcm_t* handle, int err, int silent)); 50 MOCK_METHOD3(PcmRecover, int(snd_pcm_t* handle, int err, int silent));
54 MOCK_METHOD7(PcmSetParams, int(snd_pcm_t* handle, snd_pcm_format_t format, 51 MOCK_METHOD7(PcmSetParams,
55 snd_pcm_access_t access, unsigned int channels, 52 int(snd_pcm_t* handle, snd_pcm_format_t format,
56 unsigned int rate, int soft_resample, 53 snd_pcm_access_t access, unsigned int channels,
57 unsigned int latency)); 54 unsigned int rate, int soft_resample, unsigned int latency));
58 MOCK_METHOD3(PcmGetParams, int(snd_pcm_t* handle, 55 MOCK_METHOD3(PcmGetParams,
59 snd_pcm_uframes_t* buffer_size, 56 int(snd_pcm_t* handle, snd_pcm_uframes_t* buffer_size,
60 snd_pcm_uframes_t* period_size)); 57 snd_pcm_uframes_t* period_size));
61 MOCK_METHOD1(PcmName, const char*(snd_pcm_t* handle)); 58 MOCK_METHOD1(PcmName, const char*(snd_pcm_t* handle));
62 MOCK_METHOD1(PcmAvailUpdate, snd_pcm_sframes_t(snd_pcm_t* handle)); 59 MOCK_METHOD1(PcmAvailUpdate, snd_pcm_sframes_t(snd_pcm_t* handle));
63 MOCK_METHOD1(PcmState, snd_pcm_state_t(snd_pcm_t* handle)); 60 MOCK_METHOD1(PcmState, snd_pcm_state_t(snd_pcm_t* handle));
64 MOCK_METHOD1(PcmStart, int(snd_pcm_t* handle)); 61 MOCK_METHOD1(PcmStart, int(snd_pcm_t* handle));
65 62
66 MOCK_METHOD1(StrError, const char*(int errnum)); 63 MOCK_METHOD1(StrError, const char*(int errnum));
67 }; 64 };
68 65
69 class MockAudioSourceCallback : public AudioOutputStream::AudioSourceCallback { 66 class MockAudioSourceCallback : public AudioOutputStream::AudioSourceCallback {
70 public: 67 public:
71 MOCK_METHOD2(OnMoreData, int(AudioBus* audio_bus, 68 MOCK_METHOD2(OnMoreData,
72 AudioBuffersState buffers_state)); 69 int(AudioBus* audio_bus, AudioBuffersState buffers_state));
73 MOCK_METHOD3(OnMoreIOData, int(AudioBus* source, 70 MOCK_METHOD3(OnMoreIOData, int(AudioBus* source, AudioBus* dest,
74 AudioBus* dest,
75 AudioBuffersState buffers_state)); 71 AudioBuffersState buffers_state));
76 MOCK_METHOD1(OnError, void(AudioOutputStream* stream)); 72 MOCK_METHOD1(OnError, void(AudioOutputStream* stream));
77 }; 73 };
78 74
79 class MockAudioManagerLinux : public AudioManagerLinux { 75 class MockAudioManagerLinux : public AudioManagerLinux {
80 public: 76 public:
81 MOCK_METHOD0(Init, void()); 77 MOCK_METHOD0(Init, void());
82 MOCK_METHOD0(HasAudioOutputDevices, bool()); 78 MOCK_METHOD0(HasAudioOutputDevices, bool());
83 MOCK_METHOD0(HasAudioInputDevices, bool()); 79 MOCK_METHOD0(HasAudioInputDevices, bool());
84 MOCK_METHOD1(MakeLinearOutputStream, AudioOutputStream*( 80 MOCK_METHOD1(MakeLinearOutputStream,
85 const AudioParameters& params)); 81 AudioOutputStream*(const AudioParameters& params));
86 MOCK_METHOD2(MakeLowLatencyOutputStream, AudioOutputStream*( 82 MOCK_METHOD2(MakeLowLatencyOutputStream,
87 const AudioParameters& params, const std::string& input_device_id)); 83 AudioOutputStream*(const AudioParameters& params,
88 MOCK_METHOD2(MakeLowLatencyInputStream, AudioInputStream*( 84 const std::string& input_device_id));
89 const AudioParameters& params, const std::string& device_id)); 85 MOCK_METHOD2(MakeLowLatencyInputStream,
86 AudioInputStream*(const AudioParameters& params,
87 const std::string& device_id));
90 88
91 // We need to override this function in order to skip the checking the number 89 // We need to override this function in order to skip the checking the number
92 // of active output streams. It is because the number of active streams 90 // of active output streams. It is because the number of active streams
93 // is managed inside MakeAudioOutputStream, and we don't use 91 // is managed inside MakeAudioOutputStream, and we don't use
94 // MakeAudioOutputStream to create the stream in the tests. 92 // MakeAudioOutputStream to create the stream in the tests.
95 virtual void ReleaseOutputStream(AudioOutputStream* stream) OVERRIDE { 93 virtual void ReleaseOutputStream(AudioOutputStream* stream) OVERRIDE {
96 DCHECK(stream); 94 DCHECK(stream);
97 delete stream; 95 delete stream;
98 } 96 }
99 97
100 // We don't mock this method since all tests will do the same thing 98 // We don't mock this method since all tests will do the same thing
101 // and use the current message loop. 99 // and use the current message loop.
102 virtual scoped_refptr<base::MessageLoopProxy> GetMessageLoop() OVERRIDE { 100 virtual scoped_refptr<base::MessageLoopProxy> GetMessageLoop() OVERRIDE {
103 return base::MessageLoop::current()->message_loop_proxy(); 101 return base::MessageLoop::current()->message_loop_proxy();
104 } 102 }
105 }; 103 };
106 104
107 class AlsaPcmOutputStreamTest : public testing::Test { 105 class AlsaPcmOutputStreamTest : public testing::Test {
108 protected: 106 protected:
109 AlsaPcmOutputStreamTest() { 107 AlsaPcmOutputStreamTest() {
110 mock_manager_.reset(new StrictMock<MockAudioManagerLinux>()); 108 mock_manager_.reset(new StrictMock<MockAudioManagerLinux>());
111 } 109 }
112 110
113 virtual ~AlsaPcmOutputStreamTest() { 111 virtual ~AlsaPcmOutputStreamTest() {}
114 }
115 112
116 AlsaPcmOutputStream* CreateStream(ChannelLayout layout) { 113 AlsaPcmOutputStream* CreateStream(ChannelLayout layout) {
117 return CreateStream(layout, kTestFramesPerPacket); 114 return CreateStream(layout, kTestFramesPerPacket);
118 } 115 }
119 116
120 AlsaPcmOutputStream* CreateStream(ChannelLayout layout, 117 AlsaPcmOutputStream* CreateStream(ChannelLayout layout,
121 int32 samples_per_packet) { 118 int32 samples_per_packet) {
122 AudioParameters params(kTestFormat, layout, kTestSampleRate, 119 AudioParameters params(kTestFormat, layout, kTestSampleRate,
123 kTestBitsPerSample, samples_per_packet); 120 kTestBitsPerSample, samples_per_packet);
124 return new AlsaPcmOutputStream(kTestDeviceName, 121 return new AlsaPcmOutputStream(kTestDeviceName, params, &mock_alsa_wrapper_,
125 params,
126 &mock_alsa_wrapper_,
127 mock_manager_.get()); 122 mock_manager_.get());
128 } 123 }
129 124
130 // Helper function to malloc the string returned by DeviceNameHint for NAME. 125 // Helper function to malloc the string returned by DeviceNameHint for NAME.
131 static char* EchoHint(const void* name, Unused) { 126 static char* EchoHint(const void* name, Unused) {
132 return strdup(static_cast<const char*>(name)); 127 return strdup(static_cast<const char*>(name));
133 } 128 }
134 129
135 // Helper function to malloc the string returned by DeviceNameHint for IOID. 130 // Helper function to malloc the string returned by DeviceNameHint for IOID.
136 static char* OutputHint(Unused, Unused) { 131 static char* OutputHint(Unused, Unused) { return strdup("Output"); }
137 return strdup("Output");
138 }
139 132
140 // Helper function to initialize |test_stream->buffer_|. Must be called 133 // Helper function to initialize |test_stream->buffer_|. Must be called
141 // in all tests that use buffer_ without opening the stream. 134 // in all tests that use buffer_ without opening the stream.
142 void InitBuffer(AlsaPcmOutputStream* test_stream) { 135 void InitBuffer(AlsaPcmOutputStream* test_stream) {
143 DCHECK(test_stream); 136 DCHECK(test_stream);
144 packet_ = new media::DataBuffer(kTestPacketSize); 137 packet_ = new media::DataBuffer(kTestPacketSize);
145 packet_->SetDataSize(kTestPacketSize); 138 packet_->set_data_size(kTestPacketSize);
146 test_stream->buffer_.reset(new media::SeekableBuffer(0, kTestPacketSize)); 139 test_stream->buffer_.reset(new media::SeekableBuffer(0, kTestPacketSize));
147 test_stream->buffer_->Append(packet_.get()); 140 test_stream->buffer_->Append(packet_.get());
148 } 141 }
149 142
150 static const ChannelLayout kTestChannelLayout; 143 static const ChannelLayout kTestChannelLayout;
151 static const int kTestSampleRate; 144 static const int kTestSampleRate;
152 static const int kTestBitsPerSample; 145 static const int kTestBitsPerSample;
153 static const int kTestBytesPerFrame; 146 static const int kTestBytesPerFrame;
154 static const AudioParameters::Format kTestFormat; 147 static const AudioParameters::Format kTestFormat;
155 static const char kTestDeviceName[]; 148 static const char kTestDeviceName[];
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 const int AlsaPcmOutputStreamTest::kTestFailedErrno = -EACCES; 189 const int AlsaPcmOutputStreamTest::kTestFailedErrno = -EACCES;
197 snd_pcm_t* const AlsaPcmOutputStreamTest::kFakeHandle = 190 snd_pcm_t* const AlsaPcmOutputStreamTest::kFakeHandle =
198 reinterpret_cast<snd_pcm_t*>(1); 191 reinterpret_cast<snd_pcm_t*>(1);
199 192
200 char AlsaPcmOutputStreamTest::kSurround40[] = "surround40:CARD=foo,DEV=0"; 193 char AlsaPcmOutputStreamTest::kSurround40[] = "surround40:CARD=foo,DEV=0";
201 char AlsaPcmOutputStreamTest::kSurround41[] = "surround41:CARD=foo,DEV=0"; 194 char AlsaPcmOutputStreamTest::kSurround41[] = "surround41:CARD=foo,DEV=0";
202 char AlsaPcmOutputStreamTest::kSurround50[] = "surround50:CARD=foo,DEV=0"; 195 char AlsaPcmOutputStreamTest::kSurround50[] = "surround50:CARD=foo,DEV=0";
203 char AlsaPcmOutputStreamTest::kSurround51[] = "surround51:CARD=foo,DEV=0"; 196 char AlsaPcmOutputStreamTest::kSurround51[] = "surround51:CARD=foo,DEV=0";
204 char AlsaPcmOutputStreamTest::kSurround70[] = "surround70:CARD=foo,DEV=0"; 197 char AlsaPcmOutputStreamTest::kSurround70[] = "surround70:CARD=foo,DEV=0";
205 char AlsaPcmOutputStreamTest::kSurround71[] = "surround71:CARD=foo,DEV=0"; 198 char AlsaPcmOutputStreamTest::kSurround71[] = "surround71:CARD=foo,DEV=0";
206 void* AlsaPcmOutputStreamTest::kFakeHints[] = { 199 void* AlsaPcmOutputStreamTest::kFakeHints[] = {kSurround40, kSurround41,
207 kSurround40, kSurround41, kSurround50, kSurround51, 200 kSurround50, kSurround51,
208 kSurround70, kSurround71, NULL }; 201 kSurround70, kSurround71, NULL};
209 202
210 // Custom action to clear a memory buffer. 203 // Custom action to clear a memory buffer.
211 ACTION(ClearBuffer) { 204 ACTION(ClearBuffer) { arg0->Zero(); }
212 arg0->Zero();
213 }
214 205
215 TEST_F(AlsaPcmOutputStreamTest, ConstructedState) { 206 TEST_F(AlsaPcmOutputStreamTest, ConstructedState) {
216 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); 207 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout);
217 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream->state()); 208 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream->state());
218 test_stream->Close(); 209 test_stream->Close();
219 210
220 // Should support mono. 211 // Should support mono.
221 test_stream = CreateStream(CHANNEL_LAYOUT_MONO); 212 test_stream = CreateStream(CHANNEL_LAYOUT_MONO);
222 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream->state()); 213 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream->state());
223 test_stream->Close(); 214 test_stream->Close();
224 215
225 // Should support multi-channel. 216 // Should support multi-channel.
226 test_stream = CreateStream(CHANNEL_LAYOUT_SURROUND); 217 test_stream = CreateStream(CHANNEL_LAYOUT_SURROUND);
227 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream->state()); 218 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream->state());
228 test_stream->Close(); 219 test_stream->Close();
229 220
230 // Bad bits per sample. 221 // Bad bits per sample.
231 AudioParameters bad_bps_params(kTestFormat, kTestChannelLayout, 222 AudioParameters bad_bps_params(kTestFormat, kTestChannelLayout,
232 kTestSampleRate, kTestBitsPerSample - 1, 223 kTestSampleRate, kTestBitsPerSample - 1,
233 kTestFramesPerPacket); 224 kTestFramesPerPacket);
234 test_stream = new AlsaPcmOutputStream(kTestDeviceName, 225 test_stream =
235 bad_bps_params, 226 new AlsaPcmOutputStream(kTestDeviceName, bad_bps_params,
236 &mock_alsa_wrapper_, 227 &mock_alsa_wrapper_, mock_manager_.get());
237 mock_manager_.get());
238 EXPECT_EQ(AlsaPcmOutputStream::kInError, test_stream->state()); 228 EXPECT_EQ(AlsaPcmOutputStream::kInError, test_stream->state());
239 test_stream->Close(); 229 test_stream->Close();
240 230
241 // Bad format. 231 // Bad format.
242 AudioParameters bad_format_params( 232 AudioParameters bad_format_params(AudioParameters::AUDIO_LAST_FORMAT,
243 AudioParameters::AUDIO_LAST_FORMAT, kTestChannelLayout, kTestSampleRate, 233 kTestChannelLayout, kTestSampleRate,
244 kTestBitsPerSample, kTestFramesPerPacket); 234 kTestBitsPerSample, kTestFramesPerPacket);
245 test_stream = new AlsaPcmOutputStream(kTestDeviceName, 235 test_stream =
246 bad_format_params, 236 new AlsaPcmOutputStream(kTestDeviceName, bad_format_params,
247 &mock_alsa_wrapper_, 237 &mock_alsa_wrapper_, mock_manager_.get());
248 mock_manager_.get());
249 EXPECT_EQ(AlsaPcmOutputStream::kInError, test_stream->state()); 238 EXPECT_EQ(AlsaPcmOutputStream::kInError, test_stream->state());
250 test_stream->Close(); 239 test_stream->Close();
251 } 240 }
252 241
253 TEST_F(AlsaPcmOutputStreamTest, LatencyFloor) { 242 TEST_F(AlsaPcmOutputStreamTest, LatencyFloor) {
254 const double kMicrosPerFrame = 243 const double kMicrosPerFrame = static_cast<double>(1000000) / kTestSampleRate;
255 static_cast<double>(1000000) / kTestSampleRate;
256 const double kPacketFramesInMinLatency = 244 const double kPacketFramesInMinLatency =
257 AlsaPcmOutputStream::kMinLatencyMicros / kMicrosPerFrame / 2.0; 245 AlsaPcmOutputStream::kMinLatencyMicros / kMicrosPerFrame / 2.0;
258 246
259 // Test that packets which would cause a latency under less than 247 // Test that packets which would cause a latency under less than
260 // AlsaPcmOutputStream::kMinLatencyMicros will get clipped to 248 // AlsaPcmOutputStream::kMinLatencyMicros will get clipped to
261 // AlsaPcmOutputStream::kMinLatencyMicros, 249 // AlsaPcmOutputStream::kMinLatencyMicros,
262 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 250 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
263 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), 251 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0)));
264 Return(0))); 252 EXPECT_CALL(
265 EXPECT_CALL(mock_alsa_wrapper_, 253 mock_alsa_wrapper_,
266 PcmSetParams(_, _, _, _, _, _, 254 PcmSetParams(_, _, _, _, _, _, AlsaPcmOutputStream::kMinLatencyMicros))
267 AlsaPcmOutputStream::kMinLatencyMicros))
268 .WillOnce(Return(0)); 255 .WillOnce(Return(0));
269 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) 256 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)).WillOnce(
270 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), 257 DoAll(SetArgumentPointee<1>(kTestFramesPerPacket),
271 SetArgumentPointee<2>(kTestFramesPerPacket / 2), 258 SetArgumentPointee<2>(kTestFramesPerPacket / 2), Return(0)));
272 Return(0)));
273 259
274 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout, 260 AlsaPcmOutputStream* test_stream =
275 kPacketFramesInMinLatency); 261 CreateStream(kTestChannelLayout, kPacketFramesInMinLatency);
276 ASSERT_TRUE(test_stream->Open()); 262 ASSERT_TRUE(test_stream->Open());
277 263
278 // Now close it and test that everything was released. 264 // Now close it and test that everything was released.
279 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0)); 265 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0));
280 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) 266 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle))
281 .WillOnce(Return(kTestDeviceName)); 267 .WillOnce(Return(kTestDeviceName));
282 test_stream->Close(); 268 test_stream->Close();
283 269
284 Mock::VerifyAndClear(&mock_alsa_wrapper_); 270 Mock::VerifyAndClear(&mock_alsa_wrapper_);
285 Mock::VerifyAndClear(mock_manager_.get()); 271 Mock::VerifyAndClear(mock_manager_.get());
286 272
287 // Test that having more packets ends up with a latency based on packet size. 273 // Test that having more packets ends up with a latency based on packet size.
288 const int kOverMinLatencyPacketSize = kPacketFramesInMinLatency + 1; 274 const int kOverMinLatencyPacketSize = kPacketFramesInMinLatency + 1;
289 int64 expected_micros = AlsaPcmOutputStream::FramesToTimeDelta( 275 int64 expected_micros = AlsaPcmOutputStream::FramesToTimeDelta(
290 kOverMinLatencyPacketSize * 2, kTestSampleRate).InMicroseconds(); 276 kOverMinLatencyPacketSize * 2, kTestSampleRate).InMicroseconds();
291 277
292 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 278 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
293 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); 279 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0)));
294 EXPECT_CALL(mock_alsa_wrapper_, 280 EXPECT_CALL(mock_alsa_wrapper_,
295 PcmSetParams(_, _, _, _, _, _, expected_micros)) 281 PcmSetParams(_, _, _, _, _, _, expected_micros))
296 .WillOnce(Return(0)); 282 .WillOnce(Return(0));
297 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) 283 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)).WillOnce(
298 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), 284 DoAll(SetArgumentPointee<1>(kTestFramesPerPacket),
299 SetArgumentPointee<2>(kTestFramesPerPacket / 2), 285 SetArgumentPointee<2>(kTestFramesPerPacket / 2), Return(0)));
300 Return(0)));
301 286
302 test_stream = CreateStream(kTestChannelLayout, 287 test_stream = CreateStream(kTestChannelLayout, kOverMinLatencyPacketSize);
303 kOverMinLatencyPacketSize);
304 ASSERT_TRUE(test_stream->Open()); 288 ASSERT_TRUE(test_stream->Open());
305 289
306 // Now close it and test that everything was released. 290 // Now close it and test that everything was released.
307 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) 291 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0));
308 .WillOnce(Return(0));
309 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) 292 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle))
310 .WillOnce(Return(kTestDeviceName)); 293 .WillOnce(Return(kTestDeviceName));
311 test_stream->Close(); 294 test_stream->Close();
312 295
313 Mock::VerifyAndClear(&mock_alsa_wrapper_); 296 Mock::VerifyAndClear(&mock_alsa_wrapper_);
314 Mock::VerifyAndClear(mock_manager_.get()); 297 Mock::VerifyAndClear(mock_manager_.get());
315 } 298 }
316 299
317 TEST_F(AlsaPcmOutputStreamTest, OpenClose) { 300 TEST_F(AlsaPcmOutputStreamTest, OpenClose) {
318 int64 expected_micros = AlsaPcmOutputStream::FramesToTimeDelta( 301 int64 expected_micros = AlsaPcmOutputStream::FramesToTimeDelta(
319 2 * kTestFramesPerPacket, kTestSampleRate).InMicroseconds(); 302 2 * kTestFramesPerPacket, kTestSampleRate).InMicroseconds();
320 303
321 // Open() call opens the playback device, sets the parameters, posts a task 304 // Open() call opens the playback device, sets the parameters, posts a task
322 // with the resulting configuration data, and transitions the object state to 305 // with the resulting configuration data, and transitions the object state to
323 // kIsOpened. 306 // kIsOpened.
324 EXPECT_CALL(mock_alsa_wrapper_, 307 EXPECT_CALL(mock_alsa_wrapper_,
325 PcmOpen(_, StrEq(kTestDeviceName), 308 PcmOpen(_, StrEq(kTestDeviceName), SND_PCM_STREAM_PLAYBACK,
326 SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) 309 SND_PCM_NONBLOCK))
327 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), 310 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0)));
328 Return(0)));
329 EXPECT_CALL(mock_alsa_wrapper_, 311 EXPECT_CALL(mock_alsa_wrapper_,
330 PcmSetParams(kFakeHandle, 312 PcmSetParams(
331 SND_PCM_FORMAT_U8, 313 kFakeHandle, SND_PCM_FORMAT_U8, SND_PCM_ACCESS_RW_INTERLEAVED,
332 SND_PCM_ACCESS_RW_INTERLEAVED, 314 ChannelLayoutToChannelCount(kTestChannelLayout),
333 ChannelLayoutToChannelCount(kTestChannelLayout), 315 kTestSampleRate, 1, expected_micros)).WillOnce(Return(0));
334 kTestSampleRate, 316 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(kFakeHandle, _, _)).WillOnce(
335 1, 317 DoAll(SetArgumentPointee<1>(kTestFramesPerPacket),
336 expected_micros)) 318 SetArgumentPointee<2>(kTestFramesPerPacket / 2), Return(0)));
337 .WillOnce(Return(0));
338 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(kFakeHandle, _, _))
339 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket),
340 SetArgumentPointee<2>(kTestFramesPerPacket / 2),
341 Return(0)));
342 319
343 // Open the stream. 320 // Open the stream.
344 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); 321 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout);
345 ASSERT_TRUE(test_stream->Open()); 322 ASSERT_TRUE(test_stream->Open());
346 323
347 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, test_stream->state()); 324 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, test_stream->state());
348 EXPECT_EQ(kFakeHandle, test_stream->playback_handle_); 325 EXPECT_EQ(kFakeHandle, test_stream->playback_handle_);
349 EXPECT_EQ(kTestFramesPerPacket, test_stream->frames_per_packet_); 326 EXPECT_EQ(kTestFramesPerPacket, test_stream->frames_per_packet_);
350 EXPECT_TRUE(test_stream->buffer_.get()); 327 EXPECT_TRUE(test_stream->buffer_.get());
351 EXPECT_FALSE(test_stream->stop_stream_); 328 EXPECT_FALSE(test_stream->stop_stream_);
352 329
353 // Now close it and test that everything was released. 330 // Now close it and test that everything was released.
354 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) 331 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0));
355 .WillOnce(Return(0));
356 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) 332 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle))
357 .WillOnce(Return(kTestDeviceName)); 333 .WillOnce(Return(kTestDeviceName));
358 test_stream->Close(); 334 test_stream->Close();
359 } 335 }
360 336
361 TEST_F(AlsaPcmOutputStreamTest, PcmOpenFailed) { 337 TEST_F(AlsaPcmOutputStreamTest, PcmOpenFailed) {
362 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 338 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
363 .WillOnce(Return(kTestFailedErrno)); 339 .WillOnce(Return(kTestFailedErrno));
364 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) 340 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno))
365 .WillOnce(Return(kDummyMessage)); 341 .WillOnce(Return(kDummyMessage));
366 342
367 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); 343 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout);
368 ASSERT_FALSE(test_stream->Open()); 344 ASSERT_FALSE(test_stream->Open());
369 ASSERT_EQ(AlsaPcmOutputStream::kInError, test_stream->state()); 345 ASSERT_EQ(AlsaPcmOutputStream::kInError, test_stream->state());
370 346
371 // Ensure internal state is set for a no-op stream if PcmOpen() failes. 347 // Ensure internal state is set for a no-op stream if PcmOpen() failes.
372 EXPECT_TRUE(test_stream->stop_stream_); 348 EXPECT_TRUE(test_stream->stop_stream_);
373 EXPECT_TRUE(test_stream->playback_handle_ == NULL); 349 EXPECT_TRUE(test_stream->playback_handle_ == NULL);
374 EXPECT_FALSE(test_stream->buffer_.get()); 350 EXPECT_FALSE(test_stream->buffer_.get());
375 351
376 // Close the stream since we opened it to make destruction happy. 352 // Close the stream since we opened it to make destruction happy.
377 test_stream->Close(); 353 test_stream->Close();
378 } 354 }
379 355
380 TEST_F(AlsaPcmOutputStreamTest, PcmSetParamsFailed) { 356 TEST_F(AlsaPcmOutputStreamTest, PcmSetParamsFailed) {
381 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 357 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
382 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), 358 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0)));
383 Return(0)));
384 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _)) 359 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _))
385 .WillOnce(Return(kTestFailedErrno)); 360 .WillOnce(Return(kTestFailedErrno));
386 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) 361 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0));
387 .WillOnce(Return(0));
388 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) 362 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle))
389 .WillOnce(Return(kTestDeviceName)); 363 .WillOnce(Return(kTestDeviceName));
390 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) 364 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno))
391 .WillOnce(Return(kDummyMessage)); 365 .WillOnce(Return(kDummyMessage));
392 366
393 // If open fails, the stream stays in kCreated because it has effectively had 367 // If open fails, the stream stays in kCreated because it has effectively had
394 // no changes. 368 // no changes.
395 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); 369 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout);
396 ASSERT_FALSE(test_stream->Open()); 370 ASSERT_FALSE(test_stream->Open());
397 EXPECT_EQ(AlsaPcmOutputStream::kInError, test_stream->state()); 371 EXPECT_EQ(AlsaPcmOutputStream::kInError, test_stream->state());
398 372
399 // Ensure internal state is set for a no-op stream if PcmSetParams() failes. 373 // Ensure internal state is set for a no-op stream if PcmSetParams() failes.
400 EXPECT_TRUE(test_stream->stop_stream_); 374 EXPECT_TRUE(test_stream->stop_stream_);
401 EXPECT_TRUE(test_stream->playback_handle_ == NULL); 375 EXPECT_TRUE(test_stream->playback_handle_ == NULL);
402 EXPECT_FALSE(test_stream->buffer_.get()); 376 EXPECT_FALSE(test_stream->buffer_.get());
403 377
404 // Close the stream since we opened it to make destruction happy. 378 // Close the stream since we opened it to make destruction happy.
405 test_stream->Close(); 379 test_stream->Close();
406 } 380 }
407 381
408 TEST_F(AlsaPcmOutputStreamTest, StartStop) { 382 TEST_F(AlsaPcmOutputStreamTest, StartStop) {
409 // Open() call opens the playback device, sets the parameters, posts a task 383 // Open() call opens the playback device, sets the parameters, posts a task
410 // with the resulting configuration data, and transitions the object state to 384 // with the resulting configuration data, and transitions the object state to
411 // kIsOpened. 385 // kIsOpened.
412 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 386 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
413 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), 387 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0)));
414 Return(0)));
415 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _)) 388 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _))
416 .WillOnce(Return(0)); 389 .WillOnce(Return(0));
417 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) 390 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)).WillOnce(
418 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), 391 DoAll(SetArgumentPointee<1>(kTestFramesPerPacket),
419 SetArgumentPointee<2>(kTestFramesPerPacket / 2), 392 SetArgumentPointee<2>(kTestFramesPerPacket / 2), Return(0)));
420 Return(0)));
421 393
422 // Open the stream. 394 // Open the stream.
423 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); 395 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout);
424 ASSERT_TRUE(test_stream->Open()); 396 ASSERT_TRUE(test_stream->Open());
425 397
426 // Expect Device setup. 398 // Expect Device setup.
427 EXPECT_CALL(mock_alsa_wrapper_, PcmDrop(kFakeHandle)) 399 EXPECT_CALL(mock_alsa_wrapper_, PcmDrop(kFakeHandle)).WillOnce(Return(0));
428 .WillOnce(Return(0)); 400 EXPECT_CALL(mock_alsa_wrapper_, PcmPrepare(kFakeHandle)).WillOnce(Return(0));
429 EXPECT_CALL(mock_alsa_wrapper_, PcmPrepare(kFakeHandle))
430 .WillOnce(Return(0));
431 401
432 // Expect the pre-roll. 402 // Expect the pre-roll.
433 MockAudioSourceCallback mock_callback; 403 MockAudioSourceCallback mock_callback;
434 EXPECT_CALL(mock_alsa_wrapper_, PcmState(kFakeHandle)) 404 EXPECT_CALL(mock_alsa_wrapper_, PcmState(kFakeHandle))
435 .WillRepeatedly(Return(SND_PCM_STATE_RUNNING)); 405 .WillRepeatedly(Return(SND_PCM_STATE_RUNNING));
436 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(kFakeHandle, _)) 406 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(kFakeHandle, _))
437 .WillRepeatedly(DoAll(SetArgumentPointee<1>(0), Return(0))); 407 .WillRepeatedly(DoAll(SetArgumentPointee<1>(0), Return(0)));
438 EXPECT_CALL(mock_callback, OnMoreData(_, _)) 408 EXPECT_CALL(mock_callback, OnMoreData(_, _))
439 .WillRepeatedly(DoAll(ClearBuffer(), Return(kTestFramesPerPacket))); 409 .WillRepeatedly(DoAll(ClearBuffer(), Return(kTestFramesPerPacket)));
440 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, _, _)) 410 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, _, _))
441 .WillRepeatedly(Return(kTestFramesPerPacket)); 411 .WillRepeatedly(Return(kTestFramesPerPacket));
442 412
443 // Expect scheduling. 413 // Expect scheduling.
444 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle)) 414 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle)).Times(AtLeast(2))
445 .Times(AtLeast(2))
446 .WillRepeatedly(Return(kTestFramesPerPacket)); 415 .WillRepeatedly(Return(kTestFramesPerPacket));
447 416
448 test_stream->Start(&mock_callback); 417 test_stream->Start(&mock_callback);
449 // Start() will issue a WriteTask() directly and then schedule the next one, 418 // Start() will issue a WriteTask() directly and then schedule the next one,
450 // call Stop() immediately after to ensure we don't run the message loop 419 // call Stop() immediately after to ensure we don't run the message loop
451 // forever. 420 // forever.
452 test_stream->Stop(); 421 test_stream->Stop();
453 message_loop_.RunUntilIdle(); 422 message_loop_.RunUntilIdle();
454 423
455 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) 424 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0));
456 .WillOnce(Return(0));
457 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) 425 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle))
458 .WillOnce(Return(kTestDeviceName)); 426 .WillOnce(Return(kTestDeviceName));
459 test_stream->Close(); 427 test_stream->Close();
460 } 428 }
461 429
462 TEST_F(AlsaPcmOutputStreamTest, WritePacket_FinishedPacket) { 430 TEST_F(AlsaPcmOutputStreamTest, WritePacket_FinishedPacket) {
463 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); 431 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout);
464 InitBuffer(test_stream); 432 InitBuffer(test_stream);
465 test_stream->TransitionTo(AlsaPcmOutputStream::kIsOpened); 433 test_stream->TransitionTo(AlsaPcmOutputStream::kIsOpened);
466 test_stream->TransitionTo(AlsaPcmOutputStream::kIsPlaying); 434 test_stream->TransitionTo(AlsaPcmOutputStream::kIsPlaying);
467 435
468 // Nothing should happen. Don't set any expectations and Our strict mocks 436 // Nothing should happen. Don't set any expectations and Our strict mocks
469 // should verify most of this. 437 // should verify most of this.
470 438
471 // Test empty buffer. 439 // Test empty buffer.
472 test_stream->buffer_->Clear(); 440 test_stream->buffer_->Clear();
473 test_stream->WritePacket(); 441 test_stream->WritePacket();
474 test_stream->Close(); 442 test_stream->Close();
475 } 443 }
476 444
477 TEST_F(AlsaPcmOutputStreamTest, WritePacket_NormalPacket) { 445 TEST_F(AlsaPcmOutputStreamTest, WritePacket_NormalPacket) {
478 // We need to open the stream before writing data to ALSA. 446 // We need to open the stream before writing data to ALSA.
479 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 447 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
480 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), 448 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0)));
481 Return(0)));
482 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _)) 449 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _))
483 .WillOnce(Return(0)); 450 .WillOnce(Return(0));
484 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) 451 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)).WillOnce(
485 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), 452 DoAll(SetArgumentPointee<1>(kTestFramesPerPacket),
486 SetArgumentPointee<2>(kTestFramesPerPacket / 2), 453 SetArgumentPointee<2>(kTestFramesPerPacket / 2), Return(0)));
487 Return(0)));
488 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); 454 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout);
489 ASSERT_TRUE(test_stream->Open()); 455 ASSERT_TRUE(test_stream->Open());
490 InitBuffer(test_stream); 456 InitBuffer(test_stream);
491 test_stream->TransitionTo(AlsaPcmOutputStream::kIsPlaying); 457 test_stream->TransitionTo(AlsaPcmOutputStream::kIsPlaying);
492 458
493 // Write a little less than half the data. 459 // Write a little less than half the data.
494 int written = packet_->GetDataSize() / kTestBytesPerFrame / 2 - 1; 460 int written = packet_->data_size() / kTestBytesPerFrame / 2 - 1;
495 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle)) 461 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle))
496 .WillOnce(Return(written));
497 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, packet_->GetData(), _))
498 .WillOnce(Return(written)); 462 .WillOnce(Return(written));
463 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, packet_->data(),
464 _)).WillOnce(Return(written));
499 465
500 test_stream->WritePacket(); 466 test_stream->WritePacket();
501 467
502 ASSERT_EQ(test_stream->buffer_->forward_bytes(), 468 ASSERT_EQ(test_stream->buffer_->forward_bytes(),
503 packet_->GetDataSize() - written * kTestBytesPerFrame); 469 packet_->data_size() - written * kTestBytesPerFrame);
504 470
505 // Write the rest. 471 // Write the rest.
506 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle)) 472 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle))
507 .WillOnce(Return(kTestFramesPerPacket - written)); 473 .WillOnce(Return(kTestFramesPerPacket - written));
508 EXPECT_CALL(mock_alsa_wrapper_, 474 EXPECT_CALL(mock_alsa_wrapper_,
509 PcmWritei(kFakeHandle, 475 PcmWritei(kFakeHandle,
510 packet_->GetData() + written * kTestBytesPerFrame, 476 packet_->data() + written * kTestBytesPerFrame, _))
511 _)) 477 .WillOnce(
512 .WillOnce(Return(packet_->GetDataSize() / kTestBytesPerFrame - written)); 478 Return(packet_->data_size() / kTestBytesPerFrame - written));
513 test_stream->WritePacket(); 479 test_stream->WritePacket();
514 EXPECT_EQ(0, test_stream->buffer_->forward_bytes()); 480 EXPECT_EQ(0, test_stream->buffer_->forward_bytes());
515 481
516 // Now close it and test that everything was released. 482 // Now close it and test that everything was released.
517 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) 483 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0));
518 .WillOnce(Return(0));
519 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) 484 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle))
520 .WillOnce(Return(kTestDeviceName)); 485 .WillOnce(Return(kTestDeviceName));
521 test_stream->Close(); 486 test_stream->Close();
522 } 487 }
523 488
524 TEST_F(AlsaPcmOutputStreamTest, WritePacket_WriteFails) { 489 TEST_F(AlsaPcmOutputStreamTest, WritePacket_WriteFails) {
525 // We need to open the stream before writing data to ALSA. 490 // We need to open the stream before writing data to ALSA.
526 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) 491 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _))
527 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), 492 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0)));
528 Return(0)));
529 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _)) 493 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _))
530 .WillOnce(Return(0)); 494 .WillOnce(Return(0));
531 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) 495 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)).WillOnce(
532 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), 496 DoAll(SetArgumentPointee<1>(kTestFramesPerPacket),
533 SetArgumentPointee<2>(kTestFramesPerPacket / 2), 497 SetArgumentPointee<2>(kTestFramesPerPacket / 2), Return(0)));
534 Return(0)));
535 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); 498 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout);
536 ASSERT_TRUE(test_stream->Open()); 499 ASSERT_TRUE(test_stream->Open());
537 InitBuffer(test_stream); 500 InitBuffer(test_stream);
538 test_stream->TransitionTo(AlsaPcmOutputStream::kIsPlaying); 501 test_stream->TransitionTo(AlsaPcmOutputStream::kIsPlaying);
539 502
540 // Fail due to a recoverable error and see that PcmRecover code path 503 // Fail due to a recoverable error and see that PcmRecover code path
541 // continues normally. 504 // continues normally.
542 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle)) 505 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle))
543 .WillOnce(Return(kTestFramesPerPacket)); 506 .WillOnce(Return(kTestFramesPerPacket));
544 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, _, _)) 507 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, _, _))
545 .WillOnce(Return(-EINTR)); 508 .WillOnce(Return(-EINTR));
546 EXPECT_CALL(mock_alsa_wrapper_, PcmRecover(kFakeHandle, _, _)) 509 EXPECT_CALL(mock_alsa_wrapper_, PcmRecover(kFakeHandle, _, _))
547 .WillOnce(Return(0)); 510 .WillOnce(Return(0));
548 511
549 test_stream->WritePacket(); 512 test_stream->WritePacket();
550 513
551 ASSERT_EQ(test_stream->buffer_->forward_bytes(), packet_->GetDataSize()); 514 ASSERT_EQ(test_stream->buffer_->forward_bytes(), packet_->data_size());
552 515
553 // Fail the next write, and see that stop_stream_ is set. 516 // Fail the next write, and see that stop_stream_ is set.
554 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle)) 517 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle))
555 .WillOnce(Return(kTestFramesPerPacket)); 518 .WillOnce(Return(kTestFramesPerPacket));
556 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, _, _)) 519 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, _, _))
557 .WillOnce(Return(kTestFailedErrno)); 520 .WillOnce(Return(kTestFailedErrno));
558 EXPECT_CALL(mock_alsa_wrapper_, PcmRecover(kFakeHandle, _, _)) 521 EXPECT_CALL(mock_alsa_wrapper_, PcmRecover(kFakeHandle, _, _))
559 .WillOnce(Return(kTestFailedErrno)); 522 .WillOnce(Return(kTestFailedErrno));
560 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) 523 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno))
561 .WillOnce(Return(kDummyMessage)); 524 .WillOnce(Return(kDummyMessage));
562 test_stream->WritePacket(); 525 test_stream->WritePacket();
563 EXPECT_EQ(test_stream->buffer_->forward_bytes(), packet_->GetDataSize()); 526 EXPECT_EQ(test_stream->buffer_->forward_bytes(), packet_->data_size());
564 EXPECT_TRUE(test_stream->stop_stream_); 527 EXPECT_TRUE(test_stream->stop_stream_);
565 528
566 // Now close it and test that everything was released. 529 // Now close it and test that everything was released.
567 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) 530 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0));
568 .WillOnce(Return(0));
569 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) 531 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle))
570 .WillOnce(Return(kTestDeviceName)); 532 .WillOnce(Return(kTestDeviceName));
571 test_stream->Close(); 533 test_stream->Close();
572 } 534 }
573 535
574 TEST_F(AlsaPcmOutputStreamTest, WritePacket_StopStream) { 536 TEST_F(AlsaPcmOutputStreamTest, WritePacket_StopStream) {
575 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); 537 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout);
576 InitBuffer(test_stream); 538 InitBuffer(test_stream);
577 test_stream->TransitionTo(AlsaPcmOutputStream::kIsOpened); 539 test_stream->TransitionTo(AlsaPcmOutputStream::kIsOpened);
578 test_stream->TransitionTo(AlsaPcmOutputStream::kIsPlaying); 540 test_stream->TransitionTo(AlsaPcmOutputStream::kIsPlaying);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
641 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); 603 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout);
642 InitBuffer(test_stream); 604 InitBuffer(test_stream);
643 test_stream->buffer_->Clear(); 605 test_stream->buffer_->Clear();
644 606
645 // If ALSA has underrun then we should assume a delay of zero. 607 // If ALSA has underrun then we should assume a delay of zero.
646 MockAudioSourceCallback mock_callback; 608 MockAudioSourceCallback mock_callback;
647 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) 609 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_))
648 .WillOnce(Return(SND_PCM_STATE_XRUN)); 610 .WillOnce(Return(SND_PCM_STATE_XRUN));
649 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) 611 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_))
650 .WillRepeatedly(Return(0)); // Buffer is full. 612 .WillRepeatedly(Return(0)); // Buffer is full.
651 EXPECT_CALL(mock_callback, 613 EXPECT_CALL(
652 OnMoreData(_, AllOf( 614 mock_callback,
653 Field(&AudioBuffersState::pending_bytes, 0), 615 OnMoreData(_, AllOf(Field(&AudioBuffersState::pending_bytes, 0),
654 Field(&AudioBuffersState::hardware_delay_bytes, 0)))) 616 Field(&AudioBuffersState::hardware_delay_bytes, 0))))
655 .WillOnce(DoAll(ClearBuffer(), Return(kTestFramesPerPacket / 2))); 617 .WillOnce(DoAll(ClearBuffer(), Return(kTestFramesPerPacket / 2)));
656 618
657 bool source_exhausted; 619 bool source_exhausted;
658 test_stream->set_source_callback(&mock_callback); 620 test_stream->set_source_callback(&mock_callback);
659 test_stream->packet_size_ = kTestPacketSize; 621 test_stream->packet_size_ = kTestPacketSize;
660 test_stream->BufferPacket(&source_exhausted); 622 test_stream->BufferPacket(&source_exhausted);
661 623
662 EXPECT_EQ(kTestPacketSize / 2, test_stream->buffer_->forward_bytes()); 624 EXPECT_EQ(kTestPacketSize / 2, test_stream->buffer_->forward_bytes());
663 EXPECT_FALSE(source_exhausted); 625 EXPECT_FALSE(source_exhausted);
664 test_stream->Close(); 626 test_stream->Close();
(...skipping 13 matching lines...) Expand all
678 640
679 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_DeviceSelect) { 641 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_DeviceSelect) {
680 // Try channels from 1 -> 9. and see that we get the more specific surroundXX 642 // Try channels from 1 -> 9. and see that we get the more specific surroundXX
681 // device opened for channels 4-8. For all other channels, the device should 643 // device opened for channels 4-8. For all other channels, the device should
682 // default to |AlsaPcmOutputStream::kDefaultDevice|. We should also not 644 // default to |AlsaPcmOutputStream::kDefaultDevice|. We should also not
683 // downmix any channel in this case because downmixing is only defined for 645 // downmix any channel in this case because downmixing is only defined for
684 // channels 4-8, which we are guaranteeing to work. 646 // channels 4-8, which we are guaranteeing to work.
685 // 647 //
686 // Note that the loop starts at "1", so the first parameter is ignored in 648 // Note that the loop starts at "1", so the first parameter is ignored in
687 // these arrays. 649 // these arrays.
688 const char* kExpectedDeviceName[] = { NULL, 650 const char* kExpectedDeviceName[] = {
brettw 2013/06/24 20:28:00 I fould the old code here much easier to read.
689 AlsaPcmOutputStream::kDefaultDevice, 651 NULL, AlsaPcmOutputStream::kDefaultDevice,
690 AlsaPcmOutputStream::kDefaultDevice, 652 AlsaPcmOutputStream::kDefaultDevice, AlsaPcmOutputStream::kDefaultDevice,
691 AlsaPcmOutputStream::kDefaultDevice, 653 kSurround40, kSurround50, kSurround51, kSurround70, kSurround71,
692 kSurround40, kSurround50, kSurround51, 654 AlsaPcmOutputStream::kDefaultDevice
693 kSurround70, kSurround71, 655 };
694 AlsaPcmOutputStream::kDefaultDevice }; 656 bool kExpectedDownmix[] = {false, false, false, false, false, true, false,
695 bool kExpectedDownmix[] = { false, false, false, false, false, true, 657 false, false, false};
696 false, false, false, false }; 658 ChannelLayout kExpectedLayouts[] = {
697 ChannelLayout kExpectedLayouts[] = { CHANNEL_LAYOUT_NONE, 659 CHANNEL_LAYOUT_NONE, CHANNEL_LAYOUT_MONO, CHANNEL_LAYOUT_STEREO,
698 CHANNEL_LAYOUT_MONO, 660 CHANNEL_LAYOUT_SURROUND, CHANNEL_LAYOUT_4_0, CHANNEL_LAYOUT_5_0,
699 CHANNEL_LAYOUT_STEREO, 661 CHANNEL_LAYOUT_5_1, CHANNEL_LAYOUT_7_0, CHANNEL_LAYOUT_7_1
700 CHANNEL_LAYOUT_SURROUND, 662 };
701 CHANNEL_LAYOUT_4_0,
702 CHANNEL_LAYOUT_5_0,
703 CHANNEL_LAYOUT_5_1,
704 CHANNEL_LAYOUT_7_0,
705 CHANNEL_LAYOUT_7_1 };
706
707 663
708 for (int i = 1; i < 9; ++i) { 664 for (int i = 1; i < 9; ++i) {
709 if (i == 3 || i == 4 || i == 5) // invalid number of channels 665 if (i == 3 || i == 4 || i == 5) // invalid number of channels
710 continue; 666 continue;
711 SCOPED_TRACE(base::StringPrintf("Attempting %d Channel", i)); 667 SCOPED_TRACE(base::StringPrintf("Attempting %d Channel", i));
712 668
713 // Hints will only be grabbed for channel numbers that have non-default 669 // Hints will only be grabbed for channel numbers that have non-default
714 // devices associated with them. 670 // devices associated with them.
715 if (kExpectedDeviceName[i] != AlsaPcmOutputStream::kDefaultDevice) { 671 if (kExpectedDeviceName[i] != AlsaPcmOutputStream::kDefaultDevice) {
716 // The DeviceNameHint and DeviceNameFreeHint need to be paired to avoid a 672 // The DeviceNameHint and DeviceNameFreeHint need to be paired to avoid a
717 // memory leak. 673 // memory leak.
718 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameHint(_, _, _)) 674 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameHint(_, _, _))
719 .WillOnce(DoAll(SetArgumentPointee<2>(&kFakeHints[0]), Return(0))); 675 .WillOnce(DoAll(SetArgumentPointee<2>(&kFakeHints[0]), Return(0)));
720 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameFreeHint(&kFakeHints[0])) 676 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameFreeHint(&kFakeHints[0]))
721 .Times(1); 677 .Times(1);
722 } 678 }
723 679
724 EXPECT_CALL(mock_alsa_wrapper_, 680 EXPECT_CALL(mock_alsa_wrapper_,
725 PcmOpen(_, StrEq(kExpectedDeviceName[i]), _, _)) 681 PcmOpen(_, StrEq(kExpectedDeviceName[i]), _, _))
726 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); 682 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0)));
727 EXPECT_CALL(mock_alsa_wrapper_, 683 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(kFakeHandle, _, _, i, _, _, _))
728 PcmSetParams(kFakeHandle, _, _, i, _, _, _))
729 .WillOnce(Return(0)); 684 .WillOnce(Return(0));
730 685
731 // The parameters are specified by ALSA documentation, and are in constants 686 // The parameters are specified by ALSA documentation, and are in constants
732 // in the implementation files. 687 // in the implementation files.
733 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("IOID"))) 688 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("IOID")))
734 .WillRepeatedly(Invoke(OutputHint)); 689 .WillRepeatedly(Invoke(OutputHint));
735 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("NAME"))) 690 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("NAME")))
736 .WillRepeatedly(Invoke(EchoHint)); 691 .WillRepeatedly(Invoke(EchoHint));
737 692
738 AlsaPcmOutputStream* test_stream = CreateStream(kExpectedLayouts[i]); 693 AlsaPcmOutputStream* test_stream = CreateStream(kExpectedLayouts[i]);
(...skipping 14 matching lines...) Expand all
753 // operations should be as follows. Assume the multi-channel device name is 708 // operations should be as follows. Assume the multi-channel device name is
754 // surround50: 709 // surround50:
755 // 710 //
756 // 1) Try open "surround50" 711 // 1) Try open "surround50"
757 // 2) Try open "plug:surround50". 712 // 2) Try open "plug:surround50".
758 // 3) Try open "default". 713 // 3) Try open "default".
759 // 4) Try open "plug:default". 714 // 4) Try open "plug:default".
760 // 5) Give up trying to open. 715 // 5) Give up trying to open.
761 // 716 //
762 const string first_try = kSurround50; 717 const string first_try = kSurround50;
763 const string second_try = string(AlsaPcmOutputStream::kPlugPrefix) + 718 const string second_try =
764 kSurround50; 719 string(AlsaPcmOutputStream::kPlugPrefix) + kSurround50;
765 const string third_try = AlsaPcmOutputStream::kDefaultDevice; 720 const string third_try = AlsaPcmOutputStream::kDefaultDevice;
766 const string fourth_try = string(AlsaPcmOutputStream::kPlugPrefix) + 721 const string fourth_try = string(AlsaPcmOutputStream::kPlugPrefix) +
767 AlsaPcmOutputStream::kDefaultDevice; 722 AlsaPcmOutputStream::kDefaultDevice;
768 723
769 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameHint(_, _, _)) 724 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameHint(_, _, _))
770 .WillOnce(DoAll(SetArgumentPointee<2>(&kFakeHints[0]), Return(0))); 725 .WillOnce(DoAll(SetArgumentPointee<2>(&kFakeHints[0]), Return(0)));
771 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameFreeHint(&kFakeHints[0])) 726 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameFreeHint(&kFakeHints[0])).Times(1);
772 .Times(1);
773 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("IOID"))) 727 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("IOID")))
774 .WillRepeatedly(Invoke(OutputHint)); 728 .WillRepeatedly(Invoke(OutputHint));
775 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("NAME"))) 729 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("NAME")))
776 .WillRepeatedly(Invoke(EchoHint)); 730 .WillRepeatedly(Invoke(EchoHint));
777 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) 731 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno))
778 .WillRepeatedly(Return(kDummyMessage)); 732 .WillRepeatedly(Return(kDummyMessage));
779 733
780 InSequence s; 734 InSequence s;
781 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(first_try.c_str()), _, _)) 735 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(first_try.c_str()), _, _))
782 .WillOnce(Return(kTestFailedErrno)); 736 .WillOnce(Return(kTestFailedErrno));
(...skipping 10 matching lines...) Expand all
793 } 747 }
794 748
795 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_HintFail) { 749 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_HintFail) {
796 // Should get |kDefaultDevice|, and force a 2-channel downmix on a failure to 750 // Should get |kDefaultDevice|, and force a 2-channel downmix on a failure to
797 // enumerate devices. 751 // enumerate devices.
798 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameHint(_, _, _)) 752 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameHint(_, _, _))
799 .WillRepeatedly(Return(kTestFailedErrno)); 753 .WillRepeatedly(Return(kTestFailedErrno));
800 EXPECT_CALL(mock_alsa_wrapper_, 754 EXPECT_CALL(mock_alsa_wrapper_,
801 PcmOpen(_, StrEq(AlsaPcmOutputStream::kDefaultDevice), _, _)) 755 PcmOpen(_, StrEq(AlsaPcmOutputStream::kDefaultDevice), _, _))
802 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); 756 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0)));
803 EXPECT_CALL(mock_alsa_wrapper_, 757 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(kFakeHandle, _, _, 2, _, _, _))
804 PcmSetParams(kFakeHandle, _, _, 2, _, _, _))
805 .WillOnce(Return(0)); 758 .WillOnce(Return(0));
806 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) 759 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno))
807 .WillOnce(Return(kDummyMessage)); 760 .WillOnce(Return(kDummyMessage));
808 761
809 AlsaPcmOutputStream* test_stream = CreateStream(CHANNEL_LAYOUT_5_0); 762 AlsaPcmOutputStream* test_stream = CreateStream(CHANNEL_LAYOUT_5_0);
810 EXPECT_TRUE(test_stream->AutoSelectDevice(5)); 763 EXPECT_TRUE(test_stream->AutoSelectDevice(5));
811 EXPECT_TRUE(test_stream->channel_mixer_); 764 EXPECT_TRUE(test_stream->channel_mixer_);
812 test_stream->Close(); 765 test_stream->Close();
813 } 766 }
814 767
815 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_StopStream) { 768 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_StopStream) {
816 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); 769 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout);
817 InitBuffer(test_stream); 770 InitBuffer(test_stream);
818 test_stream->stop_stream_ = true; 771 test_stream->stop_stream_ = true;
819 bool source_exhausted; 772 bool source_exhausted;
820 test_stream->BufferPacket(&source_exhausted); 773 test_stream->BufferPacket(&source_exhausted);
821 EXPECT_EQ(0, test_stream->buffer_->forward_bytes()); 774 EXPECT_EQ(0, test_stream->buffer_->forward_bytes());
822 EXPECT_TRUE(source_exhausted); 775 EXPECT_TRUE(source_exhausted);
823 test_stream->Close(); 776 test_stream->Close();
824 } 777 }
825 778
826 TEST_F(AlsaPcmOutputStreamTest, ScheduleNextWrite) { 779 TEST_F(AlsaPcmOutputStreamTest, ScheduleNextWrite) {
827 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout); 780 AlsaPcmOutputStream* test_stream = CreateStream(kTestChannelLayout);
828 test_stream->TransitionTo(AlsaPcmOutputStream::kIsOpened); 781 test_stream->TransitionTo(AlsaPcmOutputStream::kIsOpened);
829 test_stream->TransitionTo(AlsaPcmOutputStream::kIsPlaying); 782 test_stream->TransitionTo(AlsaPcmOutputStream::kIsPlaying);
830 InitBuffer(test_stream); 783 InitBuffer(test_stream);
831 DVLOG(1) << test_stream->state(); 784 DVLOG(1) << test_stream->state();
832 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) 785 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)).WillOnce(Return(10));
833 .WillOnce(Return(10));
834 test_stream->ScheduleNextWrite(false); 786 test_stream->ScheduleNextWrite(false);
835 DVLOG(1) << test_stream->state(); 787 DVLOG(1) << test_stream->state();
836 // TODO(sergeyu): Figure out how to check that the task has been added to the 788 // TODO(sergeyu): Figure out how to check that the task has been added to the
837 // message loop. 789 // message loop.
838 790
839 // Cleanup the message queue. Currently ~MessageQueue() doesn't free pending 791 // Cleanup the message queue. Currently ~MessageQueue() doesn't free pending
840 // tasks unless running on valgrind. The code below is needed to keep 792 // tasks unless running on valgrind. The code below is needed to keep
841 // heapcheck happy. 793 // heapcheck happy.
842 794
843 test_stream->stop_stream_ = true; 795 test_stream->stop_stream_ = true;
(...skipping 15 matching lines...) Expand all
859 811
860 // TODO(ajwong): Find a way to test whether or not another task has been 812 // TODO(ajwong): Find a way to test whether or not another task has been
861 // posted so we can verify that the Alsa code will indeed break the task 813 // posted so we can verify that the Alsa code will indeed break the task
862 // posting loop. 814 // posting loop.
863 815
864 test_stream->TransitionTo(AlsaPcmOutputStream::kIsClosed); 816 test_stream->TransitionTo(AlsaPcmOutputStream::kIsClosed);
865 test_stream->Close(); 817 test_stream->Close();
866 } 818 }
867 819
868 } // namespace media 820 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698