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/renderer_webaudiodevice_impl_unittest.cc

Issue 2501863003: Support for AudioContextOptions latencyHint. (Closed)
Patch Set: Rebasing 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 "content/renderer/media/audio_device_factory.h"
9 #include "media/base/audio_capturer_source.h"
10 #include "media/base/mock_audio_renderer_sink.h"
11 #include "testing/gmock/include/gmock/gmock.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 using testing::_;
15
16 namespace content {
17
18 namespace {
19
20 const int kHardwareSampleRate = 44100;
21 const int kHardwareBufferSize = 128;
22 const int kRenderFrameId = 100;
23
24 int MockFrameIdFromCurrentContext() {
25 return kRenderFrameId;
26 }
27
28 media::AudioParameters MockGetOutputDeviceParameters(
29 int frame_id,
30 int session_id,
31 const std::string& device_id,
32 const url::Origin& security_origin) {
33 return media::AudioParameters(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
34 media::CHANNEL_LAYOUT_STEREO,
35 kHardwareSampleRate, 16, kHardwareBufferSize);
36 }
37
38 class RendererWebAudioDeviceImplUnderTest : public RendererWebAudioDeviceImpl {
39 public:
40 RendererWebAudioDeviceImplUnderTest(
41 media::ChannelLayout layout,
42 const blink::WebAudioLatencyHint& latency_hint,
43 blink::WebAudioDevice::RenderCallback* callback,
44 int session_id,
45 const url::Origin& security_origin)
46 : RendererWebAudioDeviceImpl(layout,
47 latency_hint,
48 callback,
49 session_id,
50 security_origin,
51 base::Bind(&MockGetOutputDeviceParameters),
52 base::Bind(&MockFrameIdFromCurrentContext)) {
53 }
54 };
55
56 } // namespace
57
58 class RendererWebAudioDeviceImplTest
59 : public blink::WebAudioDevice::RenderCallback,
60 public AudioDeviceFactory,
61 public testing::Test {
62 protected:
63 RendererWebAudioDeviceImplTest() {}
64
65 void SetupDevice(blink::WebAudioLatencyHint latencyHint) {
66 webaudio_device_.reset(new RendererWebAudioDeviceImplUnderTest(
67 media::CHANNEL_LAYOUT_MONO, latencyHint, this, 0, url::Origin()));
68 }
69
70 MOCK_METHOD1(CreateAudioCapturerSource,
71 scoped_refptr<media::AudioCapturerSource>(int));
72 MOCK_METHOD4(CreateFinalAudioRendererSink,
73 scoped_refptr<media::AudioRendererSink>(int,
74 int,
75 const std::string&,
76 const url::Origin&));
77 MOCK_METHOD5(
78 CreateSwitchableAudioRendererSink,
79 scoped_refptr<media::SwitchableAudioRendererSink>(SourceType,
80 int,
81 int,
82 const std::string&,
83 const url::Origin&));
84
85 scoped_refptr<media::AudioRendererSink> CreateAudioRendererSink(
86 SourceType source_type,
87 int render_frame_id,
88 int session_id,
89 const std::string& device_id,
90 const url::Origin& security_origin) {
91 mock_sink_ = new media::MockAudioRendererSink(
92 device_id, media::OUTPUT_DEVICE_STATUS_OK,
93 MockGetOutputDeviceParameters(render_frame_id, session_id, device_id,
94 security_origin));
95
96 EXPECT_CALL(*mock_sink_.get(), Start());
97 EXPECT_CALL(*mock_sink_.get(), Play());
98 EXPECT_CALL(*mock_sink_.get(), Stop());
99
100 return mock_sink_;
101 }
102
103 void TearDown() override {
104 webaudio_device_.reset();
105 mock_sink_ = nullptr;
106 }
107
108 std::unique_ptr<RendererWebAudioDeviceImpl> webaudio_device_;
109 scoped_refptr<media::MockAudioRendererSink> mock_sink_;
110 };
111
112 TEST_F(RendererWebAudioDeviceImplTest, TestLatencyHintValues) {
113 blink::WebAudioLatencyHint interactiveLatencyHint(
114 blink::WebAudioLatencyHint::kCategoryInteractive);
115 int interactiveBufferSize =
116 media::AudioLatency::GetInteractiveBufferSize(kHardwareBufferSize);
117 SetupDevice(interactiveLatencyHint);
118
119 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
120 EXPECT_EQ(webaudio_device_->framesPerBuffer(), interactiveBufferSize);
121
122 webaudio_device_->start();
123 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
124 EXPECT_EQ(webaudio_device_->framesPerBuffer(), interactiveBufferSize);
125
126 webaudio_device_->stop();
127 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
128 EXPECT_EQ(webaudio_device_->framesPerBuffer(), interactiveBufferSize);
129
130 webaudio_device_->start();
131 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
132 EXPECT_EQ(webaudio_device_->framesPerBuffer(), interactiveBufferSize);
133
134 webaudio_device_->stop();
135 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
136 EXPECT_EQ(webaudio_device_->framesPerBuffer(), interactiveBufferSize);
137
138 blink::WebAudioLatencyHint balancedLatencyHint(
139 blink::WebAudioLatencyHint::kCategoryBalanced);
140 int balancedBufferSize = media::AudioLatency::GetRtcBufferSize(
141 kHardwareSampleRate, kHardwareBufferSize);
142 SetupDevice(balancedLatencyHint);
143
144 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
145 EXPECT_EQ(webaudio_device_->framesPerBuffer(), balancedBufferSize);
146
147 webaudio_device_->start();
148 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
149 EXPECT_EQ(webaudio_device_->framesPerBuffer(), balancedBufferSize);
150
151 webaudio_device_->stop();
152 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
153 EXPECT_EQ(webaudio_device_->framesPerBuffer(), balancedBufferSize);
154
155 webaudio_device_->start();
156 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
157 EXPECT_EQ(webaudio_device_->framesPerBuffer(), balancedBufferSize);
158
159 webaudio_device_->stop();
160 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
161 EXPECT_EQ(webaudio_device_->framesPerBuffer(), balancedBufferSize);
162
163 blink::WebAudioLatencyHint playbackLatencyHint(
164 blink::WebAudioLatencyHint::kCategoryPlayback);
165 int playbackBufferSize = media::AudioLatency::GetHighLatencyBufferSize(
166 kHardwareSampleRate, kHardwareBufferSize);
167 SetupDevice(playbackLatencyHint);
168
169 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
170 EXPECT_EQ(webaudio_device_->framesPerBuffer(), playbackBufferSize);
171
172 webaudio_device_->start();
173 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
174 EXPECT_EQ(webaudio_device_->framesPerBuffer(), playbackBufferSize);
175
176 webaudio_device_->stop();
177 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
178 EXPECT_EQ(webaudio_device_->framesPerBuffer(), playbackBufferSize);
179
180 webaudio_device_->start();
181 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
182 EXPECT_EQ(webaudio_device_->framesPerBuffer(), playbackBufferSize);
183
184 webaudio_device_->stop();
185 EXPECT_EQ(webaudio_device_->sampleRate(), kHardwareSampleRate);
186 EXPECT_EQ(webaudio_device_->framesPerBuffer(), playbackBufferSize);
187
188 EXPECT_GE(playbackBufferSize, balancedBufferSize);
189 EXPECT_GE(balancedBufferSize, interactiveBufferSize);
190 }
191
192 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698