blob: 82a194e287ce0c00cfaea78c0093c48a5d53da48 [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>
Sneha Patil8ff60352024-06-21 12:47:30 +000020#include <audio_utils/primitives.h>
Sneha Patil37f131c2024-05-09 15:11:19 +053021#include <system/audio.h>
Sneha Patil9aa4f9f2024-05-29 12:23:30 +053022#include <numeric>
Mikhail Naganov872d4a62023-03-09 18:19:01 -080023
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +053024#include "EffectHelper.h"
25
26using namespace android;
Sneha Patil37f131c2024-05-09 15:11:19 +053027using namespace aidl::android::hardware::audio::effect;
28using aidl::android::hardware::audio::common::getChannelCount;
Jaideep Sharma74498412023-09-13 15:25:25 +053029using android::hardware::audio::common::testing::detail::TestExecutionTracer;
Sneha Patil37f131c2024-05-09 15:11:19 +053030using TagVectorPair = std::pair<EnvironmentalReverb::Tag, std::vector<int>>;
31using TagValuePair = std::pair<EnvironmentalReverb::Tag, int>;
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +053032
Sneha Patil37f131c2024-05-09 15:11:19 +053033static constexpr int kMaxRoomLevel = 0;
34static constexpr int kMinRoomLevel = -6000;
35static constexpr int kMinRoomHfLevel = -4000;
36static constexpr int kMinDecayTime = 0;
37static constexpr int kMinHfRatio = 100;
38static constexpr int kMinLevel = -6000;
39static constexpr int kMinDensity = 0;
40static constexpr int kMinDiffusion = 0;
41static constexpr int kMinDelay = 0;
42
43static const std::vector<TagVectorPair> kParamsIncreasingVector = {
Sneha Patil37f131c2024-05-09 15:11:19 +053044 {EnvironmentalReverb::roomLevelMb, {-3500, -2800, -2100, -1400, -700, 0}},
45 {EnvironmentalReverb::roomHfLevelMb, {-4000, -3200, -2400, -1600, -800, 0}},
46 {EnvironmentalReverb::decayTimeMs, {800, 1600, 2400, 3200, 4000}},
47 {EnvironmentalReverb::decayHfRatioPm, {100, 600, 1100, 1600, 2000}},
48 {EnvironmentalReverb::levelMb, {-3500, -2800, -2100, -1400, -700, 0}},
49};
50
Sneha Patil9aa4f9f2024-05-29 12:23:30 +053051static const TagVectorPair kDiffusionParam = {EnvironmentalReverb::diffusionPm,
52 {200, 400, 600, 800, 1000}};
Sneha Patil8ff60352024-06-21 12:47:30 +000053static const TagVectorPair kDensityParam = {EnvironmentalReverb::densityPm,
54 {0, 200, 400, 600, 800, 1000}};
Sneha Patil9aa4f9f2024-05-29 12:23:30 +053055
Sneha Patil37f131c2024-05-09 15:11:19 +053056static const std::vector<TagValuePair> kParamsMinimumValue = {
57 {EnvironmentalReverb::roomLevelMb, kMinRoomLevel},
58 {EnvironmentalReverb::decayTimeMs, kMinDecayTime},
59 {EnvironmentalReverb::levelMb, kMinLevel}};
60
61std::vector<std::pair<std::shared_ptr<IFactory>, Descriptor>> kDescPair;
62
63using Maker = std::set<int> (*)();
64static const std::array<Maker, static_cast<int>(EnvironmentalReverb::bypass) + 1>
65 kTestValueSetMaker = {
66 nullptr,
67 []() -> std::set<int> {
68 return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
69 Range::environmentalReverb,
70 EnvironmentalReverb::roomLevelMb>(
71 kDescPair, EffectHelper::expandTestValueBasic<int>);
72 },
73 []() -> std::set<int> {
74 return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
75 Range::environmentalReverb,
76 EnvironmentalReverb::roomHfLevelMb>(
77 kDescPair, EffectHelper::expandTestValueBasic<int>);
78 },
79 []() -> std::set<int> {
80 return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
81 Range::environmentalReverb,
82 EnvironmentalReverb::decayTimeMs>(
83 kDescPair, EffectHelper::expandTestValueBasic<int>);
84 },
85 []() -> std::set<int> {
86 return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
87 Range::environmentalReverb,
88 EnvironmentalReverb::decayHfRatioPm>(
89 kDescPair, EffectHelper::expandTestValueBasic<int>);
90 },
91 nullptr,
92 nullptr,
93 []() -> std::set<int> {
94 return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
95 Range::environmentalReverb,
96 EnvironmentalReverb::levelMb>(
97 kDescPair, EffectHelper::expandTestValueBasic<int>);
98 },
99 []() -> std::set<int> {
100 return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
101 Range::environmentalReverb,
102 EnvironmentalReverb::delayMs>(
103 kDescPair, EffectHelper::expandTestValueBasic<int>);
104 },
105 []() -> std::set<int> {
106 return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
107 Range::environmentalReverb,
108 EnvironmentalReverb::diffusionPm>(
109 kDescPair, EffectHelper::expandTestValueBasic<int>);
110 },
111 []() -> std::set<int> {
112 return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
113 Range::environmentalReverb,
114 EnvironmentalReverb::densityPm>(
115 kDescPair, EffectHelper::expandTestValueBasic<int>);
116 },
117 []() -> std::set<int> {
118 return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
119 Range::environmentalReverb,
120 EnvironmentalReverb::bypass>(
121 kDescPair, EffectHelper::expandTestValueBasic<int>);
122 },
123};
124
125static std::vector<TagValuePair> buildSetAndGetTestParams() {
126 std::vector<TagValuePair> valueTag;
127 for (EnvironmentalReverb::Tag tag : ndk::enum_range<EnvironmentalReverb::Tag>()) {
128 std::set<int> values;
129 int intTag = static_cast<int>(tag);
130 if (intTag <= static_cast<int>(EnvironmentalReverb::bypass) &&
131 kTestValueSetMaker[intTag] != nullptr) {
132 values = kTestValueSetMaker[intTag]();
133 }
134
135 for (const auto& value : values) {
136 valueTag.push_back(std::make_pair(tag, value));
137 }
138 }
139
140 return valueTag;
141}
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530142/**
Sneha Patil37f131c2024-05-09 15:11:19 +0530143 * Tests do the following:
144 * - Testing parameter range supported by the effect. Range is verified with IEffect.getDescriptor()
145 * and range defined in the documentation.
146 * - Validating the effect by comparing the outputs of the supported parameters.
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530147 */
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530148
Sneha Patil37f131c2024-05-09 15:11:19 +0530149enum ParamName { DESCRIPTOR_INDEX, TAG_VALUE_PAIR };
150
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530151class EnvironmentalReverbHelper : public EffectHelper {
152 public:
153 EnvironmentalReverbHelper(std::pair<std::shared_ptr<IFactory>, Descriptor> pair) {
154 std::tie(mFactory, mDescriptor) = pair;
155 }
156
157 void SetUpReverb() {
158 ASSERT_NE(nullptr, mFactory);
159 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
160
161 Parameter::Specific specific = getDefaultParamSpecific();
Shunkai Yao61f9dd22024-05-08 22:34:36 +0000162 Parameter::Common common = createParamCommon(
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530163 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
Sneha Patil37f131c2024-05-09 15:11:19 +0530164 mFrameCount /* iFrameCount */, mFrameCount /* oFrameCount */);
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530165 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, specific, &ret, EX_NONE));
166 ASSERT_NE(nullptr, mEffect);
167 }
168
169 void TearDownReverb() {
170 ASSERT_NO_FATAL_FAILURE(close(mEffect));
171 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
172 }
173
174 Parameter::Specific getDefaultParamSpecific() {
Sneha Patil37f131c2024-05-09 15:11:19 +0530175 EnvironmentalReverb er =
176 EnvironmentalReverb::make<EnvironmentalReverb::roomLevelMb>(kMaxRoomLevel);
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530177 Parameter::Specific specific =
178 Parameter::Specific::make<Parameter::Specific::environmentalReverb>(er);
179 return specific;
180 }
181
Sneha Patil37f131c2024-05-09 15:11:19 +0530182 bool isParamValid(EnvironmentalReverb env) {
183 return isParameterValid<EnvironmentalReverb, Range::environmentalReverb>(env, mDescriptor);
184 }
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530185
Sneha Patil37f131c2024-05-09 15:11:19 +0530186 Parameter createParam(EnvironmentalReverb env) {
187 return Parameter::make<Parameter::specific>(
188 Parameter::Specific::make<Parameter::Specific::environmentalReverb>(env));
189 }
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530190
Sneha Patil37f131c2024-05-09 15:11:19 +0530191 void setAndVerifyParam(binder_exception_t expected, EnvironmentalReverb env,
192 EnvironmentalReverb::Tag tag) {
193 auto expectedParam = createParam(env);
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530194
Sneha Patil37f131c2024-05-09 15:11:19 +0530195 EXPECT_STATUS(expected, mEffect->setParameter(expectedParam)) << expectedParam.toString();
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530196
Sneha Patil37f131c2024-05-09 15:11:19 +0530197 if (expected == EX_NONE) {
198 auto erId = EnvironmentalReverb::Id::make<EnvironmentalReverb::Id::commonTag>(
199 EnvironmentalReverb::Tag(tag));
200
201 auto id = Parameter::Id::make<Parameter::Id::environmentalReverbTag>(erId);
202
203 // get parameter
204 Parameter getParam;
205 EXPECT_STATUS(EX_NONE, mEffect->getParameter(id, &getParam));
206 EXPECT_EQ(expectedParam, getParam) << "\nexpectedParam:" << expectedParam.toString()
207 << "\ngetParam:" << getParam.toString();
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530208 }
209 }
210
Sneha Patil37f131c2024-05-09 15:11:19 +0530211 bool isAuxiliary() {
212 return mDescriptor.common.flags.type ==
213 aidl::android::hardware::audio::effect::Flags::Type::AUXILIARY;
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530214 }
215
Sneha Patil37f131c2024-05-09 15:11:19 +0530216 float computeOutputEnergy(const std::vector<float>& input, std::vector<float> output) {
217 if (!isAuxiliary()) {
218 // Extract auxiliary output
219 for (size_t i = 0; i < output.size(); i++) {
220 output[i] -= input[i];
221 }
222 }
223 return audio_utils_compute_energy_mono(output.data(), AUDIO_FORMAT_PCM_FLOAT,
224 output.size());
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530225 }
226
Sneha Patil37f131c2024-05-09 15:11:19 +0530227 void generateSineWaveInput(std::vector<float>& input) {
228 int frequency = 1000;
229 size_t kSamplingFrequency = 44100;
230 for (size_t i = 0; i < input.size(); i++) {
231 input[i] = sin(2 * M_PI * frequency * i / kSamplingFrequency);
232 }
233 }
234 using Maker = EnvironmentalReverb (*)(int);
235
236 static constexpr std::array<Maker, static_cast<int>(EnvironmentalReverb::bypass) + 1>
237 kEnvironmentalReverbParamMaker = {
238 nullptr,
239 [](int value) -> EnvironmentalReverb {
240 return EnvironmentalReverb::make<EnvironmentalReverb::roomLevelMb>(value);
241 },
242 [](int value) -> EnvironmentalReverb {
243 return EnvironmentalReverb::make<EnvironmentalReverb::roomHfLevelMb>(value);
244 },
245 [](int value) -> EnvironmentalReverb {
246 return EnvironmentalReverb::make<EnvironmentalReverb::decayTimeMs>(value);
247 },
248 [](int value) -> EnvironmentalReverb {
249 return EnvironmentalReverb::make<EnvironmentalReverb::decayHfRatioPm>(
250 value);
251 },
252 nullptr,
253 nullptr,
254 [](int value) -> EnvironmentalReverb {
255 return EnvironmentalReverb::make<EnvironmentalReverb::levelMb>(value);
256 },
257 [](int value) -> EnvironmentalReverb {
258 return EnvironmentalReverb::make<EnvironmentalReverb::delayMs>(value);
259 },
260 [](int value) -> EnvironmentalReverb {
261 return EnvironmentalReverb::make<EnvironmentalReverb::diffusionPm>(value);
262 },
263 [](int value) -> EnvironmentalReverb {
264 return EnvironmentalReverb::make<EnvironmentalReverb::densityPm>(value);
265 },
266 [](int value) -> EnvironmentalReverb {
267 return EnvironmentalReverb::make<EnvironmentalReverb::bypass>(value);
268 }};
269
270 void createEnvParam(EnvironmentalReverb::Tag tag, int paramValue) {
271 int intTag = static_cast<int>(tag);
272 if (intTag <= static_cast<int>(EnvironmentalReverb::bypass) &&
273 kEnvironmentalReverbParamMaker[intTag] != NULL) {
274 mEnvParam = kEnvironmentalReverbParamMaker[intTag](paramValue);
275 } else {
276 GTEST_SKIP() << "Invalid parameter, skipping the test\n";
277 }
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530278 }
279
Sneha Patil37f131c2024-05-09 15:11:19 +0530280 void setParameterAndProcess(std::vector<float>& input, std::vector<float>& output, int val,
281 EnvironmentalReverb::Tag tag) {
282 createEnvParam(tag, val);
283 if (isParamValid(mEnvParam)) {
284 ASSERT_NO_FATAL_FAILURE(setAndVerifyParam(EX_NONE, mEnvParam, tag));
285 ASSERT_NO_FATAL_FAILURE(processAndWriteToOutput(input, output, mEffect, &ret));
286 }
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530287 }
288
Sneha Patil37f131c2024-05-09 15:11:19 +0530289 static constexpr int kSamplingFrequency = 44100;
290 static constexpr int kDurationMilliSec = 500;
291 static constexpr int kBufferSize = kSamplingFrequency * kDurationMilliSec / 1000;
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530292
Sneha Patil37f131c2024-05-09 15:11:19 +0530293 int mStereoChannelCount =
294 getChannelCount(AudioChannelLayout::make<AudioChannelLayout::layoutMask>(
295 AudioChannelLayout::LAYOUT_STEREO));
296 int mFrameCount = kBufferSize / mStereoChannelCount;
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530297
Sneha Patil37f131c2024-05-09 15:11:19 +0530298 std::shared_ptr<IFactory> mFactory;
299 std::shared_ptr<IEffect> mEffect;
300 IEffect::OpenEffectReturn ret;
301 Descriptor mDescriptor;
302 EnvironmentalReverb mEnvParam;
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530303};
304
Sneha Patil37f131c2024-05-09 15:11:19 +0530305class EnvironmentalReverbParamTest
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530306 : public ::testing::TestWithParam<
Sneha Patil37f131c2024-05-09 15:11:19 +0530307 std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, TagValuePair>>,
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530308 public EnvironmentalReverbHelper {
309 public:
Sneha Patil37f131c2024-05-09 15:11:19 +0530310 EnvironmentalReverbParamTest()
311 : EnvironmentalReverbHelper(std::get<DESCRIPTOR_INDEX>(GetParam())) {
312 std::tie(mTag, mParamValue) = std::get<TAG_VALUE_PAIR>(GetParam());
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530313 }
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530314 void SetUp() override { SetUpReverb(); }
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530315 void TearDown() override { TearDownReverb(); }
Sneha Patil37f131c2024-05-09 15:11:19 +0530316
317 EnvironmentalReverb::Tag mTag;
318 int mParamValue;
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530319};
320
Sneha Patil37f131c2024-05-09 15:11:19 +0530321TEST_P(EnvironmentalReverbParamTest, SetAndGetParameter) {
322 createEnvParam(mTag, mParamValue);
323 ASSERT_NO_FATAL_FAILURE(setAndVerifyParam(
324 isParamValid(mEnvParam) ? EX_NONE : EX_ILLEGAL_ARGUMENT, mEnvParam, mTag));
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530325}
326
327INSTANTIATE_TEST_SUITE_P(
Sneha Patil37f131c2024-05-09 15:11:19 +0530328 EnvironmentalReverbTest, EnvironmentalReverbParamTest,
Shunkai Yao0a0c45e2023-02-13 17:41:11 +0000329 ::testing::Combine(
330 testing::ValuesIn(kDescPair = EffectFactoryHelper::getAllEffectDescriptors(
Shunkai Yaof8be1ac2023-03-06 18:41:27 +0000331 IFactory::descriptor, getEffectTypeUuidEnvReverb())),
Sneha Patil37f131c2024-05-09 15:11:19 +0530332 testing::ValuesIn(buildSetAndGetTestParams())),
333 [](const testing::TestParamInfo<EnvironmentalReverbParamTest::ParamType>& info) {
334 auto descriptor = std::get<DESCRIPTOR_INDEX>(info.param).second;
335 auto tag = std::get<TAG_VALUE_PAIR>(info.param).first;
336 auto val = std::get<TAG_VALUE_PAIR>(info.param).second;
337 std::string name =
338 getPrefix(descriptor) + "_Tag_" + toString(tag) + std::to_string(val);
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530339 std::replace_if(
340 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
341 return name;
342 });
Sneha Patil37f131c2024-05-09 15:11:19 +0530343GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbParamTest);
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530344
Sneha Patil37f131c2024-05-09 15:11:19 +0530345class EnvironmentalReverbDataTest
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530346 : public ::testing::TestWithParam<
Sneha Patil37f131c2024-05-09 15:11:19 +0530347 std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, TagVectorPair>>,
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530348 public EnvironmentalReverbHelper {
349 public:
Sneha Patil37f131c2024-05-09 15:11:19 +0530350 EnvironmentalReverbDataTest()
351 : EnvironmentalReverbHelper(std::get<DESCRIPTOR_INDEX>(GetParam())) {
352 std::tie(mTag, mParamValues) = std::get<TAG_VALUE_PAIR>(GetParam());
353 mInput.resize(kBufferSize);
354 generateSineWaveInput(mInput);
355 }
356 void SetUp() override { SetUpReverb(); }
357 void TearDown() override { TearDownReverb(); }
358
359 void assertEnergyIncreasingWithParameter(bool bypass) {
360 createEnvParam(EnvironmentalReverb::bypass, bypass);
361 ASSERT_NO_FATAL_FAILURE(setAndVerifyParam(EX_NONE, mEnvParam, EnvironmentalReverb::bypass));
362 float baseEnergy = 0;
363 for (int val : mParamValues) {
364 std::vector<float> output(kBufferSize);
365 setParameterAndProcess(mInput, output, val, mTag);
366 float energy = computeOutputEnergy(mInput, output);
367 ASSERT_GT(energy, baseEnergy);
368 baseEnergy = energy;
369 }
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530370 }
371
Sneha Patil37f131c2024-05-09 15:11:19 +0530372 void assertZeroEnergyWithBypass(bool bypass) {
373 createEnvParam(EnvironmentalReverb::bypass, bypass);
374 ASSERT_NO_FATAL_FAILURE(setAndVerifyParam(EX_NONE, mEnvParam, EnvironmentalReverb::bypass));
375 for (int val : mParamValues) {
376 std::vector<float> output(kBufferSize);
377 setParameterAndProcess(mInput, output, val, mTag);
378 float energy = computeOutputEnergy(mInput, output);
379 ASSERT_EQ(energy, 0);
380 }
381 }
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530382
Sneha Patil37f131c2024-05-09 15:11:19 +0530383 EnvironmentalReverb::Tag mTag;
384 std::vector<int> mParamValues;
385 std::vector<float> mInput;
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530386};
387
Sneha Patil37f131c2024-05-09 15:11:19 +0530388TEST_P(EnvironmentalReverbDataTest, IncreasingParamValue) {
389 assertEnergyIncreasingWithParameter(false);
390}
391
392TEST_P(EnvironmentalReverbDataTest, WithBypassEnabled) {
393 assertZeroEnergyWithBypass(true);
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530394}
395
396INSTANTIATE_TEST_SUITE_P(
Sneha Patil37f131c2024-05-09 15:11:19 +0530397 EnvironmentalReverbTest, EnvironmentalReverbDataTest,
398 ::testing::Combine(
399 testing::ValuesIn(kDescPair = EffectFactoryHelper::getAllEffectDescriptors(
400 IFactory::descriptor, getEffectTypeUuidEnvReverb())),
401 testing::ValuesIn(kParamsIncreasingVector)),
402 [](const testing::TestParamInfo<EnvironmentalReverbDataTest::ParamType>& info) {
403 auto descriptor = std::get<DESCRIPTOR_INDEX>(info.param).second;
404 auto tag = std::get<TAG_VALUE_PAIR>(info.param).first;
405 std::string name = getPrefix(descriptor) + "_Tag_" + toString(tag);
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530406 return name;
407 });
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530408
Sneha Patil37f131c2024-05-09 15:11:19 +0530409GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbDataTest);
410
411class EnvironmentalReverbMinimumParamTest
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530412 : public ::testing::TestWithParam<
Sneha Patil37f131c2024-05-09 15:11:19 +0530413 std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, TagValuePair>>,
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530414 public EnvironmentalReverbHelper {
415 public:
Sneha Patil37f131c2024-05-09 15:11:19 +0530416 EnvironmentalReverbMinimumParamTest()
417 : EnvironmentalReverbHelper(std::get<DESCRIPTOR_INDEX>(GetParam())) {
418 std::tie(mTag, mValue) = std::get<TAG_VALUE_PAIR>(GetParam());
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530419 }
Sneha Patil37f131c2024-05-09 15:11:19 +0530420 void SetUp() override {
421 SetUpReverb();
422 createEnvParam(EnvironmentalReverb::roomLevelMb, kMinRoomLevel);
423 ASSERT_NO_FATAL_FAILURE(
424 setAndVerifyParam(EX_NONE, mEnvParam, EnvironmentalReverb::roomLevelMb));
425 }
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530426 void TearDown() override { TearDownReverb(); }
Sneha Patil37f131c2024-05-09 15:11:19 +0530427
428 EnvironmentalReverb::Tag mTag;
429 int mValue;
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530430};
431
Sneha Patil37f131c2024-05-09 15:11:19 +0530432TEST_P(EnvironmentalReverbMinimumParamTest, MinimumValueTest) {
433 std::vector<float> input(kBufferSize);
434 generateSineWaveInput(input);
435 std::vector<float> output(kBufferSize);
436 setParameterAndProcess(input, output, mValue, mTag);
437 float energy = computeOutputEnergy(input, output);
438 // No Auxiliary output for minimum param values
439 ASSERT_EQ(energy, 0);
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530440}
441
442INSTANTIATE_TEST_SUITE_P(
Sneha Patil37f131c2024-05-09 15:11:19 +0530443 EnvironmentalReverbTest, EnvironmentalReverbMinimumParamTest,
444 ::testing::Combine(
445 testing::ValuesIn(kDescPair = EffectFactoryHelper::getAllEffectDescriptors(
446 IFactory::descriptor, getEffectTypeUuidEnvReverb())),
447 testing::ValuesIn(kParamsMinimumValue)),
448 [](const testing::TestParamInfo<EnvironmentalReverbMinimumParamTest::ParamType>& info) {
449 auto descriptor = std::get<DESCRIPTOR_INDEX>(info.param).second;
450 auto tag = std::get<TAG_VALUE_PAIR>(info.param).first;
451 auto val = std::get<TAG_VALUE_PAIR>(info.param).second;
452 std::string name =
453 getPrefix(descriptor) + "_Tag_" + toString(tag) + std::to_string(val);
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530454 std::replace_if(
455 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
456 return name;
457 });
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530458
Sneha Patil37f131c2024-05-09 15:11:19 +0530459GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbMinimumParamTest);
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530460
Sneha Patil9aa4f9f2024-05-29 12:23:30 +0530461class EnvironmentalReverbDiffusionTest
462 : public ::testing::TestWithParam<
463 std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, TagVectorPair>>,
464 public EnvironmentalReverbHelper {
465 public:
466 EnvironmentalReverbDiffusionTest()
467 : EnvironmentalReverbHelper(std::get<DESCRIPTOR_INDEX>(GetParam())) {
468 std::tie(mTag, mParamValues) = std::get<TAG_VALUE_PAIR>(GetParam());
469 mInput.resize(kBufferSize);
470 generateSineWaveInput(mInput);
471 }
472 void SetUp() override { SetUpReverb(); }
473 void TearDown() override { TearDownReverb(); }
474
475 float getMean(std::vector<float>& buffer) {
476 return std::accumulate(buffer.begin(), buffer.end(), 0.0) / buffer.size();
477 }
478
479 float getVariance(std::vector<float>& buffer) {
480 if (isAuxiliary()) {
Sneha Patil8ff60352024-06-21 12:47:30 +0000481 accumulate_float(buffer.data(), mInput.data(), buffer.size());
Sneha Patil9aa4f9f2024-05-29 12:23:30 +0530482 }
483 float mean = getMean(buffer);
484 float squaredDeltas =
485 std::accumulate(buffer.begin(), buffer.end(), 0.0,
486 [mean](float a, float b) { return a + pow(b - mean, 2); });
487
488 return squaredDeltas / buffer.size();
489 }
490
491 EnvironmentalReverb::Tag mTag;
492 std::vector<int> mParamValues;
493 std::vector<float> mInput;
494};
495
496TEST_P(EnvironmentalReverbDiffusionTest, DecreasingVarianceTest) {
497 std::vector<float> baseOutput(kBufferSize);
498 setParameterAndProcess(mInput, baseOutput, kMinDiffusion, mTag);
499 ASSERT_EQ(baseOutput.size(),
500 static_cast<size_t>(mFrameCount) * static_cast<size_t>(mStereoChannelCount));
501 float baseVariance = getVariance(baseOutput);
502 for (int value : mParamValues) {
503 std::vector<float> output(kBufferSize);
504 setParameterAndProcess(mInput, output, value, mTag);
505 ASSERT_EQ(output.size(),
506 static_cast<size_t>(mFrameCount) * static_cast<size_t>(mStereoChannelCount));
507 float variance = getVariance(output);
508 ASSERT_LT(variance, baseVariance);
509 baseVariance = variance;
510 }
511}
512
513INSTANTIATE_TEST_SUITE_P(
514 EnvironmentalReverbTest, EnvironmentalReverbDiffusionTest,
515 ::testing::Combine(
516 testing::ValuesIn(kDescPair = EffectFactoryHelper::getAllEffectDescriptors(
517 IFactory::descriptor, getEffectTypeUuidEnvReverb())),
518 testing::Values(kDiffusionParam)),
519 [](const testing::TestParamInfo<EnvironmentalReverbDiffusionTest::ParamType>& info) {
520 auto descriptor = std::get<DESCRIPTOR_INDEX>(info.param).second;
521 auto tag = std::get<TAG_VALUE_PAIR>(info.param).first;
522 std::string name = getPrefix(descriptor) + "_Tag_" + toString(tag);
523 return name;
524 });
525
526GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbDiffusionTest);
527
Sneha Patil8ff60352024-06-21 12:47:30 +0000528enum ParamDensityTest { DESCRIPTOR, TAG_DENSITY_VALUE, PARAM_DENSITY_VALUE, IS_INPUT_MUTE };
529
530class EnvironmentalReverbDensityTest
531 : public ::testing::TestWithParam<std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>,
532 EnvironmentalReverb::Tag, int, bool>>,
533 public EnvironmentalReverbHelper {
534 public:
535 EnvironmentalReverbDensityTest() : EnvironmentalReverbHelper(std::get<DESCRIPTOR>(GetParam())) {
536 mTag = std::get<TAG_DENSITY_VALUE>(GetParam());
537 mParamValues = std::get<PARAM_DENSITY_VALUE>(GetParam());
538 mIsInputMute = (std::get<IS_INPUT_MUTE>(GetParam()));
539 mInput.resize(kBufferSize);
540 if (mIsInputMute) {
541 std::fill(mInput.begin(), mInput.end(), 0);
542 } else {
543 generateSineWaveInput(mInput);
544 }
545 }
546 void SetUp() override { SetUpReverb(); }
547 void TearDown() override { TearDownReverb(); }
548
549 EnvironmentalReverb::Tag mTag;
550 int mParamValues;
551 std::vector<float> mInput;
552 bool mIsInputMute;
553};
554
555TEST_P(EnvironmentalReverbDensityTest, DensityOutput) {
556 float inputRmse =
557 audio_utils_compute_energy_mono(mInput.data(), AUDIO_FORMAT_PCM_FLOAT, mInput.size());
558
559 std::vector<float> output(kBufferSize);
560 setParameterAndProcess(mInput, output, mParamValues, mTag);
561
562 if (isAuxiliary() && !mIsInputMute) {
563 accumulate_float(output.data(), mInput.data(), output.size());
564 }
565
566 float outputRmse =
567 audio_utils_compute_energy_mono(output.data(), AUDIO_FORMAT_PCM_FLOAT, output.size());
568 if (inputRmse != 0) {
569 EXPECT_GT(outputRmse, 0);
570 } else {
571 EXPECT_EQ(outputRmse, inputRmse);
572 }
573}
574
575INSTANTIATE_TEST_SUITE_P(
576 EnvironmentalReverbTest, EnvironmentalReverbDensityTest,
577 ::testing::Combine(
578 testing::ValuesIn(kDescPair = EffectFactoryHelper::getAllEffectDescriptors(
579 IFactory::descriptor, getEffectTypeUuidEnvReverb())),
580 testing::Values(kDensityParam.first), testing::ValuesIn(kDensityParam.second),
581 testing::Bool()),
582 [](const testing::TestParamInfo<EnvironmentalReverbDensityTest::ParamType>& info) {
583 auto descriptor = std::get<DESCRIPTOR>(info.param).second;
584 auto tag = std::get<TAG_DENSITY_VALUE>(info.param);
585 auto value = std::get<PARAM_DENSITY_VALUE>(info.param);
586 std::string isInputMute = std::to_string(std::get<IS_INPUT_MUTE>(info.param));
587 std::string name = getPrefix(descriptor) + "_Tag_" + toString(tag) + "_Value_" +
588 std::to_string(value) + "_isInputMute_" + isInputMute;
589 return name;
590 });
591
592GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbDensityTest);
593
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530594int main(int argc, char** argv) {
595 ::testing::InitGoogleTest(&argc, argv);
Jaideep Sharma74498412023-09-13 15:25:25 +0530596 ::testing::UnitTest::GetInstance()->listeners().Append(new TestExecutionTracer());
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530597 ABinderProcess_setThreadPoolMaxThreadCount(1);
598 ABinderProcess_startThreadPool();
599 return RUN_ALL_TESTS();
600}