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

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

Issue 2501863003: Support for AudioContextOptions latencyHint. (Closed)
Patch Set: Fix WebAudioDeviceImpl unit test on Android. Created 3 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
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/renderer/media/renderer_webaudiodevice_impl.h"
6
7 #include "base/bind.h"
8 #include "base/message_loop/message_loop.h"
9 #include "base/test/test_simple_task_runner.h"
10 #include "build/build_config.h"
11 #include "content/renderer/media/audio_device_factory.h"
12 #include "media/base/audio_capturer_source.h"
13 #include "media/base/mock_audio_renderer_sink.h"
14 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16
17 using testing::_;
18
19 namespace content {
20
21 namespace {
22
23 const int kHardwareSampleRate = 44100;
24 const int kHardwareBufferSize = 128;
25 const int kRenderFrameId = 100;
26
27 int MockFrameIdFromCurrentContext() {
28 return kRenderFrameId;
29 }
30
31 media::AudioParameters MockGetOutputDeviceParameters(
32 int frame_id,
33 int session_id,
34 const std::string& device_id,
35 const url::Origin& security_origin) {
36 return media::AudioParameters(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
37 media::CHANNEL_LAYOUT_STEREO,
38 kHardwareSampleRate, 16, kHardwareBufferSize);
39 }
40
41 class RendererWebAudioDeviceImplUnderTest : public RendererWebAudioDeviceImpl {
42 public:
43 RendererWebAudioDeviceImplUnderTest(
44 media::ChannelLayout layout,
45 const blink::WebAudioLatencyHint& latency_hint,
46 blink::WebAudioDevice::RenderCallback* callback,
47 int session_id,
48 const url::Origin& security_origin)
49 : RendererWebAudioDeviceImpl(layout,
50 latency_hint,
51 callback,
52 session_id,
53 security_origin,
54 base::Bind(&MockGetOutputDeviceParameters),
55 base::Bind(&MockFrameIdFromCurrentContext)) {
56 }
57 };
58
59 } // namespace
60
61 class RendererWebAudioDeviceImplTest
62 : public blink::WebAudioDevice::RenderCallback,
63 public AudioDeviceFactory,
64 public testing::Test {
65 protected:
66 RendererWebAudioDeviceImplTest() {
67 task_runner_ = new base::TestSimpleTaskRunner();
68 }
69
70 void SetupDevice(blink::WebAudioLatencyHint latencyHint) {
71 webaudio_device_.reset(new RendererWebAudioDeviceImplUnderTest(
72 media::CHANNEL_LAYOUT_MONO, latencyHint, this, 0, url::Origin()));
73 webaudio_device_->SetMediaTaskRunnerForTesting(task_runner_);
74 }
75
76 MOCK_METHOD1(CreateAudioCapturerSource,
77 scoped_refptr<media::AudioCapturerSource>(int));
78 MOCK_METHOD4(CreateFinalAudioRendererSink,
79 scoped_refptr<media::AudioRendererSink>(int,
80 int,
81 const std::string&,
82 const url::Origin&));
83 MOCK_METHOD5(
84 CreateSwitchableAudioRendererSink,
85 scoped_refptr<media::SwitchableAudioRendererSink>(SourceType,
86 int,
87 int,
88 const std::string&,
89 const url::Origin&));
90
91 scoped_refptr<media::AudioRendererSink> CreateAudioRendererSink(
92 SourceType source_type,
93 int render_frame_id,
94 int session_id,
95 const std::string& device_id,
96 const url::Origin& security_origin) {
97 scoped_refptr<media::MockAudioRendererSink> mock_sink =
98 new media::MockAudioRendererSink(
99 device_id, media::OUTPUT_DEVICE_STATUS_OK,
100 MockGetOutputDeviceParameters(render_frame_id, session_id,
101 device_id, security_origin));
102
103 EXPECT_CALL(*mock_sink.get(), Start());
104 EXPECT_CALL(*mock_sink.get(), Play());
105 EXPECT_CALL(*mock_sink.get(), Stop());
106
107 return mock_sink;
108 }
109
110 void TearDown() override { webaudio_device_.reset(); }
111
112 std::unique_ptr<RendererWebAudioDeviceImpl> webaudio_device_;
113 scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
114 base::MessageLoop message_loop_;
o1ka 2017/02/13 08:29:30 Why both |task_runner_| and |message_loop_| are ne
Andrew MacPherson 2017/02/13 08:52:21 Without the MessageLoop then in the SilentSinkSusp
115 };
116
117 TEST_F(RendererWebAudioDeviceImplTest, TestLatencyHintValues) {
118 blink::WebAudioLatencyHint interactiveLatencyHint(
119 blink::WebAudioLatencyHint::kCategoryInteractive);
120 int interactiveBufferSize =
121 media::AudioLatency::GetInteractiveBufferSize(kHardwareBufferSize);
122 SetupDevice(interactiveLatencyHint);
123
124 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
125 EXPECT_EQ(webaudio_device_->framesPerBuffer(), interactiveBufferSize);
126
127 webaudio_device_->start();
128 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
129 EXPECT_EQ(webaudio_device_->framesPerBuffer(), interactiveBufferSize);
130
131 webaudio_device_->stop();
132 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
133 EXPECT_EQ(webaudio_device_->framesPerBuffer(), interactiveBufferSize);
134
135 webaudio_device_->start();
136 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
137 EXPECT_EQ(webaudio_device_->framesPerBuffer(), interactiveBufferSize);
138
139 webaudio_device_->stop();
140 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
141 EXPECT_EQ(webaudio_device_->framesPerBuffer(), interactiveBufferSize);
142
143 blink::WebAudioLatencyHint balancedLatencyHint(
144 blink::WebAudioLatencyHint::kCategoryBalanced);
145 int balancedBufferSize = media::AudioLatency::GetRtcBufferSize(
146 kHardwareSampleRate, kHardwareBufferSize);
147 SetupDevice(balancedLatencyHint);
148
149 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
150 EXPECT_EQ(webaudio_device_->framesPerBuffer(), balancedBufferSize);
151
152 webaudio_device_->start();
153 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
154 EXPECT_EQ(webaudio_device_->framesPerBuffer(), balancedBufferSize);
155
156 webaudio_device_->stop();
157 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
158 EXPECT_EQ(webaudio_device_->framesPerBuffer(), balancedBufferSize);
159
160 webaudio_device_->start();
161 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
162 EXPECT_EQ(webaudio_device_->framesPerBuffer(), balancedBufferSize);
163
164 webaudio_device_->stop();
165 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
166 EXPECT_EQ(webaudio_device_->framesPerBuffer(), balancedBufferSize);
167
168 blink::WebAudioLatencyHint playbackLatencyHint(
169 blink::WebAudioLatencyHint::kCategoryPlayback);
170 int playbackBufferSize =
171 media::AudioLatency::GetHighLatencyBufferSize(kHardwareSampleRate, 0);
172 SetupDevice(playbackLatencyHint);
173
174 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
175 EXPECT_EQ(webaudio_device_->framesPerBuffer(), playbackBufferSize);
176
177 webaudio_device_->start();
178 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
179 EXPECT_EQ(webaudio_device_->framesPerBuffer(), playbackBufferSize);
180
181 webaudio_device_->stop();
182 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
183 EXPECT_EQ(webaudio_device_->framesPerBuffer(), playbackBufferSize);
184
185 webaudio_device_->start();
186 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
187 EXPECT_EQ(webaudio_device_->framesPerBuffer(), playbackBufferSize);
188
189 webaudio_device_->stop();
190 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
191 EXPECT_EQ(webaudio_device_->framesPerBuffer(), playbackBufferSize);
192
193 #if !defined(OS_ANDROID)
194 EXPECT_GE(playbackBufferSize, balancedBufferSize);
195 EXPECT_GE(balancedBufferSize, interactiveBufferSize);
196 #endif
197 }
198
199 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698