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

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

Issue 139303016: Feed the render data to MediaStreamAudioProcessor and used AudioBus in render callback (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixed the bots. Created 6 years, 10 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 <vector> 5 #include <vector>
6 6
7 #include "base/environment.h" 7 #include "base/environment.h"
8 #include "base/file_util.h" 8 #include "base/file_util.h"
9 #include "base/files/file_path.h" 9 #include "base/files/file_path.h"
10 #include "base/path_service.h" 10 #include "base/path_service.h"
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 242
243 class MockWebRtcAudioRendererSource : public WebRtcAudioRendererSource { 243 class MockWebRtcAudioRendererSource : public WebRtcAudioRendererSource {
244 public: 244 public:
245 explicit MockWebRtcAudioRendererSource(base::WaitableEvent* event) 245 explicit MockWebRtcAudioRendererSource(base::WaitableEvent* event)
246 : event_(event) { 246 : event_(event) {
247 DCHECK(event_); 247 DCHECK(event_);
248 } 248 }
249 virtual ~MockWebRtcAudioRendererSource() {} 249 virtual ~MockWebRtcAudioRendererSource() {}
250 250
251 // WebRtcAudioRendererSource implementation. 251 // WebRtcAudioRendererSource implementation.
252 virtual void RenderData(uint8* audio_data, 252 virtual void RenderData(media::AudioBus* audio_bus,
253 int number_of_channels, 253 int sample_rate,
254 int number_of_frames,
255 int audio_delay_milliseconds) OVERRIDE { 254 int audio_delay_milliseconds) OVERRIDE {
256 // Signal that a callback has been received. 255 // Signal that a callback has been received.
257 // Initialize the memory to zero to avoid uninitialized warning from 256 // Initialize the memory to zero to avoid uninitialized warning from
258 // Valgrind. 257 // Valgrind.
259 memset(audio_data, 0, 258 audio_bus->Zero();
260 sizeof(int16) * number_of_channels * number_of_frames);
261 event_->Signal(); 259 event_->Signal();
262 } 260 }
263 261
264 virtual void SetRenderFormat(const media::AudioParameters& params) OVERRIDE {
265 }
266
267 virtual void RemoveAudioRenderer(WebRtcAudioRenderer* renderer) OVERRIDE {}; 262 virtual void RemoveAudioRenderer(WebRtcAudioRenderer* renderer) OVERRIDE {};
268 263
269 private: 264 private:
270 base::WaitableEvent* event_; 265 base::WaitableEvent* event_;
271 266
272 DISALLOW_COPY_AND_ASSIGN(MockWebRtcAudioRendererSource); 267 DISALLOW_COPY_AND_ASSIGN(MockWebRtcAudioRendererSource);
273 }; 268 };
274 269
275 // Prints numerical information to stdout in a controlled format so we can plot 270 // Prints numerical information to stdout in a controlled format so we can plot
276 // the result. 271 // the result.
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 bool enable_apm) { 319 bool enable_apm) {
325 scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device( 320 scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device(
326 new WebRtcAudioDeviceImpl()); 321 new WebRtcAudioDeviceImpl());
327 WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create()); 322 WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create());
328 EXPECT_TRUE(engine.valid()); 323 EXPECT_TRUE(engine.valid());
329 ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get()); 324 ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get());
330 EXPECT_TRUE(base.valid()); 325 EXPECT_TRUE(base.valid());
331 int err = base->Init(webrtc_audio_device.get()); 326 int err = base->Init(webrtc_audio_device.get());
332 EXPECT_EQ(0, err); 327 EXPECT_EQ(0, err);
333 328
334 // We use OnSetFormat() and SetRenderFormat() to configure the audio 329 // We use OnSetFormat() to configure the audio parameters so that this
335 // parameters so that this test can run on machine without hardware device. 330 // test can run on machine without hardware device.
336 const media::AudioParameters params = media::AudioParameters( 331 const media::AudioParameters params = media::AudioParameters(
337 media::AudioParameters::AUDIO_PCM_LOW_LATENCY, CHANNEL_LAYOUT_STEREO, 332 media::AudioParameters::AUDIO_PCM_LOW_LATENCY, CHANNEL_LAYOUT_STEREO,
338 48000, 2, 480); 333 48000, 2, 480);
339 PeerConnectionAudioSink* capturer_sink = 334 PeerConnectionAudioSink* capturer_sink =
340 static_cast<PeerConnectionAudioSink*>(webrtc_audio_device.get()); 335 static_cast<PeerConnectionAudioSink*>(webrtc_audio_device.get());
341 WebRtcAudioRendererSource* renderer_source = 336 WebRtcAudioRendererSource* renderer_source =
342 static_cast<WebRtcAudioRendererSource*>(webrtc_audio_device.get()); 337 static_cast<WebRtcAudioRendererSource*>(webrtc_audio_device.get());
343 renderer_source->SetRenderFormat(params);
344 338
345 // Turn on/off all the signal processing components like AGC, AEC and NS. 339 // Turn on/off all the signal processing components like AGC, AEC and NS.
346 ScopedWebRTCPtr<webrtc::VoEAudioProcessing> audio_processing(engine.get()); 340 ScopedWebRTCPtr<webrtc::VoEAudioProcessing> audio_processing(engine.get());
347 EXPECT_TRUE(audio_processing.valid()); 341 EXPECT_TRUE(audio_processing.valid());
348 audio_processing->SetAgcStatus(enable_apm); 342 audio_processing->SetAgcStatus(enable_apm);
349 audio_processing->SetNsStatus(enable_apm); 343 audio_processing->SetNsStatus(enable_apm);
350 audio_processing->SetEcStatus(enable_apm); 344 audio_processing->SetEcStatus(enable_apm);
351 345
352 // Create a voice channel for the WebRtc. 346 // Create a voice channel for the WebRtc.
353 int channel = base->CreateChannel(); 347 int channel = base->CreateChannel();
354 EXPECT_NE(-1, channel); 348 EXPECT_NE(-1, channel);
355 SetChannelCodec(engine.get(), channel); 349 SetChannelCodec(engine.get(), channel);
356 350
357 // Use our fake network transmission and start playout and recording. 351 // Use our fake network transmission and start playout and recording.
358 ScopedWebRTCPtr<webrtc::VoENetwork> network(engine.get()); 352 ScopedWebRTCPtr<webrtc::VoENetwork> network(engine.get());
359 EXPECT_TRUE(network.valid()); 353 EXPECT_TRUE(network.valid());
360 scoped_ptr<WebRTCTransportImpl> transport( 354 scoped_ptr<WebRTCTransportImpl> transport(
361 new WebRTCTransportImpl(network.get())); 355 new WebRTCTransportImpl(network.get()));
362 EXPECT_EQ(0, network->RegisterExternalTransport(channel, *transport.get())); 356 EXPECT_EQ(0, network->RegisterExternalTransport(channel, *transport.get()));
363 EXPECT_EQ(0, base->StartPlayout(channel)); 357 EXPECT_EQ(0, base->StartPlayout(channel));
364 EXPECT_EQ(0, base->StartSend(channel)); 358 EXPECT_EQ(0, base->StartSend(channel));
365 359
366 // Read speech data from a speech test file. 360 // Read speech data from a speech test file.
367 const int input_packet_size = 361 const int input_packet_size =
368 params.frames_per_buffer() * 2 * params.channels(); 362 params.frames_per_buffer() * 2 * params.channels();
369 const int num_output_channels = webrtc_audio_device->output_channels();
370 const int output_packet_size = webrtc_audio_device->output_buffer_size() * 2 *
371 num_output_channels;
372 const size_t length = input_packet_size * kNumberOfPacketsForLoopbackTest; 363 const size_t length = input_packet_size * kNumberOfPacketsForLoopbackTest;
373 scoped_ptr<char[]> capture_data(new char[length]); 364 scoped_ptr<char[]> capture_data(new char[length]);
374 ReadDataFromSpeechFile(capture_data.get(), length); 365 ReadDataFromSpeechFile(capture_data.get(), length);
375 366
376 // Start the timer. 367 // Start the timer.
377 scoped_ptr<uint8[]> buffer(new uint8[output_packet_size]); 368 scoped_ptr<media::AudioBus> render_audio_bus(media::AudioBus::Create(params));
378 base::Time start_time = base::Time::Now(); 369 base::Time start_time = base::Time::Now();
379 int delay = 0; 370 int delay = 0;
380 std::vector<int> voe_channels; 371 std::vector<int> voe_channels;
381 voe_channels.push_back(channel); 372 voe_channels.push_back(channel);
382 for (int j = 0; j < kNumberOfPacketsForLoopbackTest; ++j) { 373 for (int j = 0; j < kNumberOfPacketsForLoopbackTest; ++j) {
383 // Sending fake capture data to WebRtc. 374 // Sending fake capture data to WebRtc.
384 capturer_sink->OnData( 375 capturer_sink->OnData(
385 reinterpret_cast<int16*>(capture_data.get() + input_packet_size * j), 376 reinterpret_cast<int16*>(capture_data.get() + input_packet_size * j),
386 params.sample_rate(), 377 params.sample_rate(),
387 params.channels(), 378 params.channels(),
388 params.frames_per_buffer(), 379 params.frames_per_buffer(),
389 voe_channels, 380 voe_channels,
390 kHardwareLatencyInMs, 381 kHardwareLatencyInMs,
391 1.0, 382 1.0,
392 enable_apm, 383 enable_apm,
393 false); 384 false);
394 385
395 // Receiving data from WebRtc. 386 // Receiving data from WebRtc.
396 renderer_source->RenderData( 387 renderer_source->RenderData(
397 reinterpret_cast<uint8*>(buffer.get()), 388 render_audio_bus.get(), params.sample_rate(),
398 num_output_channels, webrtc_audio_device->output_buffer_size(),
399 kHardwareLatencyInMs + delay); 389 kHardwareLatencyInMs + delay);
400 delay = (base::Time::Now() - start_time).InMilliseconds(); 390 delay = (base::Time::Now() - start_time).InMilliseconds();
401 } 391 }
402 392
403 int latency = (base::Time::Now() - start_time).InMilliseconds(); 393 int latency = (base::Time::Now() - start_time).InMilliseconds();
404 394
405 EXPECT_EQ(0, base->StopSend(channel)); 395 EXPECT_EQ(0, base->StopSend(channel));
406 EXPECT_EQ(0, base->StopPlayout(channel)); 396 EXPECT_EQ(0, base->StopPlayout(channel));
407 EXPECT_EQ(0, base->DeleteChannel(channel)); 397 EXPECT_EQ(0, base->DeleteChannel(channel));
408 EXPECT_EQ(0, base->Terminate()); 398 EXPECT_EQ(0, base->Terminate());
(...skipping 569 matching lines...) Expand 10 before | Expand all | Expand 10 after
978 LOG(WARNING) << "Test disabled due to the test hangs on WinXP."; 968 LOG(WARNING) << "Test disabled due to the test hangs on WinXP.";
979 return; 969 return;
980 } 970 }
981 #endif 971 #endif
982 int latency = RunWebRtcLoopbackTimeTest(audio_manager_.get(), true); 972 int latency = RunWebRtcLoopbackTimeTest(audio_manager_.get(), true);
983 PrintPerfResultMs("webrtc_loopback_with_signal_processing (100 packets)", 973 PrintPerfResultMs("webrtc_loopback_with_signal_processing (100 packets)",
984 "t", latency); 974 "t", latency);
985 } 975 }
986 976
987 } // namespace content 977 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698