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

Unified Diff: content/renderer/media/webrtc_audio_device_unittest.cc

Issue 194813002: Removing WebRTCAudioDeviceTest test suite (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: xians@ Created 6 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/content_tests.gypi ('k') | content/test/webrtc_audio_device_test.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/media/webrtc_audio_device_unittest.cc
diff --git a/content/renderer/media/webrtc_audio_device_unittest.cc b/content/renderer/media/webrtc_audio_device_unittest.cc
deleted file mode 100644
index 7567671f3de2d87a63c822e158f27d82ce8f538a..0000000000000000000000000000000000000000
--- a/content/renderer/media/webrtc_audio_device_unittest.cc
+++ /dev/null
@@ -1,987 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <vector>
-
-#include "base/environment.h"
-#include "base/file_util.h"
-#include "base/files/file_path.h"
-#include "base/path_service.h"
-#include "base/strings/stringprintf.h"
-#include "base/test/test_timeouts.h"
-#include "content/renderer/media/mock_media_stream_dependency_factory.h"
-#include "content/renderer/media/webrtc/webrtc_local_audio_track_adapter.h"
-#include "content/renderer/media/webrtc_audio_capturer.h"
-#include "content/renderer/media/webrtc_audio_device_impl.h"
-#include "content/renderer/media/webrtc_audio_renderer.h"
-#include "content/renderer/media/webrtc_local_audio_track.h"
-#include "content/renderer/render_thread_impl.h"
-#include "content/test/webrtc_audio_device_test.h"
-#include "media/audio/audio_manager_base.h"
-#include "media/base/audio_hardware_config.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "third_party/WebKit/public/platform/WebMediaConstraints.h"
-#include "third_party/webrtc/voice_engine/include/voe_audio_processing.h"
-#include "third_party/webrtc/voice_engine/include/voe_base.h"
-#include "third_party/webrtc/voice_engine/include/voe_codec.h"
-#include "third_party/webrtc/voice_engine/include/voe_external_media.h"
-#include "third_party/webrtc/voice_engine/include/voe_file.h"
-#include "third_party/webrtc/voice_engine/include/voe_network.h"
-
-#if defined(OS_WIN)
-#include "base/win/windows_version.h"
-#endif
-
-using media::AudioParameters;
-using media::CHANNEL_LAYOUT_STEREO;
-using testing::_;
-using testing::AnyNumber;
-using testing::InvokeWithoutArgs;
-using testing::Return;
-using testing::StrEq;
-
-namespace content {
-
-namespace {
-
-const int kRenderViewId = 1;
-
-// The number of packers that RunWebRtcLoopbackTimeTest() uses for measurement.
-const int kNumberOfPacketsForLoopbackTest = 100;
-
-// The hardware latency we feed to WebRtc.
-const int kHardwareLatencyInMs = 50;
-
-scoped_ptr<media::AudioHardwareConfig> CreateRealHardwareConfig(
- media::AudioManager* manager) {
- const AudioParameters output_parameters =
- manager->GetDefaultOutputStreamParameters();
- const AudioParameters input_parameters =
- manager->GetInputStreamParameters(
- media::AudioManagerBase::kDefaultDeviceId);
-
- return make_scoped_ptr(new media::AudioHardwareConfig(
- input_parameters, output_parameters));
-}
-
-// Return true if at least one element in the array matches |value|.
-bool FindElementInArray(const int* array, int size, int value) {
- return (std::find(&array[0], &array[0] + size, value) != &array[size]);
-}
-
-// This method returns false if a non-supported rate is detected on the
-// input or output side.
-// TODO(henrika): add support for automatic fallback to Windows Wave audio
-// if a non-supported rate is detected. It is probably better to detect
-// invalid audio settings by actually trying to open the audio streams instead
-// of relying on hard coded conditions.
-bool HardwareSampleRatesAreValid() {
- // These are the currently supported hardware sample rates in both directions.
- // The actual WebRTC client can limit these ranges further depending on
- // platform but this is the maximum range we support today.
- int valid_input_rates[] = {16000, 32000, 44100, 48000, 96000};
- int valid_output_rates[] = {16000, 32000, 44100, 48000, 96000};
-
- media::AudioHardwareConfig* hardware_config =
- RenderThreadImpl::current()->GetAudioHardwareConfig();
-
- // Verify the input sample rate.
- int input_sample_rate = hardware_config->GetInputSampleRate();
-
- if (!FindElementInArray(valid_input_rates, arraysize(valid_input_rates),
- input_sample_rate)) {
- LOG(WARNING) << "Non-supported input sample rate detected.";
- return false;
- }
-
- // Given that the input rate was OK, verify the output rate as well.
- int output_sample_rate = hardware_config->GetOutputSampleRate();
- if (!FindElementInArray(valid_output_rates, arraysize(valid_output_rates),
- output_sample_rate)) {
- LOG(WARNING) << "Non-supported output sample rate detected.";
- return false;
- }
-
- return true;
-}
-
-// Utility method which creates the audio capturer, it returns a scoped
-// reference of the capturer if it is created successfully, otherwise it returns
-// NULL. This method should be used in tests where
-// HardwareSampleRatesAreValid() has been called and returned true.
-scoped_refptr<WebRtcAudioCapturer> CreateAudioCapturer(
- WebRtcAudioDeviceImpl* webrtc_audio_device) {
- media::AudioHardwareConfig* hardware_config =
- RenderThreadImpl::current()->GetAudioHardwareConfig();
- // Use native capture sample rate and channel configuration to get some
- // action in this test.
- int sample_rate = hardware_config->GetInputSampleRate();
- media::ChannelLayout channel_layout =
- hardware_config->GetInputChannelLayout();
- blink::WebMediaConstraints constraints;
- StreamDeviceInfo device(MEDIA_DEVICE_AUDIO_CAPTURE,
- media::AudioManagerBase::kDefaultDeviceName,
- media::AudioManagerBase::kDefaultDeviceId,
- sample_rate, channel_layout, 0);
- device.session_id = 1;
- return WebRtcAudioCapturer::CreateCapturer(kRenderViewId, device,
- constraints,
- webrtc_audio_device);
-}
-
-// Create and start a local audio track. Starting the audio track will connect
-// the audio track to the capturer and also start the source of the capturer.
-// Also, connect the sink to the audio track.
-scoped_ptr<WebRtcLocalAudioTrack>
-CreateAndStartLocalAudioTrack(WebRtcLocalAudioTrackAdapter* adapter,
- WebRtcAudioCapturer* capturer,
- PeerConnectionAudioSink* sink) {
- scoped_ptr<WebRtcLocalAudioTrack> local_audio_track(
- new WebRtcLocalAudioTrack(adapter, capturer, NULL));
-
- local_audio_track->AddSink(sink);
- local_audio_track->Start();
- return local_audio_track.Pass();
-}
-
-class WebRTCMediaProcessImpl : public webrtc::VoEMediaProcess {
- public:
- explicit WebRTCMediaProcessImpl(base::WaitableEvent* event)
- : event_(event),
- channel_id_(-1),
- type_(webrtc::kPlaybackPerChannel),
- packet_size_(0),
- sample_rate_(0),
- channels_(0) {
- }
- virtual ~WebRTCMediaProcessImpl() {}
-
- // TODO(henrika): Refactor in WebRTC and convert to Chrome coding style.
- virtual void Process(int channel,
- webrtc::ProcessingTypes type,
- int16_t audio_10ms[],
- int length,
- int sampling_freq,
- bool is_stereo) OVERRIDE {
- base::AutoLock auto_lock(lock_);
- channel_id_ = channel;
- type_ = type;
- packet_size_ = length;
- sample_rate_ = sampling_freq;
- channels_ = (is_stereo ? 2 : 1);
- if (event_) {
- // Signal that a new callback has been received.
- event_->Signal();
- }
- }
-
- int channel_id() const {
- base::AutoLock auto_lock(lock_);
- return channel_id_;
- }
-
- int type() const {
- base::AutoLock auto_lock(lock_);
- return type_;
- }
-
- int packet_size() const {
- base::AutoLock auto_lock(lock_);
- return packet_size_;
- }
-
- int sample_rate() const {
- base::AutoLock auto_lock(lock_);
- return sample_rate_;
- }
-
- private:
- base::WaitableEvent* event_;
- int channel_id_;
- webrtc::ProcessingTypes type_;
- int packet_size_;
- int sample_rate_;
- int channels_;
- mutable base::Lock lock_;
- DISALLOW_COPY_AND_ASSIGN(WebRTCMediaProcessImpl);
-};
-
-// TODO(xians): Use MediaStreamAudioSink.
-class MockMediaStreamAudioSink : public PeerConnectionAudioSink {
- public:
- explicit MockMediaStreamAudioSink(base::WaitableEvent* event)
- : event_(event) {
- DCHECK(event_);
- }
- virtual ~MockMediaStreamAudioSink() {}
-
- // PeerConnectionAudioSink implementation.
- virtual int OnData(const int16* audio_data,
- int sample_rate,
- int number_of_channels,
- int number_of_frames,
- const std::vector<int>& channels,
- int audio_delay_milliseconds,
- int current_volume,
- bool need_audio_processing,
- bool key_pressed) OVERRIDE {
- // Signal that a callback has been received.
- event_->Signal();
- return 0;
- }
-
- // Set the format for the capture audio parameters.
- virtual void OnSetFormat(
- const media::AudioParameters& params) OVERRIDE {}
-
- private:
- base::WaitableEvent* event_;
-
- DISALLOW_COPY_AND_ASSIGN(MockMediaStreamAudioSink);
-};
-
-class MockWebRtcAudioRendererSource : public WebRtcAudioRendererSource {
- public:
- explicit MockWebRtcAudioRendererSource(base::WaitableEvent* event)
- : event_(event) {
- DCHECK(event_);
- }
- virtual ~MockWebRtcAudioRendererSource() {}
-
- // WebRtcAudioRendererSource implementation.
- virtual void RenderData(media::AudioBus* audio_bus,
- int sample_rate,
- int audio_delay_milliseconds) OVERRIDE {
- // Signal that a callback has been received.
- // Initialize the memory to zero to avoid uninitialized warning from
- // Valgrind.
- audio_bus->Zero();
- event_->Signal();
- }
-
- virtual void RemoveAudioRenderer(WebRtcAudioRenderer* renderer) OVERRIDE {};
-
- private:
- base::WaitableEvent* event_;
-
- DISALLOW_COPY_AND_ASSIGN(MockWebRtcAudioRendererSource);
-};
-
-// Prints numerical information to stdout in a controlled format so we can plot
-// the result.
-void PrintPerfResultMs(const char* graph, const char* trace, float time_ms) {
- std::string times;
- base::StringAppendF(&times, "%.2f,", time_ms);
- std::string result = base::StringPrintf(
- "%sRESULT %s%s: %s= %s%s%s %s\n", "*", graph, "",
- trace, "[", times.c_str(), "]", "ms");
-
- fflush(stdout);
- printf("%s", result.c_str());
- fflush(stdout);
-}
-
-void ReadDataFromSpeechFile(char* data, int length) {
- base::FilePath data_file;
- CHECK(PathService::Get(base::DIR_SOURCE_ROOT, &data_file));
- data_file =
- data_file.Append(FILE_PATH_LITERAL("media"))
- .Append(FILE_PATH_LITERAL("test"))
- .Append(FILE_PATH_LITERAL("data"))
- .Append(FILE_PATH_LITERAL("speech_16b_stereo_48kHz.raw"));
- DCHECK(base::PathExists(data_file));
- int64 data_file_size64 = 0;
- DCHECK(base::GetFileSize(data_file, &data_file_size64));
- EXPECT_EQ(length, base::ReadFile(data_file, data, length));
- DCHECK(data_file_size64 > length);
-}
-
-void SetChannelCodec(webrtc::VoiceEngine* engine, int channel) {
- // TODO(xians): move the codec as an input param to this function, and add
- // tests for different codecs, also add support to Android and IOS.
-#if !defined(OS_ANDROID) && !defined(OS_IOS)
- webrtc::CodecInst isac;
- strcpy(isac.plname, "ISAC");
- isac.pltype = 104;
- isac.pacsize = 960;
- isac.plfreq = 32000;
- isac.channels = 1;
- isac.rate = -1;
- ScopedWebRTCPtr<webrtc::VoECodec> codec(engine);
- EXPECT_EQ(0, codec->SetRecPayloadType(channel, isac));
- EXPECT_EQ(0, codec->SetSendCodec(channel, isac));
-#endif
-}
-
-// Returns the time in millisecond for sending packets to WebRtc for encoding,
-// signal processing, decoding and receiving them back.
-int RunWebRtcLoopbackTimeTest(media::AudioManager* manager,
- bool enable_apm) {
- scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device(
- new WebRtcAudioDeviceImpl());
- WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create());
- EXPECT_TRUE(engine.valid());
- ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get());
- EXPECT_TRUE(base.valid());
- int err = base->Init(webrtc_audio_device.get());
- EXPECT_EQ(0, err);
-
- // We use OnSetFormat() to configure the audio parameters so that this
- // test can run on machine without hardware device.
- const media::AudioParameters params = media::AudioParameters(
- media::AudioParameters::AUDIO_PCM_LOW_LATENCY, CHANNEL_LAYOUT_STEREO,
- 48000, 2, 480);
- PeerConnectionAudioSink* capturer_sink =
- static_cast<PeerConnectionAudioSink*>(webrtc_audio_device.get());
- WebRtcAudioRendererSource* renderer_source =
- static_cast<WebRtcAudioRendererSource*>(webrtc_audio_device.get());
-
- // Turn on/off all the signal processing components like AGC, AEC and NS.
- ScopedWebRTCPtr<webrtc::VoEAudioProcessing> audio_processing(engine.get());
- EXPECT_TRUE(audio_processing.valid());
- audio_processing->SetAgcStatus(enable_apm);
- audio_processing->SetNsStatus(enable_apm);
- audio_processing->SetEcStatus(enable_apm);
-
- // Create a voice channel for the WebRtc.
- int channel = base->CreateChannel();
- EXPECT_NE(-1, channel);
- SetChannelCodec(engine.get(), channel);
-
- // Use our fake network transmission and start playout and recording.
- ScopedWebRTCPtr<webrtc::VoENetwork> network(engine.get());
- EXPECT_TRUE(network.valid());
- scoped_ptr<WebRTCTransportImpl> transport(
- new WebRTCTransportImpl(network.get()));
- EXPECT_EQ(0, network->RegisterExternalTransport(channel, *transport.get()));
- EXPECT_EQ(0, base->StartPlayout(channel));
- EXPECT_EQ(0, base->StartSend(channel));
-
- // Read speech data from a speech test file.
- const int input_packet_size =
- params.frames_per_buffer() * 2 * params.channels();
- const size_t length = input_packet_size * kNumberOfPacketsForLoopbackTest;
- scoped_ptr<char[]> capture_data(new char[length]);
- ReadDataFromSpeechFile(capture_data.get(), length);
-
- // Start the timer.
- scoped_ptr<media::AudioBus> render_audio_bus(media::AudioBus::Create(params));
- base::Time start_time = base::Time::Now();
- int delay = 0;
- std::vector<int> voe_channels;
- voe_channels.push_back(channel);
- for (int j = 0; j < kNumberOfPacketsForLoopbackTest; ++j) {
- // Sending fake capture data to WebRtc.
- capturer_sink->OnData(
- reinterpret_cast<int16*>(capture_data.get() + input_packet_size * j),
- params.sample_rate(),
- params.channels(),
- params.frames_per_buffer(),
- voe_channels,
- kHardwareLatencyInMs,
- 1.0,
- enable_apm,
- false);
-
- // Receiving data from WebRtc.
- renderer_source->RenderData(
- render_audio_bus.get(), params.sample_rate(),
- kHardwareLatencyInMs + delay);
- delay = (base::Time::Now() - start_time).InMilliseconds();
- }
-
- int latency = (base::Time::Now() - start_time).InMilliseconds();
-
- EXPECT_EQ(0, base->StopSend(channel));
- EXPECT_EQ(0, base->StopPlayout(channel));
- EXPECT_EQ(0, base->DeleteChannel(channel));
- EXPECT_EQ(0, base->Terminate());
-
- return latency;
-}
-
-} // namespace
-
-// Trivial test which verifies that one part of the test harness
-// (HardwareSampleRatesAreValid()) works as intended for all supported
-// hardware input sample rates.
-TEST_F(MAYBE_WebRTCAudioDeviceTest, TestValidInputRates) {
- int valid_rates[] = {16000, 32000, 44100, 48000, 96000};
-
- // Verify that we will approve all rates listed in |valid_rates|.
- for (size_t i = 0; i < arraysize(valid_rates); ++i) {
- EXPECT_TRUE(FindElementInArray(valid_rates, arraysize(valid_rates),
- valid_rates[i]));
- }
-
- // Verify that any value outside the valid range results in negative
- // find results.
- int invalid_rates[] = {-1, 0, 8000, 11025, 22050, 192000};
- for (size_t i = 0; i < arraysize(invalid_rates); ++i) {
- EXPECT_FALSE(FindElementInArray(valid_rates, arraysize(valid_rates),
- invalid_rates[i]));
- }
-}
-
-// Trivial test which verifies that one part of the test harness
-// (HardwareSampleRatesAreValid()) works as intended for all supported
-// hardware output sample rates.
-TEST_F(MAYBE_WebRTCAudioDeviceTest, TestValidOutputRates) {
- int valid_rates[] = {44100, 48000, 96000};
-
- // Verify that we will approve all rates listed in |valid_rates|.
- for (size_t i = 0; i < arraysize(valid_rates); ++i) {
- EXPECT_TRUE(FindElementInArray(valid_rates, arraysize(valid_rates),
- valid_rates[i]));
- }
-
- // Verify that any value outside the valid range results in negative
- // find results.
- int invalid_rates[] = {-1, 0, 8000, 11025, 22050, 32000, 192000};
- for (size_t i = 0; i < arraysize(invalid_rates); ++i) {
- EXPECT_FALSE(FindElementInArray(valid_rates, arraysize(valid_rates),
- invalid_rates[i]));
- }
-}
-
-// Basic test that instantiates and initializes an instance of
-// WebRtcAudioDeviceImpl.
-TEST_F(MAYBE_WebRTCAudioDeviceTest, Construct) {
-#if defined(OS_WIN)
- // This test crashes on Win XP bots.
- if (base::win::GetVersion() <= base::win::VERSION_XP)
- return;
-#endif
-
- AudioParameters input_params(
- AudioParameters::AUDIO_PCM_LOW_LATENCY,
- media::CHANNEL_LAYOUT_MONO,
- 48000,
- 16,
- 480);
-
- AudioParameters output_params(
- AudioParameters::AUDIO_PCM_LOW_LATENCY,
- media::CHANNEL_LAYOUT_STEREO,
- 48000,
- 16,
- 480);
-
- media::AudioHardwareConfig audio_config(input_params, output_params);
- SetAudioHardwareConfig(&audio_config);
-
- scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device(
- new WebRtcAudioDeviceImpl());
-
- WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create());
- ASSERT_TRUE(engine.valid());
-
- ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get());
- int err = base->Init(webrtc_audio_device.get());
- EXPECT_TRUE(CreateAudioCapturer(webrtc_audio_device) != NULL);
- EXPECT_EQ(0, err);
- EXPECT_EQ(0, base->Terminate());
-}
-
-// Verify that a call to webrtc::VoEBase::StartPlayout() starts audio output
-// with the correct set of parameters. A WebRtcAudioDeviceImpl instance will
-// be utilized to implement the actual audio path. The test registers a
-// webrtc::VoEExternalMedia implementation to hijack the output audio and
-// verify that streaming starts correctly.
-// TODO(henrika): include on Android as well as soon as alla race conditions
-// in OpenSLES are resolved.
-#if defined(OS_ANDROID)
-#define MAYBE_StartPlayout DISABLED_StartPlayout
-#else
-#define MAYBE_StartPlayout StartPlayout
-#endif
-TEST_F(MAYBE_WebRTCAudioDeviceTest, MAYBE_StartPlayout) {
- if (!has_output_devices_) {
- LOG(WARNING) << "No output device detected.";
- return;
- }
-
- scoped_ptr<media::AudioHardwareConfig> config =
- CreateRealHardwareConfig(audio_manager_.get());
- SetAudioHardwareConfig(config.get());
-
- if (!HardwareSampleRatesAreValid())
- return;
-
- WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create());
- ASSERT_TRUE(engine.valid());
- ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get());
- ASSERT_TRUE(base.valid());
-
- scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device(
- new WebRtcAudioDeviceImpl());
- int err = base->Init(webrtc_audio_device.get());
- ASSERT_EQ(0, err);
-
- ScopedWebRTCPtr<webrtc::VoEExternalMedia> external_media(engine.get());
- ASSERT_TRUE(external_media.valid());
- base::WaitableEvent event(false, false);
- scoped_ptr<WebRTCMediaProcessImpl> media_process(
- new WebRTCMediaProcessImpl(&event));
- int ch = base->CreateChannel();
- EXPECT_NE(-1, ch);
- EXPECT_EQ(0, external_media->RegisterExternalMediaProcessing(
- ch, webrtc::kPlaybackPerChannel, *media_process.get()));
-
- scoped_refptr<webrtc::MediaStreamInterface> media_stream(
- new talk_base::RefCountedObject<MockMediaStream>("label"));
-
- EXPECT_EQ(0, base->StartPlayout(ch));
- scoped_refptr<WebRtcAudioRenderer> renderer(
- CreateDefaultWebRtcAudioRenderer(kRenderViewId, media_stream));
- scoped_refptr<MediaStreamAudioRenderer> proxy(
- renderer->CreateSharedAudioRendererProxy(media_stream));
- EXPECT_TRUE(webrtc_audio_device->SetAudioRenderer(renderer.get()));
- proxy->Start();
- proxy->Play();
-
- EXPECT_TRUE(event.TimedWait(TestTimeouts::action_timeout()));
- WaitForIOThreadCompletion();
-
- EXPECT_TRUE(webrtc_audio_device->Playing());
- EXPECT_FALSE(webrtc_audio_device->Recording());
- EXPECT_EQ(ch, media_process->channel_id());
- EXPECT_EQ(webrtc::kPlaybackPerChannel, media_process->type());
- EXPECT_EQ(80, media_process->packet_size());
- EXPECT_EQ(8000, media_process->sample_rate());
-
- EXPECT_EQ(0, external_media->DeRegisterExternalMediaProcessing(
- ch, webrtc::kPlaybackPerChannel));
- EXPECT_EQ(0, base->StopPlayout(ch));
- proxy->Stop();
- EXPECT_EQ(0, base->DeleteChannel(ch));
- EXPECT_EQ(0, base->Terminate());
-}
-
-// Verify that a call to webrtc::VoEBase::StartRecording() starts audio input
-// with the correct set of parameters. A WebRtcAudioDeviceImpl instance will
-// be utilized to implement the actual audio path. The test registers a
-// webrtc::VoEExternalMedia implementation to hijack the input audio and
-// verify that streaming starts correctly. An external transport implementation
-// is also required to ensure that "sending" can start without actually trying
-// to send encoded packets to the network. Our main interest here is to ensure
-// that the audio capturing starts as it should.
-// Disabled when running headless since the bots don't have the required config.
-
-// TODO(leozwang): Because ExternalMediaProcessing is disabled in webrtc,
-// disable this unit test on Android for now.
-#if defined(OS_ANDROID)
-#define MAYBE_StartRecording DISABLED_StartRecording
-#elif defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY)
-// This test is failing on ARM linux: http://crbug.com/238490
-#define MAYBE_StartRecording DISABLED_StartRecording
-#else
-// Flakily hangs on all other platforms as well: crbug.com/268376.
-// When the flakiness has been fixed, you probably want to leave it disabled
-// on the above platforms.
-#define MAYBE_StartRecording DISABLED_StartRecording
-#endif
-
-TEST_F(MAYBE_WebRTCAudioDeviceTest, MAYBE_StartRecording) {
- if (!has_input_devices_ || !has_output_devices_) {
- LOG(WARNING) << "Missing audio devices.";
- return;
- }
-
- scoped_ptr<media::AudioHardwareConfig> config =
- CreateRealHardwareConfig(audio_manager_.get());
- SetAudioHardwareConfig(config.get());
-
- if (!HardwareSampleRatesAreValid())
- return;
-
- // TODO(tommi): extend MediaObserver and MockMediaObserver with support
- // for new interfaces, like OnSetAudioStreamRecording(). When done, add
- // EXPECT_CALL() macros here.
- scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device(
- new WebRtcAudioDeviceImpl());
-
- WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create());
- ASSERT_TRUE(engine.valid());
-
- ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get());
- ASSERT_TRUE(base.valid());
- int err = base->Init(webrtc_audio_device.get());
- ASSERT_EQ(0, err);
-
- int ch = base->CreateChannel();
- EXPECT_NE(-1, ch);
-
- ScopedWebRTCPtr<webrtc::VoEExternalMedia> external_media(engine.get());
- ASSERT_TRUE(external_media.valid());
-
- base::WaitableEvent event(false, false);
- scoped_ptr<WebRTCMediaProcessImpl> media_process(
- new WebRTCMediaProcessImpl(&event));
- EXPECT_EQ(0, external_media->RegisterExternalMediaProcessing(
- ch, webrtc::kRecordingPerChannel, *media_process.get()));
-
- // We must add an external transport implementation to be able to start
- // recording without actually sending encoded packets to the network. All
- // we want to do here is to verify that audio capturing starts as it should.
- ScopedWebRTCPtr<webrtc::VoENetwork> network(engine.get());
- scoped_ptr<WebRTCTransportImpl> transport(
- new WebRTCTransportImpl(network.get()));
- EXPECT_EQ(0, network->RegisterExternalTransport(ch, *transport.get()));
- EXPECT_EQ(0, base->StartSend(ch));
-
- // Create the capturer which starts the source of the data flow.
- scoped_refptr<WebRtcAudioCapturer> capturer(
- CreateAudioCapturer(webrtc_audio_device));
- EXPECT_TRUE(capturer);
-
- // Create and start a local audio track which is bridging the data flow
- // between the capturer and WebRtcAudioDeviceImpl.
- scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter(
- WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL));
- scoped_ptr<WebRtcLocalAudioTrack> local_audio_track(
- CreateAndStartLocalAudioTrack(adapter, capturer, webrtc_audio_device));
- // connect the VoE voice channel to the audio track
- static_cast<webrtc::AudioTrackInterface*>(
- adapter.get())->GetRenderer()->AddChannel(ch);
-
- // Verify we get the data flow.
- EXPECT_TRUE(event.TimedWait(TestTimeouts::action_timeout()));
- WaitForIOThreadCompletion();
-
- EXPECT_FALSE(webrtc_audio_device->Playing());
- EXPECT_TRUE(webrtc_audio_device->Recording());
- EXPECT_EQ(ch, media_process->channel_id());
- EXPECT_EQ(webrtc::kRecordingPerChannel, media_process->type());
- EXPECT_EQ(80, media_process->packet_size());
- EXPECT_EQ(8000, media_process->sample_rate());
-
- EXPECT_EQ(0, external_media->DeRegisterExternalMediaProcessing(
- ch, webrtc::kRecordingPerChannel));
- EXPECT_EQ(0, base->StopSend(ch));
-
- capturer->Stop();
- EXPECT_EQ(0, base->DeleteChannel(ch));
- EXPECT_EQ(0, base->Terminate());
-}
-
-// Uses WebRtcAudioDeviceImpl to play a local wave file.
-// TODO(henrika): include on Android as well as soon as alla race conditions
-// in OpenSLES are resolved.
-#if defined(OS_ANDROID)
-#define MAYBE_PlayLocalFile DISABLED_PlayLocalFile
-#else
-#define MAYBE_PlayLocalFile PlayLocalFile
-#endif
-TEST_F(MAYBE_WebRTCAudioDeviceTest, MAYBE_PlayLocalFile) {
- if (!has_output_devices_) {
- LOG(WARNING) << "No output device detected.";
- return;
- }
-
- std::string file_path(
- GetTestDataPath(FILE_PATH_LITERAL("speechmusic_mono_16kHz.pcm")));
-
- scoped_ptr<media::AudioHardwareConfig> config =
- CreateRealHardwareConfig(audio_manager_.get());
- SetAudioHardwareConfig(config.get());
-
- if (!HardwareSampleRatesAreValid())
- return;
-
- WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create());
- ASSERT_TRUE(engine.valid());
- ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get());
- ASSERT_TRUE(base.valid());
-
- scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device(
- new WebRtcAudioDeviceImpl());
- int err = base->Init(webrtc_audio_device.get());
- ASSERT_EQ(0, err);
- int ch = base->CreateChannel();
- EXPECT_NE(-1, ch);
- EXPECT_EQ(0, base->StartPlayout(ch));
- scoped_refptr<webrtc::MediaStreamInterface> media_stream(
- new talk_base::RefCountedObject<MockMediaStream>("label"));
- scoped_refptr<WebRtcAudioRenderer> renderer(
- CreateDefaultWebRtcAudioRenderer(kRenderViewId, media_stream));
- scoped_refptr<MediaStreamAudioRenderer> proxy(
- renderer->CreateSharedAudioRendererProxy(media_stream));
- EXPECT_TRUE(webrtc_audio_device->SetAudioRenderer(renderer.get()));
- proxy->Start();
- proxy->Play();
-
- ScopedWebRTCPtr<webrtc::VoEFile> file(engine.get());
- ASSERT_TRUE(file.valid());
- int duration = 0;
- EXPECT_EQ(0, file->GetFileDuration(file_path.c_str(), duration,
- webrtc::kFileFormatPcm16kHzFile));
- EXPECT_NE(0, duration);
-
- EXPECT_EQ(0, file->StartPlayingFileLocally(ch, file_path.c_str(), false,
- webrtc::kFileFormatPcm16kHzFile));
-
- // Play 2 seconds worth of audio and then quit.
- message_loop_.PostDelayedTask(FROM_HERE,
- base::MessageLoop::QuitClosure(),
- base::TimeDelta::FromSeconds(2));
- message_loop_.Run();
-
- proxy->Stop();
- EXPECT_EQ(0, base->StopSend(ch));
- EXPECT_EQ(0, base->StopPlayout(ch));
- EXPECT_EQ(0, base->DeleteChannel(ch));
- EXPECT_EQ(0, base->Terminate());
-}
-
-// Uses WebRtcAudioDeviceImpl to play out recorded audio in loopback.
-// An external transport implementation is utilized to feed back RTP packets
-// which are recorded, encoded, packetized into RTP packets and finally
-// "transmitted". The RTP packets are then fed back into the VoiceEngine
-// where they are decoded and played out on the default audio output device.
-// Disabled when running headless since the bots don't have the required config.
-// TODO(henrika): improve quality by using a wideband codec, enabling noise-
-// suppressions etc.
-// FullDuplexAudioWithAGC is flaky on Android, disable it for now.
-// Also flakily hangs on Windows: crbug.com/269348.
-#if defined(OS_ANDROID) || defined(OS_WIN)
-#define MAYBE_FullDuplexAudioWithAGC DISABLED_FullDuplexAudioWithAGC
-#else
-#define MAYBE_FullDuplexAudioWithAGC FullDuplexAudioWithAGC
-#endif
-TEST_F(MAYBE_WebRTCAudioDeviceTest, MAYBE_FullDuplexAudioWithAGC) {
- if (!has_output_devices_ || !has_input_devices_) {
- LOG(WARNING) << "Missing audio devices.";
- return;
- }
-
- scoped_ptr<media::AudioHardwareConfig> config =
- CreateRealHardwareConfig(audio_manager_.get());
- SetAudioHardwareConfig(config.get());
-
- if (!HardwareSampleRatesAreValid())
- return;
-
- WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create());
- ASSERT_TRUE(engine.valid());
- ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get());
- ASSERT_TRUE(base.valid());
-
- scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device(
- new WebRtcAudioDeviceImpl());
- int err = base->Init(webrtc_audio_device.get());
- ASSERT_EQ(0, err);
-
- ScopedWebRTCPtr<webrtc::VoEAudioProcessing> audio_processing(engine.get());
- ASSERT_TRUE(audio_processing.valid());
-#if defined(OS_ANDROID)
- // On Android, by default AGC is off.
- bool enabled = true;
- webrtc::AgcModes agc_mode = webrtc::kAgcDefault;
- EXPECT_EQ(0, audio_processing->GetAgcStatus(enabled, agc_mode));
- EXPECT_FALSE(enabled);
-#else
- bool enabled = false;
- webrtc::AgcModes agc_mode = webrtc::kAgcDefault;
- EXPECT_EQ(0, audio_processing->GetAgcStatus(enabled, agc_mode));
- EXPECT_TRUE(enabled);
- EXPECT_EQ(agc_mode, webrtc::kAgcAdaptiveAnalog);
-#endif
-
- int ch = base->CreateChannel();
- EXPECT_NE(-1, ch);
-
- scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter(
- WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL));
- scoped_refptr<WebRtcAudioCapturer> capturer(
- CreateAudioCapturer(webrtc_audio_device));
- EXPECT_TRUE(capturer);
- scoped_ptr<WebRtcLocalAudioTrack> local_audio_track(
- CreateAndStartLocalAudioTrack(adapter, capturer, webrtc_audio_device));
- // connect the VoE voice channel to the audio track adapter.
- static_cast<webrtc::AudioTrackInterface*>(
- adapter.get())->GetRenderer()->AddChannel(ch);
-
- ScopedWebRTCPtr<webrtc::VoENetwork> network(engine.get());
- ASSERT_TRUE(network.valid());
- scoped_ptr<WebRTCTransportImpl> transport(
- new WebRTCTransportImpl(network.get()));
- EXPECT_EQ(0, network->RegisterExternalTransport(ch, *transport.get()));
- EXPECT_EQ(0, base->StartPlayout(ch));
- EXPECT_EQ(0, base->StartSend(ch));
- scoped_refptr<webrtc::MediaStreamInterface> media_stream(
- new talk_base::RefCountedObject<MockMediaStream>("label"));
- scoped_refptr<WebRtcAudioRenderer> renderer(
- CreateDefaultWebRtcAudioRenderer(kRenderViewId, media_stream));
- scoped_refptr<MediaStreamAudioRenderer> proxy(
- renderer->CreateSharedAudioRendererProxy(media_stream));
- EXPECT_TRUE(webrtc_audio_device->SetAudioRenderer(renderer.get()));
- proxy->Start();
- proxy->Play();
-
- VLOG(0) << ">> You should now be able to hear yourself in loopback...";
- message_loop_.PostDelayedTask(FROM_HERE,
- base::MessageLoop::QuitClosure(),
- base::TimeDelta::FromSeconds(2));
- message_loop_.Run();
-
- capturer->Stop();
- proxy->Stop();
- EXPECT_EQ(0, base->StopSend(ch));
- EXPECT_EQ(0, base->StopPlayout(ch));
-
- EXPECT_EQ(0, base->DeleteChannel(ch));
- EXPECT_EQ(0, base->Terminate());
-}
-
-// Test times out on bots, see http://crbug.com/247447
-TEST_F(MAYBE_WebRTCAudioDeviceTest, DISABLED_WebRtcRecordingSetupTime) {
- if (!has_input_devices_) {
- LOG(WARNING) << "Missing audio capture devices.";
- return;
- }
-
- scoped_ptr<media::AudioHardwareConfig> config =
- CreateRealHardwareConfig(audio_manager_.get());
- SetAudioHardwareConfig(config.get());
-
- if (!HardwareSampleRatesAreValid())
- return;
-
- scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device(
- new WebRtcAudioDeviceImpl());
-
- WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create());
- ASSERT_TRUE(engine.valid());
-
- ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get());
- ASSERT_TRUE(base.valid());
- int err = base->Init(webrtc_audio_device.get());
- ASSERT_EQ(0, err);
-
- int ch = base->CreateChannel();
- EXPECT_NE(-1, ch);
-
- scoped_refptr<WebRtcAudioCapturer> capturer(
- CreateAudioCapturer(webrtc_audio_device));
- EXPECT_TRUE(capturer);
- base::WaitableEvent event(false, false);
- scoped_ptr<MockMediaStreamAudioSink> sink(
- new MockMediaStreamAudioSink(&event));
-
- // Create and start a local audio track. Starting the audio track will connect
- // the audio track to the capturer and also start the source of the capturer.
- scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter(
- WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL));
- scoped_ptr<WebRtcLocalAudioTrack> local_audio_track(
- CreateAndStartLocalAudioTrack(adapter, capturer, sink.get()));
-
- // connect the VoE voice channel to the audio track adapter.
- static_cast<webrtc::AudioTrackInterface*>(
- adapter.get())->GetRenderer()->AddChannel(ch);
-
- base::Time start_time = base::Time::Now();
- EXPECT_EQ(0, base->StartSend(ch));
-
- EXPECT_TRUE(event.TimedWait(TestTimeouts::action_timeout()));
- int delay = (base::Time::Now() - start_time).InMilliseconds();
- PrintPerfResultMs("webrtc_recording_setup_c", "t", delay);
-
- capturer->Stop();
- EXPECT_EQ(0, base->StopSend(ch));
- EXPECT_EQ(0, base->DeleteChannel(ch));
- EXPECT_EQ(0, base->Terminate());
-}
-
-
-// TODO(henrika): include on Android as well as soon as alla race conditions
-// in OpenSLES are resolved.
-#if defined(OS_ANDROID)
-#define MAYBE_WebRtcPlayoutSetupTime DISABLED_WebRtcPlayoutSetupTime
-#else
-#define MAYBE_WebRtcPlayoutSetupTime WebRtcPlayoutSetupTime
-#endif
-TEST_F(MAYBE_WebRTCAudioDeviceTest, MAYBE_WebRtcPlayoutSetupTime) {
- if (!has_output_devices_) {
- LOG(WARNING) << "No output device detected.";
- return;
- }
-
- scoped_ptr<media::AudioHardwareConfig> config =
- CreateRealHardwareConfig(audio_manager_.get());
- SetAudioHardwareConfig(config.get());
-
- if (!HardwareSampleRatesAreValid())
- return;
-
- base::WaitableEvent event(false, false);
- scoped_ptr<MockWebRtcAudioRendererSource> renderer_source(
- new MockWebRtcAudioRendererSource(&event));
-
- scoped_refptr<webrtc::MediaStreamInterface> media_stream(
- new talk_base::RefCountedObject<MockMediaStream>("label"));
- scoped_refptr<WebRtcAudioRenderer> renderer(
- CreateDefaultWebRtcAudioRenderer(kRenderViewId, media_stream));
- renderer->Initialize(renderer_source.get());
- scoped_refptr<MediaStreamAudioRenderer> proxy(
- renderer->CreateSharedAudioRendererProxy(media_stream));
- proxy->Start();
-
- // Start the timer and playout.
- base::Time start_time = base::Time::Now();
- proxy->Play();
- EXPECT_TRUE(event.TimedWait(TestTimeouts::action_timeout()));
- int delay = (base::Time::Now() - start_time).InMilliseconds();
- PrintPerfResultMs("webrtc_playout_setup_c", "t", delay);
-
- proxy->Stop();
-}
-
-#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY)
-// Timing out on ARM linux bot: http://crbug.com/238490
-#define MAYBE_WebRtcLoopbackTimeWithoutSignalProcessing \
- DISABLED_WebRtcLoopbackTimeWithoutSignalProcessing
-#else
-#define MAYBE_WebRtcLoopbackTimeWithoutSignalProcessing \
- WebRtcLoopbackTimeWithoutSignalProcessing
-#endif
-
-TEST_F(MAYBE_WebRTCAudioDeviceTest,
- MAYBE_WebRtcLoopbackTimeWithoutSignalProcessing) {
-#if defined(OS_WIN)
- // This test hangs on WinXP: see http://crbug.com/318189.
- if (base::win::GetVersion() <= base::win::VERSION_XP) {
- LOG(WARNING) << "Test disabled due to the test hangs on WinXP.";
- return;
- }
-#endif
- int latency = RunWebRtcLoopbackTimeTest(audio_manager_.get(), false);
- PrintPerfResultMs("webrtc_loopback_without_sigal_processing (100 packets)",
- "t", latency);
-}
-
-#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY)
-// Timing out on ARM linux bot: http://crbug.com/238490
-#define MAYBE_WebRtcLoopbackTimeWithSignalProcessing \
- DISABLED_WebRtcLoopbackTimeWithSignalProcessing
-#else
-#define MAYBE_WebRtcLoopbackTimeWithSignalProcessing \
- WebRtcLoopbackTimeWithSignalProcessing
-#endif
-
-TEST_F(MAYBE_WebRTCAudioDeviceTest,
- MAYBE_WebRtcLoopbackTimeWithSignalProcessing) {
-#if defined(OS_WIN)
- // This test hangs on WinXP: see http://crbug.com/318189.
- if (base::win::GetVersion() <= base::win::VERSION_XP) {
- LOG(WARNING) << "Test disabled due to the test hangs on WinXP.";
- return;
- }
-#endif
- int latency = RunWebRtcLoopbackTimeTest(audio_manager_.get(), true);
- PrintPerfResultMs("webrtc_loopback_with_signal_processing (100 packets)",
- "t", latency);
-}
-
-} // namespace content
« no previous file with comments | « content/content_tests.gypi ('k') | content/test/webrtc_audio_device_test.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698