blob: 3b1f3d9b249bb157f7efc3bfeb52fc9f04476836 [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,
Sneha Patilabc94642024-11-13 08:41:05 +000049 int32_t channelLayOut = AudioChannelLayout::LAYOUT_STEREO)
50 : mChannelLayout(channelLayOut),
51 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
Ram Mohane4064ce2022-12-20 18:05:14 +0530123 // enqueue test parameters
124 void addEngineConfig(const DynamicsProcessing::EngineArchitecture& cfg);
125 void addPreEqChannelConfig(const std::vector<DynamicsProcessing::ChannelConfig>& cfg);
126 void addPostEqChannelConfig(const std::vector<DynamicsProcessing::ChannelConfig>& cfg);
127 void addMbcChannelConfig(const std::vector<DynamicsProcessing::ChannelConfig>& cfg);
128 void addPreEqBandConfigs(const std::vector<DynamicsProcessing::EqBandConfig>& cfgs);
129 void addPostEqBandConfigs(const std::vector<DynamicsProcessing::EqBandConfig>& cfgs);
130 void addMbcBandConfigs(const std::vector<DynamicsProcessing::MbcBandConfig>& cfgs);
131 void addLimiterConfig(const std::vector<DynamicsProcessing::LimiterConfig>& cfg);
132 void addInputGain(const std::vector<DynamicsProcessing::InputGain>& inputGain);
133
134 static constexpr float kPreferredProcessingDurationMs = 10.0f;
135 static constexpr int kBandCount = 5;
Sneha Patilabc94642024-11-13 08:41:05 +0000136 static constexpr int kSamplingFrequency = 44100;
137 static constexpr int kFrameCount = 2048;
Sneha Patilcbf86a42024-11-26 10:41:54 +0000138 static constexpr int kInputFrequency = 1000;
139 static constexpr size_t kStartIndex = 15 * kSamplingFrequency / 1000; // skip 15ms
140 static constexpr float kToleranceDb = 0.05;
Ram Mohane4064ce2022-12-20 18:05:14 +0530141 std::shared_ptr<IFactory> mFactory;
142 std::shared_ptr<IEffect> mEffect;
143 Descriptor mDescriptor;
Sneha Patilabc94642024-11-13 08:41:05 +0000144 IEffect::OpenEffectReturn mOpenEffectReturn;
Ram Mohane4064ce2022-12-20 18:05:14 +0530145 DynamicsProcessing::EngineArchitecture mEngineConfigApplied;
146 DynamicsProcessing::EngineArchitecture mEngineConfigPreset{
147 .resolutionPreference =
148 DynamicsProcessing::ResolutionPreference::FAVOR_FREQUENCY_RESOLUTION,
149 .preferredProcessingDurationMs = kPreferredProcessingDurationMs,
150 .preEqStage = {.inUse = true, .bandCount = kBandCount},
151 .postEqStage = {.inUse = true, .bandCount = kBandCount},
152 .mbcStage = {.inUse = true, .bandCount = kBandCount},
153 .limiterInUse = true,
154 };
155
156 std::unordered_set<int /* channelId */> mPreEqChannelEnable;
157 std::unordered_set<int /* channelId */> mPostEqChannelEnable;
158 std::unordered_set<int /* channelId */> mMbcChannelEnable;
159 std::unordered_set<int /* channelId */> mLimiterChannelEnable;
160 static const std::set<std::vector<DynamicsProcessing::ChannelConfig>> kChannelConfigTestSet;
161 static const std::set<DynamicsProcessing::StageEnablement> kStageEnablementTestSet;
162 static const std::set<std::vector<DynamicsProcessing::InputGain>> kInputGainTestSet;
163
164 private:
Sneha Patilabc94642024-11-13 08:41:05 +0000165 const int32_t mChannelLayout;
Ram Mohane4064ce2022-12-20 18:05:14 +0530166 std::vector<std::pair<DynamicsProcessing::Tag, DynamicsProcessing>> mTags;
Sneha Patilabc94642024-11-13 08:41:05 +0000167
168 protected:
169 const int mChannelCount;
Ram Mohane4064ce2022-12-20 18:05:14 +0530170 void CleanUp() {
171 mTags.clear();
172 mPreEqChannelEnable.clear();
173 mPostEqChannelEnable.clear();
174 mMbcChannelEnable.clear();
175 mLimiterChannelEnable.clear();
176 }
177};
178
179// test value set for DynamicsProcessing::StageEnablement
180const std::set<DynamicsProcessing::StageEnablement>
181 DynamicsProcessingTestHelper::kStageEnablementTestSet = {
182 {.inUse = true, .bandCount = DynamicsProcessingTestHelper::kBandCount},
183 {.inUse = true, .bandCount = 0},
184 {.inUse = true, .bandCount = -1},
Ram Mohanafdf90b2023-03-23 08:48:25 +0530185 {.inUse = false, .bandCount = 0},
186 {.inUse = false, .bandCount = -1},
Ram Mohane4064ce2022-12-20 18:05:14 +0530187 {.inUse = false, .bandCount = DynamicsProcessingTestHelper::kBandCount}};
188
189// test value set for DynamicsProcessing::ChannelConfig
190const std::set<std::vector<DynamicsProcessing::ChannelConfig>>
191 DynamicsProcessingTestHelper::kChannelConfigTestSet = {
192 {{.channel = -1, .enable = false},
193 {.channel = 0, .enable = true},
194 {.channel = 1, .enable = false},
195 {.channel = 2, .enable = true}},
Ram Mohane4064ce2022-12-20 18:05:14 +0530196 {{.channel = -1, .enable = false}, {.channel = 2, .enable = true}},
Ram Mohane4064ce2022-12-20 18:05:14 +0530197 {{.channel = 0, .enable = true}, {.channel = 1, .enable = true}}};
198
199// test value set for DynamicsProcessing::InputGain
200const std::set<std::vector<DynamicsProcessing::InputGain>>
201 DynamicsProcessingTestHelper::kInputGainTestSet = {
202 {{.channel = 0, .gainDb = 10.f},
203 {.channel = 1, .gainDb = 0.f},
204 {.channel = 2, .gainDb = -10.f}},
Ram Mohane4064ce2022-12-20 18:05:14 +0530205 {{.channel = -1, .gainDb = -10.f}, {.channel = -2, .gainDb = 10.f}},
Ram Mohanafdf90b2023-03-23 08:48:25 +0530206 {{.channel = -1, .gainDb = 10.f}, {.channel = 0, .gainDb = -10.f}},
207 {{.channel = 0, .gainDb = 10.f}, {.channel = 1, .gainDb = -10.f}}};
Ram Mohane4064ce2022-12-20 18:05:14 +0530208
Ram Mohanafdf90b2023-03-23 08:48:25 +0530209template <typename T>
210bool DynamicsProcessingTestHelper::isBandConfigValid(const std::vector<T>& cfgs, int bandCount) {
Shunkai Yao53238b12024-03-29 23:09:04 +0000211 std::unordered_set<int> freqs;
Ram Mohanafdf90b2023-03-23 08:48:25 +0530212 for (auto cfg : cfgs) {
213 if (cfg.channel < 0 || cfg.channel >= mChannelCount) return false;
214 if (cfg.band < 0 || cfg.band >= bandCount) return false;
Shunkai Yao53238b12024-03-29 23:09:04 +0000215 // duplicated band index
216 if (freqs.find(cfg.band) != freqs.end()) return false;
217 freqs.insert(cfg.band);
Ram Mohanafdf90b2023-03-23 08:48:25 +0530218 }
Shunkai Yao53238b12024-03-29 23:09:04 +0000219 return true;
Ram Mohanafdf90b2023-03-23 08:48:25 +0530220}
221
222bool DynamicsProcessingTestHelper::isParamValid(const DynamicsProcessing::Tag& tag,
223 const DynamicsProcessing& dp) {
224 switch (tag) {
225 case DynamicsProcessing::preEq: {
Ram Mohanafdf90b2023-03-23 08:48:25 +0530226 return isChannelConfigValid(dp.get<DynamicsProcessing::preEq>());
227 }
228 case DynamicsProcessing::postEq: {
Ram Mohanafdf90b2023-03-23 08:48:25 +0530229 return isChannelConfigValid(dp.get<DynamicsProcessing::postEq>());
230 }
231 case DynamicsProcessing::mbc: {
Ram Mohanafdf90b2023-03-23 08:48:25 +0530232 return isChannelConfigValid(dp.get<DynamicsProcessing::mbc>());
233 }
234 case DynamicsProcessing::preEqBand: {
Ram Mohanafdf90b2023-03-23 08:48:25 +0530235 return isBandConfigValid(dp.get<DynamicsProcessing::preEqBand>(),
236 mEngineConfigApplied.preEqStage.bandCount);
237 }
238 case DynamicsProcessing::postEqBand: {
Ram Mohanafdf90b2023-03-23 08:48:25 +0530239 return isBandConfigValid(dp.get<DynamicsProcessing::postEqBand>(),
240 mEngineConfigApplied.postEqStage.bandCount);
241 }
242 case DynamicsProcessing::mbcBand: {
Ram Mohanafdf90b2023-03-23 08:48:25 +0530243 return isBandConfigValid(dp.get<DynamicsProcessing::mbcBand>(),
244 mEngineConfigApplied.mbcStage.bandCount);
245 }
246 case DynamicsProcessing::limiter: {
Ram Mohanafdf90b2023-03-23 08:48:25 +0530247 return isChannelConfigValid(dp.get<DynamicsProcessing::limiter>());
248 }
249 case DynamicsProcessing::inputGain: {
250 return isChannelConfigValid(dp.get<DynamicsProcessing::inputGain>());
251 }
252 default: {
253 return true;
254 }
255 }
256 return true;
257}
Ram Mohane4064ce2022-12-20 18:05:14 +0530258
Ram Mohane4064ce2022-12-20 18:05:14 +0530259bool DynamicsProcessingTestHelper::isParamEqual(const DynamicsProcessing::Tag& tag,
260 const DynamicsProcessing& dpRef,
261 const DynamicsProcessing& dpTest) {
262 switch (tag) {
263 case DynamicsProcessing::engineArchitecture: {
264 return isEngineConfigEqual(dpRef.get<DynamicsProcessing::engineArchitecture>(),
265 dpTest.get<DynamicsProcessing::engineArchitecture>());
266 }
267 case DynamicsProcessing::preEq: {
268 const auto& source = dpRef.get<DynamicsProcessing::preEq>();
269 const auto& target = dpTest.get<DynamicsProcessing::preEq>();
270 return isAidlVectorEqualAfterFilter<DynamicsProcessing::ChannelConfig>(source, target);
271 }
272 case DynamicsProcessing::postEq: {
273 return isAidlVectorEqualAfterFilter<DynamicsProcessing::ChannelConfig>(
274 dpRef.get<DynamicsProcessing::postEq>(),
275 dpTest.get<DynamicsProcessing::postEq>());
276 }
277 case DynamicsProcessing::mbc: {
278 return isAidlVectorEqualAfterFilter<DynamicsProcessing::ChannelConfig>(
279 dpRef.get<DynamicsProcessing::mbc>(), dpTest.get<DynamicsProcessing::mbc>());
280 }
281 case DynamicsProcessing::preEqBand: {
282 return isAidlVectorEqualAfterFilter<DynamicsProcessing::EqBandConfig>(
283 dpRef.get<DynamicsProcessing::preEqBand>(),
284 dpTest.get<DynamicsProcessing::preEqBand>());
285 }
286 case DynamicsProcessing::postEqBand: {
287 return isAidlVectorEqualAfterFilter<DynamicsProcessing::EqBandConfig>(
288 dpRef.get<DynamicsProcessing::postEqBand>(),
289 dpTest.get<DynamicsProcessing::postEqBand>());
290 }
291 case DynamicsProcessing::mbcBand: {
292 return isAidlVectorEqualAfterFilter<DynamicsProcessing::MbcBandConfig>(
293 dpRef.get<DynamicsProcessing::mbcBand>(),
294 dpTest.get<DynamicsProcessing::mbcBand>());
295 }
296 case DynamicsProcessing::limiter: {
297 return isAidlVectorEqualAfterFilter<DynamicsProcessing::LimiterConfig>(
298 dpRef.get<DynamicsProcessing::limiter>(),
299 dpTest.get<DynamicsProcessing::limiter>());
300 }
301 case DynamicsProcessing::inputGain: {
302 return isAidlVectorEqual<DynamicsProcessing::InputGain>(
303 dpRef.get<DynamicsProcessing::inputGain>(),
304 dpTest.get<DynamicsProcessing::inputGain>());
305 }
Shunkai Yaob2325e52023-03-03 19:34:47 +0000306 case DynamicsProcessing::vendor: {
Ram Mohane4064ce2022-12-20 18:05:14 +0530307 return false;
308 }
309 }
310}
311
Ram Mohane4064ce2022-12-20 18:05:14 +0530312bool DynamicsProcessingTestHelper::isEngineConfigEqual(
313 const DynamicsProcessing::EngineArchitecture& ref,
314 const DynamicsProcessing::EngineArchitecture& test) {
315 return ref == test;
316}
317
318template <typename T>
319std::vector<T> DynamicsProcessingTestHelper::filterEnabledVector(const std::vector<T>& vec) {
320 std::vector<T> ret;
321 std::copy_if(vec.begin(), vec.end(), std::back_inserter(ret),
322 [](const auto& v) { return v.enable; });
323 return ret;
324}
325
326template <typename T>
327bool DynamicsProcessingTestHelper::isAidlVectorEqual(const std::vector<T>& source,
328 const std::vector<T>& target) {
329 if (source.size() != target.size()) return false;
330
331 auto tempS = source;
332 auto tempT = target;
333 std::sort(tempS.begin(), tempS.end());
334 std::sort(tempT.begin(), tempT.end());
335 return tempS == tempT;
336}
337
338template <typename T>
339bool DynamicsProcessingTestHelper::isAidlVectorEqualAfterFilter(const std::vector<T>& source,
340 const std::vector<T>& target) {
341 return isAidlVectorEqual<T>(filterEnabledVector<T>(source), filterEnabledVector<T>(target));
342}
343
344void DynamicsProcessingTestHelper::SetAndGetDynamicsProcessingParameters() {
Sneha Patilabc94642024-11-13 08:41:05 +0000345 for (const auto& [tag, dp] : mTags) {
Ram Mohane4064ce2022-12-20 18:05:14 +0530346 // validate parameter
347 Descriptor desc;
348 ASSERT_STATUS(EX_NONE, mEffect->getDescriptor(&desc));
Ram Mohanafdf90b2023-03-23 08:48:25 +0530349 bool valid = isParamInRange(dp, desc.capability.range.get<Range::dynamicsProcessing>());
350 if (valid) valid = isParamValid(tag, dp);
Ram Mohane4064ce2022-12-20 18:05:14 +0530351 const binder_exception_t expected = valid ? EX_NONE : EX_ILLEGAL_ARGUMENT;
352
353 // set parameter
354 Parameter expectParam;
355 Parameter::Specific specific;
356 specific.set<Parameter::Specific::dynamicsProcessing>(dp);
357 expectParam.set<Parameter::specific>(specific);
Shunkai Yao0a0c45e2023-02-13 17:41:11 +0000358 ASSERT_STATUS(expected, mEffect->setParameter(expectParam))
359 << "\n"
360 << expectParam.toString() << "\n"
361 << desc.toString();
Ram Mohane4064ce2022-12-20 18:05:14 +0530362
363 // only get if parameter in range and set success
364 if (expected == EX_NONE) {
365 Parameter getParam;
366 Parameter::Id id;
367 DynamicsProcessing::Id dpId;
368 dpId.set<DynamicsProcessing::Id::commonTag>(tag);
369 id.set<Parameter::Id::dynamicsProcessingTag>(dpId);
370 // if set success, then get should match
371 EXPECT_STATUS(expected, mEffect->getParameter(id, &getParam));
372 Parameter::Specific specificTest = getParam.get<Parameter::specific>();
373 const auto& target = specificTest.get<Parameter::Specific::dynamicsProcessing>();
374 EXPECT_TRUE(isParamEqual(tag, dp, target)) << dp.toString() << "\n"
375 << target.toString();
376 // update mEngineConfigApplied after setting successfully
377 if (tag == DynamicsProcessing::engineArchitecture) {
378 mEngineConfigApplied = target.get<DynamicsProcessing::engineArchitecture>();
379 }
380 }
381 }
382}
383
Sneha Patilabc94642024-11-13 08:41:05 +0000384bool DynamicsProcessingTestHelper::isAllParamsValid() {
385 if (mTags.empty()) {
386 return false;
387 }
388 for (const auto& [tag, dp] : mTags) {
389 // validate parameter
390 if (!isParamInRange(dp, mDescriptor.capability.range.get<Range::dynamicsProcessing>())) {
391 return false;
392 }
393 if (!isParamValid(tag, dp)) {
394 return false;
395 }
396 }
397 return true;
398}
399
Sneha Patilcbf86a42024-11-26 10:41:54 +0000400float DynamicsProcessingTestHelper::calculateDb(const std::vector<float>& input,
401 size_t startSamplePos = 0) {
402 return audio_utils_compute_power_mono(input.data() + startSamplePos, AUDIO_FORMAT_PCM_FLOAT,
403 input.size() - startSamplePos);
404}
405
406void DynamicsProcessingTestHelper::setParamsAndProcess(std::vector<float>& input,
407 std::vector<float>& output) {
408 ASSERT_NO_FATAL_FAILURE(SetAndGetDynamicsProcessingParameters());
409 if (isAllParamsValid()) {
410 ASSERT_NO_FATAL_FAILURE(
411 processAndWriteToOutput(input, output, mEffect, &mOpenEffectReturn));
412 ASSERT_GT(output.size(), kStartIndex);
413 }
414}
415
Ram Mohane4064ce2022-12-20 18:05:14 +0530416void DynamicsProcessingTestHelper::addEngineConfig(
417 const DynamicsProcessing::EngineArchitecture& cfg) {
418 DynamicsProcessing dp;
419 dp.set<DynamicsProcessing::engineArchitecture>(cfg);
420 mTags.push_back({DynamicsProcessing::engineArchitecture, dp});
421}
422
423void DynamicsProcessingTestHelper::addPreEqChannelConfig(
424 const std::vector<DynamicsProcessing::ChannelConfig>& cfgs) {
425 DynamicsProcessing dp;
426 dp.set<DynamicsProcessing::preEq>(cfgs);
427 mTags.push_back({DynamicsProcessing::preEq, dp});
428 for (auto& cfg : cfgs) {
429 if (cfg.enable) mPreEqChannelEnable.insert(cfg.channel);
430 }
431}
432
433void DynamicsProcessingTestHelper::addPostEqChannelConfig(
434 const std::vector<DynamicsProcessing::ChannelConfig>& cfgs) {
435 DynamicsProcessing dp;
436 dp.set<DynamicsProcessing::postEq>(cfgs);
437 mTags.push_back({DynamicsProcessing::postEq, dp});
438 for (auto& cfg : cfgs) {
439 if (cfg.enable) mPostEqChannelEnable.insert(cfg.channel);
440 }
441}
442
443void DynamicsProcessingTestHelper::addMbcChannelConfig(
444 const std::vector<DynamicsProcessing::ChannelConfig>& cfgs) {
445 DynamicsProcessing dp;
446 dp.set<DynamicsProcessing::mbc>(cfgs);
447 mTags.push_back({DynamicsProcessing::mbc, dp});
448 for (auto& cfg : cfgs) {
449 if (cfg.enable) mMbcChannelEnable.insert(cfg.channel);
450 }
451}
452
453void DynamicsProcessingTestHelper::addPreEqBandConfigs(
454 const std::vector<DynamicsProcessing::EqBandConfig>& cfgs) {
455 DynamicsProcessing dp;
456 dp.set<DynamicsProcessing::preEqBand>(cfgs);
457 mTags.push_back({DynamicsProcessing::preEqBand, dp});
458}
459
460void DynamicsProcessingTestHelper::addPostEqBandConfigs(
461 const std::vector<DynamicsProcessing::EqBandConfig>& cfgs) {
462 DynamicsProcessing dp;
463 dp.set<DynamicsProcessing::postEqBand>(cfgs);
464 mTags.push_back({DynamicsProcessing::postEqBand, dp});
465}
466
467void DynamicsProcessingTestHelper::addMbcBandConfigs(
468 const std::vector<DynamicsProcessing::MbcBandConfig>& cfgs) {
469 DynamicsProcessing dp;
470 dp.set<DynamicsProcessing::mbcBand>(cfgs);
471 mTags.push_back({DynamicsProcessing::mbcBand, dp});
472}
473
474void DynamicsProcessingTestHelper::addLimiterConfig(
475 const std::vector<DynamicsProcessing::LimiterConfig>& cfgs) {
476 DynamicsProcessing dp;
477 dp.set<DynamicsProcessing::limiter>(cfgs);
478 mTags.push_back({DynamicsProcessing::limiter, dp});
479 for (auto& cfg : cfgs) {
480 if (cfg.enable) mLimiterChannelEnable.insert(cfg.channel);
481 }
482}
483
484void DynamicsProcessingTestHelper::addInputGain(
485 const std::vector<DynamicsProcessing::InputGain>& inputGains) {
486 DynamicsProcessing dp;
487 dp.set<DynamicsProcessing::inputGain>(inputGains);
488 mTags.push_back({DynamicsProcessing::inputGain, dp});
489}
490
Sneha Patilabc94642024-11-13 08:41:05 +0000491void fillLimiterConfig(std::vector<DynamicsProcessing::LimiterConfig>& limiterConfigList,
492 int channelIndex, bool enable, int linkGroup, float attackTime,
493 float releaseTime, float ratio, float threshold, float postGain) {
494 DynamicsProcessing::LimiterConfig cfg;
495 cfg.channel = channelIndex;
496 cfg.enable = enable;
497 cfg.linkGroup = linkGroup;
498 cfg.attackTimeMs = attackTime;
499 cfg.releaseTimeMs = releaseTime;
500 cfg.ratio = ratio;
501 cfg.thresholdDb = threshold;
502 cfg.postGainDb = postGain;
503 limiterConfigList.push_back(cfg);
504}
505
Ram Mohane4064ce2022-12-20 18:05:14 +0530506/**
507 * Test DynamicsProcessing Engine Configuration
508 */
509enum EngineArchitectureTestParamName {
510 ENGINE_TEST_INSTANCE_NAME,
511 ENGINE_TEST_RESOLUTION_PREFERENCE,
512 ENGINE_TEST_PREFERRED_DURATION,
Shunkai Yaof137ba42024-04-11 17:11:03 +0000513 ENGINE_TEST_STAGE_ENABLEMENT
Ram Mohane4064ce2022-12-20 18:05:14 +0530514};
515using EngineArchitectureTestParams = std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>,
516 DynamicsProcessing::ResolutionPreference, float,
Shunkai Yaof137ba42024-04-11 17:11:03 +0000517 DynamicsProcessing::StageEnablement>;
Ram Mohane4064ce2022-12-20 18:05:14 +0530518
519void fillEngineArchConfig(DynamicsProcessing::EngineArchitecture& cfg,
520 const EngineArchitectureTestParams& params) {
521 cfg.resolutionPreference = std::get<ENGINE_TEST_RESOLUTION_PREFERENCE>(params);
522 cfg.preferredProcessingDurationMs = std::get<ENGINE_TEST_PREFERRED_DURATION>(params);
523 cfg.preEqStage = cfg.postEqStage = cfg.mbcStage =
524 std::get<ENGINE_TEST_STAGE_ENABLEMENT>(params);
Shunkai Yaof137ba42024-04-11 17:11:03 +0000525 cfg.limiterInUse = true;
Ram Mohane4064ce2022-12-20 18:05:14 +0530526}
527
528class DynamicsProcessingTestEngineArchitecture
529 : public ::testing::TestWithParam<EngineArchitectureTestParams>,
530 public DynamicsProcessingTestHelper {
531 public:
532 DynamicsProcessingTestEngineArchitecture()
533 : DynamicsProcessingTestHelper(std::get<ENGINE_TEST_INSTANCE_NAME>(GetParam())) {
534 fillEngineArchConfig(mCfg, GetParam());
535 };
536
537 void SetUp() override { SetUpDynamicsProcessingEffect(); }
538
539 void TearDown() override { TearDownDynamicsProcessingEffect(); }
540
541 DynamicsProcessing::EngineArchitecture mCfg;
542};
543
544TEST_P(DynamicsProcessingTestEngineArchitecture, SetAndGetEngineArch) {
545 EXPECT_NO_FATAL_FAILURE(addEngineConfig(mCfg));
Sneha Patilabc94642024-11-13 08:41:05 +0000546 ASSERT_NO_FATAL_FAILURE(SetAndGetDynamicsProcessingParameters());
Ram Mohane4064ce2022-12-20 18:05:14 +0530547}
548
549INSTANTIATE_TEST_SUITE_P(
550 DynamicsProcessingTest, DynamicsProcessingTestEngineArchitecture,
551 ::testing::Combine(
552 testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
Shunkai Yaof8be1ac2023-03-06 18:41:27 +0000553 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
Ram Mohanafdf90b2023-03-23 08:48:25 +0530554 testing::Values(
555 DynamicsProcessing::ResolutionPreference::FAVOR_TIME_RESOLUTION,
556 DynamicsProcessing::ResolutionPreference::FAVOR_FREQUENCY_RESOLUTION,
557 static_cast<DynamicsProcessing::ResolutionPreference>(-1)), // variant
558 testing::Values(-10.f, 0.f, 10.f), // processing duration
Ram Mohane4064ce2022-12-20 18:05:14 +0530559 testing::ValuesIn(
Shunkai Yaof137ba42024-04-11 17:11:03 +0000560 DynamicsProcessingTestHelper::kStageEnablementTestSet) // preEQ/postEQ/mbc
561 ),
Ram Mohane4064ce2022-12-20 18:05:14 +0530562 [](const auto& info) {
563 auto descriptor = std::get<ENGINE_TEST_INSTANCE_NAME>(info.param).second;
564 DynamicsProcessing::EngineArchitecture cfg;
565 fillEngineArchConfig(cfg, info.param);
Jaideep Sharmae4c7a962023-06-14 19:14:44 +0530566 std::string name = getPrefix(descriptor) + "_Cfg_" + cfg.toString();
Ram Mohane4064ce2022-12-20 18:05:14 +0530567 std::replace_if(
568 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
569 return name;
570 });
571GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestEngineArchitecture);
572
573/**
574 * Test DynamicsProcessing Input Gain
575 */
576enum InputGainTestParamName {
577 INPUT_GAIN_INSTANCE_NAME,
578 INPUT_GAIN_PARAM,
579};
580class DynamicsProcessingTestInputGain
581 : public ::testing::TestWithParam<std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>,
582 std::vector<DynamicsProcessing::InputGain>>>,
583 public DynamicsProcessingTestHelper {
584 public:
585 DynamicsProcessingTestInputGain()
586 : DynamicsProcessingTestHelper(std::get<INPUT_GAIN_INSTANCE_NAME>(GetParam())),
Sneha Patilabc94642024-11-13 08:41:05 +0000587 mInputGain(std::get<INPUT_GAIN_PARAM>(GetParam())) {};
Ram Mohane4064ce2022-12-20 18:05:14 +0530588
589 void SetUp() override { SetUpDynamicsProcessingEffect(); }
590
591 void TearDown() override { TearDownDynamicsProcessingEffect(); }
592
593 const std::vector<DynamicsProcessing::InputGain> mInputGain;
594};
595
596TEST_P(DynamicsProcessingTestInputGain, SetAndGetInputGain) {
597 EXPECT_NO_FATAL_FAILURE(addInputGain(mInputGain));
Sneha Patilabc94642024-11-13 08:41:05 +0000598 ASSERT_NO_FATAL_FAILURE(SetAndGetDynamicsProcessingParameters());
Ram Mohane4064ce2022-12-20 18:05:14 +0530599}
600
601INSTANTIATE_TEST_SUITE_P(
602 DynamicsProcessingTest, DynamicsProcessingTestInputGain,
603 ::testing::Combine(testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
Shunkai Yaof8be1ac2023-03-06 18:41:27 +0000604 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
Ram Mohane4064ce2022-12-20 18:05:14 +0530605 testing::ValuesIn(DynamicsProcessingTestInputGain::kInputGainTestSet)),
606 [](const auto& info) {
607 auto descriptor = std::get<INPUT_GAIN_INSTANCE_NAME>(info.param).second;
608 std::string gains =
609 ::android::internal::ToString(std::get<INPUT_GAIN_PARAM>(info.param));
610 std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
611 descriptor.common.name + "_UUID_" +
Shunkai Yao6f822452024-03-29 18:45:30 +0000612 toString(descriptor.common.id.uuid) + "_inputGains_" + gains;
Ram Mohane4064ce2022-12-20 18:05:14 +0530613 std::replace_if(
614 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
615 return name;
616 });
617GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestInputGain);
618
Sneha Patilcbf86a42024-11-26 10:41:54 +0000619class DynamicsProcessingInputGainDataTest
620 : public ::testing::TestWithParam<std::pair<std::shared_ptr<IFactory>, Descriptor>>,
621 public DynamicsProcessingTestHelper {
622 public:
623 DynamicsProcessingInputGainDataTest()
624 : DynamicsProcessingTestHelper((GetParam()), AudioChannelLayout::LAYOUT_MONO) {
625 mInput.resize(kFrameCount * mChannelCount);
626 generateSineWave(kInputFrequency /*Input Frequency*/, mInput);
627 mInputDb = calculateDb(mInput);
628 }
629
630 void SetUp() override {
631 SetUpDynamicsProcessingEffect();
632 SKIP_TEST_IF_DATA_UNSUPPORTED(mDescriptor.common.flags);
633 }
634
635 void TearDown() override { TearDownDynamicsProcessingEffect(); }
636
637 void cleanUpInputGainConfig() {
638 CleanUp();
639 mInputGain.clear();
640 }
641
642 std::vector<DynamicsProcessing::InputGain> mInputGain;
643 std::vector<float> mInput;
644 float mInputDb;
645};
646
647TEST_P(DynamicsProcessingInputGainDataTest, SetAndGetInputGain) {
648 std::vector<float> gainDbValues = {-85, -40, 0, 40, 85};
649 for (float gainDb : gainDbValues) {
650 cleanUpInputGainConfig();
651 for (int i = 0; i < mChannelCount; i++) {
652 mInputGain.push_back(DynamicsProcessing::InputGain(i, gainDb));
653 }
654 std::vector<float> output(mInput.size());
655 EXPECT_NO_FATAL_FAILURE(addInputGain(mInputGain));
656 EXPECT_NO_FATAL_FAILURE(setParamsAndProcess(mInput, output));
657 if (!isAllParamsValid()) {
658 continue;
659 }
660 float outputDb = calculateDb(output, kStartIndex);
661 EXPECT_NEAR(outputDb, mInputDb + gainDb, kToleranceDb)
662 << "InputGain: " << gainDb << ", OutputDb: " << outputDb;
663 }
664}
665
666INSTANTIATE_TEST_SUITE_P(DynamicsProcessingTest, DynamicsProcessingInputGainDataTest,
667 testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
668 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
669 [](const auto& info) {
670 auto descriptor = info.param;
671 std::string name = getPrefix(descriptor.second);
672 std::replace_if(
673 name.begin(), name.end(),
674 [](const char c) { return !std::isalnum(c); }, '_');
675 return name;
676 });
677GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingInputGainDataTest);
678
Ram Mohane4064ce2022-12-20 18:05:14 +0530679/**
680 * Test DynamicsProcessing Limiter Config
681 */
682enum LimiterConfigTestParamName {
683 LIMITER_INSTANCE_NAME,
684 LIMITER_CHANNEL,
Ram Mohane4064ce2022-12-20 18:05:14 +0530685 LIMITER_LINK_GROUP,
Ram Mohane4064ce2022-12-20 18:05:14 +0530686 LIMITER_ATTACK_TIME,
687 LIMITER_RELEASE_TIME,
688 LIMITER_RATIO,
689 LIMITER_THRESHOLD,
690 LIMITER_POST_GAIN,
Ram Mohane4064ce2022-12-20 18:05:14 +0530691};
Ram Mohane4064ce2022-12-20 18:05:14 +0530692
Shunkai Yaof137ba42024-04-11 17:11:03 +0000693using LimiterConfigTestParams = std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>,
Sneha Patilabc94642024-11-13 08:41:05 +0000694 int32_t, int32_t, float, float, float, float, float>;
Ram Mohane4064ce2022-12-20 18:05:14 +0530695
Sneha Patilabc94642024-11-13 08:41:05 +0000696void fillLimiterConfig(std::vector<DynamicsProcessing::LimiterConfig>& cfg,
Ram Mohane4064ce2022-12-20 18:05:14 +0530697 const LimiterConfigTestParams& params) {
Sneha Patilabc94642024-11-13 08:41:05 +0000698 fillLimiterConfig(cfg, std::get<LIMITER_CHANNEL>(params), true,
699 std::get<LIMITER_LINK_GROUP>(params), std::get<LIMITER_ATTACK_TIME>(params),
700 std::get<LIMITER_RELEASE_TIME>(params), std::get<LIMITER_RATIO>(params),
701 std::get<LIMITER_THRESHOLD>(params), std::get<LIMITER_POST_GAIN>(params));
Ram Mohane4064ce2022-12-20 18:05:14 +0530702}
703
704class DynamicsProcessingTestLimiterConfig
705 : public ::testing::TestWithParam<LimiterConfigTestParams>,
706 public DynamicsProcessingTestHelper {
707 public:
708 DynamicsProcessingTestLimiterConfig()
Shunkai Yaof137ba42024-04-11 17:11:03 +0000709 : DynamicsProcessingTestHelper(std::get<LIMITER_INSTANCE_NAME>(GetParam())) {
Sneha Patilabc94642024-11-13 08:41:05 +0000710 fillLimiterConfig(mLimiterConfigList, GetParam());
Ram Mohane4064ce2022-12-20 18:05:14 +0530711 }
712
713 void SetUp() override { SetUpDynamicsProcessingEffect(); }
714
715 void TearDown() override { TearDownDynamicsProcessingEffect(); }
716
717 DynamicsProcessing::LimiterConfig mCfg;
Sneha Patilabc94642024-11-13 08:41:05 +0000718 std::vector<DynamicsProcessing::LimiterConfig> mLimiterConfigList;
Ram Mohane4064ce2022-12-20 18:05:14 +0530719};
720
721TEST_P(DynamicsProcessingTestLimiterConfig, SetAndGetLimiterConfig) {
Ram Mohane4064ce2022-12-20 18:05:14 +0530722 EXPECT_NO_FATAL_FAILURE(addEngineConfig(mEngineConfigPreset));
Sneha Patilabc94642024-11-13 08:41:05 +0000723 EXPECT_NO_FATAL_FAILURE(addLimiterConfig(mLimiterConfigList));
724 ASSERT_NO_FATAL_FAILURE(SetAndGetDynamicsProcessingParameters());
Ram Mohane4064ce2022-12-20 18:05:14 +0530725}
726
727INSTANTIATE_TEST_SUITE_P(
728 DynamicsProcessingTest, DynamicsProcessingTestLimiterConfig,
729 ::testing::Combine(testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
Shunkai Yaof8be1ac2023-03-06 18:41:27 +0000730 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
Sneha Patilabc94642024-11-13 08:41:05 +0000731 testing::Values(-1, 0, 1, 2), // channel index
732 testing::Values(3), // link group
733 testing::Values(-1, 1), // attackTime
734 testing::Values(-60, 60), // releaseTime
735 testing::Values(-2.5, 2.5), // ratio
736 testing::Values(-2, 2), // thresh
737 testing::Values(-3.14, 3.14) // postGain
738 ),
Ram Mohane4064ce2022-12-20 18:05:14 +0530739 [](const auto& info) {
740 auto descriptor = std::get<LIMITER_INSTANCE_NAME>(info.param).second;
Sneha Patilabc94642024-11-13 08:41:05 +0000741 std::vector<DynamicsProcessing::LimiterConfig> cfg;
Ram Mohane4064ce2022-12-20 18:05:14 +0530742 fillLimiterConfig(cfg, info.param);
Sneha Patilabc94642024-11-13 08:41:05 +0000743 std::string name =
744 "Implementer_" + getPrefix(descriptor) + "_limiterConfig_" + cfg[0].toString();
Ram Mohane4064ce2022-12-20 18:05:14 +0530745 std::replace_if(
746 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
747 return name;
748 });
749GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestLimiterConfig);
750
Sneha Patilabc94642024-11-13 08:41:05 +0000751using LimiterConfigDataTestParams = std::pair<std::shared_ptr<IFactory>, Descriptor>;
752
753class DynamicsProcessingLimiterConfigDataTest
754 : public ::testing::TestWithParam<LimiterConfigDataTestParams>,
755 public DynamicsProcessingTestHelper {
756 public:
757 DynamicsProcessingLimiterConfigDataTest()
758 : DynamicsProcessingTestHelper(GetParam(), AudioChannelLayout::LAYOUT_MONO) {
759 mBufferSize = kFrameCount * mChannelCount;
760 mInput.resize(mBufferSize);
761 generateSineWave(1000 /*Input Frequency*/, mInput);
762 mInputDb = calculateDb(mInput);
763 }
764
765 void SetUp() override {
766 SetUpDynamicsProcessingEffect();
767 SKIP_TEST_IF_DATA_UNSUPPORTED(mDescriptor.common.flags);
768 }
769
770 void TearDown() override { TearDownDynamicsProcessingEffect(); }
771
Sneha Patilabc94642024-11-13 08:41:05 +0000772 void computeThreshold(float ratio, float outputDb, float& threshold) {
773 EXPECT_NE(ratio, 0);
774 threshold = (mInputDb - (ratio * outputDb)) / (1 - ratio);
775 }
776
777 void computeRatio(float threshold, float outputDb, float& ratio) {
778 float inputOverThreshold = mInputDb - threshold;
779 float outputOverThreshold = outputDb - threshold;
780 EXPECT_NE(outputOverThreshold, 0);
781 ratio = inputOverThreshold / outputOverThreshold;
782 }
783
Sneha Patilcbf86a42024-11-26 10:41:54 +0000784 void setLimiterParamsAndProcess(std::vector<float>& input, std::vector<float>& output) {
Sneha Patilabc94642024-11-13 08:41:05 +0000785 EXPECT_NO_FATAL_FAILURE(addEngineConfig(mEngineConfigPreset));
786 EXPECT_NO_FATAL_FAILURE(addLimiterConfig(mLimiterConfigList));
Sneha Patilcbf86a42024-11-26 10:41:54 +0000787 EXPECT_NO_FATAL_FAILURE(setParamsAndProcess(input, output));
Sneha Patilabc94642024-11-13 08:41:05 +0000788 }
789
790 void cleanUpLimiterConfig() {
791 CleanUp();
792 mLimiterConfigList.clear();
793 }
794 static constexpr float kDefaultLinkerGroup = 3;
795 static constexpr float kDefaultAttackTime = 0;
796 static constexpr float kDefaultReleaseTime = 0;
797 static constexpr float kDefaultRatio = 4;
Sneha Patilcbf86a42024-11-26 10:41:54 +0000798 static constexpr float kDefaultThreshold = -10;
Sneha Patilabc94642024-11-13 08:41:05 +0000799 static constexpr float kDefaultPostGain = 0;
Sneha Patilabc94642024-11-13 08:41:05 +0000800 std::vector<DynamicsProcessing::LimiterConfig> mLimiterConfigList;
801 std::vector<float> mInput;
802 float mInputDb;
803 int mBufferSize;
804};
805
806TEST_P(DynamicsProcessingLimiterConfigDataTest, IncreasingThresholdDb) {
807 std::vector<float> thresholdValues = {-200, -150, -100, -50, -5, 0};
808 std::vector<float> output(mInput.size());
809 float previousThreshold = -FLT_MAX;
810 for (float threshold : thresholdValues) {
Sneha Patilcbf86a42024-11-26 10:41:54 +0000811 cleanUpLimiterConfig();
Sneha Patilabc94642024-11-13 08:41:05 +0000812 for (int i = 0; i < mChannelCount; i++) {
813 fillLimiterConfig(mLimiterConfigList, i, true, kDefaultLinkerGroup, kDefaultAttackTime,
814 kDefaultReleaseTime, kDefaultRatio, threshold, kDefaultPostGain);
815 }
Sneha Patilcbf86a42024-11-26 10:41:54 +0000816 EXPECT_NO_FATAL_FAILURE(setLimiterParamsAndProcess(mInput, output));
Sneha Patilabc94642024-11-13 08:41:05 +0000817 if (!isAllParamsValid()) {
818 continue;
819 }
820 float outputDb = calculateDb(output, kStartIndex);
821 if (threshold >= mInputDb || kDefaultRatio == 1) {
Sneha Patilcbf86a42024-11-26 10:41:54 +0000822 EXPECT_NEAR(mInputDb, outputDb, kToleranceDb);
Sneha Patilabc94642024-11-13 08:41:05 +0000823 } else {
824 float calculatedThreshold = 0;
825 EXPECT_NO_FATAL_FAILURE(computeThreshold(kDefaultRatio, outputDb, calculatedThreshold));
826 ASSERT_GT(calculatedThreshold, previousThreshold);
827 previousThreshold = calculatedThreshold;
828 }
829 }
830}
831
832TEST_P(DynamicsProcessingLimiterConfigDataTest, IncreasingRatio) {
833 std::vector<float> ratioValues = {1, 10, 20, 30, 40, 50};
834 std::vector<float> output(mInput.size());
Sneha Patilabc94642024-11-13 08:41:05 +0000835 float previousRatio = 0;
836 for (float ratio : ratioValues) {
Sneha Patilcbf86a42024-11-26 10:41:54 +0000837 cleanUpLimiterConfig();
Sneha Patilabc94642024-11-13 08:41:05 +0000838 for (int i = 0; i < mChannelCount; i++) {
839 fillLimiterConfig(mLimiterConfigList, i, true, kDefaultLinkerGroup, kDefaultAttackTime,
Sneha Patilcbf86a42024-11-26 10:41:54 +0000840 kDefaultReleaseTime, ratio, kDefaultThreshold, kDefaultPostGain);
Sneha Patilabc94642024-11-13 08:41:05 +0000841 }
Sneha Patilcbf86a42024-11-26 10:41:54 +0000842 EXPECT_NO_FATAL_FAILURE(setLimiterParamsAndProcess(mInput, output));
Sneha Patilabc94642024-11-13 08:41:05 +0000843 if (!isAllParamsValid()) {
844 continue;
845 }
846 float outputDb = calculateDb(output, kStartIndex);
847
Sneha Patilcbf86a42024-11-26 10:41:54 +0000848 if (kDefaultThreshold >= mInputDb) {
849 EXPECT_NEAR(mInputDb, outputDb, kToleranceDb);
Sneha Patilabc94642024-11-13 08:41:05 +0000850 } else {
851 float calculatedRatio = 0;
Sneha Patilcbf86a42024-11-26 10:41:54 +0000852 EXPECT_NO_FATAL_FAILURE(computeRatio(kDefaultThreshold, outputDb, calculatedRatio));
Sneha Patilabc94642024-11-13 08:41:05 +0000853 ASSERT_GT(calculatedRatio, previousRatio);
854 previousRatio = calculatedRatio;
855 }
856 }
857}
858
Sneha Patilcbf86a42024-11-26 10:41:54 +0000859TEST_P(DynamicsProcessingLimiterConfigDataTest, IncreasingPostGain) {
860 std::vector<float> postGainDbValues = {-85, -40, 0, 40, 85};
861 std::vector<float> output(mInput.size());
862 for (float postGainDb : postGainDbValues) {
863 cleanUpLimiterConfig();
864 for (int i = 0; i < mChannelCount; i++) {
865 fillLimiterConfig(mLimiterConfigList, i, true, kDefaultLinkerGroup, kDefaultAttackTime,
866 kDefaultReleaseTime, kDefaultRatio, -1, postGainDb);
867 }
868 EXPECT_NO_FATAL_FAILURE(setLimiterParamsAndProcess(mInput, output));
869 if (!isAllParamsValid()) {
870 continue;
871 }
872 float outputDb = calculateDb(output, kStartIndex);
873 EXPECT_NEAR(outputDb, mInputDb + postGainDb, kToleranceDb)
874 << "PostGain: " << postGainDb << ", OutputDb: " << outputDb;
875 }
876}
877
Sneha Patilabc94642024-11-13 08:41:05 +0000878TEST_P(DynamicsProcessingLimiterConfigDataTest, LimiterEnableDisable) {
879 std::vector<bool> limiterEnableValues = {false, true};
880 std::vector<float> output(mInput.size());
881 for (bool isEnabled : limiterEnableValues) {
Sneha Patilcbf86a42024-11-26 10:41:54 +0000882 cleanUpLimiterConfig();
Sneha Patilabc94642024-11-13 08:41:05 +0000883 for (int i = 0; i < mChannelCount; i++) {
884 // Set non-default values
885 fillLimiterConfig(mLimiterConfigList, i, isEnabled, kDefaultLinkerGroup,
886 5 /*attack time*/, 5 /*release time*/, 10 /*ratio*/,
887 -10 /*threshold*/, 5 /*postgain*/);
888 }
Sneha Patilcbf86a42024-11-26 10:41:54 +0000889 EXPECT_NO_FATAL_FAILURE(setLimiterParamsAndProcess(mInput, output));
Sneha Patilabc94642024-11-13 08:41:05 +0000890 if (!isAllParamsValid()) {
891 continue;
892 }
893 if (isEnabled) {
894 EXPECT_NE(mInputDb, calculateDb(output, kStartIndex));
895 } else {
Sneha Patilcbf86a42024-11-26 10:41:54 +0000896 EXPECT_NEAR(mInputDb, calculateDb(output, kStartIndex), kToleranceDb);
Sneha Patilabc94642024-11-13 08:41:05 +0000897 }
898 }
899}
900
901INSTANTIATE_TEST_SUITE_P(DynamicsProcessingTest, DynamicsProcessingLimiterConfigDataTest,
902 testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
903 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
904 [](const auto& info) {
905 auto descriptor = info.param;
906 std::string name = getPrefix(descriptor.second);
907 std::replace_if(
908 name.begin(), name.end(),
909 [](const char c) { return !std::isalnum(c); }, '_');
910 return name;
911 });
Sneha Patild341d6f2024-11-28 06:27:19 +0000912GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingLimiterConfigDataTest);
Sneha Patilabc94642024-11-13 08:41:05 +0000913
Ram Mohane4064ce2022-12-20 18:05:14 +0530914/**
915 * Test DynamicsProcessing ChannelConfig
916 */
917enum ChannelConfigTestParamName {
918 BAND_CHANNEL_TEST_INSTANCE_NAME,
Shunkai Yaof137ba42024-04-11 17:11:03 +0000919 BAND_CHANNEL_TEST_CHANNEL_CONFIG
Ram Mohane4064ce2022-12-20 18:05:14 +0530920};
921using ChannelConfigTestParams = std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>,
Shunkai Yaof137ba42024-04-11 17:11:03 +0000922 std::vector<DynamicsProcessing::ChannelConfig>>;
Ram Mohane4064ce2022-12-20 18:05:14 +0530923
924class DynamicsProcessingTestChannelConfig
925 : public ::testing::TestWithParam<ChannelConfigTestParams>,
926 public DynamicsProcessingTestHelper {
927 public:
928 DynamicsProcessingTestChannelConfig()
929 : DynamicsProcessingTestHelper(std::get<BAND_CHANNEL_TEST_INSTANCE_NAME>(GetParam())),
Shunkai Yaof137ba42024-04-11 17:11:03 +0000930 mCfg(std::get<BAND_CHANNEL_TEST_CHANNEL_CONFIG>(GetParam())) {}
Ram Mohane4064ce2022-12-20 18:05:14 +0530931
932 void SetUp() override { SetUpDynamicsProcessingEffect(); }
933
934 void TearDown() override { TearDownDynamicsProcessingEffect(); }
935
936 std::vector<DynamicsProcessing::ChannelConfig> mCfg;
Ram Mohane4064ce2022-12-20 18:05:14 +0530937};
938
939TEST_P(DynamicsProcessingTestChannelConfig, SetAndGetPreEqChannelConfig) {
Ram Mohane4064ce2022-12-20 18:05:14 +0530940 EXPECT_NO_FATAL_FAILURE(addEngineConfig(mEngineConfigPreset));
941 EXPECT_NO_FATAL_FAILURE(addPreEqChannelConfig(mCfg));
Sneha Patilabc94642024-11-13 08:41:05 +0000942 ASSERT_NO_FATAL_FAILURE(SetAndGetDynamicsProcessingParameters());
Ram Mohane4064ce2022-12-20 18:05:14 +0530943}
944
945TEST_P(DynamicsProcessingTestChannelConfig, SetAndGetPostEqChannelConfig) {
Ram Mohane4064ce2022-12-20 18:05:14 +0530946 EXPECT_NO_FATAL_FAILURE(addEngineConfig(mEngineConfigPreset));
947 EXPECT_NO_FATAL_FAILURE(addPostEqChannelConfig(mCfg));
Sneha Patilabc94642024-11-13 08:41:05 +0000948 ASSERT_NO_FATAL_FAILURE(SetAndGetDynamicsProcessingParameters());
Ram Mohane4064ce2022-12-20 18:05:14 +0530949}
950
951TEST_P(DynamicsProcessingTestChannelConfig, SetAndGetMbcChannelConfig) {
Ram Mohane4064ce2022-12-20 18:05:14 +0530952 EXPECT_NO_FATAL_FAILURE(addEngineConfig(mEngineConfigPreset));
953 EXPECT_NO_FATAL_FAILURE(addMbcChannelConfig(mCfg));
Sneha Patilabc94642024-11-13 08:41:05 +0000954 ASSERT_NO_FATAL_FAILURE(SetAndGetDynamicsProcessingParameters());
Ram Mohane4064ce2022-12-20 18:05:14 +0530955}
956
957INSTANTIATE_TEST_SUITE_P(
958 DynamicsProcessingTest, DynamicsProcessingTestChannelConfig,
959 ::testing::Combine(
960 testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
Shunkai Yaof8be1ac2023-03-06 18:41:27 +0000961 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
Ram Mohane4064ce2022-12-20 18:05:14 +0530962 testing::ValuesIn(
Shunkai Yaof137ba42024-04-11 17:11:03 +0000963 DynamicsProcessingTestHelper::kChannelConfigTestSet)), // channel config
Ram Mohane4064ce2022-12-20 18:05:14 +0530964 [](const auto& info) {
965 auto descriptor = std::get<BAND_CHANNEL_TEST_INSTANCE_NAME>(info.param).second;
Ram Mohane4064ce2022-12-20 18:05:14 +0530966 std::string channelConfig = ::android::internal::ToString(
967 std::get<BAND_CHANNEL_TEST_CHANNEL_CONFIG>(info.param));
968
969 std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
970 descriptor.common.name + "_UUID_" +
Shunkai Yaof137ba42024-04-11 17:11:03 +0000971 toString(descriptor.common.id.uuid) + "_" + channelConfig;
Ram Mohane4064ce2022-12-20 18:05:14 +0530972 std::replace_if(
973 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
974 return name;
975 });
976GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestChannelConfig);
977
978/**
979 * Test DynamicsProcessing EqBandConfig
980 */
981enum EqBandConfigTestParamName {
982 EQ_BAND_INSTANCE_NAME,
983 EQ_BAND_CHANNEL,
Ram Mohane4064ce2022-12-20 18:05:14 +0530984 EQ_BAND_CUT_OFF_FREQ,
Shunkai Yaof137ba42024-04-11 17:11:03 +0000985 EQ_BAND_GAIN
Ram Mohane4064ce2022-12-20 18:05:14 +0530986};
987using EqBandConfigTestParams = std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, int32_t,
Sneha Patilabc94642024-11-13 08:41:05 +0000988 std::vector<std::pair<int, float>>, float>;
Ram Mohane4064ce2022-12-20 18:05:14 +0530989
990void fillEqBandConfig(std::vector<DynamicsProcessing::EqBandConfig>& cfgs,
991 const EqBandConfigTestParams& params) {
992 const std::vector<std::pair<int, float>> cutOffFreqs = std::get<EQ_BAND_CUT_OFF_FREQ>(params);
993 int bandCount = cutOffFreqs.size();
994 cfgs.resize(bandCount);
995 for (int i = 0; i < bandCount; i++) {
996 cfgs[i].channel = std::get<EQ_BAND_CHANNEL>(params);
997 cfgs[i].band = cutOffFreqs[i].first;
Sneha Patilabc94642024-11-13 08:41:05 +0000998 cfgs[i].enable = true /*Eqband Enable*/;
Ram Mohane4064ce2022-12-20 18:05:14 +0530999 cfgs[i].cutoffFrequencyHz = cutOffFreqs[i].second;
1000 cfgs[i].gainDb = std::get<EQ_BAND_GAIN>(params);
1001 }
1002}
1003
1004class DynamicsProcessingTestEqBandConfig : public ::testing::TestWithParam<EqBandConfigTestParams>,
1005 public DynamicsProcessingTestHelper {
1006 public:
1007 DynamicsProcessingTestEqBandConfig()
Shunkai Yaof137ba42024-04-11 17:11:03 +00001008 : DynamicsProcessingTestHelper(std::get<EQ_BAND_INSTANCE_NAME>(GetParam())) {
Ram Mohane4064ce2022-12-20 18:05:14 +05301009 fillEqBandConfig(mCfgs, GetParam());
1010 }
1011
1012 void SetUp() override { SetUpDynamicsProcessingEffect(); }
1013
1014 void TearDown() override { TearDownDynamicsProcessingEffect(); }
1015
1016 std::vector<DynamicsProcessing::EqBandConfig> mCfgs;
Ram Mohane4064ce2022-12-20 18:05:14 +05301017};
1018
1019TEST_P(DynamicsProcessingTestEqBandConfig, SetAndGetPreEqBandConfig) {
Ram Mohane4064ce2022-12-20 18:05:14 +05301020 mEngineConfigPreset.preEqStage.bandCount = mCfgs.size();
1021 EXPECT_NO_FATAL_FAILURE(addEngineConfig(mEngineConfigPreset));
Ram Mohanafdf90b2023-03-23 08:48:25 +05301022 std::vector<DynamicsProcessing::ChannelConfig> cfgs(mChannelCount);
1023 for (int i = 0; i < mChannelCount; i++) {
1024 cfgs[i].channel = i;
1025 cfgs[i].enable = true;
1026 }
1027 EXPECT_NO_FATAL_FAILURE(addPreEqChannelConfig(cfgs));
Ram Mohane4064ce2022-12-20 18:05:14 +05301028 EXPECT_NO_FATAL_FAILURE(addPreEqBandConfigs(mCfgs));
Sneha Patilabc94642024-11-13 08:41:05 +00001029 ASSERT_NO_FATAL_FAILURE(SetAndGetDynamicsProcessingParameters());
Ram Mohane4064ce2022-12-20 18:05:14 +05301030}
1031
1032TEST_P(DynamicsProcessingTestEqBandConfig, SetAndGetPostEqBandConfig) {
Ram Mohane4064ce2022-12-20 18:05:14 +05301033 mEngineConfigPreset.postEqStage.bandCount = mCfgs.size();
1034 EXPECT_NO_FATAL_FAILURE(addEngineConfig(mEngineConfigPreset));
Ram Mohanafdf90b2023-03-23 08:48:25 +05301035 std::vector<DynamicsProcessing::ChannelConfig> cfgs(mChannelCount);
1036 for (int i = 0; i < mChannelCount; i++) {
1037 cfgs[i].channel = i;
1038 cfgs[i].enable = true;
1039 }
1040 EXPECT_NO_FATAL_FAILURE(addPostEqChannelConfig(cfgs));
Ram Mohane4064ce2022-12-20 18:05:14 +05301041 EXPECT_NO_FATAL_FAILURE(addPostEqBandConfigs(mCfgs));
Sneha Patilabc94642024-11-13 08:41:05 +00001042 ASSERT_NO_FATAL_FAILURE(SetAndGetDynamicsProcessingParameters());
Ram Mohane4064ce2022-12-20 18:05:14 +05301043}
1044
1045std::vector<std::vector<std::pair<int, float>>> kBands{
1046 {
1047 {0, 600},
1048 {1, 2000},
1049 {2, 6000},
1050 {3, 10000},
1051 {4, 16000},
1052 }, // 5 bands
1053 {
1054 {0, 800},
1055 {3, 15000},
1056 {2, 6000},
1057 {1, 2000},
1058 }, // 4 bands, unsorted
1059 {
1060 {0, 650},
1061 {1, 2000},
1062 {2, 6000},
1063 {3, 10000},
1064 {3, 16000},
1065 }, // 5 bands, missing band
1066 {
1067 {0, 900},
1068 {1, 8000},
1069 {2, 4000},
1070 {3, 12000},
1071 }, // 4 bands, cutoff freq not increasing
1072 {
1073 {0, 450},
1074 {1, 2000},
1075 {7, 6000},
1076 {3, 10000},
1077 {4, 16000},
1078 }, // bad band index
1079 {
1080 {0, 1},
1081 {1, 8000},
1082 }, // too low cutoff freq
1083 {
1084 {0, 1200},
1085 {1, 80000},
1086 }, // too high cutoff freq
1087};
1088
1089INSTANTIATE_TEST_SUITE_P(
1090 DynamicsProcessingTest, DynamicsProcessingTestEqBandConfig,
Ram Mohanafdf90b2023-03-23 08:48:25 +05301091 ::testing::Combine(testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
1092 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
Sneha Patilabc94642024-11-13 08:41:05 +00001093 testing::Values(-1, 0, 10), // channel index
1094 testing::ValuesIn(kBands), // band index, cut off frequencies
Shunkai Yaof137ba42024-04-11 17:11:03 +00001095 testing::Values(-3.14f, 3.14f) // gain
1096 ),
Ram Mohane4064ce2022-12-20 18:05:14 +05301097 [](const auto& info) {
1098 auto descriptor = std::get<EQ_BAND_INSTANCE_NAME>(info.param).second;
1099 std::vector<DynamicsProcessing::EqBandConfig> cfgs;
1100 fillEqBandConfig(cfgs, info.param);
Ram Mohane4064ce2022-12-20 18:05:14 +05301101 std::string bands = ::android::internal::ToString(cfgs);
Ram Mohane4064ce2022-12-20 18:05:14 +05301102 std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
1103 descriptor.common.name + "_UUID_" +
Shunkai Yaof137ba42024-04-11 17:11:03 +00001104 toString(descriptor.common.id.uuid) + "_bands_" + bands;
Ram Mohane4064ce2022-12-20 18:05:14 +05301105 std::replace_if(
1106 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
1107 return name;
1108 });
1109GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestEqBandConfig);
1110
1111/**
1112 * Test DynamicsProcessing MbcBandConfig
1113 */
1114
1115enum MbcBandConfigParamName {
1116 MBC_BAND_INSTANCE_NAME,
1117 MBC_BAND_CHANNEL,
Ram Mohane4064ce2022-12-20 18:05:14 +05301118 MBC_BAND_CUTOFF_FREQ,
Ram Mohane4064ce2022-12-20 18:05:14 +05301119 MBC_BAND_ADDITIONAL
1120};
1121enum MbcBandConfigAdditional {
1122 MBC_ADD_ATTACK_TIME,
1123 MBC_ADD_RELEASE_TIME,
1124 MBC_ADD_RATIO,
1125 MBC_ADD_THRESHOLD,
1126 MBC_ADD_KNEE_WIDTH,
1127 MBC_ADD_NOISE_GATE_THRESHOLD,
1128 MBC_ADD_EXPENDER_RATIO,
1129 MBC_ADD_PRE_GAIN,
1130 MBC_ADD_POST_GAIN,
1131 MBC_ADD_MAX_NUM
1132};
1133using TestParamsMbcBandConfigAdditional = std::array<float, MBC_ADD_MAX_NUM>;
1134
Ram Mohanafdf90b2023-03-23 08:48:25 +05301135// attackTime, releaseTime, ratio, thresh, kneeWidth, noise, expander, preGain, postGain
Ram Mohane4064ce2022-12-20 18:05:14 +05301136static constexpr std::array<TestParamsMbcBandConfigAdditional, 4> kMbcBandConfigAdditionalParam = {
1137 {{-3, -10, -2, -2, -5, -90, -2.5, -2, -2},
1138 {0, 0, 0, 0, 0, 0, 0, 0, 0},
1139 {-3, 10, -2, 2, -5, 90, -2.5, 2, -2},
Ram Mohanafdf90b2023-03-23 08:48:25 +05301140 {3, 10, 2, -2, -5, 90, 2.5, 2, 2}}};
Ram Mohane4064ce2022-12-20 18:05:14 +05301141
1142using TestParamsMbcBandConfig =
Sneha Patilabc94642024-11-13 08:41:05 +00001143 std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, int32_t,
Shunkai Yaof137ba42024-04-11 17:11:03 +00001144 std::vector<std::pair<int, float>>, TestParamsMbcBandConfigAdditional>;
Ram Mohane4064ce2022-12-20 18:05:14 +05301145
1146void fillMbcBandConfig(std::vector<DynamicsProcessing::MbcBandConfig>& cfgs,
1147 const TestParamsMbcBandConfig& params) {
1148 const std::vector<std::pair<int, float>> cutOffFreqs = std::get<MBC_BAND_CUTOFF_FREQ>(params);
1149 const std::array<float, MBC_ADD_MAX_NUM> additional = std::get<MBC_BAND_ADDITIONAL>(params);
1150 int bandCount = cutOffFreqs.size();
1151 cfgs.resize(bandCount);
1152 for (int i = 0; i < bandCount; i++) {
1153 cfgs[i] = DynamicsProcessing::MbcBandConfig{
1154 .channel = std::get<MBC_BAND_CHANNEL>(params),
1155 .band = cutOffFreqs[i].first,
Sneha Patilabc94642024-11-13 08:41:05 +00001156 .enable = true /*Mbc Band Enable*/,
Ram Mohane4064ce2022-12-20 18:05:14 +05301157 .cutoffFrequencyHz = cutOffFreqs[i].second,
1158 .attackTimeMs = additional[MBC_ADD_ATTACK_TIME],
1159 .releaseTimeMs = additional[MBC_ADD_RELEASE_TIME],
1160 .ratio = additional[MBC_ADD_RATIO],
1161 .thresholdDb = additional[MBC_ADD_THRESHOLD],
1162 .kneeWidthDb = additional[MBC_ADD_KNEE_WIDTH],
1163 .noiseGateThresholdDb = additional[MBC_ADD_NOISE_GATE_THRESHOLD],
1164 .expanderRatio = additional[MBC_ADD_EXPENDER_RATIO],
1165 .preGainDb = additional[MBC_ADD_PRE_GAIN],
1166 .postGainDb = additional[MBC_ADD_POST_GAIN]};
1167 }
1168}
1169
1170class DynamicsProcessingTestMbcBandConfig
1171 : public ::testing::TestWithParam<TestParamsMbcBandConfig>,
1172 public DynamicsProcessingTestHelper {
1173 public:
1174 DynamicsProcessingTestMbcBandConfig()
Shunkai Yaof137ba42024-04-11 17:11:03 +00001175 : DynamicsProcessingTestHelper(std::get<MBC_BAND_INSTANCE_NAME>(GetParam())) {
Ram Mohane4064ce2022-12-20 18:05:14 +05301176 fillMbcBandConfig(mCfgs, GetParam());
1177 }
1178
1179 void SetUp() override { SetUpDynamicsProcessingEffect(); }
1180
1181 void TearDown() override { TearDownDynamicsProcessingEffect(); }
1182
1183 std::vector<DynamicsProcessing::MbcBandConfig> mCfgs;
Ram Mohane4064ce2022-12-20 18:05:14 +05301184};
1185
1186TEST_P(DynamicsProcessingTestMbcBandConfig, SetAndGetMbcBandConfig) {
Ram Mohane4064ce2022-12-20 18:05:14 +05301187 mEngineConfigPreset.mbcStage.bandCount = mCfgs.size();
1188 EXPECT_NO_FATAL_FAILURE(addEngineConfig(mEngineConfigPreset));
Ram Mohanafdf90b2023-03-23 08:48:25 +05301189 std::vector<DynamicsProcessing::ChannelConfig> cfgs(mChannelCount);
1190 for (int i = 0; i < mChannelCount; i++) {
1191 cfgs[i].channel = i;
1192 cfgs[i].enable = true;
1193 }
1194 EXPECT_NO_FATAL_FAILURE(addMbcChannelConfig(cfgs));
Ram Mohane4064ce2022-12-20 18:05:14 +05301195 EXPECT_NO_FATAL_FAILURE(addMbcBandConfigs(mCfgs));
Sneha Patilabc94642024-11-13 08:41:05 +00001196 ASSERT_NO_FATAL_FAILURE(SetAndGetDynamicsProcessingParameters());
Ram Mohane4064ce2022-12-20 18:05:14 +05301197}
1198
1199INSTANTIATE_TEST_SUITE_P(
1200 DynamicsProcessingTest, DynamicsProcessingTestMbcBandConfig,
Ram Mohanafdf90b2023-03-23 08:48:25 +05301201 ::testing::Combine(testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
1202 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
Sneha Patilabc94642024-11-13 08:41:05 +00001203 testing::Values(-1, 0, 10), // channel index
1204 testing::ValuesIn(kBands), // band index, cut off frequencies
Ram Mohanafdf90b2023-03-23 08:48:25 +05301205 testing::ValuesIn(kMbcBandConfigAdditionalParam)), // Additional
Ram Mohane4064ce2022-12-20 18:05:14 +05301206 [](const auto& info) {
1207 auto descriptor = std::get<MBC_BAND_INSTANCE_NAME>(info.param).second;
1208 std::vector<DynamicsProcessing::MbcBandConfig> cfgs;
1209 fillMbcBandConfig(cfgs, info.param);
Ram Mohane4064ce2022-12-20 18:05:14 +05301210 std::string mbcBands = ::android::internal::ToString(cfgs);
Ram Mohane4064ce2022-12-20 18:05:14 +05301211 std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
1212 descriptor.common.name + "_UUID_" +
Shunkai Yaof137ba42024-04-11 17:11:03 +00001213 toString(descriptor.common.id.uuid) + "_bands_" + mbcBands;
Ram Mohane4064ce2022-12-20 18:05:14 +05301214 std::replace_if(
1215 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
1216 return name;
1217 });
1218GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestMbcBandConfig);
1219
1220int main(int argc, char** argv) {
1221 ::testing::InitGoogleTest(&argc, argv);
Jaideep Sharma74498412023-09-13 15:25:25 +05301222 ::testing::UnitTest::GetInstance()->listeners().Append(new TestExecutionTracer());
Ram Mohane4064ce2022-12-20 18:05:14 +05301223 ABinderProcess_setThreadPoolMaxThreadCount(1);
1224 ABinderProcess_startThreadPool();
1225 return RUN_ALL_TESTS();
1226}