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

Side by Side Diff: content/renderer/media/webrtc_audio_device_unittest.cc

Issue 11270012: Adding audio support to the new webmediaplyer (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebased and fixed some comments in rtc_audio_renderer.h Created 8 years, 1 month 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 "base/environment.h" 5 #include "base/environment.h"
6 #include "base/test/test_timeouts.h" 6 #include "base/test/test_timeouts.h"
7 #include "content/renderer/media/audio_hardware.h" 7 #include "content/renderer/media/audio_hardware.h"
8 #include "content/renderer/media/webrtc_audio_device_impl.h" 8 #include "content/renderer/media/webrtc_audio_device_impl.h"
9 #include "content/renderer/media/webrtc_audio_renderer.h"
9 #include "content/test/webrtc_audio_device_test.h" 10 #include "content/test/webrtc_audio_device_test.h"
10 #include "media/audio/audio_manager.h" 11 #include "media/audio/audio_manager.h"
11 #include "media/audio/audio_util.h" 12 #include "media/audio/audio_util.h"
12 #include "testing/gmock/include/gmock/gmock.h" 13 #include "testing/gmock/include/gmock/gmock.h"
13 #include "third_party/webrtc/voice_engine/include/voe_audio_processing.h" 14 #include "third_party/webrtc/voice_engine/include/voe_audio_processing.h"
14 #include "third_party/webrtc/voice_engine/include/voe_base.h" 15 #include "third_party/webrtc/voice_engine/include/voe_base.h"
15 #include "third_party/webrtc/voice_engine/include/voe_external_media.h" 16 #include "third_party/webrtc/voice_engine/include/voe_external_media.h"
16 #include "third_party/webrtc/voice_engine/include/voe_file.h" 17 #include "third_party/webrtc/voice_engine/include/voe_file.h"
17 #include "third_party/webrtc/voice_engine/include/voe_network.h" 18 #include "third_party/webrtc/voice_engine/include/voe_network.h"
18 19
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 EXPECT_FALSE(FindElementInArray(valid_rates, arraysize(valid_rates), 217 EXPECT_FALSE(FindElementInArray(valid_rates, arraysize(valid_rates),
217 invalid_rates[i])); 218 invalid_rates[i]));
218 } 219 }
219 } 220 }
220 221
221 // Basic test that instantiates and initializes an instance of 222 // Basic test that instantiates and initializes an instance of
222 // WebRtcAudioDeviceImpl. 223 // WebRtcAudioDeviceImpl.
223 TEST_F(WebRTCAudioDeviceTest, Construct) { 224 TEST_F(WebRTCAudioDeviceTest, Construct) {
224 AudioUtilNoHardware audio_util(48000, 48000, media::CHANNEL_LAYOUT_MONO); 225 AudioUtilNoHardware audio_util(48000, 48000, media::CHANNEL_LAYOUT_MONO);
225 SetAudioUtilCallback(&audio_util); 226 SetAudioUtilCallback(&audio_util);
227
226 scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device( 228 scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device(
227 new WebRtcAudioDeviceImpl()); 229 new WebRtcAudioDeviceImpl());
228
229 webrtc_audio_device->SetSessionId(1); 230 webrtc_audio_device->SetSessionId(1);
230 231
231 WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create()); 232 WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create());
232 ASSERT_TRUE(engine.valid()); 233 ASSERT_TRUE(engine.valid());
233 234
234 ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get()); 235 ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get());
235 int err = base->Init(webrtc_audio_device); 236 int err = base->Init(webrtc_audio_device);
236 EXPECT_EQ(0, err); 237 EXPECT_EQ(0, err);
237 EXPECT_EQ(0, base->Terminate()); 238 EXPECT_EQ(0, base->Terminate());
238 } 239 }
(...skipping 18 matching lines...) Expand all
257 258
258 EXPECT_CALL(media_observer(), 259 EXPECT_CALL(media_observer(),
259 OnSetAudioStreamStatus(_, 1, StrEq("created"))).Times(1); 260 OnSetAudioStreamStatus(_, 1, StrEq("created"))).Times(1);
260 EXPECT_CALL(media_observer(), 261 EXPECT_CALL(media_observer(),
261 OnSetAudioStreamPlaying(_, 1, true)).Times(1); 262 OnSetAudioStreamPlaying(_, 1, true)).Times(1);
262 EXPECT_CALL(media_observer(), 263 EXPECT_CALL(media_observer(),
263 OnSetAudioStreamStatus(_, 1, StrEq("closed"))).Times(1); 264 OnSetAudioStreamStatus(_, 1, StrEq("closed"))).Times(1);
264 EXPECT_CALL(media_observer(), 265 EXPECT_CALL(media_observer(),
265 OnDeleteAudioStream(_, 1)).Times(AnyNumber()); 266 OnDeleteAudioStream(_, 1)).Times(AnyNumber());
266 267
268 scoped_refptr<WebRtcAudioRenderer> renderer = new WebRtcAudioRenderer();
scherkus (not reviewing) 2012/10/25 17:47:39 remove extra space after =
no longer working on chromium 2012/10/26 09:35:29 Done.
267 scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device( 269 scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device(
268 new WebRtcAudioDeviceImpl()); 270 new WebRtcAudioDeviceImpl());
269 webrtc_audio_device->SetSessionId(1); 271 webrtc_audio_device->SetSessionId(1);
272 EXPECT_TRUE(webrtc_audio_device->SetRenderer(renderer));
273
270 WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create()); 274 WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create());
271 ASSERT_TRUE(engine.valid()); 275 ASSERT_TRUE(engine.valid());
272 276
273 ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get()); 277 ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get());
274 ASSERT_TRUE(base.valid()); 278 ASSERT_TRUE(base.valid());
275 int err = base->Init(webrtc_audio_device); 279 int err = base->Init(webrtc_audio_device);
276 ASSERT_EQ(0, err); 280 ASSERT_EQ(0, err);
277 281
278 int ch = base->CreateChannel(); 282 int ch = base->CreateChannel();
279 EXPECT_NE(-1, ch); 283 EXPECT_NE(-1, ch);
280 284
281 ScopedWebRTCPtr<webrtc::VoEExternalMedia> external_media(engine.get()); 285 ScopedWebRTCPtr<webrtc::VoEExternalMedia> external_media(engine.get());
282 ASSERT_TRUE(external_media.valid()); 286 ASSERT_TRUE(external_media.valid());
283 287
284 base::WaitableEvent event(false, false); 288 base::WaitableEvent event(false, false);
285 scoped_ptr<WebRTCMediaProcessImpl> media_process( 289 scoped_ptr<WebRTCMediaProcessImpl> media_process(
286 new WebRTCMediaProcessImpl(&event)); 290 new WebRTCMediaProcessImpl(&event));
287 EXPECT_EQ(0, external_media->RegisterExternalMediaProcessing( 291 EXPECT_EQ(0, external_media->RegisterExternalMediaProcessing(
288 ch, webrtc::kPlaybackPerChannel, *media_process.get())); 292 ch, webrtc::kPlaybackPerChannel, *media_process.get()));
289 293
290 EXPECT_EQ(0, base->StartPlayout(ch)); 294 EXPECT_EQ(0, base->StartPlayout(ch));
295 renderer->Play();
291 296
292 EXPECT_TRUE(event.TimedWait(TestTimeouts::action_timeout())); 297 EXPECT_TRUE(event.TimedWait(TestTimeouts::action_timeout()));
293 WaitForIOThreadCompletion(); 298 WaitForIOThreadCompletion();
294 299
295 EXPECT_TRUE(webrtc_audio_device->playing()); 300 EXPECT_TRUE(webrtc_audio_device->playing());
296 EXPECT_FALSE(webrtc_audio_device->recording()); 301 EXPECT_FALSE(webrtc_audio_device->recording());
297 EXPECT_EQ(ch, media_process->channel_id()); 302 EXPECT_EQ(ch, media_process->channel_id());
298 EXPECT_EQ(webrtc::kPlaybackPerChannel, media_process->type()); 303 EXPECT_EQ(webrtc::kPlaybackPerChannel, media_process->type());
299 EXPECT_EQ(80, media_process->packet_size()); 304 EXPECT_EQ(80, media_process->packet_size());
300 EXPECT_EQ(8000, media_process->sample_rate()); 305 EXPECT_EQ(8000, media_process->sample_rate());
301 306
302 EXPECT_EQ(0, external_media->DeRegisterExternalMediaProcessing( 307 EXPECT_EQ(0, external_media->DeRegisterExternalMediaProcessing(
303 ch, webrtc::kPlaybackPerChannel)); 308 ch, webrtc::kPlaybackPerChannel));
304 EXPECT_EQ(0, base->StopPlayout(ch)); 309 EXPECT_EQ(0, base->StopPlayout(ch));
310 renderer->Stop();
305 311
306 EXPECT_EQ(0, base->DeleteChannel(ch)); 312 EXPECT_EQ(0, base->DeleteChannel(ch));
307 EXPECT_EQ(0, base->Terminate()); 313 EXPECT_EQ(0, base->Terminate());
308 } 314 }
309 315
310 // Verify that a call to webrtc::VoEBase::StartRecording() starts audio input 316 // Verify that a call to webrtc::VoEBase::StartRecording() starts audio input
311 // with the correct set of parameters. A WebRtcAudioDeviceImpl instance will 317 // with the correct set of parameters. A WebRtcAudioDeviceImpl instance will
312 // be utilized to implement the actual audio path. The test registers a 318 // be utilized to implement the actual audio path. The test registers a
313 // webrtc::VoEExternalMedia implementation to hijack the input audio and 319 // webrtc::VoEExternalMedia implementation to hijack the input audio and
314 // verify that streaming starts correctly. An external transport implementation 320 // verify that streaming starts correctly. An external transport implementation
315 // is also required to ensure that "sending" can start without actually trying 321 // is also required to ensure that "sending" can start without actually trying
316 // to send encoded packets to the network. Our main interest here is to ensure 322 // to send encoded packets to the network. Our main interest here is to ensure
317 // that the audio capturing starts as it should. 323 // that the audio capturing starts as it should.
318 // Disabled when running headless since the bots don't have the required config. 324 // Disabled when running headless since the bots don't have the required config.
319 TEST_F(WebRTCAudioDeviceTest, StartRecording) { 325 TEST_F(WebRTCAudioDeviceTest, StartRecording) {
320 if (!has_input_devices_ || !has_output_devices_) { 326 if (!has_input_devices_ || !has_output_devices_) {
321 LOG(WARNING) << "Missing audio devices."; 327 LOG(WARNING) << "Missing audio devices.";
322 return; 328 return;
323 } 329 }
324 330
325 AudioUtil audio_util; 331 AudioUtil audio_util;
326 SetAudioUtilCallback(&audio_util); 332 SetAudioUtilCallback(&audio_util);
327 333
328 if (!HardwareSampleRatesAreValid()) 334 if (!HardwareSampleRatesAreValid())
329 return; 335 return;
330 336
331 // TODO(tommi): extend MediaObserver and MockMediaObserver with support 337 // TODO(tommi): extend MediaObserver and MockMediaObserver with support
332 // for new interfaces, like OnSetAudioStreamRecording(). When done, add 338 // for new interfaces, like OnSetAudioStreamRecording(). When done, add
333 // EXPECT_CALL() macros here. 339 // EXPECT_CALL() macros here.
334
335 scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device( 340 scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device(
336 new WebRtcAudioDeviceImpl()); 341 new WebRtcAudioDeviceImpl());
337 webrtc_audio_device->SetSessionId(1); 342 webrtc_audio_device->SetSessionId(1);
343
scherkus (not reviewing) 2012/10/25 17:47:39 remove extra blank line
no longer working on chromium 2012/10/26 09:35:29 Done.
344
338 WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create()); 345 WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create());
339 ASSERT_TRUE(engine.valid()); 346 ASSERT_TRUE(engine.valid());
340 347
341 ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get()); 348 ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get());
342 ASSERT_TRUE(base.valid()); 349 ASSERT_TRUE(base.valid());
343 int err = base->Init(webrtc_audio_device); 350 int err = base->Init(webrtc_audio_device);
344 ASSERT_EQ(0, err); 351 ASSERT_EQ(0, err);
345 352
346 int ch = base->CreateChannel(); 353 int ch = base->CreateChannel();
347 EXPECT_NE(-1, ch); 354 EXPECT_NE(-1, ch);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
401 408
402 EXPECT_CALL(media_observer(), 409 EXPECT_CALL(media_observer(),
403 OnSetAudioStreamStatus(_, 1, StrEq("created"))).Times(1); 410 OnSetAudioStreamStatus(_, 1, StrEq("created"))).Times(1);
404 EXPECT_CALL(media_observer(), 411 EXPECT_CALL(media_observer(),
405 OnSetAudioStreamPlaying(_, 1, true)).Times(1); 412 OnSetAudioStreamPlaying(_, 1, true)).Times(1);
406 EXPECT_CALL(media_observer(), 413 EXPECT_CALL(media_observer(),
407 OnSetAudioStreamStatus(_, 1, StrEq("closed"))).Times(1); 414 OnSetAudioStreamStatus(_, 1, StrEq("closed"))).Times(1);
408 EXPECT_CALL(media_observer(), 415 EXPECT_CALL(media_observer(),
409 OnDeleteAudioStream(_, 1)).Times(AnyNumber()); 416 OnDeleteAudioStream(_, 1)).Times(AnyNumber());
410 417
418 scoped_refptr<WebRtcAudioRenderer> renderer = new WebRtcAudioRenderer();
419
411 scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device( 420 scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device(
412 new WebRtcAudioDeviceImpl()); 421 new WebRtcAudioDeviceImpl());
413 webrtc_audio_device->SetSessionId(1); 422 webrtc_audio_device->SetSessionId(1);
423 EXPECT_TRUE(webrtc_audio_device->SetRenderer(renderer));
414 424
415 WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create()); 425 WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create());
416 ASSERT_TRUE(engine.valid()); 426 ASSERT_TRUE(engine.valid());
417 427
418 ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get()); 428 ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get());
419 ASSERT_TRUE(base.valid()); 429 ASSERT_TRUE(base.valid());
420 int err = base->Init(webrtc_audio_device); 430 int err = base->Init(webrtc_audio_device);
421 ASSERT_EQ(0, err); 431 ASSERT_EQ(0, err);
422 432
423 int ch = base->CreateChannel(); 433 int ch = base->CreateChannel();
424 EXPECT_NE(-1, ch); 434 EXPECT_NE(-1, ch);
425 EXPECT_EQ(0, base->StartPlayout(ch)); 435 EXPECT_EQ(0, base->StartPlayout(ch));
436 renderer->Play();
426 437
427 ScopedWebRTCPtr<webrtc::VoEFile> file(engine.get()); 438 ScopedWebRTCPtr<webrtc::VoEFile> file(engine.get());
428 ASSERT_TRUE(file.valid()); 439 ASSERT_TRUE(file.valid());
429 int duration = 0; 440 int duration = 0;
430 EXPECT_EQ(0, file->GetFileDuration(file_path.c_str(), duration, 441 EXPECT_EQ(0, file->GetFileDuration(file_path.c_str(), duration,
431 webrtc::kFileFormatPcm16kHzFile)); 442 webrtc::kFileFormatPcm16kHzFile));
432 EXPECT_NE(0, duration); 443 EXPECT_NE(0, duration);
433 444
434 EXPECT_EQ(0, file->StartPlayingFileLocally(ch, file_path.c_str(), false, 445 EXPECT_EQ(0, file->StartPlayingFileLocally(ch, file_path.c_str(), false,
435 webrtc::kFileFormatPcm16kHzFile)); 446 webrtc::kFileFormatPcm16kHzFile));
436 447
437 // Play 2 seconds worth of audio and then quit. 448 // Play 2 seconds worth of audio and then quit.
438 message_loop_.PostDelayedTask(FROM_HERE, 449 message_loop_.PostDelayedTask(FROM_HERE,
439 MessageLoop::QuitClosure(), 450 MessageLoop::QuitClosure(),
440 base::TimeDelta::FromSeconds(2)); 451 base::TimeDelta::FromSeconds(2));
441 message_loop_.Run(); 452 message_loop_.Run();
442 453
443 454
scherkus (not reviewing) 2012/10/25 17:47:39 remove extra blank line
no longer working on chromium 2012/10/26 09:35:29 Done.
455 renderer->Stop();
444 EXPECT_EQ(0, base->StopSend(ch)); 456 EXPECT_EQ(0, base->StopSend(ch));
445 EXPECT_EQ(0, base->StopPlayout(ch)); 457 EXPECT_EQ(0, base->StopPlayout(ch));
446 EXPECT_EQ(0, base->DeleteChannel(ch)); 458 EXPECT_EQ(0, base->DeleteChannel(ch));
447 EXPECT_EQ(0, base->Terminate()); 459 EXPECT_EQ(0, base->Terminate());
448 } 460 }
449 461
450 // Uses WebRtcAudioDeviceImpl to play out recorded audio in loopback. 462 // Uses WebRtcAudioDeviceImpl to play out recorded audio in loopback.
451 // An external transport implementation is utilized to feed back RTP packets 463 // An external transport implementation is utilized to feed back RTP packets
452 // which are recorded, encoded, packetized into RTP packets and finally 464 // which are recorded, encoded, packetized into RTP packets and finally
453 // "transmitted". The RTP packets are then fed back into the VoiceEngine 465 // "transmitted". The RTP packets are then fed back into the VoiceEngine
(...skipping 15 matching lines...) Expand all
469 481
470 EXPECT_CALL(media_observer(), 482 EXPECT_CALL(media_observer(),
471 OnSetAudioStreamStatus(_, 1, StrEq("created"))); 483 OnSetAudioStreamStatus(_, 1, StrEq("created")));
472 EXPECT_CALL(media_observer(), 484 EXPECT_CALL(media_observer(),
473 OnSetAudioStreamPlaying(_, 1, true)); 485 OnSetAudioStreamPlaying(_, 1, true));
474 EXPECT_CALL(media_observer(), 486 EXPECT_CALL(media_observer(),
475 OnSetAudioStreamStatus(_, 1, StrEq("closed"))); 487 OnSetAudioStreamStatus(_, 1, StrEq("closed")));
476 EXPECT_CALL(media_observer(), 488 EXPECT_CALL(media_observer(),
477 OnDeleteAudioStream(_, 1)).Times(AnyNumber()); 489 OnDeleteAudioStream(_, 1)).Times(AnyNumber());
478 490
491 scoped_refptr<WebRtcAudioRenderer> renderer = new WebRtcAudioRenderer();
492
479 scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device( 493 scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device(
480 new WebRtcAudioDeviceImpl()); 494 new WebRtcAudioDeviceImpl());
481 webrtc_audio_device->SetSessionId(1); 495 webrtc_audio_device->SetSessionId(1);
496 EXPECT_TRUE(webrtc_audio_device->SetRenderer(renderer));
497
482 WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create()); 498 WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create());
483 ASSERT_TRUE(engine.valid()); 499 ASSERT_TRUE(engine.valid());
484 500
485 ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get()); 501 ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get());
486 ASSERT_TRUE(base.valid()); 502 ASSERT_TRUE(base.valid());
487 int err = base->Init(webrtc_audio_device); 503 int err = base->Init(webrtc_audio_device);
488 ASSERT_EQ(0, err); 504 ASSERT_EQ(0, err);
489 505
490 ScopedWebRTCPtr<webrtc::VoEAudioProcessing> audio_processing(engine.get()); 506 ScopedWebRTCPtr<webrtc::VoEAudioProcessing> audio_processing(engine.get());
491 ASSERT_TRUE(audio_processing.valid()); 507 ASSERT_TRUE(audio_processing.valid());
492 bool enabled = false; 508 bool enabled = false;
493 webrtc::AgcModes agc_mode = webrtc::kAgcDefault; 509 webrtc::AgcModes agc_mode = webrtc::kAgcDefault;
494 EXPECT_EQ(0, audio_processing->GetAgcStatus(enabled, agc_mode)); 510 EXPECT_EQ(0, audio_processing->GetAgcStatus(enabled, agc_mode));
495 EXPECT_TRUE(enabled); 511 EXPECT_TRUE(enabled);
496 EXPECT_EQ(agc_mode, webrtc::kAgcAdaptiveAnalog); 512 EXPECT_EQ(agc_mode, webrtc::kAgcAdaptiveAnalog);
497 513
498 int ch = base->CreateChannel(); 514 int ch = base->CreateChannel();
499 EXPECT_NE(-1, ch); 515 EXPECT_NE(-1, ch);
500 516
501 ScopedWebRTCPtr<webrtc::VoENetwork> network(engine.get()); 517 ScopedWebRTCPtr<webrtc::VoENetwork> network(engine.get());
502 ASSERT_TRUE(network.valid()); 518 ASSERT_TRUE(network.valid());
503 scoped_ptr<WebRTCTransportImpl> transport( 519 scoped_ptr<WebRTCTransportImpl> transport(
504 new WebRTCTransportImpl(network.get())); 520 new WebRTCTransportImpl(network.get()));
505 EXPECT_EQ(0, network->RegisterExternalTransport(ch, *transport.get())); 521 EXPECT_EQ(0, network->RegisterExternalTransport(ch, *transport.get()));
506 EXPECT_EQ(0, base->StartPlayout(ch)); 522 EXPECT_EQ(0, base->StartPlayout(ch));
507 EXPECT_EQ(0, base->StartSend(ch)); 523 EXPECT_EQ(0, base->StartSend(ch));
524 renderer->Play();
508 525
509 LOG(INFO) << ">> You should now be able to hear yourself in loopback..."; 526 LOG(INFO) << ">> You should now be able to hear yourself in loopback...";
510 message_loop_.PostDelayedTask(FROM_HERE, 527 message_loop_.PostDelayedTask(FROM_HERE,
511 MessageLoop::QuitClosure(), 528 MessageLoop::QuitClosure(),
512 base::TimeDelta::FromSeconds(2)); 529 base::TimeDelta::FromSeconds(2));
513 message_loop_.Run(); 530 message_loop_.Run();
514 531
532 renderer->Stop();
515 EXPECT_EQ(0, base->StopSend(ch)); 533 EXPECT_EQ(0, base->StopSend(ch));
516 EXPECT_EQ(0, base->StopPlayout(ch)); 534 EXPECT_EQ(0, base->StopPlayout(ch));
517 535
518 EXPECT_EQ(0, base->DeleteChannel(ch)); 536 EXPECT_EQ(0, base->DeleteChannel(ch));
519 EXPECT_EQ(0, base->Terminate()); 537 EXPECT_EQ(0, base->Terminate());
520 } 538 }
521 539
522 } // namespace content 540 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698