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

Side by Side Diff: media/audio/audio_output_proxy_unittest.cc

Issue 15979015: Reland 15721002: Hook up the device selection to the WebAudio live audio (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixed the comments. 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <string> 5 #include <string>
6 6
7 #include "base/message_loop.h" 7 #include "base/message_loop.h"
8 #include "base/message_loop_proxy.h" 8 #include "base/message_loop_proxy.h"
9 #include "media/audio/audio_output_dispatcher_impl.h" 9 #include "media/audio/audio_output_dispatcher_impl.h"
10 #include "media/audio/audio_output_proxy.h" 10 #include "media/audio/audio_output_proxy.h"
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 class MockAudioManager : public AudioManagerBase { 88 class MockAudioManager : public AudioManagerBase {
89 public: 89 public:
90 MockAudioManager() {} 90 MockAudioManager() {}
91 virtual ~MockAudioManager() { 91 virtual ~MockAudioManager() {
92 Shutdown(); 92 Shutdown();
93 } 93 }
94 94
95 MOCK_METHOD0(HasAudioOutputDevices, bool()); 95 MOCK_METHOD0(HasAudioOutputDevices, bool());
96 MOCK_METHOD0(HasAudioInputDevices, bool()); 96 MOCK_METHOD0(HasAudioInputDevices, bool());
97 MOCK_METHOD0(GetAudioInputDeviceModel, string16()); 97 MOCK_METHOD0(GetAudioInputDeviceModel, string16());
98 MOCK_METHOD1(MakeAudioOutputStream, AudioOutputStream*( 98 MOCK_METHOD2(MakeAudioOutputStream, AudioOutputStream*(
99 const AudioParameters& params)); 99 const AudioParameters& params, const std::string& input_device_id));
100 MOCK_METHOD1(MakeAudioOutputStreamProxy, AudioOutputStream*( 100 MOCK_METHOD2(MakeAudioOutputStreamProxy, AudioOutputStream*(
101 const AudioParameters& params)); 101 const AudioParameters& params, const std::string& input_device_id));
102 MOCK_METHOD2(MakeAudioInputStream, AudioInputStream*( 102 MOCK_METHOD2(MakeAudioInputStream, AudioInputStream*(
103 const AudioParameters& params, const std::string& device_id)); 103 const AudioParameters& params, const std::string& device_id));
104 MOCK_METHOD0(ShowAudioInputSettings, void()); 104 MOCK_METHOD0(ShowAudioInputSettings, void());
105 MOCK_METHOD0(GetMessageLoop, scoped_refptr<base::MessageLoopProxy>()); 105 MOCK_METHOD0(GetMessageLoop, scoped_refptr<base::MessageLoopProxy>());
106 MOCK_METHOD1(GetAudioInputDeviceNames, void( 106 MOCK_METHOD1(GetAudioInputDeviceNames, void(
107 media::AudioDeviceNames* device_name)); 107 media::AudioDeviceNames* device_name));
108 MOCK_METHOD0(IsRecordingInProcess, bool()); 108 MOCK_METHOD0(IsRecordingInProcess, bool());
109 109
110 MOCK_METHOD1(MakeLinearOutputStream, AudioOutputStream*( 110 MOCK_METHOD1(MakeLinearOutputStream, AudioOutputStream*(
111 const AudioParameters& params)); 111 const AudioParameters& params));
112 MOCK_METHOD1(MakeLowLatencyOutputStream, AudioOutputStream*( 112 MOCK_METHOD2(MakeLowLatencyOutputStream, AudioOutputStream*(
113 const AudioParameters& params)); 113 const AudioParameters& params, const std::string& input_device_id));
114 MOCK_METHOD2(MakeLinearInputStream, AudioInputStream*( 114 MOCK_METHOD2(MakeLinearInputStream, AudioInputStream*(
115 const AudioParameters& params, const std::string& device_id)); 115 const AudioParameters& params, const std::string& device_id));
116 MOCK_METHOD2(MakeLowLatencyInputStream, AudioInputStream*( 116 MOCK_METHOD2(MakeLowLatencyInputStream, AudioInputStream*(
117 const AudioParameters& params, const std::string& device_id)); 117 const AudioParameters& params, const std::string& device_id));
118 MOCK_METHOD1(GetPreferredOutputStreamParameters, AudioParameters( 118 MOCK_METHOD1(GetPreferredOutputStreamParameters, AudioParameters(
119 const AudioParameters& params)); 119 const AudioParameters& params));
120 }; 120 };
121 121
122 class MockAudioSourceCallback : public AudioOutputStream::AudioSourceCallback { 122 class MockAudioSourceCallback : public AudioOutputStream::AudioSourceCallback {
123 public: 123 public:
(...skipping 30 matching lines...) Expand all
154 } 154 }
155 155
156 virtual void InitDispatcher(base::TimeDelta close_delay) { 156 virtual void InitDispatcher(base::TimeDelta close_delay) {
157 // Use a low sample rate and large buffer size when testing otherwise the 157 // Use a low sample rate and large buffer size when testing otherwise the
158 // FakeAudioOutputStream will keep the message loop busy indefinitely; i.e., 158 // FakeAudioOutputStream will keep the message loop busy indefinitely; i.e.,
159 // RunUntilIdle() will never terminate. 159 // RunUntilIdle() will never terminate.
160 params_ = AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, 160 params_ = AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
161 CHANNEL_LAYOUT_STEREO, 8000, 16, 2048); 161 CHANNEL_LAYOUT_STEREO, 8000, 16, 2048);
162 dispatcher_impl_ = new AudioOutputDispatcherImpl(&manager(), 162 dispatcher_impl_ = new AudioOutputDispatcherImpl(&manager(),
163 params_, 163 params_,
164 std::string(),
164 close_delay); 165 close_delay);
165 166
166 // Necessary to know how long the dispatcher will wait before posting 167 // Necessary to know how long the dispatcher will wait before posting
167 // StopStreamTask. 168 // StopStreamTask.
168 pause_delay_ = dispatcher_impl_->pause_delay_; 169 pause_delay_ = dispatcher_impl_->pause_delay_;
169 } 170 }
170 171
171 virtual void OnStart() {} 172 virtual void OnStart() {}
172 173
173 MockAudioManager& manager() { 174 MockAudioManager& manager() {
174 return manager_; 175 return manager_;
175 } 176 }
176 177
177 // Wait for the close timer to fire. 178 // Wait for the close timer to fire.
178 void WaitForCloseTimer(const int timer_delay_ms) { 179 void WaitForCloseTimer(const int timer_delay_ms) {
179 message_loop_.RunUntilIdle(); // OpenTask() may reset the timer. 180 message_loop_.RunUntilIdle(); // OpenTask() may reset the timer.
180 base::PlatformThread::Sleep( 181 base::PlatformThread::Sleep(
181 base::TimeDelta::FromMilliseconds(timer_delay_ms) * 2); 182 base::TimeDelta::FromMilliseconds(timer_delay_ms) * 2);
182 message_loop_.RunUntilIdle(); 183 message_loop_.RunUntilIdle();
183 } 184 }
184 185
185 // Methods that do actual tests. 186 // Methods that do actual tests.
186 void OpenAndClose(AudioOutputDispatcher* dispatcher) { 187 void OpenAndClose(AudioOutputDispatcher* dispatcher) {
187 MockAudioOutputStream stream(&manager_, params_); 188 MockAudioOutputStream stream(&manager_, params_);
188 189
189 EXPECT_CALL(manager(), MakeAudioOutputStream(_)) 190 EXPECT_CALL(manager(), MakeAudioOutputStream(_, _))
190 .WillOnce(Return(&stream)); 191 .WillOnce(Return(&stream));
191 EXPECT_CALL(stream, Open()) 192 EXPECT_CALL(stream, Open())
192 .WillOnce(Return(true)); 193 .WillOnce(Return(true));
193 EXPECT_CALL(stream, Close()) 194 EXPECT_CALL(stream, Close())
194 .Times(1); 195 .Times(1);
195 196
196 AudioOutputProxy* proxy = new AudioOutputProxy(dispatcher); 197 AudioOutputProxy* proxy = new AudioOutputProxy(dispatcher);
197 EXPECT_TRUE(proxy->Open()); 198 EXPECT_TRUE(proxy->Open());
198 proxy->Close(); 199 proxy->Close();
199 WaitForCloseTimer(kTestCloseDelayMs); 200 WaitForCloseTimer(kTestCloseDelayMs);
200 } 201 }
201 202
202 // Create a stream, and then calls Start() and Stop(). 203 // Create a stream, and then calls Start() and Stop().
203 void StartAndStop(AudioOutputDispatcher* dispatcher) { 204 void StartAndStop(AudioOutputDispatcher* dispatcher) {
204 MockAudioOutputStream stream(&manager_, params_); 205 MockAudioOutputStream stream(&manager_, params_);
205 206
206 EXPECT_CALL(manager(), MakeAudioOutputStream(_)) 207 EXPECT_CALL(manager(), MakeAudioOutputStream(_, _))
207 .WillOnce(Return(&stream)); 208 .WillOnce(Return(&stream));
208 EXPECT_CALL(stream, Open()) 209 EXPECT_CALL(stream, Open())
209 .WillOnce(Return(true)); 210 .WillOnce(Return(true));
210 EXPECT_CALL(stream, SetVolume(_)) 211 EXPECT_CALL(stream, SetVolume(_))
211 .Times(1); 212 .Times(1);
212 EXPECT_CALL(stream, Close()) 213 EXPECT_CALL(stream, Close())
213 .Times(1); 214 .Times(1);
214 215
215 AudioOutputProxy* proxy = new AudioOutputProxy(dispatcher); 216 AudioOutputProxy* proxy = new AudioOutputProxy(dispatcher);
216 EXPECT_TRUE(proxy->Open()); 217 EXPECT_TRUE(proxy->Open());
217 218
218 proxy->Start(&callback_); 219 proxy->Start(&callback_);
219 OnStart(); 220 OnStart();
220 proxy->Stop(); 221 proxy->Stop();
221 222
222 proxy->Close(); 223 proxy->Close();
223 WaitForCloseTimer(kTestCloseDelayMs); 224 WaitForCloseTimer(kTestCloseDelayMs);
224 EXPECT_TRUE(stream.stop_called()); 225 EXPECT_TRUE(stream.stop_called());
225 EXPECT_TRUE(stream.start_called()); 226 EXPECT_TRUE(stream.start_called());
226 } 227 }
227 228
228 // Verify that the stream is closed after Stop is called. 229 // Verify that the stream is closed after Stop is called.
229 void CloseAfterStop(AudioOutputDispatcher* dispatcher) { 230 void CloseAfterStop(AudioOutputDispatcher* dispatcher) {
230 MockAudioOutputStream stream(&manager_, params_); 231 MockAudioOutputStream stream(&manager_, params_);
231 232
232 EXPECT_CALL(manager(), MakeAudioOutputStream(_)) 233 EXPECT_CALL(manager(), MakeAudioOutputStream(_, _))
233 .WillOnce(Return(&stream)); 234 .WillOnce(Return(&stream));
234 EXPECT_CALL(stream, Open()) 235 EXPECT_CALL(stream, Open())
235 .WillOnce(Return(true)); 236 .WillOnce(Return(true));
236 EXPECT_CALL(stream, SetVolume(_)) 237 EXPECT_CALL(stream, SetVolume(_))
237 .Times(1); 238 .Times(1);
238 EXPECT_CALL(stream, Close()) 239 EXPECT_CALL(stream, Close())
239 .Times(1); 240 .Times(1);
240 241
241 AudioOutputProxy* proxy = new AudioOutputProxy(dispatcher); 242 AudioOutputProxy* proxy = new AudioOutputProxy(dispatcher);
242 EXPECT_TRUE(proxy->Open()); 243 EXPECT_TRUE(proxy->Open());
(...skipping 11 matching lines...) Expand all
254 255
255 proxy->Close(); 256 proxy->Close();
256 EXPECT_TRUE(stream.stop_called()); 257 EXPECT_TRUE(stream.stop_called());
257 EXPECT_TRUE(stream.start_called()); 258 EXPECT_TRUE(stream.start_called());
258 } 259 }
259 260
260 // Create two streams, but don't start them. Only one device must be open. 261 // Create two streams, but don't start them. Only one device must be open.
261 void TwoStreams(AudioOutputDispatcher* dispatcher) { 262 void TwoStreams(AudioOutputDispatcher* dispatcher) {
262 MockAudioOutputStream stream(&manager_, params_); 263 MockAudioOutputStream stream(&manager_, params_);
263 264
264 EXPECT_CALL(manager(), MakeAudioOutputStream(_)) 265 EXPECT_CALL(manager(), MakeAudioOutputStream(_, _))
265 .WillOnce(Return(&stream)); 266 .WillOnce(Return(&stream));
266 EXPECT_CALL(stream, Open()) 267 EXPECT_CALL(stream, Open())
267 .WillOnce(Return(true)); 268 .WillOnce(Return(true));
268 EXPECT_CALL(stream, Close()) 269 EXPECT_CALL(stream, Close())
269 .Times(1); 270 .Times(1);
270 271
271 AudioOutputProxy* proxy1 = new AudioOutputProxy(dispatcher); 272 AudioOutputProxy* proxy1 = new AudioOutputProxy(dispatcher);
272 AudioOutputProxy* proxy2 = new AudioOutputProxy(dispatcher); 273 AudioOutputProxy* proxy2 = new AudioOutputProxy(dispatcher);
273 EXPECT_TRUE(proxy1->Open()); 274 EXPECT_TRUE(proxy1->Open());
274 EXPECT_TRUE(proxy2->Open()); 275 EXPECT_TRUE(proxy2->Open());
275 proxy1->Close(); 276 proxy1->Close();
276 proxy2->Close(); 277 proxy2->Close();
277 WaitForCloseTimer(kTestCloseDelayMs); 278 WaitForCloseTimer(kTestCloseDelayMs);
278 EXPECT_FALSE(stream.stop_called()); 279 EXPECT_FALSE(stream.stop_called());
279 EXPECT_FALSE(stream.start_called()); 280 EXPECT_FALSE(stream.start_called());
280 } 281 }
281 282
282 // Open() method failed. 283 // Open() method failed.
283 void OpenFailed(AudioOutputDispatcher* dispatcher) { 284 void OpenFailed(AudioOutputDispatcher* dispatcher) {
284 MockAudioOutputStream stream(&manager_, params_); 285 MockAudioOutputStream stream(&manager_, params_);
285 286
286 EXPECT_CALL(manager(), MakeAudioOutputStream(_)) 287 EXPECT_CALL(manager(), MakeAudioOutputStream(_, _))
287 .WillOnce(Return(&stream)); 288 .WillOnce(Return(&stream));
288 EXPECT_CALL(stream, Open()) 289 EXPECT_CALL(stream, Open())
289 .WillOnce(Return(false)); 290 .WillOnce(Return(false));
290 EXPECT_CALL(stream, Close()) 291 EXPECT_CALL(stream, Close())
291 .Times(1); 292 .Times(1);
292 293
293 AudioOutputProxy* proxy = new AudioOutputProxy(dispatcher); 294 AudioOutputProxy* proxy = new AudioOutputProxy(dispatcher);
294 EXPECT_FALSE(proxy->Open()); 295 EXPECT_FALSE(proxy->Open());
295 proxy->Close(); 296 proxy->Close();
296 WaitForCloseTimer(kTestCloseDelayMs); 297 WaitForCloseTimer(kTestCloseDelayMs);
297 EXPECT_FALSE(stream.stop_called()); 298 EXPECT_FALSE(stream.stop_called());
298 EXPECT_FALSE(stream.start_called()); 299 EXPECT_FALSE(stream.start_called());
299 } 300 }
300 301
301 void CreateAndWait(AudioOutputDispatcher* dispatcher) { 302 void CreateAndWait(AudioOutputDispatcher* dispatcher) {
302 MockAudioOutputStream stream(&manager_, params_); 303 MockAudioOutputStream stream(&manager_, params_);
303 304
304 EXPECT_CALL(manager(), MakeAudioOutputStream(_)) 305 EXPECT_CALL(manager(), MakeAudioOutputStream(_, _))
305 .WillOnce(Return(&stream)); 306 .WillOnce(Return(&stream));
306 EXPECT_CALL(stream, Open()) 307 EXPECT_CALL(stream, Open())
307 .WillOnce(Return(true)); 308 .WillOnce(Return(true));
308 EXPECT_CALL(stream, Close()) 309 EXPECT_CALL(stream, Close())
309 .Times(1); 310 .Times(1);
310 311
311 AudioOutputProxy* proxy = new AudioOutputProxy(dispatcher); 312 AudioOutputProxy* proxy = new AudioOutputProxy(dispatcher);
312 EXPECT_TRUE(proxy->Open()); 313 EXPECT_TRUE(proxy->Open());
313 314
314 // Simulate a delay. 315 // Simulate a delay.
315 base::PlatformThread::Sleep( 316 base::PlatformThread::Sleep(
316 base::TimeDelta::FromMilliseconds(kTestCloseDelayMs) * 2); 317 base::TimeDelta::FromMilliseconds(kTestCloseDelayMs) * 2);
317 message_loop_.RunUntilIdle(); 318 message_loop_.RunUntilIdle();
318 319
319 // Verify expectation before calling Close(). 320 // Verify expectation before calling Close().
320 Mock::VerifyAndClear(&stream); 321 Mock::VerifyAndClear(&stream);
321 322
322 proxy->Close(); 323 proxy->Close();
323 EXPECT_FALSE(stream.stop_called()); 324 EXPECT_FALSE(stream.stop_called());
324 EXPECT_FALSE(stream.start_called()); 325 EXPECT_FALSE(stream.start_called());
325 } 326 }
326 327
327 void TwoStreams_OnePlaying(AudioOutputDispatcher* dispatcher) { 328 void TwoStreams_OnePlaying(AudioOutputDispatcher* dispatcher) {
328 MockAudioOutputStream stream1(&manager_, params_); 329 MockAudioOutputStream stream1(&manager_, params_);
329 MockAudioOutputStream stream2(&manager_, params_); 330 MockAudioOutputStream stream2(&manager_, params_);
330 331
331 EXPECT_CALL(manager(), MakeAudioOutputStream(_)) 332 EXPECT_CALL(manager(), MakeAudioOutputStream(_, _))
332 .WillOnce(Return(&stream1)) 333 .WillOnce(Return(&stream1))
333 .WillOnce(Return(&stream2)); 334 .WillOnce(Return(&stream2));
334 335
335 EXPECT_CALL(stream1, Open()) 336 EXPECT_CALL(stream1, Open())
336 .WillOnce(Return(true)); 337 .WillOnce(Return(true));
337 EXPECT_CALL(stream1, SetVolume(_)) 338 EXPECT_CALL(stream1, SetVolume(_))
338 .Times(1); 339 .Times(1);
339 EXPECT_CALL(stream1, Close()) 340 EXPECT_CALL(stream1, Close())
340 .Times(1); 341 .Times(1);
341 342
(...skipping 17 matching lines...) Expand all
359 EXPECT_TRUE(stream1.stop_called()); 360 EXPECT_TRUE(stream1.stop_called());
360 EXPECT_TRUE(stream1.start_called()); 361 EXPECT_TRUE(stream1.start_called());
361 EXPECT_FALSE(stream2.stop_called()); 362 EXPECT_FALSE(stream2.stop_called());
362 EXPECT_FALSE(stream2.start_called()); 363 EXPECT_FALSE(stream2.start_called());
363 } 364 }
364 365
365 void TwoStreams_BothPlaying(AudioOutputDispatcher* dispatcher) { 366 void TwoStreams_BothPlaying(AudioOutputDispatcher* dispatcher) {
366 MockAudioOutputStream stream1(&manager_, params_); 367 MockAudioOutputStream stream1(&manager_, params_);
367 MockAudioOutputStream stream2(&manager_, params_); 368 MockAudioOutputStream stream2(&manager_, params_);
368 369
369 EXPECT_CALL(manager(), MakeAudioOutputStream(_)) 370 EXPECT_CALL(manager(), MakeAudioOutputStream(_, _))
370 .WillOnce(Return(&stream1)) 371 .WillOnce(Return(&stream1))
371 .WillOnce(Return(&stream2)); 372 .WillOnce(Return(&stream2));
372 373
373 EXPECT_CALL(stream1, Open()) 374 EXPECT_CALL(stream1, Open())
374 .WillOnce(Return(true)); 375 .WillOnce(Return(true));
375 EXPECT_CALL(stream1, SetVolume(_)) 376 EXPECT_CALL(stream1, SetVolume(_))
376 .Times(1); 377 .Times(1);
377 EXPECT_CALL(stream1, Close()) 378 EXPECT_CALL(stream1, Close())
378 .Times(1); 379 .Times(1);
379 380
(...skipping 19 matching lines...) Expand all
399 proxy2->Close(); 400 proxy2->Close();
400 EXPECT_TRUE(stream1.stop_called()); 401 EXPECT_TRUE(stream1.stop_called());
401 EXPECT_TRUE(stream1.start_called()); 402 EXPECT_TRUE(stream1.start_called());
402 EXPECT_TRUE(stream2.stop_called()); 403 EXPECT_TRUE(stream2.stop_called());
403 EXPECT_TRUE(stream2.start_called()); 404 EXPECT_TRUE(stream2.start_called());
404 } 405 }
405 406
406 void StartFailed(AudioOutputDispatcher* dispatcher) { 407 void StartFailed(AudioOutputDispatcher* dispatcher) {
407 MockAudioOutputStream stream(&manager_, params_); 408 MockAudioOutputStream stream(&manager_, params_);
408 409
409 EXPECT_CALL(manager(), MakeAudioOutputStream(_)) 410 EXPECT_CALL(manager(), MakeAudioOutputStream(_, _))
410 .WillOnce(Return(&stream)); 411 .WillOnce(Return(&stream));
411 EXPECT_CALL(stream, Open()) 412 EXPECT_CALL(stream, Open())
412 .WillOnce(Return(true)); 413 .WillOnce(Return(true));
413 EXPECT_CALL(stream, Close()) 414 EXPECT_CALL(stream, Close())
414 .Times(1); 415 .Times(1);
415 416
416 AudioOutputProxy* proxy = new AudioOutputProxy(dispatcher); 417 AudioOutputProxy* proxy = new AudioOutputProxy(dispatcher);
417 EXPECT_TRUE(proxy->Open()); 418 EXPECT_TRUE(proxy->Open());
418 419
419 // Simulate a delay. 420 // Simulate a delay.
420 base::PlatformThread::Sleep( 421 base::PlatformThread::Sleep(
421 base::TimeDelta::FromMilliseconds(kTestCloseDelayMs) * 2); 422 base::TimeDelta::FromMilliseconds(kTestCloseDelayMs) * 2);
422 message_loop_.RunUntilIdle(); 423 message_loop_.RunUntilIdle();
423 424
424 // Verify expectation before calling Close(). 425 // Verify expectation before calling Close().
425 Mock::VerifyAndClear(&stream); 426 Mock::VerifyAndClear(&stream);
426 427
427 // |stream| is closed at this point. Start() should reopen it again. 428 // |stream| is closed at this point. Start() should reopen it again.
428 EXPECT_CALL(manager(), MakeAudioOutputStream(_)) 429 EXPECT_CALL(manager(), MakeAudioOutputStream(_, _))
429 .Times(2) 430 .Times(2)
430 .WillRepeatedly(Return(reinterpret_cast<AudioOutputStream*>(NULL))); 431 .WillRepeatedly(Return(reinterpret_cast<AudioOutputStream*>(NULL)));
431 432
432 EXPECT_CALL(callback_, OnError(_)) 433 EXPECT_CALL(callback_, OnError(_))
433 .Times(2); 434 .Times(2);
434 435
435 proxy->Start(&callback_); 436 proxy->Start(&callback_);
436 437
437 // Double Start() in the error case should be allowed since it's possible a 438 // Double Start() in the error case should be allowed since it's possible a
438 // callback may not have had time to process the OnError() in between. 439 // callback may not have had time to process the OnError() in between.
(...skipping 21 matching lines...) Expand all
460 461
461 virtual void InitDispatcher(base::TimeDelta close_delay) OVERRIDE { 462 virtual void InitDispatcher(base::TimeDelta close_delay) OVERRIDE {
462 AudioOutputProxyTest::InitDispatcher(close_delay); 463 AudioOutputProxyTest::InitDispatcher(close_delay);
463 // Use a low sample rate and large buffer size when testing otherwise the 464 // Use a low sample rate and large buffer size when testing otherwise the
464 // FakeAudioOutputStream will keep the message loop busy indefinitely; i.e., 465 // FakeAudioOutputStream will keep the message loop busy indefinitely; i.e.,
465 // RunUntilIdle() will never terminate. 466 // RunUntilIdle() will never terminate.
466 resampler_params_ = AudioParameters( 467 resampler_params_ = AudioParameters(
467 AudioParameters::AUDIO_PCM_LOW_LATENCY, CHANNEL_LAYOUT_STEREO, 468 AudioParameters::AUDIO_PCM_LOW_LATENCY, CHANNEL_LAYOUT_STEREO,
468 16000, 16, 1024); 469 16000, 16, 1024);
469 resampler_ = new AudioOutputResampler( 470 resampler_ = new AudioOutputResampler(
470 &manager(), params_, resampler_params_, close_delay); 471 &manager(), params_, resampler_params_, std::string(), close_delay);
471 } 472 }
472 473
473 virtual void OnStart() OVERRIDE { 474 virtual void OnStart() OVERRIDE {
474 // Let start run for a bit. 475 // Let start run for a bit.
475 message_loop_.RunUntilIdle(); 476 message_loop_.RunUntilIdle();
476 base::PlatformThread::Sleep( 477 base::PlatformThread::Sleep(
477 base::TimeDelta::FromMilliseconds(kStartRunTimeMs)); 478 base::TimeDelta::FromMilliseconds(kStartRunTimeMs));
478 } 479 }
479 480
480 protected: 481 protected:
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 TEST_F(AudioOutputProxyTest, StartFailed) { 562 TEST_F(AudioOutputProxyTest, StartFailed) {
562 StartFailed(dispatcher_impl_.get()); 563 StartFailed(dispatcher_impl_.get());
563 } 564 }
564 565
565 TEST_F(AudioOutputResamplerTest, StartFailed) { StartFailed(resampler_.get()); } 566 TEST_F(AudioOutputResamplerTest, StartFailed) { StartFailed(resampler_.get()); }
566 567
567 // Simulate AudioOutputStream::Create() failure with a low latency stream and 568 // Simulate AudioOutputStream::Create() failure with a low latency stream and
568 // ensure AudioOutputResampler falls back to the high latency path. 569 // ensure AudioOutputResampler falls back to the high latency path.
569 TEST_F(AudioOutputResamplerTest, LowLatencyCreateFailedFallback) { 570 TEST_F(AudioOutputResamplerTest, LowLatencyCreateFailedFallback) {
570 MockAudioOutputStream stream(&manager_, params_); 571 MockAudioOutputStream stream(&manager_, params_);
571 EXPECT_CALL(manager(), MakeAudioOutputStream(_)) 572 EXPECT_CALL(manager(), MakeAudioOutputStream(_, _))
572 .Times(2) 573 .Times(2)
573 .WillOnce(Return(static_cast<AudioOutputStream*>(NULL))) 574 .WillOnce(Return(static_cast<AudioOutputStream*>(NULL)))
574 .WillRepeatedly(Return(&stream)); 575 .WillRepeatedly(Return(&stream));
575 EXPECT_CALL(stream, Open()) 576 EXPECT_CALL(stream, Open())
576 .WillOnce(Return(true)); 577 .WillOnce(Return(true));
577 EXPECT_CALL(stream, Close()) 578 EXPECT_CALL(stream, Close())
578 .Times(1); 579 .Times(1);
579 580
580 AudioOutputProxy* proxy = new AudioOutputProxy(resampler_.get()); 581 AudioOutputProxy* proxy = new AudioOutputProxy(resampler_.get());
581 EXPECT_TRUE(proxy->Open()); 582 EXPECT_TRUE(proxy->Open());
582 proxy->Close(); 583 proxy->Close();
583 WaitForCloseTimer(kTestCloseDelayMs); 584 WaitForCloseTimer(kTestCloseDelayMs);
584 } 585 }
585 586
586 // Simulate AudioOutputStream::Open() failure with a low latency stream and 587 // Simulate AudioOutputStream::Open() failure with a low latency stream and
587 // ensure AudioOutputResampler falls back to the high latency path. 588 // ensure AudioOutputResampler falls back to the high latency path.
588 TEST_F(AudioOutputResamplerTest, LowLatencyOpenFailedFallback) { 589 TEST_F(AudioOutputResamplerTest, LowLatencyOpenFailedFallback) {
589 MockAudioOutputStream failed_stream(&manager_, params_); 590 MockAudioOutputStream failed_stream(&manager_, params_);
590 MockAudioOutputStream okay_stream(&manager_, params_); 591 MockAudioOutputStream okay_stream(&manager_, params_);
591 EXPECT_CALL(manager(), MakeAudioOutputStream(_)) 592 EXPECT_CALL(manager(), MakeAudioOutputStream(_, _))
592 .Times(2) 593 .Times(2)
593 .WillOnce(Return(&failed_stream)) 594 .WillOnce(Return(&failed_stream))
594 .WillRepeatedly(Return(&okay_stream)); 595 .WillRepeatedly(Return(&okay_stream));
595 EXPECT_CALL(failed_stream, Open()) 596 EXPECT_CALL(failed_stream, Open())
596 .WillOnce(Return(false)); 597 .WillOnce(Return(false));
597 EXPECT_CALL(failed_stream, Close()) 598 EXPECT_CALL(failed_stream, Close())
598 .Times(1); 599 .Times(1);
599 EXPECT_CALL(okay_stream, Open()) 600 EXPECT_CALL(okay_stream, Open())
600 .WillOnce(Return(true)); 601 .WillOnce(Return(true));
601 EXPECT_CALL(okay_stream, Close()) 602 EXPECT_CALL(okay_stream, Close())
(...skipping 10 matching lines...) Expand all
612 TEST_F(AudioOutputResamplerTest, HighLatencyFallbackFailed) { 613 TEST_F(AudioOutputResamplerTest, HighLatencyFallbackFailed) {
613 MockAudioOutputStream okay_stream(&manager_, params_); 614 MockAudioOutputStream okay_stream(&manager_, params_);
614 615
615 // Only Windows has a high latency output driver that is not the same as the low 616 // Only Windows has a high latency output driver that is not the same as the low
616 // latency path. 617 // latency path.
617 #if defined(OS_WIN) 618 #if defined(OS_WIN)
618 static const int kFallbackCount = 2; 619 static const int kFallbackCount = 2;
619 #else 620 #else
620 static const int kFallbackCount = 1; 621 static const int kFallbackCount = 1;
621 #endif 622 #endif
622 EXPECT_CALL(manager(), MakeAudioOutputStream(_)) 623 EXPECT_CALL(manager(), MakeAudioOutputStream(_, _))
623 .Times(kFallbackCount) 624 .Times(kFallbackCount)
624 .WillRepeatedly(Return(static_cast<AudioOutputStream*>(NULL))); 625 .WillRepeatedly(Return(static_cast<AudioOutputStream*>(NULL)));
625 626
626 // To prevent shared memory issues the sample rate and buffer size should 627 // To prevent shared memory issues the sample rate and buffer size should
627 // match the input stream parameters. 628 // match the input stream parameters.
628 EXPECT_CALL(manager(), MakeAudioOutputStream(AllOf( 629 EXPECT_CALL(manager(), MakeAudioOutputStream(AllOf(
629 testing::Property(&AudioParameters::format, AudioParameters::AUDIO_FAKE), 630 testing::Property(&AudioParameters::format, AudioParameters::AUDIO_FAKE),
630 testing::Property(&AudioParameters::sample_rate, params_.sample_rate()), 631 testing::Property(&AudioParameters::sample_rate, params_.sample_rate()),
631 testing::Property( 632 testing::Property(
632 &AudioParameters::frames_per_buffer, params_.frames_per_buffer())))) 633 &AudioParameters::frames_per_buffer, params_.frames_per_buffer())),
634 _))
633 .Times(1) 635 .Times(1)
634 .WillOnce(Return(&okay_stream)); 636 .WillOnce(Return(&okay_stream));
635 EXPECT_CALL(okay_stream, Open()) 637 EXPECT_CALL(okay_stream, Open())
636 .WillOnce(Return(true)); 638 .WillOnce(Return(true));
637 EXPECT_CALL(okay_stream, Close()) 639 EXPECT_CALL(okay_stream, Close())
638 .Times(1); 640 .Times(1);
639 641
640 AudioOutputProxy* proxy = new AudioOutputProxy(resampler_.get()); 642 AudioOutputProxy* proxy = new AudioOutputProxy(resampler_.get());
641 EXPECT_TRUE(proxy->Open()); 643 EXPECT_TRUE(proxy->Open());
642 proxy->Close(); 644 proxy->Close();
643 WaitForCloseTimer(kTestCloseDelayMs); 645 WaitForCloseTimer(kTestCloseDelayMs);
644 } 646 }
645 647
646 // Simulate failures to open both the low latency, the fallback high latency 648 // Simulate failures to open both the low latency, the fallback high latency
647 // stream, and the fake audio output stream and ensure AudioOutputResampler 649 // stream, and the fake audio output stream and ensure AudioOutputResampler
648 // terminates normally. 650 // terminates normally.
649 TEST_F(AudioOutputResamplerTest, AllFallbackFailed) { 651 TEST_F(AudioOutputResamplerTest, AllFallbackFailed) {
650 // Only Windows has a high latency output driver that is not the same as the low 652 // Only Windows has a high latency output driver that is not the same as the low
651 // latency path. 653 // latency path.
652 #if defined(OS_WIN) 654 #if defined(OS_WIN)
653 static const int kFallbackCount = 3; 655 static const int kFallbackCount = 3;
654 #else 656 #else
655 static const int kFallbackCount = 2; 657 static const int kFallbackCount = 2;
656 #endif 658 #endif
657 EXPECT_CALL(manager(), MakeAudioOutputStream(_)) 659 EXPECT_CALL(manager(), MakeAudioOutputStream(_, _))
658 .Times(kFallbackCount) 660 .Times(kFallbackCount)
659 .WillRepeatedly(Return(static_cast<AudioOutputStream*>(NULL))); 661 .WillRepeatedly(Return(static_cast<AudioOutputStream*>(NULL)));
660 662
661 AudioOutputProxy* proxy = new AudioOutputProxy(resampler_.get()); 663 AudioOutputProxy* proxy = new AudioOutputProxy(resampler_.get());
662 EXPECT_FALSE(proxy->Open()); 664 EXPECT_FALSE(proxy->Open());
663 proxy->Close(); 665 proxy->Close();
664 WaitForCloseTimer(kTestCloseDelayMs); 666 WaitForCloseTimer(kTestCloseDelayMs);
665 } 667 }
666 668
667 // Simulate an eventual OpenStream() failure; i.e. successful OpenStream() calls 669 // Simulate an eventual OpenStream() failure; i.e. successful OpenStream() calls
668 // eventually followed by one which fails; root cause of http://crbug.com/150619 670 // eventually followed by one which fails; root cause of http://crbug.com/150619
669 TEST_F(AudioOutputResamplerTest, LowLatencyOpenEventuallyFails) { 671 TEST_F(AudioOutputResamplerTest, LowLatencyOpenEventuallyFails) {
670 MockAudioOutputStream stream1(&manager_, params_); 672 MockAudioOutputStream stream1(&manager_, params_);
671 MockAudioOutputStream stream2(&manager_, params_); 673 MockAudioOutputStream stream2(&manager_, params_);
672 MockAudioOutputStream stream3(&manager_, params_); 674 MockAudioOutputStream stream3(&manager_, params_);
673 675
674 // Setup the mock such that all three streams are successfully created. 676 // Setup the mock such that all three streams are successfully created.
675 EXPECT_CALL(manager(), MakeAudioOutputStream(_)) 677 EXPECT_CALL(manager(), MakeAudioOutputStream(_, _))
676 .WillOnce(Return(&stream1)) 678 .WillOnce(Return(&stream1))
677 .WillOnce(Return(&stream2)) 679 .WillOnce(Return(&stream2))
678 .WillOnce(Return(&stream3)) 680 .WillOnce(Return(&stream3))
679 .WillRepeatedly(Return(static_cast<AudioOutputStream*>(NULL))); 681 .WillRepeatedly(Return(static_cast<AudioOutputStream*>(NULL)));
680 682
681 // Stream1 should be able to successfully open and start. 683 // Stream1 should be able to successfully open and start.
682 EXPECT_CALL(stream1, Open()) 684 EXPECT_CALL(stream1, Open())
683 .WillOnce(Return(true)); 685 .WillOnce(Return(true));
684 EXPECT_CALL(stream1, Close()) 686 EXPECT_CALL(stream1, Close())
685 .Times(1); 687 .Times(1);
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
731 WaitForCloseTimer(kTestCloseDelayMs); 733 WaitForCloseTimer(kTestCloseDelayMs);
732 EXPECT_TRUE(stream1.stop_called()); 734 EXPECT_TRUE(stream1.stop_called());
733 EXPECT_TRUE(stream1.start_called()); 735 EXPECT_TRUE(stream1.start_called());
734 EXPECT_TRUE(stream2.stop_called()); 736 EXPECT_TRUE(stream2.stop_called());
735 EXPECT_TRUE(stream2.start_called()); 737 EXPECT_TRUE(stream2.start_called());
736 EXPECT_FALSE(stream3.stop_called()); 738 EXPECT_FALSE(stream3.stop_called());
737 EXPECT_FALSE(stream3.start_called()); 739 EXPECT_FALSE(stream3.start_called());
738 } 740 }
739 741
740 } // namespace media 742 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698