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

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: addressed the nits from Andrew and fixed the chromeOS testbot error 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();
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
338 WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create()); 344 WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create());
339 ASSERT_TRUE(engine.valid()); 345 ASSERT_TRUE(engine.valid());
340 346
341 ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get()); 347 ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get());
342 ASSERT_TRUE(base.valid()); 348 ASSERT_TRUE(base.valid());
343 int err = base->Init(webrtc_audio_device); 349 int err = base->Init(webrtc_audio_device);
344 ASSERT_EQ(0, err); 350 ASSERT_EQ(0, err);
345 351
346 int ch = base->CreateChannel(); 352 int ch = base->CreateChannel();
347 EXPECT_NE(-1, ch); 353 EXPECT_NE(-1, ch);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
401 407
402 EXPECT_CALL(media_observer(), 408 EXPECT_CALL(media_observer(),
403 OnSetAudioStreamStatus(_, 1, StrEq("created"))).Times(1); 409 OnSetAudioStreamStatus(_, 1, StrEq("created"))).Times(1);
404 EXPECT_CALL(media_observer(), 410 EXPECT_CALL(media_observer(),
405 OnSetAudioStreamPlaying(_, 1, true)).Times(1); 411 OnSetAudioStreamPlaying(_, 1, true)).Times(1);
406 EXPECT_CALL(media_observer(), 412 EXPECT_CALL(media_observer(),
407 OnSetAudioStreamStatus(_, 1, StrEq("closed"))).Times(1); 413 OnSetAudioStreamStatus(_, 1, StrEq("closed"))).Times(1);
408 EXPECT_CALL(media_observer(), 414 EXPECT_CALL(media_observer(),
409 OnDeleteAudioStream(_, 1)).Times(AnyNumber()); 415 OnDeleteAudioStream(_, 1)).Times(AnyNumber());
410 416
417 scoped_refptr<WebRtcAudioRenderer> renderer = new WebRtcAudioRenderer();
418
411 scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device( 419 scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device(
412 new WebRtcAudioDeviceImpl()); 420 new WebRtcAudioDeviceImpl());
413 webrtc_audio_device->SetSessionId(1); 421 webrtc_audio_device->SetSessionId(1);
422 EXPECT_TRUE(webrtc_audio_device->SetRenderer(renderer));
414 423
415 WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create()); 424 WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create());
416 ASSERT_TRUE(engine.valid()); 425 ASSERT_TRUE(engine.valid());
417 426
418 ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get()); 427 ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get());
419 ASSERT_TRUE(base.valid()); 428 ASSERT_TRUE(base.valid());
420 int err = base->Init(webrtc_audio_device); 429 int err = base->Init(webrtc_audio_device);
421 ASSERT_EQ(0, err); 430 ASSERT_EQ(0, err);
422 431
423 int ch = base->CreateChannel(); 432 int ch = base->CreateChannel();
424 EXPECT_NE(-1, ch); 433 EXPECT_NE(-1, ch);
425 EXPECT_EQ(0, base->StartPlayout(ch)); 434 EXPECT_EQ(0, base->StartPlayout(ch));
435 renderer->Play();
426 436
427 ScopedWebRTCPtr<webrtc::VoEFile> file(engine.get()); 437 ScopedWebRTCPtr<webrtc::VoEFile> file(engine.get());
428 ASSERT_TRUE(file.valid()); 438 ASSERT_TRUE(file.valid());
429 int duration = 0; 439 int duration = 0;
430 EXPECT_EQ(0, file->GetFileDuration(file_path.c_str(), duration, 440 EXPECT_EQ(0, file->GetFileDuration(file_path.c_str(), duration,
431 webrtc::kFileFormatPcm16kHzFile)); 441 webrtc::kFileFormatPcm16kHzFile));
432 EXPECT_NE(0, duration); 442 EXPECT_NE(0, duration);
433 443
434 EXPECT_EQ(0, file->StartPlayingFileLocally(ch, file_path.c_str(), false, 444 EXPECT_EQ(0, file->StartPlayingFileLocally(ch, file_path.c_str(), false,
435 webrtc::kFileFormatPcm16kHzFile)); 445 webrtc::kFileFormatPcm16kHzFile));
436 446
437 // Play 2 seconds worth of audio and then quit. 447 // Play 2 seconds worth of audio and then quit.
438 message_loop_.PostDelayedTask(FROM_HERE, 448 message_loop_.PostDelayedTask(FROM_HERE,
439 MessageLoop::QuitClosure(), 449 MessageLoop::QuitClosure(),
440 base::TimeDelta::FromSeconds(2)); 450 base::TimeDelta::FromSeconds(2));
441 message_loop_.Run(); 451 message_loop_.Run();
442 452
443 453 renderer->Stop();
444 EXPECT_EQ(0, base->StopSend(ch)); 454 EXPECT_EQ(0, base->StopSend(ch));
445 EXPECT_EQ(0, base->StopPlayout(ch)); 455 EXPECT_EQ(0, base->StopPlayout(ch));
446 EXPECT_EQ(0, base->DeleteChannel(ch)); 456 EXPECT_EQ(0, base->DeleteChannel(ch));
447 EXPECT_EQ(0, base->Terminate()); 457 EXPECT_EQ(0, base->Terminate());
448 } 458 }
449 459
450 // Uses WebRtcAudioDeviceImpl to play out recorded audio in loopback. 460 // Uses WebRtcAudioDeviceImpl to play out recorded audio in loopback.
451 // An external transport implementation is utilized to feed back RTP packets 461 // An external transport implementation is utilized to feed back RTP packets
452 // which are recorded, encoded, packetized into RTP packets and finally 462 // which are recorded, encoded, packetized into RTP packets and finally
453 // "transmitted". The RTP packets are then fed back into the VoiceEngine 463 // "transmitted". The RTP packets are then fed back into the VoiceEngine
(...skipping 15 matching lines...) Expand all
469 479
470 EXPECT_CALL(media_observer(), 480 EXPECT_CALL(media_observer(),
471 OnSetAudioStreamStatus(_, 1, StrEq("created"))); 481 OnSetAudioStreamStatus(_, 1, StrEq("created")));
472 EXPECT_CALL(media_observer(), 482 EXPECT_CALL(media_observer(),
473 OnSetAudioStreamPlaying(_, 1, true)); 483 OnSetAudioStreamPlaying(_, 1, true));
474 EXPECT_CALL(media_observer(), 484 EXPECT_CALL(media_observer(),
475 OnSetAudioStreamStatus(_, 1, StrEq("closed"))); 485 OnSetAudioStreamStatus(_, 1, StrEq("closed")));
476 EXPECT_CALL(media_observer(), 486 EXPECT_CALL(media_observer(),
477 OnDeleteAudioStream(_, 1)).Times(AnyNumber()); 487 OnDeleteAudioStream(_, 1)).Times(AnyNumber());
478 488
489 scoped_refptr<WebRtcAudioRenderer> renderer = new WebRtcAudioRenderer();
490
479 scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device( 491 scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device(
480 new WebRtcAudioDeviceImpl()); 492 new WebRtcAudioDeviceImpl());
481 webrtc_audio_device->SetSessionId(1); 493 webrtc_audio_device->SetSessionId(1);
494 EXPECT_TRUE(webrtc_audio_device->SetRenderer(renderer));
495
482 WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create()); 496 WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create());
483 ASSERT_TRUE(engine.valid()); 497 ASSERT_TRUE(engine.valid());
484 498
485 ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get()); 499 ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get());
486 ASSERT_TRUE(base.valid()); 500 ASSERT_TRUE(base.valid());
487 int err = base->Init(webrtc_audio_device); 501 int err = base->Init(webrtc_audio_device);
488 ASSERT_EQ(0, err); 502 ASSERT_EQ(0, err);
489 503
490 ScopedWebRTCPtr<webrtc::VoEAudioProcessing> audio_processing(engine.get()); 504 ScopedWebRTCPtr<webrtc::VoEAudioProcessing> audio_processing(engine.get());
491 ASSERT_TRUE(audio_processing.valid()); 505 ASSERT_TRUE(audio_processing.valid());
492 bool enabled = false; 506 bool enabled = false;
493 webrtc::AgcModes agc_mode = webrtc::kAgcDefault; 507 webrtc::AgcModes agc_mode = webrtc::kAgcDefault;
494 EXPECT_EQ(0, audio_processing->GetAgcStatus(enabled, agc_mode)); 508 EXPECT_EQ(0, audio_processing->GetAgcStatus(enabled, agc_mode));
495 EXPECT_TRUE(enabled); 509 EXPECT_TRUE(enabled);
496 EXPECT_EQ(agc_mode, webrtc::kAgcAdaptiveAnalog); 510 EXPECT_EQ(agc_mode, webrtc::kAgcAdaptiveAnalog);
497 511
498 int ch = base->CreateChannel(); 512 int ch = base->CreateChannel();
499 EXPECT_NE(-1, ch); 513 EXPECT_NE(-1, ch);
500 514
501 ScopedWebRTCPtr<webrtc::VoENetwork> network(engine.get()); 515 ScopedWebRTCPtr<webrtc::VoENetwork> network(engine.get());
502 ASSERT_TRUE(network.valid()); 516 ASSERT_TRUE(network.valid());
503 scoped_ptr<WebRTCTransportImpl> transport( 517 scoped_ptr<WebRTCTransportImpl> transport(
504 new WebRTCTransportImpl(network.get())); 518 new WebRTCTransportImpl(network.get()));
505 EXPECT_EQ(0, network->RegisterExternalTransport(ch, *transport.get())); 519 EXPECT_EQ(0, network->RegisterExternalTransport(ch, *transport.get()));
506 EXPECT_EQ(0, base->StartPlayout(ch)); 520 EXPECT_EQ(0, base->StartPlayout(ch));
507 EXPECT_EQ(0, base->StartSend(ch)); 521 EXPECT_EQ(0, base->StartSend(ch));
522 renderer->Play();
508 523
509 LOG(INFO) << ">> You should now be able to hear yourself in loopback..."; 524 LOG(INFO) << ">> You should now be able to hear yourself in loopback...";
510 message_loop_.PostDelayedTask(FROM_HERE, 525 message_loop_.PostDelayedTask(FROM_HERE,
511 MessageLoop::QuitClosure(), 526 MessageLoop::QuitClosure(),
512 base::TimeDelta::FromSeconds(2)); 527 base::TimeDelta::FromSeconds(2));
513 message_loop_.Run(); 528 message_loop_.Run();
514 529
530 renderer->Stop();
515 EXPECT_EQ(0, base->StopSend(ch)); 531 EXPECT_EQ(0, base->StopSend(ch));
516 EXPECT_EQ(0, base->StopPlayout(ch)); 532 EXPECT_EQ(0, base->StopPlayout(ch));
517 533
518 EXPECT_EQ(0, base->DeleteChannel(ch)); 534 EXPECT_EQ(0, base->DeleteChannel(ch));
519 EXPECT_EQ(0, base->Terminate()); 535 EXPECT_EQ(0, base->Terminate());
520 } 536 }
521 537
522 } // namespace content 538 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698