blob: 2bb0a7269287de82eca2d4f7654147642a9a4f44 [file] [log] [blame]
Ram Mohane4064ce2022-12-20 18:05:14 +05301/*
2 * Copyright (C) 2023 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
Ram Mohane4064ce2022-12-20 18:05:14 +053017#include <set>
18#include <string>
Ram Mohane4064ce2022-12-20 18:05:14 +053019#include <unordered_set>
20
Mikhail Naganov872d4a62023-03-09 18:19:01 -080021#define LOG_TAG "VtsHalDynamicsProcessingTest"
22#include <android-base/logging.h>
Sneha Patilabc94642024-11-13 08:41:05 +000023#include <audio_utils/power.h>
24#include <audio_utils/primitives.h>
Mikhail Naganov872d4a62023-03-09 18:19:01 -080025
Ram Mohane4064ce2022-12-20 18:05:14 +053026#include <Utils.h>
Mikhail Naganov872d4a62023-03-09 18:19:01 -080027
Ram Mohane4064ce2022-12-20 18:05:14 +053028#include "EffectHelper.h"
Ram Mohanafdf90b2023-03-23 08:48:25 +053029#include "EffectRangeSpecific.h"
Ram Mohane4064ce2022-12-20 18:05:14 +053030
31using namespace android;
Ram Mohanafdf90b2023-03-23 08:48:25 +053032using namespace aidl::android::hardware::audio::effect::DynamicsProcessingRanges;
Ram Mohane4064ce2022-12-20 18:05:14 +053033
Ram Mohane4064ce2022-12-20 18:05:14 +053034using aidl::android::hardware::audio::effect::Descriptor;
35using aidl::android::hardware::audio::effect::DynamicsProcessing;
Shunkai Yaof8be1ac2023-03-06 18:41:27 +000036using aidl::android::hardware::audio::effect::getEffectTypeUuidDynamicsProcessing;
Ram Mohane4064ce2022-12-20 18:05:14 +053037using aidl::android::hardware::audio::effect::IEffect;
38using aidl::android::hardware::audio::effect::IFactory;
Ram Mohane4064ce2022-12-20 18:05:14 +053039using aidl::android::hardware::audio::effect::Parameter;
Jaideep Sharma74498412023-09-13 15:25:25 +053040using android::hardware::audio::common::testing::detail::TestExecutionTracer;
Ram Mohane4064ce2022-12-20 18:05:14 +053041
42/**
43 * Here we focus on specific parameter checking, general IEffect interfaces testing performed in
44 * VtsAudioEffectTargetTest.
45 */
46class DynamicsProcessingTestHelper : public EffectHelper {
47 public:
48 DynamicsProcessingTestHelper(std::pair<std::shared_ptr<IFactory>, Descriptor> pair,
Aayush Sonifbb5cd32024-11-21 10:51:46 +000049 int32_t channelLayout = kDefaultChannelLayout)
50 : mChannelLayout(channelLayout),
Sneha Patilabc94642024-11-13 08:41:05 +000051 mChannelCount(::aidl::android::hardware::audio::common::getChannelCount(
52 AudioChannelLayout::make<AudioChannelLayout::layoutMask>(mChannelLayout))) {
Ram Mohane4064ce2022-12-20 18:05:14 +053053 std::tie(mFactory, mDescriptor) = pair;
Ram Mohane4064ce2022-12-20 18:05:14 +053054 }
55
56 // setup
57 void SetUpDynamicsProcessingEffect() {
58 ASSERT_NE(nullptr, mFactory);
59 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Ram Mohane4064ce2022-12-20 18:05:14 +053060 Parameter::Specific specific = getDefaultParamSpecific();
Shunkai Yao61f9dd22024-05-08 22:34:36 +000061 Parameter::Common common = createParamCommon(
Sneha Patilabc94642024-11-13 08:41:05 +000062 0 /* session */, 1 /* ioHandle */, kSamplingFrequency /* iSampleRate */,
63 kSamplingFrequency /* oSampleRate */, kFrameCount /* iFrameCount */,
64 kFrameCount /* oFrameCount */,
Ram Mohane4064ce2022-12-20 18:05:14 +053065 AudioChannelLayout::make<AudioChannelLayout::layoutMask>(mChannelLayout),
66 AudioChannelLayout::make<AudioChannelLayout::layoutMask>(mChannelLayout));
Sneha Patilabc94642024-11-13 08:41:05 +000067 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, specific, &mOpenEffectReturn, EX_NONE));
Ram Mohane4064ce2022-12-20 18:05:14 +053068 ASSERT_NE(nullptr, mEffect);
69 mEngineConfigApplied = mEngineConfigPreset;
70 }
71
72 Parameter::Specific getDefaultParamSpecific() {
73 DynamicsProcessing dp = DynamicsProcessing::make<DynamicsProcessing::engineArchitecture>(
74 mEngineConfigPreset);
75 Parameter::Specific specific =
76 Parameter::Specific::make<Parameter::Specific::dynamicsProcessing>(dp);
77 return specific;
78 }
79
80 // teardown
81 void TearDownDynamicsProcessingEffect() {
82 ASSERT_NO_FATAL_FAILURE(close(mEffect));
83 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
84 }
85
86 // utils functions for parameter checking
Ram Mohane4064ce2022-12-20 18:05:14 +053087 bool isParamEqual(const DynamicsProcessing::Tag& tag, const DynamicsProcessing& dpRef,
88 const DynamicsProcessing& dpTest);
Ram Mohane4064ce2022-12-20 18:05:14 +053089 bool isEngineConfigEqual(const DynamicsProcessing::EngineArchitecture& refCfg,
90 const DynamicsProcessing::EngineArchitecture& testCfg);
91
92 template <typename T>
93 std::vector<T> filterEnabledVector(const std::vector<T>& vec);
94
95 template <typename T>
96 bool isAidlVectorEqualAfterFilter(const std::vector<T>& source, const std::vector<T>& target);
97
98 template <typename T>
99 bool isAidlVectorEqual(const std::vector<T>& source, const std::vector<T>& target);
100
Ram Mohanafdf90b2023-03-23 08:48:25 +0530101 template <typename T>
102 bool isChannelConfigValid(const std::vector<T>& cfgs) {
103 auto& channelCount = mChannelCount;
104 return std::all_of(cfgs.cbegin(), cfgs.cend(), [channelCount](const T& cfg) {
105 return (cfg.channel >= 0 && cfg.channel < channelCount);
106 });
107 }
108
109 template <typename T>
110 bool isBandConfigValid(const std::vector<T>& cfgs, int bandCount);
111
112 bool isParamValid(const DynamicsProcessing::Tag& tag, const DynamicsProcessing& dp);
113
Ram Mohane4064ce2022-12-20 18:05:14 +0530114 // get set params and validate
115 void SetAndGetDynamicsProcessingParameters();
116
Sneha Patilabc94642024-11-13 08:41:05 +0000117 bool isAllParamsValid();
118
Sneha Patilcbf86a42024-11-26 10:41:54 +0000119 void setParamsAndProcess(std::vector<float>& input, std::vector<float>& output);
120
121 float calculateDb(const std::vector<float>& input, size_t startSamplePos);
122
Sneha Patil2da23d72025-02-25 10:54:18 +0000123 void getMagnitudeValue(const std::vector<float>& output, std::vector<float>& bufferMag);
124
125 void checkInputAndOutputEquality(const std::vector<float>& outputMag);
126
127 void setUpDataTest(const std::vector<int>& testFrequencies, float fullScaleSineDb);
128
129 void createChannelConfig();
130
Ram Mohane4064ce2022-12-20 18:05:14 +0530131 // enqueue test parameters
132 void addEngineConfig(const DynamicsProcessing::EngineArchitecture& cfg);
133 void addPreEqChannelConfig(const std::vector<DynamicsProcessing::ChannelConfig>& cfg);
134 void addPostEqChannelConfig(const std::vector<DynamicsProcessing::ChannelConfig>& cfg);
135 void addMbcChannelConfig(const std::vector<DynamicsProcessing::ChannelConfig>& cfg);
136 void addPreEqBandConfigs(const std::vector<DynamicsProcessing::EqBandConfig>& cfgs);
137 void addPostEqBandConfigs(const std::vector<DynamicsProcessing::EqBandConfig>& cfgs);
138 void addMbcBandConfigs(const std::vector<DynamicsProcessing::MbcBandConfig>& cfgs);
139 void addLimiterConfig(const std::vector<DynamicsProcessing::LimiterConfig>& cfg);
140 void addInputGain(const std::vector<DynamicsProcessing::InputGain>& inputGain);
141
142 static constexpr float kPreferredProcessingDurationMs = 10.0f;
143 static constexpr int kBandCount = 5;
Sneha Patilabc94642024-11-13 08:41:05 +0000144 static constexpr int kSamplingFrequency = 44100;
145 static constexpr int kFrameCount = 2048;
Sneha Patilcbf86a42024-11-26 10:41:54 +0000146 static constexpr int kInputFrequency = 1000;
147 static constexpr size_t kStartIndex = 15 * kSamplingFrequency / 1000; // skip 15ms
Sneha Patil2da23d72025-02-25 10:54:18 +0000148 static constexpr float kToleranceDb = 0.5;
149 static constexpr int kNPointFFT = 1024;
150 static constexpr float kBinWidth = (float)kSamplingFrequency / kNPointFFT;
151 // Full scale sine wave with 1000 Hz frequency is -3 dB
152 static constexpr float kSineFullScaleDb = -3;
153 // Full scale sine wave with 100 Hz and 1000 Hz frequency is -6 dB
154 static constexpr float kSineMultitoneFullScaleDb = -6;
155 const std::vector<int> kCutoffFreqHz = {200 /*0th band cutoff*/, 2000 /*1st band cutoff*/};
156 std::vector<int> mMultitoneTestFrequencies = {100, 1000};
157 // Calculating normalizing factor by dividing the number of FFT points by half and the number of
158 // test frequencies. The normalization accounts for the FFT splitting the signal into positive
159 // and negative frequencies. Additionally, during multi-tone input generation, sample values are
160 // normalized to the range [-1, 1] by dividing them by the number of test frequencies.
161 float mNormalizingFactor = (kNPointFFT / (2 * mMultitoneTestFrequencies.size()));
162 std::vector<int> mBinOffsets;
163 std::vector<DynamicsProcessing::ChannelConfig> mChannelConfig;
164 std::vector<float> mInput;
165 float mInputDb;
Ram Mohane4064ce2022-12-20 18:05:14 +0530166 std::shared_ptr<IFactory> mFactory;
167 std::shared_ptr<IEffect> mEffect;
168 Descriptor mDescriptor;
Sneha Patilabc94642024-11-13 08:41:05 +0000169 IEffect::OpenEffectReturn mOpenEffectReturn;
Ram Mohane4064ce2022-12-20 18:05:14 +0530170 DynamicsProcessing::EngineArchitecture mEngineConfigApplied;
171 DynamicsProcessing::EngineArchitecture mEngineConfigPreset{
172 .resolutionPreference =
173 DynamicsProcessing::ResolutionPreference::FAVOR_FREQUENCY_RESOLUTION,
174 .preferredProcessingDurationMs = kPreferredProcessingDurationMs,
175 .preEqStage = {.inUse = true, .bandCount = kBandCount},
176 .postEqStage = {.inUse = true, .bandCount = kBandCount},
177 .mbcStage = {.inUse = true, .bandCount = kBandCount},
178 .limiterInUse = true,
179 };
180
181 std::unordered_set<int /* channelId */> mPreEqChannelEnable;
182 std::unordered_set<int /* channelId */> mPostEqChannelEnable;
183 std::unordered_set<int /* channelId */> mMbcChannelEnable;
184 std::unordered_set<int /* channelId */> mLimiterChannelEnable;
185 static const std::set<std::vector<DynamicsProcessing::ChannelConfig>> kChannelConfigTestSet;
186 static const std::set<DynamicsProcessing::StageEnablement> kStageEnablementTestSet;
187 static const std::set<std::vector<DynamicsProcessing::InputGain>> kInputGainTestSet;
188
189 private:
Ram Mohane4064ce2022-12-20 18:05:14 +0530190 std::vector<std::pair<DynamicsProcessing::Tag, DynamicsProcessing>> mTags;
Sneha Patilabc94642024-11-13 08:41:05 +0000191
192 protected:
Aayush Sonifbb5cd32024-11-21 10:51:46 +0000193 const int32_t mChannelLayout;
Sneha Patilabc94642024-11-13 08:41:05 +0000194 const int mChannelCount;
Aayush Sonifbb5cd32024-11-21 10:51:46 +0000195
Ram Mohane4064ce2022-12-20 18:05:14 +0530196 void CleanUp() {
197 mTags.clear();
198 mPreEqChannelEnable.clear();
199 mPostEqChannelEnable.clear();
200 mMbcChannelEnable.clear();
201 mLimiterChannelEnable.clear();
202 }
203};
204
205// test value set for DynamicsProcessing::StageEnablement
206const std::set<DynamicsProcessing::StageEnablement>
207 DynamicsProcessingTestHelper::kStageEnablementTestSet = {
208 {.inUse = true, .bandCount = DynamicsProcessingTestHelper::kBandCount},
209 {.inUse = true, .bandCount = 0},
210 {.inUse = true, .bandCount = -1},
Ram Mohanafdf90b2023-03-23 08:48:25 +0530211 {.inUse = false, .bandCount = 0},
212 {.inUse = false, .bandCount = -1},
Ram Mohane4064ce2022-12-20 18:05:14 +0530213 {.inUse = false, .bandCount = DynamicsProcessingTestHelper::kBandCount}};
214
215// test value set for DynamicsProcessing::ChannelConfig
216const std::set<std::vector<DynamicsProcessing::ChannelConfig>>
217 DynamicsProcessingTestHelper::kChannelConfigTestSet = {
218 {{.channel = -1, .enable = false},
219 {.channel = 0, .enable = true},
220 {.channel = 1, .enable = false},
221 {.channel = 2, .enable = true}},
Ram Mohane4064ce2022-12-20 18:05:14 +0530222 {{.channel = -1, .enable = false}, {.channel = 2, .enable = true}},
Ram Mohane4064ce2022-12-20 18:05:14 +0530223 {{.channel = 0, .enable = true}, {.channel = 1, .enable = true}}};
224
225// test value set for DynamicsProcessing::InputGain
226const std::set<std::vector<DynamicsProcessing::InputGain>>
227 DynamicsProcessingTestHelper::kInputGainTestSet = {
228 {{.channel = 0, .gainDb = 10.f},
229 {.channel = 1, .gainDb = 0.f},
230 {.channel = 2, .gainDb = -10.f}},
Ram Mohane4064ce2022-12-20 18:05:14 +0530231 {{.channel = -1, .gainDb = -10.f}, {.channel = -2, .gainDb = 10.f}},
Ram Mohanafdf90b2023-03-23 08:48:25 +0530232 {{.channel = -1, .gainDb = 10.f}, {.channel = 0, .gainDb = -10.f}},
233 {{.channel = 0, .gainDb = 10.f}, {.channel = 1, .gainDb = -10.f}}};
Ram Mohane4064ce2022-12-20 18:05:14 +0530234
Ram Mohanafdf90b2023-03-23 08:48:25 +0530235template <typename T>
236bool DynamicsProcessingTestHelper::isBandConfigValid(const std::vector<T>& cfgs, int bandCount) {
Shunkai Yao53238b12024-03-29 23:09:04 +0000237 std::unordered_set<int> freqs;
Ram Mohanafdf90b2023-03-23 08:48:25 +0530238 for (auto cfg : cfgs) {
239 if (cfg.channel < 0 || cfg.channel >= mChannelCount) return false;
240 if (cfg.band < 0 || cfg.band >= bandCount) return false;
Shunkai Yao53238b12024-03-29 23:09:04 +0000241 // duplicated band index
242 if (freqs.find(cfg.band) != freqs.end()) return false;
243 freqs.insert(cfg.band);
Ram Mohanafdf90b2023-03-23 08:48:25 +0530244 }
Shunkai Yao53238b12024-03-29 23:09:04 +0000245 return true;
Ram Mohanafdf90b2023-03-23 08:48:25 +0530246}
247
248bool DynamicsProcessingTestHelper::isParamValid(const DynamicsProcessing::Tag& tag,
249 const DynamicsProcessing& dp) {
250 switch (tag) {
251 case DynamicsProcessing::preEq: {
Ram Mohanafdf90b2023-03-23 08:48:25 +0530252 return isChannelConfigValid(dp.get<DynamicsProcessing::preEq>());
253 }
254 case DynamicsProcessing::postEq: {
Ram Mohanafdf90b2023-03-23 08:48:25 +0530255 return isChannelConfigValid(dp.get<DynamicsProcessing::postEq>());
256 }
257 case DynamicsProcessing::mbc: {
Ram Mohanafdf90b2023-03-23 08:48:25 +0530258 return isChannelConfigValid(dp.get<DynamicsProcessing::mbc>());
259 }
260 case DynamicsProcessing::preEqBand: {
Ram Mohanafdf90b2023-03-23 08:48:25 +0530261 return isBandConfigValid(dp.get<DynamicsProcessing::preEqBand>(),
262 mEngineConfigApplied.preEqStage.bandCount);
263 }
264 case DynamicsProcessing::postEqBand: {
Ram Mohanafdf90b2023-03-23 08:48:25 +0530265 return isBandConfigValid(dp.get<DynamicsProcessing::postEqBand>(),
266 mEngineConfigApplied.postEqStage.bandCount);
267 }
268 case DynamicsProcessing::mbcBand: {
Ram Mohanafdf90b2023-03-23 08:48:25 +0530269 return isBandConfigValid(dp.get<DynamicsProcessing::mbcBand>(),
270 mEngineConfigApplied.mbcStage.bandCount);
271 }
272 case DynamicsProcessing::limiter: {
Ram Mohanafdf90b2023-03-23 08:48:25 +0530273 return isChannelConfigValid(dp.get<DynamicsProcessing::limiter>());
274 }
275 case DynamicsProcessing::inputGain: {
276 return isChannelConfigValid(dp.get<DynamicsProcessing::inputGain>());
277 }
278 default: {
279 return true;
280 }
281 }
282 return true;
283}
Ram Mohane4064ce2022-12-20 18:05:14 +0530284
Ram Mohane4064ce2022-12-20 18:05:14 +0530285bool DynamicsProcessingTestHelper::isParamEqual(const DynamicsProcessing::Tag& tag,
286 const DynamicsProcessing& dpRef,
287 const DynamicsProcessing& dpTest) {
288 switch (tag) {
289 case DynamicsProcessing::engineArchitecture: {
290 return isEngineConfigEqual(dpRef.get<DynamicsProcessing::engineArchitecture>(),
291 dpTest.get<DynamicsProcessing::engineArchitecture>());
292 }
293 case DynamicsProcessing::preEq: {
294 const auto& source = dpRef.get<DynamicsProcessing::preEq>();
295 const auto& target = dpTest.get<DynamicsProcessing::preEq>();
296 return isAidlVectorEqualAfterFilter<DynamicsProcessing::ChannelConfig>(source, target);
297 }
298 case DynamicsProcessing::postEq: {
299 return isAidlVectorEqualAfterFilter<DynamicsProcessing::ChannelConfig>(
300 dpRef.get<DynamicsProcessing::postEq>(),
301 dpTest.get<DynamicsProcessing::postEq>());
302 }
303 case DynamicsProcessing::mbc: {
304 return isAidlVectorEqualAfterFilter<DynamicsProcessing::ChannelConfig>(
305 dpRef.get<DynamicsProcessing::mbc>(), dpTest.get<DynamicsProcessing::mbc>());
306 }
307 case DynamicsProcessing::preEqBand: {
308 return isAidlVectorEqualAfterFilter<DynamicsProcessing::EqBandConfig>(
309 dpRef.get<DynamicsProcessing::preEqBand>(),
310 dpTest.get<DynamicsProcessing::preEqBand>());
311 }
312 case DynamicsProcessing::postEqBand: {
313 return isAidlVectorEqualAfterFilter<DynamicsProcessing::EqBandConfig>(
314 dpRef.get<DynamicsProcessing::postEqBand>(),
315 dpTest.get<DynamicsProcessing::postEqBand>());
316 }
317 case DynamicsProcessing::mbcBand: {
318 return isAidlVectorEqualAfterFilter<DynamicsProcessing::MbcBandConfig>(
319 dpRef.get<DynamicsProcessing::mbcBand>(),
320 dpTest.get<DynamicsProcessing::mbcBand>());
321 }
322 case DynamicsProcessing::limiter: {
323 return isAidlVectorEqualAfterFilter<DynamicsProcessing::LimiterConfig>(
324 dpRef.get<DynamicsProcessing::limiter>(),
325 dpTest.get<DynamicsProcessing::limiter>());
326 }
327 case DynamicsProcessing::inputGain: {
328 return isAidlVectorEqual<DynamicsProcessing::InputGain>(
329 dpRef.get<DynamicsProcessing::inputGain>(),
330 dpTest.get<DynamicsProcessing::inputGain>());
331 }
Shunkai Yaob2325e52023-03-03 19:34:47 +0000332 case DynamicsProcessing::vendor: {
Ram Mohane4064ce2022-12-20 18:05:14 +0530333 return false;
334 }
335 }
336}
337
Ram Mohane4064ce2022-12-20 18:05:14 +0530338bool DynamicsProcessingTestHelper::isEngineConfigEqual(
339 const DynamicsProcessing::EngineArchitecture& ref,
340 const DynamicsProcessing::EngineArchitecture& test) {
341 return ref == test;
342}
343
344template <typename T>
345std::vector<T> DynamicsProcessingTestHelper::filterEnabledVector(const std::vector<T>& vec) {
346 std::vector<T> ret;
347 std::copy_if(vec.begin(), vec.end(), std::back_inserter(ret),
348 [](const auto& v) { return v.enable; });
349 return ret;
350}
351
352template <typename T>
353bool DynamicsProcessingTestHelper::isAidlVectorEqual(const std::vector<T>& source,
354 const std::vector<T>& target) {
355 if (source.size() != target.size()) return false;
356
357 auto tempS = source;
358 auto tempT = target;
359 std::sort(tempS.begin(), tempS.end());
360 std::sort(tempT.begin(), tempT.end());
361 return tempS == tempT;
362}
363
364template <typename T>
365bool DynamicsProcessingTestHelper::isAidlVectorEqualAfterFilter(const std::vector<T>& source,
366 const std::vector<T>& target) {
367 return isAidlVectorEqual<T>(filterEnabledVector<T>(source), filterEnabledVector<T>(target));
368}
369
370void DynamicsProcessingTestHelper::SetAndGetDynamicsProcessingParameters() {
Sneha Patilabc94642024-11-13 08:41:05 +0000371 for (const auto& [tag, dp] : mTags) {
Ram Mohane4064ce2022-12-20 18:05:14 +0530372 // validate parameter
373 Descriptor desc;
374 ASSERT_STATUS(EX_NONE, mEffect->getDescriptor(&desc));
Ram Mohanafdf90b2023-03-23 08:48:25 +0530375 bool valid = isParamInRange(dp, desc.capability.range.get<Range::dynamicsProcessing>());
376 if (valid) valid = isParamValid(tag, dp);
Ram Mohane4064ce2022-12-20 18:05:14 +0530377 const binder_exception_t expected = valid ? EX_NONE : EX_ILLEGAL_ARGUMENT;
378
379 // set parameter
380 Parameter expectParam;
381 Parameter::Specific specific;
382 specific.set<Parameter::Specific::dynamicsProcessing>(dp);
383 expectParam.set<Parameter::specific>(specific);
Shunkai Yao0a0c45e2023-02-13 17:41:11 +0000384 ASSERT_STATUS(expected, mEffect->setParameter(expectParam))
385 << "\n"
386 << expectParam.toString() << "\n"
387 << desc.toString();
Ram Mohane4064ce2022-12-20 18:05:14 +0530388
389 // only get if parameter in range and set success
390 if (expected == EX_NONE) {
391 Parameter getParam;
392 Parameter::Id id;
393 DynamicsProcessing::Id dpId;
394 dpId.set<DynamicsProcessing::Id::commonTag>(tag);
395 id.set<Parameter::Id::dynamicsProcessingTag>(dpId);
396 // if set success, then get should match
397 EXPECT_STATUS(expected, mEffect->getParameter(id, &getParam));
398 Parameter::Specific specificTest = getParam.get<Parameter::specific>();
399 const auto& target = specificTest.get<Parameter::Specific::dynamicsProcessing>();
400 EXPECT_TRUE(isParamEqual(tag, dp, target)) << dp.toString() << "\n"
401 << target.toString();
402 // update mEngineConfigApplied after setting successfully
403 if (tag == DynamicsProcessing::engineArchitecture) {
404 mEngineConfigApplied = target.get<DynamicsProcessing::engineArchitecture>();
405 }
406 }
407 }
408}
409
Sneha Patilabc94642024-11-13 08:41:05 +0000410bool DynamicsProcessingTestHelper::isAllParamsValid() {
411 if (mTags.empty()) {
412 return false;
413 }
414 for (const auto& [tag, dp] : mTags) {
415 // validate parameter
416 if (!isParamInRange(dp, mDescriptor.capability.range.get<Range::dynamicsProcessing>())) {
417 return false;
418 }
419 if (!isParamValid(tag, dp)) {
420 return false;
421 }
422 }
423 return true;
424}
425
Aayush Sonifbb5cd32024-11-21 10:51:46 +0000426// This function calculates power for both and mono and stereo data as the total power for
427// interleaved multichannel data can be calculated by treating it as a continuous mono input.
Sneha Patilcbf86a42024-11-26 10:41:54 +0000428float DynamicsProcessingTestHelper::calculateDb(const std::vector<float>& input,
429 size_t startSamplePos = 0) {
430 return audio_utils_compute_power_mono(input.data() + startSamplePos, AUDIO_FORMAT_PCM_FLOAT,
431 input.size() - startSamplePos);
432}
433
434void DynamicsProcessingTestHelper::setParamsAndProcess(std::vector<float>& input,
435 std::vector<float>& output) {
436 ASSERT_NO_FATAL_FAILURE(SetAndGetDynamicsProcessingParameters());
437 if (isAllParamsValid()) {
438 ASSERT_NO_FATAL_FAILURE(
439 processAndWriteToOutput(input, output, mEffect, &mOpenEffectReturn));
440 ASSERT_GT(output.size(), kStartIndex);
441 }
442}
443
Sneha Patil2da23d72025-02-25 10:54:18 +0000444void DynamicsProcessingTestHelper::getMagnitudeValue(const std::vector<float>& output,
445 std::vector<float>& bufferMag) {
446 std::vector<float> subOutput(output.begin() + kStartIndex, output.end());
447 EXPECT_NO_FATAL_FAILURE(calculateMagnitudeMono(bufferMag, subOutput, mBinOffsets, kNPointFFT));
448}
449
450void DynamicsProcessingTestHelper::checkInputAndOutputEquality(
451 const std::vector<float>& outputMag) {
452 std::vector<float> inputMag(mBinOffsets.size());
453 EXPECT_NO_FATAL_FAILURE(getMagnitudeValue(mInput, inputMag));
454 for (size_t i = 0; i < inputMag.size(); i++) {
455 EXPECT_NEAR(calculateDb({inputMag[i] / mNormalizingFactor}),
456 calculateDb({outputMag[i] / mNormalizingFactor}), kToleranceDb);
457 }
458}
459
460void DynamicsProcessingTestHelper::setUpDataTest(const std::vector<int>& testFrequencies,
461 float fullScaleSineDb) {
462 ASSERT_NO_FATAL_FAILURE(SetUpDynamicsProcessingEffect());
463 SKIP_TEST_IF_DATA_UNSUPPORTED(mDescriptor.common.flags);
464 ASSERT_NO_FATAL_FAILURE(
465 generateSineWave(testFrequencies, mInput, 1.0, kSamplingFrequency, mChannelLayout));
466 mInputDb = calculateDb(mInput);
467 ASSERT_NEAR(mInputDb, fullScaleSineDb, kToleranceDb);
468}
469
470void DynamicsProcessingTestHelper::createChannelConfig() {
471 for (int i = 0; i < mChannelCount; i++) {
472 mChannelConfig.push_back(DynamicsProcessing::ChannelConfig(i, true));
473 }
474}
475
Ram Mohane4064ce2022-12-20 18:05:14 +0530476void DynamicsProcessingTestHelper::addEngineConfig(
477 const DynamicsProcessing::EngineArchitecture& cfg) {
478 DynamicsProcessing dp;
479 dp.set<DynamicsProcessing::engineArchitecture>(cfg);
480 mTags.push_back({DynamicsProcessing::engineArchitecture, dp});
481}
482
483void DynamicsProcessingTestHelper::addPreEqChannelConfig(
484 const std::vector<DynamicsProcessing::ChannelConfig>& cfgs) {
485 DynamicsProcessing dp;
486 dp.set<DynamicsProcessing::preEq>(cfgs);
487 mTags.push_back({DynamicsProcessing::preEq, dp});
488 for (auto& cfg : cfgs) {
489 if (cfg.enable) mPreEqChannelEnable.insert(cfg.channel);
490 }
491}
492
493void DynamicsProcessingTestHelper::addPostEqChannelConfig(
494 const std::vector<DynamicsProcessing::ChannelConfig>& cfgs) {
495 DynamicsProcessing dp;
496 dp.set<DynamicsProcessing::postEq>(cfgs);
497 mTags.push_back({DynamicsProcessing::postEq, dp});
498 for (auto& cfg : cfgs) {
499 if (cfg.enable) mPostEqChannelEnable.insert(cfg.channel);
500 }
501}
502
503void DynamicsProcessingTestHelper::addMbcChannelConfig(
504 const std::vector<DynamicsProcessing::ChannelConfig>& cfgs) {
505 DynamicsProcessing dp;
506 dp.set<DynamicsProcessing::mbc>(cfgs);
507 mTags.push_back({DynamicsProcessing::mbc, dp});
508 for (auto& cfg : cfgs) {
509 if (cfg.enable) mMbcChannelEnable.insert(cfg.channel);
510 }
511}
512
513void DynamicsProcessingTestHelper::addPreEqBandConfigs(
514 const std::vector<DynamicsProcessing::EqBandConfig>& cfgs) {
515 DynamicsProcessing dp;
516 dp.set<DynamicsProcessing::preEqBand>(cfgs);
517 mTags.push_back({DynamicsProcessing::preEqBand, dp});
518}
519
520void DynamicsProcessingTestHelper::addPostEqBandConfigs(
521 const std::vector<DynamicsProcessing::EqBandConfig>& cfgs) {
522 DynamicsProcessing dp;
523 dp.set<DynamicsProcessing::postEqBand>(cfgs);
524 mTags.push_back({DynamicsProcessing::postEqBand, dp});
525}
526
527void DynamicsProcessingTestHelper::addMbcBandConfigs(
528 const std::vector<DynamicsProcessing::MbcBandConfig>& cfgs) {
529 DynamicsProcessing dp;
530 dp.set<DynamicsProcessing::mbcBand>(cfgs);
531 mTags.push_back({DynamicsProcessing::mbcBand, dp});
532}
533
534void DynamicsProcessingTestHelper::addLimiterConfig(
535 const std::vector<DynamicsProcessing::LimiterConfig>& cfgs) {
536 DynamicsProcessing dp;
537 dp.set<DynamicsProcessing::limiter>(cfgs);
538 mTags.push_back({DynamicsProcessing::limiter, dp});
539 for (auto& cfg : cfgs) {
540 if (cfg.enable) mLimiterChannelEnable.insert(cfg.channel);
541 }
542}
543
544void DynamicsProcessingTestHelper::addInputGain(
545 const std::vector<DynamicsProcessing::InputGain>& inputGains) {
546 DynamicsProcessing dp;
547 dp.set<DynamicsProcessing::inputGain>(inputGains);
548 mTags.push_back({DynamicsProcessing::inputGain, dp});
549}
550
Sneha Patilabc94642024-11-13 08:41:05 +0000551void fillLimiterConfig(std::vector<DynamicsProcessing::LimiterConfig>& limiterConfigList,
552 int channelIndex, bool enable, int linkGroup, float attackTime,
553 float releaseTime, float ratio, float threshold, float postGain) {
554 DynamicsProcessing::LimiterConfig cfg;
555 cfg.channel = channelIndex;
556 cfg.enable = enable;
557 cfg.linkGroup = linkGroup;
558 cfg.attackTimeMs = attackTime;
559 cfg.releaseTimeMs = releaseTime;
560 cfg.ratio = ratio;
561 cfg.thresholdDb = threshold;
562 cfg.postGainDb = postGain;
563 limiterConfigList.push_back(cfg);
564}
565
Sneha Patilc3252762024-11-21 10:51:46 +0000566DynamicsProcessing::MbcBandConfig createMbcBandConfig(int channel, int band, float cutoffFreqHz,
567 float attackTimeMs, float releaseTimeMs,
568 float ratio, float thresholdDb,
569 float kneeWidthDb, float noiseGate,
570 float expanderRatio, float preGainDb,
571 float postGainDb) {
572 return DynamicsProcessing::MbcBandConfig{.channel = channel,
573 .band = band,
574 .enable = true,
575 .cutoffFrequencyHz = cutoffFreqHz,
576 .attackTimeMs = attackTimeMs,
577 .releaseTimeMs = releaseTimeMs,
578 .ratio = ratio,
579 .thresholdDb = thresholdDb,
580 .kneeWidthDb = kneeWidthDb,
581 .noiseGateThresholdDb = noiseGate,
582 .expanderRatio = expanderRatio,
583 .preGainDb = preGainDb,
584 .postGainDb = postGainDb};
585}
586
Sneha Patil2da23d72025-02-25 10:54:18 +0000587DynamicsProcessing::EqBandConfig creatEqBandConfig(int channel, int band, float cutOffFreqHz,
588 float gainDb) {
589 return DynamicsProcessing::EqBandConfig{.channel = channel,
590 .band = band,
591 .enable = true,
592 .cutoffFrequencyHz = cutOffFreqHz,
593 .gainDb = gainDb};
594}
595
Ram Mohane4064ce2022-12-20 18:05:14 +0530596/**
597 * Test DynamicsProcessing Engine Configuration
598 */
599enum EngineArchitectureTestParamName {
600 ENGINE_TEST_INSTANCE_NAME,
601 ENGINE_TEST_RESOLUTION_PREFERENCE,
602 ENGINE_TEST_PREFERRED_DURATION,
Shunkai Yaof137ba42024-04-11 17:11:03 +0000603 ENGINE_TEST_STAGE_ENABLEMENT
Ram Mohane4064ce2022-12-20 18:05:14 +0530604};
605using EngineArchitectureTestParams = std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>,
606 DynamicsProcessing::ResolutionPreference, float,
Shunkai Yaof137ba42024-04-11 17:11:03 +0000607 DynamicsProcessing::StageEnablement>;
Ram Mohane4064ce2022-12-20 18:05:14 +0530608
609void fillEngineArchConfig(DynamicsProcessing::EngineArchitecture& cfg,
610 const EngineArchitectureTestParams& params) {
611 cfg.resolutionPreference = std::get<ENGINE_TEST_RESOLUTION_PREFERENCE>(params);
612 cfg.preferredProcessingDurationMs = std::get<ENGINE_TEST_PREFERRED_DURATION>(params);
613 cfg.preEqStage = cfg.postEqStage = cfg.mbcStage =
614 std::get<ENGINE_TEST_STAGE_ENABLEMENT>(params);
Shunkai Yaof137ba42024-04-11 17:11:03 +0000615 cfg.limiterInUse = true;
Ram Mohane4064ce2022-12-20 18:05:14 +0530616}
617
618class DynamicsProcessingTestEngineArchitecture
619 : public ::testing::TestWithParam<EngineArchitectureTestParams>,
620 public DynamicsProcessingTestHelper {
621 public:
622 DynamicsProcessingTestEngineArchitecture()
623 : DynamicsProcessingTestHelper(std::get<ENGINE_TEST_INSTANCE_NAME>(GetParam())) {
624 fillEngineArchConfig(mCfg, GetParam());
625 };
626
627 void SetUp() override { SetUpDynamicsProcessingEffect(); }
628
629 void TearDown() override { TearDownDynamicsProcessingEffect(); }
630
631 DynamicsProcessing::EngineArchitecture mCfg;
632};
633
634TEST_P(DynamicsProcessingTestEngineArchitecture, SetAndGetEngineArch) {
Sneha Patil3587ae52025-01-06 05:59:08 +0000635 addEngineConfig(mCfg);
Sneha Patilabc94642024-11-13 08:41:05 +0000636 ASSERT_NO_FATAL_FAILURE(SetAndGetDynamicsProcessingParameters());
Ram Mohane4064ce2022-12-20 18:05:14 +0530637}
638
639INSTANTIATE_TEST_SUITE_P(
640 DynamicsProcessingTest, DynamicsProcessingTestEngineArchitecture,
641 ::testing::Combine(
642 testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
Shunkai Yaof8be1ac2023-03-06 18:41:27 +0000643 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
Ram Mohanafdf90b2023-03-23 08:48:25 +0530644 testing::Values(
645 DynamicsProcessing::ResolutionPreference::FAVOR_TIME_RESOLUTION,
646 DynamicsProcessing::ResolutionPreference::FAVOR_FREQUENCY_RESOLUTION,
647 static_cast<DynamicsProcessing::ResolutionPreference>(-1)), // variant
648 testing::Values(-10.f, 0.f, 10.f), // processing duration
Ram Mohane4064ce2022-12-20 18:05:14 +0530649 testing::ValuesIn(
Shunkai Yaof137ba42024-04-11 17:11:03 +0000650 DynamicsProcessingTestHelper::kStageEnablementTestSet) // preEQ/postEQ/mbc
651 ),
Ram Mohane4064ce2022-12-20 18:05:14 +0530652 [](const auto& info) {
653 auto descriptor = std::get<ENGINE_TEST_INSTANCE_NAME>(info.param).second;
654 DynamicsProcessing::EngineArchitecture cfg;
655 fillEngineArchConfig(cfg, info.param);
Jaideep Sharmae4c7a962023-06-14 19:14:44 +0530656 std::string name = getPrefix(descriptor) + "_Cfg_" + cfg.toString();
Ram Mohane4064ce2022-12-20 18:05:14 +0530657 std::replace_if(
658 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
659 return name;
660 });
661GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestEngineArchitecture);
662
663/**
664 * Test DynamicsProcessing Input Gain
665 */
666enum InputGainTestParamName {
667 INPUT_GAIN_INSTANCE_NAME,
668 INPUT_GAIN_PARAM,
669};
670class DynamicsProcessingTestInputGain
671 : public ::testing::TestWithParam<std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>,
672 std::vector<DynamicsProcessing::InputGain>>>,
673 public DynamicsProcessingTestHelper {
674 public:
675 DynamicsProcessingTestInputGain()
676 : DynamicsProcessingTestHelper(std::get<INPUT_GAIN_INSTANCE_NAME>(GetParam())),
Sneha Patilabc94642024-11-13 08:41:05 +0000677 mInputGain(std::get<INPUT_GAIN_PARAM>(GetParam())) {};
Ram Mohane4064ce2022-12-20 18:05:14 +0530678
679 void SetUp() override { SetUpDynamicsProcessingEffect(); }
680
681 void TearDown() override { TearDownDynamicsProcessingEffect(); }
682
683 const std::vector<DynamicsProcessing::InputGain> mInputGain;
684};
685
686TEST_P(DynamicsProcessingTestInputGain, SetAndGetInputGain) {
Sneha Patil3587ae52025-01-06 05:59:08 +0000687 addInputGain(mInputGain);
Sneha Patilabc94642024-11-13 08:41:05 +0000688 ASSERT_NO_FATAL_FAILURE(SetAndGetDynamicsProcessingParameters());
Ram Mohane4064ce2022-12-20 18:05:14 +0530689}
690
691INSTANTIATE_TEST_SUITE_P(
692 DynamicsProcessingTest, DynamicsProcessingTestInputGain,
693 ::testing::Combine(testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
Shunkai Yaof8be1ac2023-03-06 18:41:27 +0000694 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
Ram Mohane4064ce2022-12-20 18:05:14 +0530695 testing::ValuesIn(DynamicsProcessingTestInputGain::kInputGainTestSet)),
696 [](const auto& info) {
697 auto descriptor = std::get<INPUT_GAIN_INSTANCE_NAME>(info.param).second;
698 std::string gains =
699 ::android::internal::ToString(std::get<INPUT_GAIN_PARAM>(info.param));
700 std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
701 descriptor.common.name + "_UUID_" +
Shunkai Yao6f822452024-03-29 18:45:30 +0000702 toString(descriptor.common.id.uuid) + "_inputGains_" + gains;
Ram Mohane4064ce2022-12-20 18:05:14 +0530703 std::replace_if(
704 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
705 return name;
706 });
707GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestInputGain);
708
Sneha Patilcbf86a42024-11-26 10:41:54 +0000709class DynamicsProcessingInputGainDataTest
710 : public ::testing::TestWithParam<std::pair<std::shared_ptr<IFactory>, Descriptor>>,
711 public DynamicsProcessingTestHelper {
712 public:
713 DynamicsProcessingInputGainDataTest()
714 : DynamicsProcessingTestHelper((GetParam()), AudioChannelLayout::LAYOUT_MONO) {
715 mInput.resize(kFrameCount * mChannelCount);
Sneha Patilcbf86a42024-11-26 10:41:54 +0000716 }
717
Sneha Patil2da23d72025-02-25 10:54:18 +0000718 void SetUp() override { setUpDataTest({static_cast<int>(kInputFrequency)}, kSineFullScaleDb); }
Sneha Patilcbf86a42024-11-26 10:41:54 +0000719
720 void TearDown() override { TearDownDynamicsProcessingEffect(); }
721
722 void cleanUpInputGainConfig() {
723 CleanUp();
724 mInputGain.clear();
725 }
726
727 std::vector<DynamicsProcessing::InputGain> mInputGain;
Sneha Patilcbf86a42024-11-26 10:41:54 +0000728};
729
730TEST_P(DynamicsProcessingInputGainDataTest, SetAndGetInputGain) {
731 std::vector<float> gainDbValues = {-85, -40, 0, 40, 85};
732 for (float gainDb : gainDbValues) {
733 cleanUpInputGainConfig();
734 for (int i = 0; i < mChannelCount; i++) {
735 mInputGain.push_back(DynamicsProcessing::InputGain(i, gainDb));
736 }
737 std::vector<float> output(mInput.size());
Sneha Patil3587ae52025-01-06 05:59:08 +0000738 addInputGain(mInputGain);
Sneha Patilcbf86a42024-11-26 10:41:54 +0000739 EXPECT_NO_FATAL_FAILURE(setParamsAndProcess(mInput, output));
740 if (!isAllParamsValid()) {
741 continue;
742 }
743 float outputDb = calculateDb(output, kStartIndex);
744 EXPECT_NEAR(outputDb, mInputDb + gainDb, kToleranceDb)
745 << "InputGain: " << gainDb << ", OutputDb: " << outputDb;
746 }
747}
748
749INSTANTIATE_TEST_SUITE_P(DynamicsProcessingTest, DynamicsProcessingInputGainDataTest,
750 testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
751 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
752 [](const auto& info) {
753 auto descriptor = info.param;
754 std::string name = getPrefix(descriptor.second);
755 std::replace_if(
756 name.begin(), name.end(),
757 [](const char c) { return !std::isalnum(c); }, '_');
758 return name;
759 });
760GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingInputGainDataTest);
761
Ram Mohane4064ce2022-12-20 18:05:14 +0530762/**
763 * Test DynamicsProcessing Limiter Config
764 */
765enum LimiterConfigTestParamName {
766 LIMITER_INSTANCE_NAME,
767 LIMITER_CHANNEL,
Ram Mohane4064ce2022-12-20 18:05:14 +0530768 LIMITER_LINK_GROUP,
Ram Mohane4064ce2022-12-20 18:05:14 +0530769 LIMITER_ATTACK_TIME,
770 LIMITER_RELEASE_TIME,
771 LIMITER_RATIO,
772 LIMITER_THRESHOLD,
773 LIMITER_POST_GAIN,
Ram Mohane4064ce2022-12-20 18:05:14 +0530774};
Ram Mohane4064ce2022-12-20 18:05:14 +0530775
Shunkai Yaof137ba42024-04-11 17:11:03 +0000776using LimiterConfigTestParams = std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>,
Sneha Patilabc94642024-11-13 08:41:05 +0000777 int32_t, int32_t, float, float, float, float, float>;
Ram Mohane4064ce2022-12-20 18:05:14 +0530778
Sneha Patilabc94642024-11-13 08:41:05 +0000779void fillLimiterConfig(std::vector<DynamicsProcessing::LimiterConfig>& cfg,
Ram Mohane4064ce2022-12-20 18:05:14 +0530780 const LimiterConfigTestParams& params) {
Sneha Patilabc94642024-11-13 08:41:05 +0000781 fillLimiterConfig(cfg, std::get<LIMITER_CHANNEL>(params), true,
782 std::get<LIMITER_LINK_GROUP>(params), std::get<LIMITER_ATTACK_TIME>(params),
783 std::get<LIMITER_RELEASE_TIME>(params), std::get<LIMITER_RATIO>(params),
784 std::get<LIMITER_THRESHOLD>(params), std::get<LIMITER_POST_GAIN>(params));
Ram Mohane4064ce2022-12-20 18:05:14 +0530785}
786
787class DynamicsProcessingTestLimiterConfig
788 : public ::testing::TestWithParam<LimiterConfigTestParams>,
789 public DynamicsProcessingTestHelper {
790 public:
791 DynamicsProcessingTestLimiterConfig()
Shunkai Yaof137ba42024-04-11 17:11:03 +0000792 : DynamicsProcessingTestHelper(std::get<LIMITER_INSTANCE_NAME>(GetParam())) {
Sneha Patilabc94642024-11-13 08:41:05 +0000793 fillLimiterConfig(mLimiterConfigList, GetParam());
Ram Mohane4064ce2022-12-20 18:05:14 +0530794 }
795
796 void SetUp() override { SetUpDynamicsProcessingEffect(); }
797
798 void TearDown() override { TearDownDynamicsProcessingEffect(); }
799
800 DynamicsProcessing::LimiterConfig mCfg;
Sneha Patilabc94642024-11-13 08:41:05 +0000801 std::vector<DynamicsProcessing::LimiterConfig> mLimiterConfigList;
Ram Mohane4064ce2022-12-20 18:05:14 +0530802};
803
804TEST_P(DynamicsProcessingTestLimiterConfig, SetAndGetLimiterConfig) {
Sneha Patil3587ae52025-01-06 05:59:08 +0000805 addEngineConfig(mEngineConfigPreset);
806 addLimiterConfig(mLimiterConfigList);
Sneha Patilabc94642024-11-13 08:41:05 +0000807 ASSERT_NO_FATAL_FAILURE(SetAndGetDynamicsProcessingParameters());
Ram Mohane4064ce2022-12-20 18:05:14 +0530808}
809
810INSTANTIATE_TEST_SUITE_P(
811 DynamicsProcessingTest, DynamicsProcessingTestLimiterConfig,
812 ::testing::Combine(testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
Shunkai Yaof8be1ac2023-03-06 18:41:27 +0000813 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
Sneha Patilabc94642024-11-13 08:41:05 +0000814 testing::Values(-1, 0, 1, 2), // channel index
815 testing::Values(3), // link group
816 testing::Values(-1, 1), // attackTime
817 testing::Values(-60, 60), // releaseTime
818 testing::Values(-2.5, 2.5), // ratio
819 testing::Values(-2, 2), // thresh
820 testing::Values(-3.14, 3.14) // postGain
821 ),
Ram Mohane4064ce2022-12-20 18:05:14 +0530822 [](const auto& info) {
823 auto descriptor = std::get<LIMITER_INSTANCE_NAME>(info.param).second;
Sneha Patilabc94642024-11-13 08:41:05 +0000824 std::vector<DynamicsProcessing::LimiterConfig> cfg;
Ram Mohane4064ce2022-12-20 18:05:14 +0530825 fillLimiterConfig(cfg, info.param);
Sneha Patilabc94642024-11-13 08:41:05 +0000826 std::string name =
827 "Implementer_" + getPrefix(descriptor) + "_limiterConfig_" + cfg[0].toString();
Ram Mohane4064ce2022-12-20 18:05:14 +0530828 std::replace_if(
829 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
830 return name;
831 });
832GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestLimiterConfig);
833
Sneha Patilabc94642024-11-13 08:41:05 +0000834using LimiterConfigDataTestParams = std::pair<std::shared_ptr<IFactory>, Descriptor>;
835
836class DynamicsProcessingLimiterConfigDataTest
837 : public ::testing::TestWithParam<LimiterConfigDataTestParams>,
838 public DynamicsProcessingTestHelper {
839 public:
840 DynamicsProcessingLimiterConfigDataTest()
841 : DynamicsProcessingTestHelper(GetParam(), AudioChannelLayout::LAYOUT_MONO) {
842 mBufferSize = kFrameCount * mChannelCount;
843 mInput.resize(mBufferSize);
Sneha Patilabc94642024-11-13 08:41:05 +0000844 }
845
Sneha Patil2da23d72025-02-25 10:54:18 +0000846 void SetUp() override { setUpDataTest({static_cast<int>(kInputFrequency)}, kSineFullScaleDb); }
Sneha Patilabc94642024-11-13 08:41:05 +0000847
848 void TearDown() override { TearDownDynamicsProcessingEffect(); }
849
Sneha Patilabc94642024-11-13 08:41:05 +0000850 void computeThreshold(float ratio, float outputDb, float& threshold) {
851 EXPECT_NE(ratio, 0);
852 threshold = (mInputDb - (ratio * outputDb)) / (1 - ratio);
853 }
854
855 void computeRatio(float threshold, float outputDb, float& ratio) {
856 float inputOverThreshold = mInputDb - threshold;
857 float outputOverThreshold = outputDb - threshold;
858 EXPECT_NE(outputOverThreshold, 0);
859 ratio = inputOverThreshold / outputOverThreshold;
860 }
861
Sneha Patilcbf86a42024-11-26 10:41:54 +0000862 void setLimiterParamsAndProcess(std::vector<float>& input, std::vector<float>& output) {
Sneha Patil3587ae52025-01-06 05:59:08 +0000863 addEngineConfig(mEngineConfigPreset);
864 addLimiterConfig(mLimiterConfigList);
Sneha Patilcbf86a42024-11-26 10:41:54 +0000865 EXPECT_NO_FATAL_FAILURE(setParamsAndProcess(input, output));
Sneha Patilabc94642024-11-13 08:41:05 +0000866 }
867
868 void cleanUpLimiterConfig() {
869 CleanUp();
870 mLimiterConfigList.clear();
871 }
872 static constexpr float kDefaultLinkerGroup = 3;
873 static constexpr float kDefaultAttackTime = 0;
874 static constexpr float kDefaultReleaseTime = 0;
875 static constexpr float kDefaultRatio = 4;
Sneha Patilcbf86a42024-11-26 10:41:54 +0000876 static constexpr float kDefaultThreshold = -10;
Sneha Patilabc94642024-11-13 08:41:05 +0000877 static constexpr float kDefaultPostGain = 0;
Sneha Patil903c6202025-01-30 06:37:10 +0000878 static constexpr float kInputFrequency = 1000;
Sneha Patil2da23d72025-02-25 10:54:18 +0000879 static constexpr float kLimiterTestToleranceDb = 0.05;
Sneha Patilabc94642024-11-13 08:41:05 +0000880 std::vector<DynamicsProcessing::LimiterConfig> mLimiterConfigList;
Sneha Patilabc94642024-11-13 08:41:05 +0000881 int mBufferSize;
882};
883
884TEST_P(DynamicsProcessingLimiterConfigDataTest, IncreasingThresholdDb) {
885 std::vector<float> thresholdValues = {-200, -150, -100, -50, -5, 0};
886 std::vector<float> output(mInput.size());
887 float previousThreshold = -FLT_MAX;
888 for (float threshold : thresholdValues) {
Sneha Patilcbf86a42024-11-26 10:41:54 +0000889 cleanUpLimiterConfig();
Sneha Patilabc94642024-11-13 08:41:05 +0000890 for (int i = 0; i < mChannelCount; i++) {
891 fillLimiterConfig(mLimiterConfigList, i, true, kDefaultLinkerGroup, kDefaultAttackTime,
892 kDefaultReleaseTime, kDefaultRatio, threshold, kDefaultPostGain);
893 }
Sneha Patilc3252762024-11-21 10:51:46 +0000894 ASSERT_NO_FATAL_FAILURE(setLimiterParamsAndProcess(mInput, output));
Sneha Patilabc94642024-11-13 08:41:05 +0000895 if (!isAllParamsValid()) {
896 continue;
897 }
898 float outputDb = calculateDb(output, kStartIndex);
899 if (threshold >= mInputDb || kDefaultRatio == 1) {
Sneha Patil2da23d72025-02-25 10:54:18 +0000900 EXPECT_NEAR(mInputDb, outputDb, kLimiterTestToleranceDb);
Sneha Patilabc94642024-11-13 08:41:05 +0000901 } else {
902 float calculatedThreshold = 0;
Sneha Patilc3252762024-11-21 10:51:46 +0000903 ASSERT_NO_FATAL_FAILURE(computeThreshold(kDefaultRatio, outputDb, calculatedThreshold));
Sneha Patilabc94642024-11-13 08:41:05 +0000904 ASSERT_GT(calculatedThreshold, previousThreshold);
905 previousThreshold = calculatedThreshold;
906 }
907 }
908}
909
910TEST_P(DynamicsProcessingLimiterConfigDataTest, IncreasingRatio) {
911 std::vector<float> ratioValues = {1, 10, 20, 30, 40, 50};
912 std::vector<float> output(mInput.size());
Sneha Patilabc94642024-11-13 08:41:05 +0000913 float previousRatio = 0;
914 for (float ratio : ratioValues) {
Sneha Patilcbf86a42024-11-26 10:41:54 +0000915 cleanUpLimiterConfig();
Sneha Patilabc94642024-11-13 08:41:05 +0000916 for (int i = 0; i < mChannelCount; i++) {
917 fillLimiterConfig(mLimiterConfigList, i, true, kDefaultLinkerGroup, kDefaultAttackTime,
Sneha Patilcbf86a42024-11-26 10:41:54 +0000918 kDefaultReleaseTime, ratio, kDefaultThreshold, kDefaultPostGain);
Sneha Patilabc94642024-11-13 08:41:05 +0000919 }
Sneha Patilc3252762024-11-21 10:51:46 +0000920 ASSERT_NO_FATAL_FAILURE(setLimiterParamsAndProcess(mInput, output));
Sneha Patilabc94642024-11-13 08:41:05 +0000921 if (!isAllParamsValid()) {
922 continue;
923 }
924 float outputDb = calculateDb(output, kStartIndex);
925
Sneha Patilcbf86a42024-11-26 10:41:54 +0000926 if (kDefaultThreshold >= mInputDb) {
Sneha Patil2da23d72025-02-25 10:54:18 +0000927 EXPECT_NEAR(mInputDb, outputDb, kLimiterTestToleranceDb);
Sneha Patilabc94642024-11-13 08:41:05 +0000928 } else {
929 float calculatedRatio = 0;
Sneha Patilc3252762024-11-21 10:51:46 +0000930 ASSERT_NO_FATAL_FAILURE(computeRatio(kDefaultThreshold, outputDb, calculatedRatio));
Sneha Patilabc94642024-11-13 08:41:05 +0000931 ASSERT_GT(calculatedRatio, previousRatio);
932 previousRatio = calculatedRatio;
933 }
934 }
935}
936
Sneha Patilcbf86a42024-11-26 10:41:54 +0000937TEST_P(DynamicsProcessingLimiterConfigDataTest, IncreasingPostGain) {
938 std::vector<float> postGainDbValues = {-85, -40, 0, 40, 85};
939 std::vector<float> output(mInput.size());
940 for (float postGainDb : postGainDbValues) {
941 cleanUpLimiterConfig();
Sneha Patil903c6202025-01-30 06:37:10 +0000942 ASSERT_NO_FATAL_FAILURE(generateSineWave(kInputFrequency, mInput, dBToAmplitude(postGainDb),
943 kSamplingFrequency, mChannelLayout));
944 mInputDb = calculateDb(mInput);
Sneha Patil2da23d72025-02-25 10:54:18 +0000945 EXPECT_NEAR(mInputDb, kSineFullScaleDb - postGainDb, kLimiterTestToleranceDb);
Sneha Patilcbf86a42024-11-26 10:41:54 +0000946 for (int i = 0; i < mChannelCount; i++) {
947 fillLimiterConfig(mLimiterConfigList, i, true, kDefaultLinkerGroup, kDefaultAttackTime,
Sneha Patil903c6202025-01-30 06:37:10 +0000948 kDefaultReleaseTime, 1, kDefaultThreshold, postGainDb);
Sneha Patilcbf86a42024-11-26 10:41:54 +0000949 }
Sneha Patilc3252762024-11-21 10:51:46 +0000950 ASSERT_NO_FATAL_FAILURE(setLimiterParamsAndProcess(mInput, output));
Sneha Patilcbf86a42024-11-26 10:41:54 +0000951 if (!isAllParamsValid()) {
952 continue;
953 }
954 float outputDb = calculateDb(output, kStartIndex);
Sneha Patil2da23d72025-02-25 10:54:18 +0000955 EXPECT_NEAR(outputDb, mInputDb + postGainDb, kLimiterTestToleranceDb)
Sneha Patilcbf86a42024-11-26 10:41:54 +0000956 << "PostGain: " << postGainDb << ", OutputDb: " << outputDb;
957 }
958}
959
Sneha Patilabc94642024-11-13 08:41:05 +0000960TEST_P(DynamicsProcessingLimiterConfigDataTest, LimiterEnableDisable) {
961 std::vector<bool> limiterEnableValues = {false, true};
962 std::vector<float> output(mInput.size());
963 for (bool isEnabled : limiterEnableValues) {
Sneha Patilcbf86a42024-11-26 10:41:54 +0000964 cleanUpLimiterConfig();
Sneha Patilabc94642024-11-13 08:41:05 +0000965 for (int i = 0; i < mChannelCount; i++) {
966 // Set non-default values
967 fillLimiterConfig(mLimiterConfigList, i, isEnabled, kDefaultLinkerGroup,
968 5 /*attack time*/, 5 /*release time*/, 10 /*ratio*/,
969 -10 /*threshold*/, 5 /*postgain*/);
970 }
Sneha Patilc3252762024-11-21 10:51:46 +0000971 ASSERT_NO_FATAL_FAILURE(setLimiterParamsAndProcess(mInput, output));
Sneha Patilabc94642024-11-13 08:41:05 +0000972 if (!isAllParamsValid()) {
973 continue;
974 }
975 if (isEnabled) {
976 EXPECT_NE(mInputDb, calculateDb(output, kStartIndex));
977 } else {
Sneha Patil2da23d72025-02-25 10:54:18 +0000978 EXPECT_NEAR(mInputDb, calculateDb(output, kStartIndex), kLimiterTestToleranceDb);
Sneha Patilabc94642024-11-13 08:41:05 +0000979 }
980 }
981}
982
983INSTANTIATE_TEST_SUITE_P(DynamicsProcessingTest, DynamicsProcessingLimiterConfigDataTest,
984 testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
985 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
986 [](const auto& info) {
987 auto descriptor = info.param;
988 std::string name = getPrefix(descriptor.second);
989 std::replace_if(
990 name.begin(), name.end(),
991 [](const char c) { return !std::isalnum(c); }, '_');
992 return name;
993 });
Sneha Patild341d6f2024-11-28 06:27:19 +0000994GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingLimiterConfigDataTest);
Sneha Patilabc94642024-11-13 08:41:05 +0000995
Ram Mohane4064ce2022-12-20 18:05:14 +0530996/**
997 * Test DynamicsProcessing ChannelConfig
998 */
999enum ChannelConfigTestParamName {
1000 BAND_CHANNEL_TEST_INSTANCE_NAME,
Shunkai Yaof137ba42024-04-11 17:11:03 +00001001 BAND_CHANNEL_TEST_CHANNEL_CONFIG
Ram Mohane4064ce2022-12-20 18:05:14 +05301002};
1003using ChannelConfigTestParams = std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>,
Shunkai Yaof137ba42024-04-11 17:11:03 +00001004 std::vector<DynamicsProcessing::ChannelConfig>>;
Ram Mohane4064ce2022-12-20 18:05:14 +05301005
1006class DynamicsProcessingTestChannelConfig
1007 : public ::testing::TestWithParam<ChannelConfigTestParams>,
1008 public DynamicsProcessingTestHelper {
1009 public:
1010 DynamicsProcessingTestChannelConfig()
1011 : DynamicsProcessingTestHelper(std::get<BAND_CHANNEL_TEST_INSTANCE_NAME>(GetParam())),
Shunkai Yaof137ba42024-04-11 17:11:03 +00001012 mCfg(std::get<BAND_CHANNEL_TEST_CHANNEL_CONFIG>(GetParam())) {}
Ram Mohane4064ce2022-12-20 18:05:14 +05301013
1014 void SetUp() override { SetUpDynamicsProcessingEffect(); }
1015
1016 void TearDown() override { TearDownDynamicsProcessingEffect(); }
1017
1018 std::vector<DynamicsProcessing::ChannelConfig> mCfg;
Ram Mohane4064ce2022-12-20 18:05:14 +05301019};
1020
1021TEST_P(DynamicsProcessingTestChannelConfig, SetAndGetPreEqChannelConfig) {
Sneha Patil3587ae52025-01-06 05:59:08 +00001022 addEngineConfig(mEngineConfigPreset);
1023 addPreEqChannelConfig(mCfg);
Sneha Patilabc94642024-11-13 08:41:05 +00001024 ASSERT_NO_FATAL_FAILURE(SetAndGetDynamicsProcessingParameters());
Ram Mohane4064ce2022-12-20 18:05:14 +05301025}
1026
1027TEST_P(DynamicsProcessingTestChannelConfig, SetAndGetPostEqChannelConfig) {
Sneha Patil3587ae52025-01-06 05:59:08 +00001028 addEngineConfig(mEngineConfigPreset);
1029 addPostEqChannelConfig(mCfg);
Sneha Patilabc94642024-11-13 08:41:05 +00001030 ASSERT_NO_FATAL_FAILURE(SetAndGetDynamicsProcessingParameters());
Ram Mohane4064ce2022-12-20 18:05:14 +05301031}
1032
1033TEST_P(DynamicsProcessingTestChannelConfig, SetAndGetMbcChannelConfig) {
Sneha Patil3587ae52025-01-06 05:59:08 +00001034 addEngineConfig(mEngineConfigPreset);
1035 addMbcChannelConfig(mCfg);
Sneha Patilabc94642024-11-13 08:41:05 +00001036 ASSERT_NO_FATAL_FAILURE(SetAndGetDynamicsProcessingParameters());
Ram Mohane4064ce2022-12-20 18:05:14 +05301037}
1038
1039INSTANTIATE_TEST_SUITE_P(
1040 DynamicsProcessingTest, DynamicsProcessingTestChannelConfig,
1041 ::testing::Combine(
1042 testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
Shunkai Yaof8be1ac2023-03-06 18:41:27 +00001043 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
Ram Mohane4064ce2022-12-20 18:05:14 +05301044 testing::ValuesIn(
Shunkai Yaof137ba42024-04-11 17:11:03 +00001045 DynamicsProcessingTestHelper::kChannelConfigTestSet)), // channel config
Ram Mohane4064ce2022-12-20 18:05:14 +05301046 [](const auto& info) {
1047 auto descriptor = std::get<BAND_CHANNEL_TEST_INSTANCE_NAME>(info.param).second;
Ram Mohane4064ce2022-12-20 18:05:14 +05301048 std::string channelConfig = ::android::internal::ToString(
1049 std::get<BAND_CHANNEL_TEST_CHANNEL_CONFIG>(info.param));
1050
1051 std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
1052 descriptor.common.name + "_UUID_" +
Shunkai Yaof137ba42024-04-11 17:11:03 +00001053 toString(descriptor.common.id.uuid) + "_" + channelConfig;
Ram Mohane4064ce2022-12-20 18:05:14 +05301054 std::replace_if(
1055 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
1056 return name;
1057 });
1058GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestChannelConfig);
1059
1060/**
1061 * Test DynamicsProcessing EqBandConfig
1062 */
1063enum EqBandConfigTestParamName {
1064 EQ_BAND_INSTANCE_NAME,
1065 EQ_BAND_CHANNEL,
Ram Mohane4064ce2022-12-20 18:05:14 +05301066 EQ_BAND_CUT_OFF_FREQ,
Shunkai Yaof137ba42024-04-11 17:11:03 +00001067 EQ_BAND_GAIN
Ram Mohane4064ce2022-12-20 18:05:14 +05301068};
1069using EqBandConfigTestParams = std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, int32_t,
Sneha Patilabc94642024-11-13 08:41:05 +00001070 std::vector<std::pair<int, float>>, float>;
Ram Mohane4064ce2022-12-20 18:05:14 +05301071
1072void fillEqBandConfig(std::vector<DynamicsProcessing::EqBandConfig>& cfgs,
1073 const EqBandConfigTestParams& params) {
1074 const std::vector<std::pair<int, float>> cutOffFreqs = std::get<EQ_BAND_CUT_OFF_FREQ>(params);
1075 int bandCount = cutOffFreqs.size();
Ram Mohane4064ce2022-12-20 18:05:14 +05301076 for (int i = 0; i < bandCount; i++) {
Sneha Patil2da23d72025-02-25 10:54:18 +00001077 cfgs.push_back(creatEqBandConfig(std::get<EQ_BAND_CHANNEL>(params), cutOffFreqs[i].first,
1078 cutOffFreqs[i].second, std::get<EQ_BAND_GAIN>(params)));
Ram Mohane4064ce2022-12-20 18:05:14 +05301079 }
1080}
1081
1082class DynamicsProcessingTestEqBandConfig : public ::testing::TestWithParam<EqBandConfigTestParams>,
1083 public DynamicsProcessingTestHelper {
1084 public:
1085 DynamicsProcessingTestEqBandConfig()
Shunkai Yaof137ba42024-04-11 17:11:03 +00001086 : DynamicsProcessingTestHelper(std::get<EQ_BAND_INSTANCE_NAME>(GetParam())) {
Ram Mohane4064ce2022-12-20 18:05:14 +05301087 fillEqBandConfig(mCfgs, GetParam());
1088 }
1089
1090 void SetUp() override { SetUpDynamicsProcessingEffect(); }
1091
1092 void TearDown() override { TearDownDynamicsProcessingEffect(); }
1093
1094 std::vector<DynamicsProcessing::EqBandConfig> mCfgs;
Ram Mohane4064ce2022-12-20 18:05:14 +05301095};
1096
1097TEST_P(DynamicsProcessingTestEqBandConfig, SetAndGetPreEqBandConfig) {
Ram Mohane4064ce2022-12-20 18:05:14 +05301098 mEngineConfigPreset.preEqStage.bandCount = mCfgs.size();
Sneha Patil3587ae52025-01-06 05:59:08 +00001099 addEngineConfig(mEngineConfigPreset);
Ram Mohanafdf90b2023-03-23 08:48:25 +05301100 std::vector<DynamicsProcessing::ChannelConfig> cfgs(mChannelCount);
1101 for (int i = 0; i < mChannelCount; i++) {
1102 cfgs[i].channel = i;
1103 cfgs[i].enable = true;
1104 }
Sneha Patil3587ae52025-01-06 05:59:08 +00001105 addPreEqChannelConfig(cfgs);
1106 addPreEqBandConfigs(mCfgs);
Sneha Patilabc94642024-11-13 08:41:05 +00001107 ASSERT_NO_FATAL_FAILURE(SetAndGetDynamicsProcessingParameters());
Ram Mohane4064ce2022-12-20 18:05:14 +05301108}
1109
1110TEST_P(DynamicsProcessingTestEqBandConfig, SetAndGetPostEqBandConfig) {
Ram Mohane4064ce2022-12-20 18:05:14 +05301111 mEngineConfigPreset.postEqStage.bandCount = mCfgs.size();
Sneha Patil3587ae52025-01-06 05:59:08 +00001112 addEngineConfig(mEngineConfigPreset);
Ram Mohanafdf90b2023-03-23 08:48:25 +05301113 std::vector<DynamicsProcessing::ChannelConfig> cfgs(mChannelCount);
1114 for (int i = 0; i < mChannelCount; i++) {
1115 cfgs[i].channel = i;
1116 cfgs[i].enable = true;
1117 }
Sneha Patil3587ae52025-01-06 05:59:08 +00001118 addPostEqChannelConfig(cfgs);
1119 addPostEqBandConfigs(mCfgs);
Sneha Patilabc94642024-11-13 08:41:05 +00001120 ASSERT_NO_FATAL_FAILURE(SetAndGetDynamicsProcessingParameters());
Ram Mohane4064ce2022-12-20 18:05:14 +05301121}
1122
1123std::vector<std::vector<std::pair<int, float>>> kBands{
1124 {
1125 {0, 600},
1126 {1, 2000},
1127 {2, 6000},
1128 {3, 10000},
1129 {4, 16000},
Sneha Patil0ecc1782025-02-17 11:21:32 +00001130 {5, 20000},
1131 {6, 26000},
1132 {7, 30000},
1133 {8, 36000},
1134 {9, 40000},
1135 }, // 10 bands
Ram Mohane4064ce2022-12-20 18:05:14 +05301136 {
1137 {0, 800},
1138 {3, 15000},
1139 {2, 6000},
1140 {1, 2000},
1141 }, // 4 bands, unsorted
1142 {
1143 {0, 650},
1144 {1, 2000},
1145 {2, 6000},
1146 {3, 10000},
1147 {3, 16000},
1148 }, // 5 bands, missing band
1149 {
1150 {0, 900},
1151 {1, 8000},
1152 {2, 4000},
1153 {3, 12000},
1154 }, // 4 bands, cutoff freq not increasing
1155 {
1156 {0, 450},
1157 {1, 2000},
1158 {7, 6000},
1159 {3, 10000},
1160 {4, 16000},
1161 }, // bad band index
1162 {
1163 {0, 1},
1164 {1, 8000},
1165 }, // too low cutoff freq
1166 {
1167 {0, 1200},
1168 {1, 80000},
1169 }, // too high cutoff freq
1170};
1171
1172INSTANTIATE_TEST_SUITE_P(
1173 DynamicsProcessingTest, DynamicsProcessingTestEqBandConfig,
Ram Mohanafdf90b2023-03-23 08:48:25 +05301174 ::testing::Combine(testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
1175 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
Sneha Patilabc94642024-11-13 08:41:05 +00001176 testing::Values(-1, 0, 10), // channel index
1177 testing::ValuesIn(kBands), // band index, cut off frequencies
Shunkai Yaof137ba42024-04-11 17:11:03 +00001178 testing::Values(-3.14f, 3.14f) // gain
1179 ),
Ram Mohane4064ce2022-12-20 18:05:14 +05301180 [](const auto& info) {
1181 auto descriptor = std::get<EQ_BAND_INSTANCE_NAME>(info.param).second;
1182 std::vector<DynamicsProcessing::EqBandConfig> cfgs;
1183 fillEqBandConfig(cfgs, info.param);
Ram Mohane4064ce2022-12-20 18:05:14 +05301184 std::string bands = ::android::internal::ToString(cfgs);
Ram Mohane4064ce2022-12-20 18:05:14 +05301185 std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
1186 descriptor.common.name + "_UUID_" +
Shunkai Yaof137ba42024-04-11 17:11:03 +00001187 toString(descriptor.common.id.uuid) + "_bands_" + bands;
Ram Mohane4064ce2022-12-20 18:05:14 +05301188 std::replace_if(
1189 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
1190 return name;
1191 });
1192GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestEqBandConfig);
1193
Sneha Patil2da23d72025-02-25 10:54:18 +00001194class DynamicsProcessingEqBandConfigDataTest
1195 : public ::testing::TestWithParam<std::pair<std::shared_ptr<IFactory>, Descriptor>>,
1196 public DynamicsProcessingTestHelper {
1197 public:
1198 DynamicsProcessingEqBandConfigDataTest()
1199 : DynamicsProcessingTestHelper(GetParam(), AudioChannelLayout::LAYOUT_MONO) {
1200 mInput.resize(kFrameCount * mChannelCount);
1201 mBinOffsets.resize(mMultitoneTestFrequencies.size());
1202 }
1203
1204 void SetUp() override {
1205 ASSERT_NO_FATAL_FAILURE(
1206 setUpDataTest(mMultitoneTestFrequencies, kSineMultitoneFullScaleDb));
1207 }
1208
1209 void TearDown() override { TearDownDynamicsProcessingEffect(); }
1210
1211 void addEqParam(bool isPreEq) {
1212 createChannelConfig();
1213 auto stage = isPreEq ? mEngineConfigPreset.preEqStage : mEngineConfigPreset.postEqStage;
1214 stage.bandCount = mCfgs.size();
1215 addEngineConfig(mEngineConfigPreset);
1216 isPreEq ? addPreEqChannelConfig(mChannelConfig) : addPostEqChannelConfig(mChannelConfig);
1217 isPreEq ? addPreEqBandConfigs(mCfgs) : addPostEqBandConfigs(mCfgs);
1218 }
1219
1220 void setEqParamAndProcess(std::vector<float>& output, bool isPreEq) {
1221 addEqParam(isPreEq);
1222 ASSERT_NO_FATAL_FAILURE(setParamsAndProcess(mInput, output));
1223 }
1224
1225 void fillEqBandConfig(std::vector<DynamicsProcessing::EqBandConfig>& cfgs, int channelIndex,
1226 int bandIndex, int cutOffFreqHz, float gainDb) {
1227 cfgs.push_back(creatEqBandConfig(channelIndex, bandIndex, static_cast<float>(cutOffFreqHz),
1228 gainDb));
1229 }
1230
1231 void validateOutput(const std::vector<float>& output, float gainDb, size_t bandIndex) {
1232 std::vector<float> outputMag(mBinOffsets.size());
1233 EXPECT_NO_FATAL_FAILURE(getMagnitudeValue(output, outputMag));
1234 if (gainDb == 0) {
1235 EXPECT_NO_FATAL_FAILURE(checkInputAndOutputEquality(outputMag));
1236 } else if (gainDb > 0) {
1237 // For positive gain, current band's magnitude is greater than the other band's
1238 // magnitude
1239 EXPECT_GT(outputMag[bandIndex], outputMag[bandIndex ^ 1]);
1240 } else {
1241 // For negative gain, current band's magnitude is less than the other band's magnitude
1242 EXPECT_LT(outputMag[bandIndex], outputMag[bandIndex ^ 1]);
1243 }
1244 }
1245
1246 void analyseMultiBandOutput(float gainDb, bool isPreEq) {
1247 std::vector<float> output(mInput.size());
1248 roundToFreqCenteredToFftBin(mMultitoneTestFrequencies, mBinOffsets, kBinWidth);
1249 // Set Equalizer values for two bands
1250 for (size_t i = 0; i < kCutoffFreqHz.size(); i++) {
1251 for (int channelIndex = 0; channelIndex < mChannelCount; channelIndex++) {
1252 fillEqBandConfig(mCfgs, channelIndex, i, kCutoffFreqHz[i], gainDb);
1253 fillEqBandConfig(mCfgs, channelIndex, i ^ 1, kCutoffFreqHz[i ^ 1], 0);
1254 }
1255 ASSERT_NO_FATAL_FAILURE(setEqParamAndProcess(output, isPreEq));
1256
1257 if (isAllParamsValid()) {
1258 ASSERT_NO_FATAL_FAILURE(validateOutput(output, gainDb, i));
1259 }
1260 cleanUpEqConfig();
1261 }
1262 }
1263
1264 void cleanUpEqConfig() {
1265 CleanUp();
1266 mCfgs.clear();
1267 mChannelConfig.clear();
1268 }
1269
1270 const std::vector<float> kTestGainDbValues = {-200, -100, 0, 100, 200};
1271 std::vector<DynamicsProcessing::EqBandConfig> mCfgs;
1272};
1273
1274TEST_P(DynamicsProcessingEqBandConfigDataTest, IncreasingPreEqGain) {
1275 for (float gainDb : kTestGainDbValues) {
1276 ASSERT_NO_FATAL_FAILURE(generateSineWave(mMultitoneTestFrequencies, mInput,
1277 dBToAmplitude(gainDb), kSamplingFrequency,
1278 mChannelLayout));
1279 cleanUpEqConfig();
1280 ASSERT_NO_FATAL_FAILURE(analyseMultiBandOutput(gainDb, true /*pre-equalizer*/));
1281 }
1282}
1283
1284TEST_P(DynamicsProcessingEqBandConfigDataTest, IncreasingPostEqGain) {
1285 for (float gainDb : kTestGainDbValues) {
1286 ASSERT_NO_FATAL_FAILURE(generateSineWave(mMultitoneTestFrequencies, mInput,
1287 dBToAmplitude(gainDb), kSamplingFrequency,
1288 mChannelLayout));
1289 cleanUpEqConfig();
1290 ASSERT_NO_FATAL_FAILURE(analyseMultiBandOutput(gainDb, false /*post-equalizer*/));
1291 }
1292}
1293
1294INSTANTIATE_TEST_SUITE_P(DynamicsProcessingTest, DynamicsProcessingEqBandConfigDataTest,
1295 testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
1296 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
1297 [](const auto& info) {
1298 auto descriptor = info.param;
1299 std::string name = getPrefix(descriptor.second);
1300 std::replace_if(
1301 name.begin(), name.end(),
1302 [](const char c) { return !std::isalnum(c); }, '_');
1303 return name;
1304 });
1305GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingEqBandConfigDataTest);
1306
Ram Mohane4064ce2022-12-20 18:05:14 +05301307/**
1308 * Test DynamicsProcessing MbcBandConfig
1309 */
1310
1311enum MbcBandConfigParamName {
1312 MBC_BAND_INSTANCE_NAME,
1313 MBC_BAND_CHANNEL,
Ram Mohane4064ce2022-12-20 18:05:14 +05301314 MBC_BAND_CUTOFF_FREQ,
Ram Mohane4064ce2022-12-20 18:05:14 +05301315 MBC_BAND_ADDITIONAL
1316};
1317enum MbcBandConfigAdditional {
1318 MBC_ADD_ATTACK_TIME,
1319 MBC_ADD_RELEASE_TIME,
1320 MBC_ADD_RATIO,
1321 MBC_ADD_THRESHOLD,
1322 MBC_ADD_KNEE_WIDTH,
1323 MBC_ADD_NOISE_GATE_THRESHOLD,
1324 MBC_ADD_EXPENDER_RATIO,
1325 MBC_ADD_PRE_GAIN,
1326 MBC_ADD_POST_GAIN,
1327 MBC_ADD_MAX_NUM
1328};
1329using TestParamsMbcBandConfigAdditional = std::array<float, MBC_ADD_MAX_NUM>;
1330
Ram Mohanafdf90b2023-03-23 08:48:25 +05301331// attackTime, releaseTime, ratio, thresh, kneeWidth, noise, expander, preGain, postGain
Ram Mohane4064ce2022-12-20 18:05:14 +05301332static constexpr std::array<TestParamsMbcBandConfigAdditional, 4> kMbcBandConfigAdditionalParam = {
1333 {{-3, -10, -2, -2, -5, -90, -2.5, -2, -2},
1334 {0, 0, 0, 0, 0, 0, 0, 0, 0},
1335 {-3, 10, -2, 2, -5, 90, -2.5, 2, -2},
Ram Mohanafdf90b2023-03-23 08:48:25 +05301336 {3, 10, 2, -2, -5, 90, 2.5, 2, 2}}};
Ram Mohane4064ce2022-12-20 18:05:14 +05301337
1338using TestParamsMbcBandConfig =
Sneha Patilabc94642024-11-13 08:41:05 +00001339 std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, int32_t,
Shunkai Yaof137ba42024-04-11 17:11:03 +00001340 std::vector<std::pair<int, float>>, TestParamsMbcBandConfigAdditional>;
Ram Mohane4064ce2022-12-20 18:05:14 +05301341
1342void fillMbcBandConfig(std::vector<DynamicsProcessing::MbcBandConfig>& cfgs,
1343 const TestParamsMbcBandConfig& params) {
Sneha Patilc3252762024-11-21 10:51:46 +00001344 const auto& cutOffFreqs = std::get<MBC_BAND_CUTOFF_FREQ>(params);
1345 const auto& additional = std::get<MBC_BAND_ADDITIONAL>(params);
1346
1347 cfgs.resize(cutOffFreqs.size());
1348
1349 for (size_t i = 0; i < cutOffFreqs.size(); ++i) {
1350 cfgs[i] = createMbcBandConfig(std::get<MBC_BAND_CHANNEL>(params),
1351 cutOffFreqs[i].first, // band channel
1352 cutOffFreqs[i].second, // band cutoff frequency
1353 additional[MBC_ADD_ATTACK_TIME],
1354 additional[MBC_ADD_RELEASE_TIME], additional[MBC_ADD_RATIO],
1355 additional[MBC_ADD_THRESHOLD], additional[MBC_ADD_KNEE_WIDTH],
1356 additional[MBC_ADD_NOISE_GATE_THRESHOLD],
1357 additional[MBC_ADD_EXPENDER_RATIO],
1358 additional[MBC_ADD_PRE_GAIN], additional[MBC_ADD_POST_GAIN]);
Ram Mohane4064ce2022-12-20 18:05:14 +05301359 }
1360}
1361
1362class DynamicsProcessingTestMbcBandConfig
1363 : public ::testing::TestWithParam<TestParamsMbcBandConfig>,
1364 public DynamicsProcessingTestHelper {
1365 public:
1366 DynamicsProcessingTestMbcBandConfig()
Shunkai Yaof137ba42024-04-11 17:11:03 +00001367 : DynamicsProcessingTestHelper(std::get<MBC_BAND_INSTANCE_NAME>(GetParam())) {
Ram Mohane4064ce2022-12-20 18:05:14 +05301368 fillMbcBandConfig(mCfgs, GetParam());
1369 }
1370
1371 void SetUp() override { SetUpDynamicsProcessingEffect(); }
1372
1373 void TearDown() override { TearDownDynamicsProcessingEffect(); }
1374
1375 std::vector<DynamicsProcessing::MbcBandConfig> mCfgs;
Ram Mohane4064ce2022-12-20 18:05:14 +05301376};
1377
1378TEST_P(DynamicsProcessingTestMbcBandConfig, SetAndGetMbcBandConfig) {
Ram Mohane4064ce2022-12-20 18:05:14 +05301379 mEngineConfigPreset.mbcStage.bandCount = mCfgs.size();
Sneha Patil3587ae52025-01-06 05:59:08 +00001380 addEngineConfig(mEngineConfigPreset);
Ram Mohanafdf90b2023-03-23 08:48:25 +05301381 std::vector<DynamicsProcessing::ChannelConfig> cfgs(mChannelCount);
1382 for (int i = 0; i < mChannelCount; i++) {
1383 cfgs[i].channel = i;
1384 cfgs[i].enable = true;
1385 }
Sneha Patil3587ae52025-01-06 05:59:08 +00001386 addMbcChannelConfig(cfgs);
1387 addMbcBandConfigs(mCfgs);
Sneha Patilabc94642024-11-13 08:41:05 +00001388 ASSERT_NO_FATAL_FAILURE(SetAndGetDynamicsProcessingParameters());
Ram Mohane4064ce2022-12-20 18:05:14 +05301389}
1390
1391INSTANTIATE_TEST_SUITE_P(
1392 DynamicsProcessingTest, DynamicsProcessingTestMbcBandConfig,
Ram Mohanafdf90b2023-03-23 08:48:25 +05301393 ::testing::Combine(testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
1394 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
Sneha Patilabc94642024-11-13 08:41:05 +00001395 testing::Values(-1, 0, 10), // channel index
1396 testing::ValuesIn(kBands), // band index, cut off frequencies
Ram Mohanafdf90b2023-03-23 08:48:25 +05301397 testing::ValuesIn(kMbcBandConfigAdditionalParam)), // Additional
Ram Mohane4064ce2022-12-20 18:05:14 +05301398 [](const auto& info) {
1399 auto descriptor = std::get<MBC_BAND_INSTANCE_NAME>(info.param).second;
1400 std::vector<DynamicsProcessing::MbcBandConfig> cfgs;
1401 fillMbcBandConfig(cfgs, info.param);
Ram Mohane4064ce2022-12-20 18:05:14 +05301402 std::string mbcBands = ::android::internal::ToString(cfgs);
Ram Mohane4064ce2022-12-20 18:05:14 +05301403 std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
1404 descriptor.common.name + "_UUID_" +
Shunkai Yaof137ba42024-04-11 17:11:03 +00001405 toString(descriptor.common.id.uuid) + "_bands_" + mbcBands;
Ram Mohane4064ce2022-12-20 18:05:14 +05301406 std::replace_if(
1407 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
1408 return name;
1409 });
1410GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestMbcBandConfig);
1411
Sneha Patilc3252762024-11-21 10:51:46 +00001412class DynamicsProcessingMbcBandConfigDataTest
1413 : public ::testing::TestWithParam<std::pair<std::shared_ptr<IFactory>, Descriptor>>,
1414 public DynamicsProcessingTestHelper {
1415 public:
1416 DynamicsProcessingMbcBandConfigDataTest()
1417 : DynamicsProcessingTestHelper(GetParam(), AudioChannelLayout::LAYOUT_MONO) {
1418 mInput.resize(kFrameCount * mChannelCount);
Sneha Patil2da23d72025-02-25 10:54:18 +00001419 mBinOffsets.resize(mMultitoneTestFrequencies.size());
Sneha Patilc3252762024-11-21 10:51:46 +00001420 }
1421
1422 void SetUp() override {
Sneha Patil2da23d72025-02-25 10:54:18 +00001423 ASSERT_NO_FATAL_FAILURE(
1424 setUpDataTest(mMultitoneTestFrequencies, kSineMultitoneFullScaleDb));
Sneha Patilc3252762024-11-21 10:51:46 +00001425 }
1426
1427 void TearDown() override { TearDownDynamicsProcessingEffect(); }
1428
1429 void setMbcParamsAndProcess(std::vector<float>& output) {
Sneha Patil2da23d72025-02-25 10:54:18 +00001430 createChannelConfig();
Sneha Patilc3252762024-11-21 10:51:46 +00001431 mEngineConfigPreset.mbcStage.bandCount = mCfgs.size();
1432 addEngineConfig(mEngineConfigPreset);
1433 addMbcChannelConfig(mChannelConfig);
1434 addMbcBandConfigs(mCfgs);
Sneha Patil903c6202025-01-30 06:37:10 +00001435 ASSERT_NO_FATAL_FAILURE(setParamsAndProcess(mInput, output));
Sneha Patilc3252762024-11-21 10:51:46 +00001436 }
1437
1438 void fillMbcBandConfig(std::vector<DynamicsProcessing::MbcBandConfig>& cfgs, int channelIndex,
1439 float threshold, float ratio, float noiseGate, float expanderRatio,
Sneha Patil7ba121b2025-01-22 09:19:39 +00001440 int bandIndex, int cutoffFreqHz, float preGain, float postGain) {
1441 cfgs.push_back(createMbcBandConfig(channelIndex, bandIndex,
1442 static_cast<float>(cutoffFreqHz), kDefaultAttackTime,
1443 kDefaultReleaseTime, ratio, threshold, kDefaultKneeWidth,
1444 noiseGate, expanderRatio, preGain, postGain));
Sneha Patilc3252762024-11-21 10:51:46 +00001445 }
1446
Sneha Patilc3252762024-11-21 10:51:46 +00001447 void validateOutput(const std::vector<float>& output, float threshold, float ratio,
1448 size_t bandIndex) {
Sneha Patilc3252762024-11-21 10:51:46 +00001449 std::vector<float> outputMag(mBinOffsets.size());
1450 EXPECT_NO_FATAL_FAILURE(getMagnitudeValue(output, outputMag));
Sneha Patil7ba121b2025-01-22 09:19:39 +00001451 if (threshold >= mInputDb || ratio == 1) {
Sneha Patil2da23d72025-02-25 10:54:18 +00001452 EXPECT_NO_FATAL_FAILURE(checkInputAndOutputEquality(outputMag));
Sneha Patilc3252762024-11-21 10:51:46 +00001453 } else {
1454 // Current band's magnitude is less than the other band's magnitude
1455 EXPECT_LT(outputMag[bandIndex], outputMag[bandIndex ^ 1]);
1456 }
1457 }
1458
1459 void analyseMultiBandOutput(float threshold, float ratio) {
1460 std::vector<float> output(mInput.size());
Sneha Patil2da23d72025-02-25 10:54:18 +00001461 roundToFreqCenteredToFftBin(mMultitoneTestFrequencies, mBinOffsets, kBinWidth);
Sneha Patilc3252762024-11-21 10:51:46 +00001462 // Set MBC values for two bands
Sneha Patil2da23d72025-02-25 10:54:18 +00001463 for (size_t i = 0; i < kCutoffFreqHz.size(); i++) {
Sneha Patilc3252762024-11-21 10:51:46 +00001464 for (int channelIndex = 0; channelIndex < mChannelCount; channelIndex++) {
1465 fillMbcBandConfig(mCfgs, channelIndex, threshold, ratio, kDefaultNoiseGateDb,
Sneha Patil2da23d72025-02-25 10:54:18 +00001466 kDefaultExpanderRatio, i, kCutoffFreqHz[i], kDefaultPreGainDb,
Sneha Patil7ba121b2025-01-22 09:19:39 +00001467 kDefaultPostGainDb);
Sneha Patilc3252762024-11-21 10:51:46 +00001468 fillMbcBandConfig(mCfgs, channelIndex, kDefaultThresholdDb, kDefaultRatio,
1469 kDefaultNoiseGateDb, kDefaultExpanderRatio, i ^ 1,
Sneha Patil2da23d72025-02-25 10:54:18 +00001470 kCutoffFreqHz[i ^ 1], kDefaultPreGainDb, kDefaultPostGainDb);
Sneha Patilc3252762024-11-21 10:51:46 +00001471 }
1472 ASSERT_NO_FATAL_FAILURE(setMbcParamsAndProcess(output));
1473
1474 if (isAllParamsValid()) {
1475 ASSERT_NO_FATAL_FAILURE(validateOutput(output, threshold, ratio, i));
1476 }
1477 cleanUpMbcConfig();
1478 }
1479 }
1480
1481 void cleanUpMbcConfig() {
1482 CleanUp();
1483 mCfgs.clear();
1484 mChannelConfig.clear();
1485 }
1486
Sneha Patilc3252762024-11-21 10:51:46 +00001487 static constexpr float kDefaultPostGainDb = 0;
1488 static constexpr float kDefaultPreGainDb = 0;
1489 static constexpr float kDefaultAttackTime = 0;
1490 static constexpr float kDefaultReleaseTime = 0;
1491 static constexpr float kDefaultKneeWidth = 0;
1492 static constexpr float kDefaultThresholdDb = 0;
1493 static constexpr float kDefaultNoiseGateDb = -10;
1494 static constexpr float kDefaultExpanderRatio = 1;
1495 static constexpr float kDefaultRatio = 1;
Sneha Patilc3252762024-11-21 10:51:46 +00001496 std::vector<DynamicsProcessing::MbcBandConfig> mCfgs;
Sneha Patilc3252762024-11-21 10:51:46 +00001497};
1498
1499TEST_P(DynamicsProcessingMbcBandConfigDataTest, IncreasingThreshold) {
1500 float ratio = 20;
1501 std::vector<float> thresholdValues = {-200, -100, 0, 100, 200};
1502
1503 for (float threshold : thresholdValues) {
1504 cleanUpMbcConfig();
1505 ASSERT_NO_FATAL_FAILURE(analyseMultiBandOutput(threshold, ratio));
1506 }
1507}
1508
1509TEST_P(DynamicsProcessingMbcBandConfigDataTest, IncreasingRatio) {
1510 float threshold = -20;
1511 std::vector<float> ratioValues = {1, 10, 20, 30, 40, 50};
1512
1513 for (float ratio : ratioValues) {
1514 cleanUpMbcConfig();
1515 ASSERT_NO_FATAL_FAILURE(analyseMultiBandOutput(threshold, ratio));
1516 }
1517}
1518
Sneha Patil7ba121b2025-01-22 09:19:39 +00001519TEST_P(DynamicsProcessingMbcBandConfigDataTest, IncreasingPostGain) {
1520 std::vector<float> postGainDbValues = {-55, -30, 0, 30, 55};
1521 std::vector<float> output(mInput.size());
1522 for (float postGainDb : postGainDbValues) {
Sneha Patil2da23d72025-02-25 10:54:18 +00001523 ASSERT_NO_FATAL_FAILURE(generateSineWave(mMultitoneTestFrequencies, mInput,
Sneha Patil903c6202025-01-30 06:37:10 +00001524 dBToAmplitude(postGainDb), kSamplingFrequency,
1525 mChannelLayout));
Sneha Patil7ba121b2025-01-22 09:19:39 +00001526 mInputDb = calculateDb(mInput);
Sneha Patil2da23d72025-02-25 10:54:18 +00001527 EXPECT_NEAR(mInputDb, kSineMultitoneFullScaleDb - postGainDb, kToleranceDb);
Sneha Patil7ba121b2025-01-22 09:19:39 +00001528 cleanUpMbcConfig();
1529 for (int i = 0; i < mChannelCount; i++) {
1530 fillMbcBandConfig(mCfgs, i, kDefaultThresholdDb, kDefaultRatio, kDefaultNoiseGateDb,
1531 kDefaultExpanderRatio, 0 /*band index*/, 2000 /*cutoffFrequency*/,
1532 kDefaultPreGainDb, postGainDb);
1533 }
1534 EXPECT_NO_FATAL_FAILURE(setMbcParamsAndProcess(output));
1535 if (!isAllParamsValid()) {
1536 continue;
1537 }
1538 float outputDb = calculateDb(output, kStartIndex);
1539 EXPECT_NEAR(outputDb, mInputDb + postGainDb, kToleranceDb)
1540 << "PostGain: " << postGainDb << ", OutputDb: " << outputDb;
1541 }
1542}
1543
Sneha Patilc3252762024-11-21 10:51:46 +00001544INSTANTIATE_TEST_SUITE_P(DynamicsProcessingTest, DynamicsProcessingMbcBandConfigDataTest,
1545 testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
1546 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
1547 [](const auto& info) {
1548 auto descriptor = info.param;
1549 std::string name = getPrefix(descriptor.second);
1550 std::replace_if(
1551 name.begin(), name.end(),
1552 [](const char c) { return !std::isalnum(c); }, '_');
1553 return name;
1554 });
1555
1556GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingMbcBandConfigDataTest);
1557
Ram Mohane4064ce2022-12-20 18:05:14 +05301558int main(int argc, char** argv) {
1559 ::testing::InitGoogleTest(&argc, argv);
Jaideep Sharma74498412023-09-13 15:25:25 +05301560 ::testing::UnitTest::GetInstance()->listeners().Append(new TestExecutionTracer());
Ram Mohane4064ce2022-12-20 18:05:14 +05301561 ABinderProcess_setThreadPoolMaxThreadCount(1);
1562 ABinderProcess_startThreadPool();
1563 return RUN_ALL_TESTS();
1564}