Chromium Code Reviews| Index: content/renderer/media/renderer_webaudiodevice_impl_unittest.cc |
| diff --git a/content/renderer/media/renderer_webaudiodevice_impl_unittest.cc b/content/renderer/media/renderer_webaudiodevice_impl_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..795c0fa00fc0f59e1bbcc718e0c6d96314cd3826 |
| --- /dev/null |
| +++ b/content/renderer/media/renderer_webaudiodevice_impl_unittest.cc |
| @@ -0,0 +1,167 @@ |
| +// Copyright 2016 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 "content/renderer/media/renderer_webaudiodevice_impl.h" |
| + |
| +#include "base/bind.h" |
| +#include "content/renderer/media/audio_device_factory.h" |
| +#include "media/base/audio_capturer_source.h" |
| +#include "media/base/mock_audio_renderer_sink.h" |
| +#include "testing/gmock/include/gmock/gmock.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| + |
| +using testing::_; |
| + |
| +namespace content { |
| + |
| +namespace { |
| + |
| +const int kHardwareSampleRate = 44100; |
| +const int kHardwareBufferSize = 128; |
| +const int kRenderFrameId = 100; |
| + |
| +int MockFrameIdFromCurrentContext() { |
| + return kRenderFrameId; |
| +} |
| + |
| +media::AudioParameters MockGetOutputDeviceParameters( |
| + int frame_id, |
| + int session_id, |
| + const std::string& device_id, |
| + const url::Origin& security_origin) { |
| + return media::AudioParameters(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, |
| + media::CHANNEL_LAYOUT_STEREO, |
| + kHardwareSampleRate, 16, kHardwareBufferSize); |
| +} |
| + |
| +class RendererWebAudioDeviceImplUnderTest : public RendererWebAudioDeviceImpl { |
| + public: |
| + RendererWebAudioDeviceImplUnderTest( |
| + media::ChannelLayout layout, |
| + const blink::WebAudioLatencyHint& latency_hint, |
| + blink::WebAudioDevice::RenderCallback* callback, |
| + int session_id, |
| + const url::Origin& security_origin) |
| + : RendererWebAudioDeviceImpl(layout, |
| + latency_hint, |
| + callback, |
| + session_id, |
| + security_origin, |
| + base::Bind(&MockGetOutputDeviceParameters), |
| + base::Bind(&MockFrameIdFromCurrentContext)) { |
| + } |
| +}; |
| + |
| +} // namespace |
| + |
| +class RendererWebAudioDeviceImplTest |
| + : public blink::WebAudioDevice::RenderCallback, |
| + public AudioDeviceFactory, |
| + public testing::Test { |
| + public: |
| + MOCK_METHOD3(render, |
| + void(const blink::WebVector<float*>& sourceData, |
| + const blink::WebVector<float*>& destinationData, |
| + size_t numberOfFrames)); |
| + |
| + protected: |
| + RendererWebAudioDeviceImplTest() {} |
| + |
| + void SetupDevice(blink::WebAudioLatencyHint latencyHint) { |
| + webaudio_device_.reset(new RendererWebAudioDeviceImplUnderTest( |
| + media::CHANNEL_LAYOUT_MONO, latencyHint, this, 0, url::Origin())); |
| + } |
| + |
| + MOCK_METHOD1(CreateAudioCapturerSource, |
| + scoped_refptr<media::AudioCapturerSource>(int)); |
| + MOCK_METHOD4(CreateFinalAudioRendererSink, |
| + scoped_refptr<media::AudioRendererSink>(int, |
| + int, |
| + const std::string&, |
| + const url::Origin&)); |
| + MOCK_METHOD5( |
| + CreateSwitchableAudioRendererSink, |
| + scoped_refptr<media::SwitchableAudioRendererSink>(SourceType, |
| + int, |
| + int, |
| + const std::string&, |
| + const url::Origin&)); |
| + |
| + scoped_refptr<media::AudioRendererSink> CreateAudioRendererSink( |
| + SourceType source_type, |
| + int render_frame_id, |
| + int session_id, |
| + const std::string& device_id, |
| + const url::Origin& security_origin) { |
| + mock_sink_ = new media::MockAudioRendererSink( |
| + device_id, media::OUTPUT_DEVICE_STATUS_OK, |
| + MockGetOutputDeviceParameters(render_frame_id, session_id, device_id, |
| + security_origin)); |
| + |
| + EXPECT_CALL(*mock_sink_.get(), Start()); |
| + EXPECT_CALL(*mock_sink_.get(), Play()); |
| + EXPECT_CALL(*mock_sink_.get(), Stop()); |
| + |
| + return mock_sink_; |
| + } |
| + |
| + void TearDown() override { |
| + webaudio_device_.reset(); |
| + mock_sink_ = nullptr; |
| + } |
| + |
| + std::unique_ptr<RendererWebAudioDeviceImpl> webaudio_device_; |
| + scoped_refptr<media::MockAudioRendererSink> mock_sink_; |
| +}; |
| + |
| +TEST_F(RendererWebAudioDeviceImplTest, TestLatencyHint) { |
| + SetupDevice(blink::WebAudioLatencyHint( |
| + blink::WebAudioLatencyHint::CategoryInteractive)); |
| + int interactive_frames = webaudio_device_->framesPerBuffer(); |
| + media::AudioLatency::LatencyType interactive_latency = |
| + webaudio_device_->latencyType(); |
| + |
| + SetupDevice( |
| + blink::WebAudioLatencyHint(blink::WebAudioLatencyHint::CategoryBalanced)); |
| + int balanced_frames = webaudio_device_->framesPerBuffer(); |
| + media::AudioLatency::LatencyType balanced_latency = |
| + webaudio_device_->latencyType(); |
| + |
| + SetupDevice( |
| + blink::WebAudioLatencyHint(blink::WebAudioLatencyHint::CategoryPlayback)); |
| + int playback_frames = webaudio_device_->framesPerBuffer(); |
| + media::AudioLatency::LatencyType playback_latency = |
| + webaudio_device_->latencyType(); |
| + |
| + EXPECT_GE(playback_frames, balanced_frames); |
| + EXPECT_GE(balanced_frames, interactive_frames); |
| + |
| + EXPECT_GT(playback_latency, balanced_latency); |
| + EXPECT_GT(balanced_latency, interactive_latency); |
| +} |
| + |
| +TEST_F(RendererWebAudioDeviceImplTest, TestStartStopValues) { |
| + SetupDevice(blink::WebAudioLatencyHint( |
| + blink::WebAudioLatencyHint::CategoryInteractive)); |
| + EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate); |
| + EXPECT_EQ(webaudio_device_->framesPerBuffer(), kHardwareBufferSize); |
|
o1ka
2016/12/08 10:57:19
Here and below: shouldn't WAD return latency-depen
Andrew MacPherson
2016/12/08 12:22:54
Yes you're right, I was cutting a corner since the
o1ka
2016/12/08 13:10:16
Could you check it for each latency type, so that
Andrew MacPherson
2016/12/08 13:53:53
No problem, done. The code for checking each type
|
| + |
| + webaudio_device_->start(); |
| + EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate); |
| + EXPECT_EQ(webaudio_device_->framesPerBuffer(), kHardwareBufferSize); |
| + |
| + webaudio_device_->stop(); |
| + EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate); |
| + EXPECT_EQ(webaudio_device_->framesPerBuffer(), kHardwareBufferSize); |
| + |
| + webaudio_device_->start(); |
| + EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate); |
| + EXPECT_EQ(webaudio_device_->framesPerBuffer(), kHardwareBufferSize); |
| + |
| + webaudio_device_->stop(); |
| + EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate); |
| + EXPECT_EQ(webaudio_device_->framesPerBuffer(), kHardwareBufferSize); |
| +} |
| + |
| +} // namespace content |