| Index: content/renderer/media/webrtc_local_audio_source_provider_unittest.cc
|
| diff --git a/content/renderer/media/webrtc_local_audio_source_provider_unittest.cc b/content/renderer/media/webrtc_local_audio_source_provider_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c23ce0ee63450b43fc176b7ec0651175045c3924
|
| --- /dev/null
|
| +++ b/content/renderer/media/webrtc_local_audio_source_provider_unittest.cc
|
| @@ -0,0 +1,121 @@
|
| +// Copyright 2013 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 "base/logging.h"
|
| +#include "content/renderer/media/webrtc_local_audio_source_provider.h"
|
| +#include "media/audio/audio_parameters.h"
|
| +#include "media/base/audio_bus.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace content {
|
| +
|
| +class WebRtcLocalAudioSourceProviderTest : public testing::Test {
|
| + protected:
|
| + virtual void SetUp() OVERRIDE {
|
| + source_params_.Reset(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
|
| + media::CHANNEL_LAYOUT_MONO, 1, 0, 48000, 16, 480);
|
| + sink_params_.Reset(
|
| + media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
|
| + media::CHANNEL_LAYOUT_STEREO, 2, 0, 44100, 16,
|
| + WebRtcLocalAudioSourceProvider::kWebAudioRenderBufferSize);
|
| + source_bus_ = media::AudioBus::Create(source_params_);
|
| + sink_bus_ = media::AudioBus::Create(sink_params_);
|
| + source_provider_.reset(new WebRtcLocalAudioSourceProvider());
|
| + source_provider_->SetSinkParamsForTesting(sink_params_);
|
| + source_provider_->Initialize(source_params_);
|
| + }
|
| +
|
| + media::AudioParameters source_params_;
|
| + media::AudioParameters sink_params_;
|
| + scoped_ptr<media::AudioBus> source_bus_;
|
| + scoped_ptr<media::AudioBus> sink_bus_;
|
| + scoped_ptr<WebRtcLocalAudioSourceProvider> source_provider_;
|
| +};
|
| +
|
| +TEST_F(WebRtcLocalAudioSourceProviderTest, VerifyDataFlow) {
|
| + // Point the WebVector into memory owned by |sink_bus_|.
|
| + WebKit::WebVector<float*> audio_data(
|
| + static_cast<size_t>(sink_bus_->channels()));
|
| + for (size_t i = 0; i < audio_data.size(); ++i)
|
| + audio_data[i] = sink_bus_->channel(i);
|
| +
|
| + // Enable the |source_provider_| by asking for data. This will inject
|
| + // source_params_.frames_per_buffer() of zero into the resampler since there
|
| + // no available data in the FIFO.
|
| + source_provider_->provideInput(audio_data, sink_params_.frames_per_buffer());
|
| + EXPECT_TRUE(sink_bus_->channel(0)[0] == 0);
|
| +
|
| + // Set the value of source data to be 1.
|
| + for (int i = 0; i < source_params_.frames_per_buffer(); ++i) {
|
| + source_bus_->channel(0)[i] = 1;
|
| + }
|
| +
|
| + // Deliver data to |source_provider_|.
|
| + source_provider_->DeliverData(source_bus_.get(), 0, 0, false);
|
| +
|
| + // Consume the first packet in the resampler, which contains only zero.
|
| + // And the consumption of the data will trigger pulling the real packet from
|
| + // the source provider FIFO into the resampler.
|
| + // Note that we need to count in the provideInput() call a few lines above.
|
| + for (int i = sink_params_.frames_per_buffer();
|
| + i < source_params_.frames_per_buffer();
|
| + i += sink_params_.frames_per_buffer()) {
|
| + sink_bus_->Zero();
|
| + source_provider_->provideInput(audio_data,
|
| + sink_params_.frames_per_buffer());
|
| + EXPECT_DOUBLE_EQ(0.0, sink_bus_->channel(0)[0]);
|
| + EXPECT_DOUBLE_EQ(0.0, sink_bus_->channel(1)[0]);
|
| + }
|
| +
|
| + // Prepare the second packet for featching.
|
| + source_provider_->DeliverData(source_bus_.get(), 0, 0, false);
|
| +
|
| + // Verify the packets.
|
| + for (int i = 0; i < source_params_.frames_per_buffer();
|
| + i += sink_params_.frames_per_buffer()) {
|
| + sink_bus_->Zero();
|
| + source_provider_->provideInput(audio_data,
|
| + sink_params_.frames_per_buffer());
|
| + EXPECT_GT(sink_bus_->channel(0)[0], 0);
|
| + EXPECT_GT(sink_bus_->channel(1)[0], 0);
|
| + EXPECT_DOUBLE_EQ(sink_bus_->channel(0)[0], sink_bus_->channel(1)[0]);
|
| + }
|
| +}
|
| +
|
| +TEST_F(WebRtcLocalAudioSourceProviderTest, VerifyAudioProcessingParams) {
|
| + // Point the WebVector into memory owned by |sink_bus_|.
|
| + WebKit::WebVector<float*> audio_data(
|
| + static_cast<size_t>(sink_bus_->channels()));
|
| + for (size_t i = 0; i < audio_data.size(); ++i)
|
| + audio_data[i] = sink_bus_->channel(i);
|
| +
|
| + // Enable the source provider.
|
| + source_provider_->provideInput(audio_data, sink_params_.frames_per_buffer());
|
| +
|
| + // Deliver data to |source_provider_| with audio processing params.
|
| + int source_delay = 5;
|
| + int source_volume = 255;
|
| + bool source_key_pressed = true;
|
| + source_provider_->DeliverData(source_bus_.get(), source_delay,
|
| + source_volume, source_key_pressed);
|
| +
|
| + int delay = 0, volume = 0;
|
| + bool key_pressed = false;
|
| + source_provider_->GetAudioProcessingParams(&delay, &volume, &key_pressed);
|
| + EXPECT_EQ(volume, source_volume);
|
| + EXPECT_EQ(key_pressed, source_key_pressed);
|
| + int expected_delay = source_delay + static_cast<int>(
|
| + source_bus_->frames() / source_params_.sample_rate() + 0.5);
|
| + EXPECT_GE(delay, expected_delay);
|
| +
|
| + // Sleep a few ms to simulate processing time. This should increase the delay
|
| + // value as time passes.
|
| + int cached_delay = delay;
|
| + const int kSleepMs = 10;
|
| + base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(kSleepMs));
|
| + source_provider_->GetAudioProcessingParams(&delay, &volume, &key_pressed);
|
| + EXPECT_GT(delay, cached_delay);
|
| +}
|
| +
|
| +} // namespace content
|
|
|