blob: 5fe27f6656d88c76c777f14e169c61662428566f [file] [log] [blame]
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +05301/*
2 * Copyright (C) 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Mikhail Naganov872d4a62023-03-09 18:19:01 -080017#define LOG_TAG "VtsHalEnvironmentalReverbTest"
18#include <android-base/logging.h>
Sneha Patil37f131c2024-05-09 15:11:19 +053019#include <audio_utils/power.h>
20#include <system/audio.h>
Sneha Patil9aa4f9f2024-05-29 12:23:30 +053021#include <numeric>
Mikhail Naganov872d4a62023-03-09 18:19:01 -080022
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +053023#include "EffectHelper.h"
24
25using namespace android;
Sneha Patil37f131c2024-05-09 15:11:19 +053026using namespace aidl::android::hardware::audio::effect;
27using aidl::android::hardware::audio::common::getChannelCount;
Jaideep Sharma74498412023-09-13 15:25:25 +053028using android::hardware::audio::common::testing::detail::TestExecutionTracer;
Sneha Patil37f131c2024-05-09 15:11:19 +053029using TagVectorPair = std::pair<EnvironmentalReverb::Tag, std::vector<int>>;
30using TagValuePair = std::pair<EnvironmentalReverb::Tag, int>;
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +053031
Sneha Patil37f131c2024-05-09 15:11:19 +053032static constexpr int kMaxRoomLevel = 0;
33static constexpr int kMinRoomLevel = -6000;
34static constexpr int kMinRoomHfLevel = -4000;
35static constexpr int kMinDecayTime = 0;
36static constexpr int kMinHfRatio = 100;
37static constexpr int kMinLevel = -6000;
38static constexpr int kMinDensity = 0;
39static constexpr int kMinDiffusion = 0;
40static constexpr int kMinDelay = 0;
41
42static const std::vector<TagVectorPair> kParamsIncreasingVector = {
Sneha Patil37f131c2024-05-09 15:11:19 +053043 {EnvironmentalReverb::roomLevelMb, {-3500, -2800, -2100, -1400, -700, 0}},
44 {EnvironmentalReverb::roomHfLevelMb, {-4000, -3200, -2400, -1600, -800, 0}},
45 {EnvironmentalReverb::decayTimeMs, {800, 1600, 2400, 3200, 4000}},
46 {EnvironmentalReverb::decayHfRatioPm, {100, 600, 1100, 1600, 2000}},
47 {EnvironmentalReverb::levelMb, {-3500, -2800, -2100, -1400, -700, 0}},
48};
49
Sneha Patil9aa4f9f2024-05-29 12:23:30 +053050static const TagVectorPair kDiffusionParam = {EnvironmentalReverb::diffusionPm,
51 {200, 400, 600, 800, 1000}};
52
Sneha Patil37f131c2024-05-09 15:11:19 +053053static const std::vector<TagValuePair> kParamsMinimumValue = {
54 {EnvironmentalReverb::roomLevelMb, kMinRoomLevel},
55 {EnvironmentalReverb::decayTimeMs, kMinDecayTime},
56 {EnvironmentalReverb::levelMb, kMinLevel}};
57
58std::vector<std::pair<std::shared_ptr<IFactory>, Descriptor>> kDescPair;
59
60using Maker = std::set<int> (*)();
61static const std::array<Maker, static_cast<int>(EnvironmentalReverb::bypass) + 1>
62 kTestValueSetMaker = {
63 nullptr,
64 []() -> std::set<int> {
65 return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
66 Range::environmentalReverb,
67 EnvironmentalReverb::roomLevelMb>(
68 kDescPair, EffectHelper::expandTestValueBasic<int>);
69 },
70 []() -> std::set<int> {
71 return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
72 Range::environmentalReverb,
73 EnvironmentalReverb::roomHfLevelMb>(
74 kDescPair, EffectHelper::expandTestValueBasic<int>);
75 },
76 []() -> std::set<int> {
77 return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
78 Range::environmentalReverb,
79 EnvironmentalReverb::decayTimeMs>(
80 kDescPair, EffectHelper::expandTestValueBasic<int>);
81 },
82 []() -> std::set<int> {
83 return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
84 Range::environmentalReverb,
85 EnvironmentalReverb::decayHfRatioPm>(
86 kDescPair, EffectHelper::expandTestValueBasic<int>);
87 },
88 nullptr,
89 nullptr,
90 []() -> std::set<int> {
91 return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
92 Range::environmentalReverb,
93 EnvironmentalReverb::levelMb>(
94 kDescPair, EffectHelper::expandTestValueBasic<int>);
95 },
96 []() -> std::set<int> {
97 return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
98 Range::environmentalReverb,
99 EnvironmentalReverb::delayMs>(
100 kDescPair, EffectHelper::expandTestValueBasic<int>);
101 },
102 []() -> std::set<int> {
103 return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
104 Range::environmentalReverb,
105 EnvironmentalReverb::diffusionPm>(
106 kDescPair, EffectHelper::expandTestValueBasic<int>);
107 },
108 []() -> std::set<int> {
109 return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
110 Range::environmentalReverb,
111 EnvironmentalReverb::densityPm>(
112 kDescPair, EffectHelper::expandTestValueBasic<int>);
113 },
114 []() -> std::set<int> {
115 return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
116 Range::environmentalReverb,
117 EnvironmentalReverb::bypass>(
118 kDescPair, EffectHelper::expandTestValueBasic<int>);
119 },
120};
121
122static std::vector<TagValuePair> buildSetAndGetTestParams() {
123 std::vector<TagValuePair> valueTag;
124 for (EnvironmentalReverb::Tag tag : ndk::enum_range<EnvironmentalReverb::Tag>()) {
125 std::set<int> values;
126 int intTag = static_cast<int>(tag);
127 if (intTag <= static_cast<int>(EnvironmentalReverb::bypass) &&
128 kTestValueSetMaker[intTag] != nullptr) {
129 values = kTestValueSetMaker[intTag]();
130 }
131
132 for (const auto& value : values) {
133 valueTag.push_back(std::make_pair(tag, value));
134 }
135 }
136
137 return valueTag;
138}
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530139/**
Sneha Patil37f131c2024-05-09 15:11:19 +0530140 * Tests do the following:
141 * - Testing parameter range supported by the effect. Range is verified with IEffect.getDescriptor()
142 * and range defined in the documentation.
143 * - Validating the effect by comparing the outputs of the supported parameters.
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530144 */
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530145
Sneha Patil37f131c2024-05-09 15:11:19 +0530146enum ParamName { DESCRIPTOR_INDEX, TAG_VALUE_PAIR };
147
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530148class EnvironmentalReverbHelper : public EffectHelper {
149 public:
150 EnvironmentalReverbHelper(std::pair<std::shared_ptr<IFactory>, Descriptor> pair) {
151 std::tie(mFactory, mDescriptor) = pair;
152 }
153
154 void SetUpReverb() {
155 ASSERT_NE(nullptr, mFactory);
156 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
157
158 Parameter::Specific specific = getDefaultParamSpecific();
Shunkai Yao61f9dd22024-05-08 22:34:36 +0000159 Parameter::Common common = createParamCommon(
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530160 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
Sneha Patil37f131c2024-05-09 15:11:19 +0530161 mFrameCount /* iFrameCount */, mFrameCount /* oFrameCount */);
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530162 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, specific, &ret, EX_NONE));
163 ASSERT_NE(nullptr, mEffect);
164 }
165
166 void TearDownReverb() {
167 ASSERT_NO_FATAL_FAILURE(close(mEffect));
168 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
169 }
170
171 Parameter::Specific getDefaultParamSpecific() {
Sneha Patil37f131c2024-05-09 15:11:19 +0530172 EnvironmentalReverb er =
173 EnvironmentalReverb::make<EnvironmentalReverb::roomLevelMb>(kMaxRoomLevel);
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530174 Parameter::Specific specific =
175 Parameter::Specific::make<Parameter::Specific::environmentalReverb>(er);
176 return specific;
177 }
178
Sneha Patil37f131c2024-05-09 15:11:19 +0530179 bool isParamValid(EnvironmentalReverb env) {
180 return isParameterValid<EnvironmentalReverb, Range::environmentalReverb>(env, mDescriptor);
181 }
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530182
Sneha Patil37f131c2024-05-09 15:11:19 +0530183 Parameter createParam(EnvironmentalReverb env) {
184 return Parameter::make<Parameter::specific>(
185 Parameter::Specific::make<Parameter::Specific::environmentalReverb>(env));
186 }
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530187
Sneha Patil37f131c2024-05-09 15:11:19 +0530188 void setAndVerifyParam(binder_exception_t expected, EnvironmentalReverb env,
189 EnvironmentalReverb::Tag tag) {
190 auto expectedParam = createParam(env);
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530191
Sneha Patil37f131c2024-05-09 15:11:19 +0530192 EXPECT_STATUS(expected, mEffect->setParameter(expectedParam)) << expectedParam.toString();
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530193
Sneha Patil37f131c2024-05-09 15:11:19 +0530194 if (expected == EX_NONE) {
195 auto erId = EnvironmentalReverb::Id::make<EnvironmentalReverb::Id::commonTag>(
196 EnvironmentalReverb::Tag(tag));
197
198 auto id = Parameter::Id::make<Parameter::Id::environmentalReverbTag>(erId);
199
200 // get parameter
201 Parameter getParam;
202 EXPECT_STATUS(EX_NONE, mEffect->getParameter(id, &getParam));
203 EXPECT_EQ(expectedParam, getParam) << "\nexpectedParam:" << expectedParam.toString()
204 << "\ngetParam:" << getParam.toString();
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530205 }
206 }
207
Sneha Patil37f131c2024-05-09 15:11:19 +0530208 bool isAuxiliary() {
209 return mDescriptor.common.flags.type ==
210 aidl::android::hardware::audio::effect::Flags::Type::AUXILIARY;
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530211 }
212
Sneha Patil37f131c2024-05-09 15:11:19 +0530213 float computeOutputEnergy(const std::vector<float>& input, std::vector<float> output) {
214 if (!isAuxiliary()) {
215 // Extract auxiliary output
216 for (size_t i = 0; i < output.size(); i++) {
217 output[i] -= input[i];
218 }
219 }
220 return audio_utils_compute_energy_mono(output.data(), AUDIO_FORMAT_PCM_FLOAT,
221 output.size());
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530222 }
223
Sneha Patil37f131c2024-05-09 15:11:19 +0530224 void generateSineWaveInput(std::vector<float>& input) {
225 int frequency = 1000;
226 size_t kSamplingFrequency = 44100;
227 for (size_t i = 0; i < input.size(); i++) {
228 input[i] = sin(2 * M_PI * frequency * i / kSamplingFrequency);
229 }
230 }
231 using Maker = EnvironmentalReverb (*)(int);
232
233 static constexpr std::array<Maker, static_cast<int>(EnvironmentalReverb::bypass) + 1>
234 kEnvironmentalReverbParamMaker = {
235 nullptr,
236 [](int value) -> EnvironmentalReverb {
237 return EnvironmentalReverb::make<EnvironmentalReverb::roomLevelMb>(value);
238 },
239 [](int value) -> EnvironmentalReverb {
240 return EnvironmentalReverb::make<EnvironmentalReverb::roomHfLevelMb>(value);
241 },
242 [](int value) -> EnvironmentalReverb {
243 return EnvironmentalReverb::make<EnvironmentalReverb::decayTimeMs>(value);
244 },
245 [](int value) -> EnvironmentalReverb {
246 return EnvironmentalReverb::make<EnvironmentalReverb::decayHfRatioPm>(
247 value);
248 },
249 nullptr,
250 nullptr,
251 [](int value) -> EnvironmentalReverb {
252 return EnvironmentalReverb::make<EnvironmentalReverb::levelMb>(value);
253 },
254 [](int value) -> EnvironmentalReverb {
255 return EnvironmentalReverb::make<EnvironmentalReverb::delayMs>(value);
256 },
257 [](int value) -> EnvironmentalReverb {
258 return EnvironmentalReverb::make<EnvironmentalReverb::diffusionPm>(value);
259 },
260 [](int value) -> EnvironmentalReverb {
261 return EnvironmentalReverb::make<EnvironmentalReverb::densityPm>(value);
262 },
263 [](int value) -> EnvironmentalReverb {
264 return EnvironmentalReverb::make<EnvironmentalReverb::bypass>(value);
265 }};
266
267 void createEnvParam(EnvironmentalReverb::Tag tag, int paramValue) {
268 int intTag = static_cast<int>(tag);
269 if (intTag <= static_cast<int>(EnvironmentalReverb::bypass) &&
270 kEnvironmentalReverbParamMaker[intTag] != NULL) {
271 mEnvParam = kEnvironmentalReverbParamMaker[intTag](paramValue);
272 } else {
273 GTEST_SKIP() << "Invalid parameter, skipping the test\n";
274 }
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530275 }
276
Sneha Patil37f131c2024-05-09 15:11:19 +0530277 void setParameterAndProcess(std::vector<float>& input, std::vector<float>& output, int val,
278 EnvironmentalReverb::Tag tag) {
279 createEnvParam(tag, val);
280 if (isParamValid(mEnvParam)) {
281 ASSERT_NO_FATAL_FAILURE(setAndVerifyParam(EX_NONE, mEnvParam, tag));
282 ASSERT_NO_FATAL_FAILURE(processAndWriteToOutput(input, output, mEffect, &ret));
283 }
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530284 }
285
Sneha Patil37f131c2024-05-09 15:11:19 +0530286 static constexpr int kSamplingFrequency = 44100;
287 static constexpr int kDurationMilliSec = 500;
288 static constexpr int kBufferSize = kSamplingFrequency * kDurationMilliSec / 1000;
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530289
Sneha Patil37f131c2024-05-09 15:11:19 +0530290 int mStereoChannelCount =
291 getChannelCount(AudioChannelLayout::make<AudioChannelLayout::layoutMask>(
292 AudioChannelLayout::LAYOUT_STEREO));
293 int mFrameCount = kBufferSize / mStereoChannelCount;
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530294
Sneha Patil37f131c2024-05-09 15:11:19 +0530295 std::shared_ptr<IFactory> mFactory;
296 std::shared_ptr<IEffect> mEffect;
297 IEffect::OpenEffectReturn ret;
298 Descriptor mDescriptor;
299 EnvironmentalReverb mEnvParam;
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530300};
301
Sneha Patil37f131c2024-05-09 15:11:19 +0530302class EnvironmentalReverbParamTest
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530303 : public ::testing::TestWithParam<
Sneha Patil37f131c2024-05-09 15:11:19 +0530304 std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, TagValuePair>>,
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530305 public EnvironmentalReverbHelper {
306 public:
Sneha Patil37f131c2024-05-09 15:11:19 +0530307 EnvironmentalReverbParamTest()
308 : EnvironmentalReverbHelper(std::get<DESCRIPTOR_INDEX>(GetParam())) {
309 std::tie(mTag, mParamValue) = std::get<TAG_VALUE_PAIR>(GetParam());
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530310 }
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530311 void SetUp() override { SetUpReverb(); }
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530312 void TearDown() override { TearDownReverb(); }
Sneha Patil37f131c2024-05-09 15:11:19 +0530313
314 EnvironmentalReverb::Tag mTag;
315 int mParamValue;
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530316};
317
Sneha Patil37f131c2024-05-09 15:11:19 +0530318TEST_P(EnvironmentalReverbParamTest, SetAndGetParameter) {
319 createEnvParam(mTag, mParamValue);
320 ASSERT_NO_FATAL_FAILURE(setAndVerifyParam(
321 isParamValid(mEnvParam) ? EX_NONE : EX_ILLEGAL_ARGUMENT, mEnvParam, mTag));
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530322}
323
324INSTANTIATE_TEST_SUITE_P(
Sneha Patil37f131c2024-05-09 15:11:19 +0530325 EnvironmentalReverbTest, EnvironmentalReverbParamTest,
Shunkai Yao0a0c45e2023-02-13 17:41:11 +0000326 ::testing::Combine(
327 testing::ValuesIn(kDescPair = EffectFactoryHelper::getAllEffectDescriptors(
Shunkai Yaof8be1ac2023-03-06 18:41:27 +0000328 IFactory::descriptor, getEffectTypeUuidEnvReverb())),
Sneha Patil37f131c2024-05-09 15:11:19 +0530329 testing::ValuesIn(buildSetAndGetTestParams())),
330 [](const testing::TestParamInfo<EnvironmentalReverbParamTest::ParamType>& info) {
331 auto descriptor = std::get<DESCRIPTOR_INDEX>(info.param).second;
332 auto tag = std::get<TAG_VALUE_PAIR>(info.param).first;
333 auto val = std::get<TAG_VALUE_PAIR>(info.param).second;
334 std::string name =
335 getPrefix(descriptor) + "_Tag_" + toString(tag) + std::to_string(val);
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530336 std::replace_if(
337 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
338 return name;
339 });
Sneha Patil37f131c2024-05-09 15:11:19 +0530340GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbParamTest);
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530341
Sneha Patil37f131c2024-05-09 15:11:19 +0530342class EnvironmentalReverbDataTest
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530343 : public ::testing::TestWithParam<
Sneha Patil37f131c2024-05-09 15:11:19 +0530344 std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, TagVectorPair>>,
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530345 public EnvironmentalReverbHelper {
346 public:
Sneha Patil37f131c2024-05-09 15:11:19 +0530347 EnvironmentalReverbDataTest()
348 : EnvironmentalReverbHelper(std::get<DESCRIPTOR_INDEX>(GetParam())) {
349 std::tie(mTag, mParamValues) = std::get<TAG_VALUE_PAIR>(GetParam());
350 mInput.resize(kBufferSize);
351 generateSineWaveInput(mInput);
352 }
353 void SetUp() override { SetUpReverb(); }
354 void TearDown() override { TearDownReverb(); }
355
356 void assertEnergyIncreasingWithParameter(bool bypass) {
357 createEnvParam(EnvironmentalReverb::bypass, bypass);
358 ASSERT_NO_FATAL_FAILURE(setAndVerifyParam(EX_NONE, mEnvParam, EnvironmentalReverb::bypass));
359 float baseEnergy = 0;
360 for (int val : mParamValues) {
361 std::vector<float> output(kBufferSize);
362 setParameterAndProcess(mInput, output, val, mTag);
363 float energy = computeOutputEnergy(mInput, output);
364 ASSERT_GT(energy, baseEnergy);
365 baseEnergy = energy;
366 }
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530367 }
368
Sneha Patil37f131c2024-05-09 15:11:19 +0530369 void assertZeroEnergyWithBypass(bool bypass) {
370 createEnvParam(EnvironmentalReverb::bypass, bypass);
371 ASSERT_NO_FATAL_FAILURE(setAndVerifyParam(EX_NONE, mEnvParam, EnvironmentalReverb::bypass));
372 for (int val : mParamValues) {
373 std::vector<float> output(kBufferSize);
374 setParameterAndProcess(mInput, output, val, mTag);
375 float energy = computeOutputEnergy(mInput, output);
376 ASSERT_EQ(energy, 0);
377 }
378 }
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530379
Sneha Patil37f131c2024-05-09 15:11:19 +0530380 EnvironmentalReverb::Tag mTag;
381 std::vector<int> mParamValues;
382 std::vector<float> mInput;
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530383};
384
Sneha Patil37f131c2024-05-09 15:11:19 +0530385TEST_P(EnvironmentalReverbDataTest, IncreasingParamValue) {
386 assertEnergyIncreasingWithParameter(false);
387}
388
389TEST_P(EnvironmentalReverbDataTest, WithBypassEnabled) {
390 assertZeroEnergyWithBypass(true);
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530391}
392
393INSTANTIATE_TEST_SUITE_P(
Sneha Patil37f131c2024-05-09 15:11:19 +0530394 EnvironmentalReverbTest, EnvironmentalReverbDataTest,
395 ::testing::Combine(
396 testing::ValuesIn(kDescPair = EffectFactoryHelper::getAllEffectDescriptors(
397 IFactory::descriptor, getEffectTypeUuidEnvReverb())),
398 testing::ValuesIn(kParamsIncreasingVector)),
399 [](const testing::TestParamInfo<EnvironmentalReverbDataTest::ParamType>& info) {
400 auto descriptor = std::get<DESCRIPTOR_INDEX>(info.param).second;
401 auto tag = std::get<TAG_VALUE_PAIR>(info.param).first;
402 std::string name = getPrefix(descriptor) + "_Tag_" + toString(tag);
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530403 return name;
404 });
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530405
Sneha Patil37f131c2024-05-09 15:11:19 +0530406GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbDataTest);
407
408class EnvironmentalReverbMinimumParamTest
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530409 : public ::testing::TestWithParam<
Sneha Patil37f131c2024-05-09 15:11:19 +0530410 std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, TagValuePair>>,
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530411 public EnvironmentalReverbHelper {
412 public:
Sneha Patil37f131c2024-05-09 15:11:19 +0530413 EnvironmentalReverbMinimumParamTest()
414 : EnvironmentalReverbHelper(std::get<DESCRIPTOR_INDEX>(GetParam())) {
415 std::tie(mTag, mValue) = std::get<TAG_VALUE_PAIR>(GetParam());
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530416 }
Sneha Patil37f131c2024-05-09 15:11:19 +0530417 void SetUp() override {
418 SetUpReverb();
419 createEnvParam(EnvironmentalReverb::roomLevelMb, kMinRoomLevel);
420 ASSERT_NO_FATAL_FAILURE(
421 setAndVerifyParam(EX_NONE, mEnvParam, EnvironmentalReverb::roomLevelMb));
422 }
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530423 void TearDown() override { TearDownReverb(); }
Sneha Patil37f131c2024-05-09 15:11:19 +0530424
425 EnvironmentalReverb::Tag mTag;
426 int mValue;
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530427};
428
Sneha Patil37f131c2024-05-09 15:11:19 +0530429TEST_P(EnvironmentalReverbMinimumParamTest, MinimumValueTest) {
430 std::vector<float> input(kBufferSize);
431 generateSineWaveInput(input);
432 std::vector<float> output(kBufferSize);
433 setParameterAndProcess(input, output, mValue, mTag);
434 float energy = computeOutputEnergy(input, output);
435 // No Auxiliary output for minimum param values
436 ASSERT_EQ(energy, 0);
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530437}
438
439INSTANTIATE_TEST_SUITE_P(
Sneha Patil37f131c2024-05-09 15:11:19 +0530440 EnvironmentalReverbTest, EnvironmentalReverbMinimumParamTest,
441 ::testing::Combine(
442 testing::ValuesIn(kDescPair = EffectFactoryHelper::getAllEffectDescriptors(
443 IFactory::descriptor, getEffectTypeUuidEnvReverb())),
444 testing::ValuesIn(kParamsMinimumValue)),
445 [](const testing::TestParamInfo<EnvironmentalReverbMinimumParamTest::ParamType>& info) {
446 auto descriptor = std::get<DESCRIPTOR_INDEX>(info.param).second;
447 auto tag = std::get<TAG_VALUE_PAIR>(info.param).first;
448 auto val = std::get<TAG_VALUE_PAIR>(info.param).second;
449 std::string name =
450 getPrefix(descriptor) + "_Tag_" + toString(tag) + std::to_string(val);
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530451 std::replace_if(
452 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
453 return name;
454 });
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530455
Sneha Patil37f131c2024-05-09 15:11:19 +0530456GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbMinimumParamTest);
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530457
Sneha Patil9aa4f9f2024-05-29 12:23:30 +0530458class EnvironmentalReverbDiffusionTest
459 : public ::testing::TestWithParam<
460 std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, TagVectorPair>>,
461 public EnvironmentalReverbHelper {
462 public:
463 EnvironmentalReverbDiffusionTest()
464 : EnvironmentalReverbHelper(std::get<DESCRIPTOR_INDEX>(GetParam())) {
465 std::tie(mTag, mParamValues) = std::get<TAG_VALUE_PAIR>(GetParam());
466 mInput.resize(kBufferSize);
467 generateSineWaveInput(mInput);
468 }
469 void SetUp() override { SetUpReverb(); }
470 void TearDown() override { TearDownReverb(); }
471
472 float getMean(std::vector<float>& buffer) {
473 return std::accumulate(buffer.begin(), buffer.end(), 0.0) / buffer.size();
474 }
475
476 float getVariance(std::vector<float>& buffer) {
477 if (isAuxiliary()) {
478 for (size_t i = 0; i < buffer.size(); i++) {
479 buffer[i] += mInput[i];
480 }
481 }
482 float mean = getMean(buffer);
483 float squaredDeltas =
484 std::accumulate(buffer.begin(), buffer.end(), 0.0,
485 [mean](float a, float b) { return a + pow(b - mean, 2); });
486
487 return squaredDeltas / buffer.size();
488 }
489
490 EnvironmentalReverb::Tag mTag;
491 std::vector<int> mParamValues;
492 std::vector<float> mInput;
493};
494
495TEST_P(EnvironmentalReverbDiffusionTest, DecreasingVarianceTest) {
496 std::vector<float> baseOutput(kBufferSize);
497 setParameterAndProcess(mInput, baseOutput, kMinDiffusion, mTag);
498 ASSERT_EQ(baseOutput.size(),
499 static_cast<size_t>(mFrameCount) * static_cast<size_t>(mStereoChannelCount));
500 float baseVariance = getVariance(baseOutput);
501 for (int value : mParamValues) {
502 std::vector<float> output(kBufferSize);
503 setParameterAndProcess(mInput, output, value, mTag);
504 ASSERT_EQ(output.size(),
505 static_cast<size_t>(mFrameCount) * static_cast<size_t>(mStereoChannelCount));
506 float variance = getVariance(output);
507 ASSERT_LT(variance, baseVariance);
508 baseVariance = variance;
509 }
510}
511
512INSTANTIATE_TEST_SUITE_P(
513 EnvironmentalReverbTest, EnvironmentalReverbDiffusionTest,
514 ::testing::Combine(
515 testing::ValuesIn(kDescPair = EffectFactoryHelper::getAllEffectDescriptors(
516 IFactory::descriptor, getEffectTypeUuidEnvReverb())),
517 testing::Values(kDiffusionParam)),
518 [](const testing::TestParamInfo<EnvironmentalReverbDiffusionTest::ParamType>& info) {
519 auto descriptor = std::get<DESCRIPTOR_INDEX>(info.param).second;
520 auto tag = std::get<TAG_VALUE_PAIR>(info.param).first;
521 std::string name = getPrefix(descriptor) + "_Tag_" + toString(tag);
522 return name;
523 });
524
525GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbDiffusionTest);
526
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530527int main(int argc, char** argv) {
528 ::testing::InitGoogleTest(&argc, argv);
Jaideep Sharma74498412023-09-13 15:25:25 +0530529 ::testing::UnitTest::GetInstance()->listeners().Append(new TestExecutionTracer());
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530530 ABinderProcess_setThreadPoolMaxThreadCount(1);
531 ABinderProcess_startThreadPool();
532 return RUN_ALL_TESTS();
533}