blob: 5509c76eb96cd896f4c5155c299f2854fb00e437 [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#include <aidl/Vintf.h>
22#define LOG_TAG "VtsHalDynamicsProcessingTest"
23#include <android-base/logging.h>
24
Ram Mohane4064ce2022-12-20 18:05:14 +053025#include <Utils.h>
Mikhail Naganov872d4a62023-03-09 18:19:01 -080026
Ram Mohane4064ce2022-12-20 18:05:14 +053027#include "EffectHelper.h"
Ram Mohanafdf90b2023-03-23 08:48:25 +053028#include "EffectRangeSpecific.h"
Ram Mohane4064ce2022-12-20 18:05:14 +053029
30using namespace android;
Ram Mohanafdf90b2023-03-23 08:48:25 +053031using namespace aidl::android::hardware::audio::effect::DynamicsProcessingRanges;
Ram Mohane4064ce2022-12-20 18:05:14 +053032
Ram Mohane4064ce2022-12-20 18:05:14 +053033using aidl::android::hardware::audio::effect::Descriptor;
34using aidl::android::hardware::audio::effect::DynamicsProcessing;
Shunkai Yaof8be1ac2023-03-06 18:41:27 +000035using aidl::android::hardware::audio::effect::getEffectTypeUuidDynamicsProcessing;
Ram Mohane4064ce2022-12-20 18:05:14 +053036using aidl::android::hardware::audio::effect::IEffect;
37using aidl::android::hardware::audio::effect::IFactory;
Ram Mohane4064ce2022-12-20 18:05:14 +053038using aidl::android::hardware::audio::effect::Parameter;
39
40/**
41 * Here we focus on specific parameter checking, general IEffect interfaces testing performed in
42 * VtsAudioEffectTargetTest.
43 */
44class DynamicsProcessingTestHelper : public EffectHelper {
45 public:
46 DynamicsProcessingTestHelper(std::pair<std::shared_ptr<IFactory>, Descriptor> pair,
47 int32_t channelLayOut = AudioChannelLayout::LAYOUT_STEREO) {
48 std::tie(mFactory, mDescriptor) = pair;
49 mChannelLayout = channelLayOut;
Mikhail Naganov872d4a62023-03-09 18:19:01 -080050 mChannelCount = ::aidl::android::hardware::audio::common::getChannelCount(
Ram Mohane4064ce2022-12-20 18:05:14 +053051 AudioChannelLayout::make<AudioChannelLayout::layoutMask>(mChannelLayout));
52 }
53
54 // setup
55 void SetUpDynamicsProcessingEffect() {
56 ASSERT_NE(nullptr, mFactory);
57 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
58
59 Parameter::Specific specific = getDefaultParamSpecific();
60 Parameter::Common common = EffectHelper::createParamCommon(
61 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
62 0x100 /* iFrameCount */, 0x100 /* oFrameCount */,
63 AudioChannelLayout::make<AudioChannelLayout::layoutMask>(mChannelLayout),
64 AudioChannelLayout::make<AudioChannelLayout::layoutMask>(mChannelLayout));
65 IEffect::OpenEffectReturn ret;
66 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, specific, &ret, EX_NONE));
67 ASSERT_NE(nullptr, mEffect);
68 mEngineConfigApplied = mEngineConfigPreset;
69 }
70
71 Parameter::Specific getDefaultParamSpecific() {
72 DynamicsProcessing dp = DynamicsProcessing::make<DynamicsProcessing::engineArchitecture>(
73 mEngineConfigPreset);
74 Parameter::Specific specific =
75 Parameter::Specific::make<Parameter::Specific::dynamicsProcessing>(dp);
76 return specific;
77 }
78
79 // teardown
80 void TearDownDynamicsProcessingEffect() {
81 ASSERT_NO_FATAL_FAILURE(close(mEffect));
82 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
83 }
84
85 // utils functions for parameter checking
Ram Mohane4064ce2022-12-20 18:05:14 +053086 bool isParamEqual(const DynamicsProcessing::Tag& tag, const DynamicsProcessing& dpRef,
87 const DynamicsProcessing& dpTest);
Ram Mohane4064ce2022-12-20 18:05:14 +053088 bool isEngineConfigEqual(const DynamicsProcessing::EngineArchitecture& refCfg,
89 const DynamicsProcessing::EngineArchitecture& testCfg);
90
91 template <typename T>
92 std::vector<T> filterEnabledVector(const std::vector<T>& vec);
93
94 template <typename T>
95 bool isAidlVectorEqualAfterFilter(const std::vector<T>& source, const std::vector<T>& target);
96
97 template <typename T>
98 bool isAidlVectorEqual(const std::vector<T>& source, const std::vector<T>& target);
99
Ram Mohanafdf90b2023-03-23 08:48:25 +0530100 template <typename T>
101 bool isChannelConfigValid(const std::vector<T>& cfgs) {
102 auto& channelCount = mChannelCount;
103 return std::all_of(cfgs.cbegin(), cfgs.cend(), [channelCount](const T& cfg) {
104 return (cfg.channel >= 0 && cfg.channel < channelCount);
105 });
106 }
107
108 template <typename T>
109 bool isBandConfigValid(const std::vector<T>& cfgs, int bandCount);
110
111 bool isParamValid(const DynamicsProcessing::Tag& tag, const DynamicsProcessing& dp);
112
Ram Mohane4064ce2022-12-20 18:05:14 +0530113 // get set params and validate
114 void SetAndGetDynamicsProcessingParameters();
115
116 // enqueue test parameters
117 void addEngineConfig(const DynamicsProcessing::EngineArchitecture& cfg);
118 void addPreEqChannelConfig(const std::vector<DynamicsProcessing::ChannelConfig>& cfg);
119 void addPostEqChannelConfig(const std::vector<DynamicsProcessing::ChannelConfig>& cfg);
120 void addMbcChannelConfig(const std::vector<DynamicsProcessing::ChannelConfig>& cfg);
121 void addPreEqBandConfigs(const std::vector<DynamicsProcessing::EqBandConfig>& cfgs);
122 void addPostEqBandConfigs(const std::vector<DynamicsProcessing::EqBandConfig>& cfgs);
123 void addMbcBandConfigs(const std::vector<DynamicsProcessing::MbcBandConfig>& cfgs);
124 void addLimiterConfig(const std::vector<DynamicsProcessing::LimiterConfig>& cfg);
125 void addInputGain(const std::vector<DynamicsProcessing::InputGain>& inputGain);
126
127 static constexpr float kPreferredProcessingDurationMs = 10.0f;
128 static constexpr int kBandCount = 5;
129 std::shared_ptr<IFactory> mFactory;
130 std::shared_ptr<IEffect> mEffect;
131 Descriptor mDescriptor;
132 DynamicsProcessing::EngineArchitecture mEngineConfigApplied;
133 DynamicsProcessing::EngineArchitecture mEngineConfigPreset{
134 .resolutionPreference =
135 DynamicsProcessing::ResolutionPreference::FAVOR_FREQUENCY_RESOLUTION,
136 .preferredProcessingDurationMs = kPreferredProcessingDurationMs,
137 .preEqStage = {.inUse = true, .bandCount = kBandCount},
138 .postEqStage = {.inUse = true, .bandCount = kBandCount},
139 .mbcStage = {.inUse = true, .bandCount = kBandCount},
140 .limiterInUse = true,
141 };
142
143 std::unordered_set<int /* channelId */> mPreEqChannelEnable;
144 std::unordered_set<int /* channelId */> mPostEqChannelEnable;
145 std::unordered_set<int /* channelId */> mMbcChannelEnable;
146 std::unordered_set<int /* channelId */> mLimiterChannelEnable;
147 static const std::set<std::vector<DynamicsProcessing::ChannelConfig>> kChannelConfigTestSet;
148 static const std::set<DynamicsProcessing::StageEnablement> kStageEnablementTestSet;
149 static const std::set<std::vector<DynamicsProcessing::InputGain>> kInputGainTestSet;
150
Ram Mohanafdf90b2023-03-23 08:48:25 +0530151 protected:
152 int mChannelCount;
153
Ram Mohane4064ce2022-12-20 18:05:14 +0530154 private:
155 int32_t mChannelLayout;
Ram Mohane4064ce2022-12-20 18:05:14 +0530156 std::vector<std::pair<DynamicsProcessing::Tag, DynamicsProcessing>> mTags;
157 void CleanUp() {
158 mTags.clear();
159 mPreEqChannelEnable.clear();
160 mPostEqChannelEnable.clear();
161 mMbcChannelEnable.clear();
162 mLimiterChannelEnable.clear();
163 }
164};
165
166// test value set for DynamicsProcessing::StageEnablement
167const std::set<DynamicsProcessing::StageEnablement>
168 DynamicsProcessingTestHelper::kStageEnablementTestSet = {
169 {.inUse = true, .bandCount = DynamicsProcessingTestHelper::kBandCount},
170 {.inUse = true, .bandCount = 0},
171 {.inUse = true, .bandCount = -1},
Ram Mohanafdf90b2023-03-23 08:48:25 +0530172 {.inUse = false, .bandCount = 0},
173 {.inUse = false, .bandCount = -1},
Ram Mohane4064ce2022-12-20 18:05:14 +0530174 {.inUse = false, .bandCount = DynamicsProcessingTestHelper::kBandCount}};
175
176// test value set for DynamicsProcessing::ChannelConfig
177const std::set<std::vector<DynamicsProcessing::ChannelConfig>>
178 DynamicsProcessingTestHelper::kChannelConfigTestSet = {
179 {{.channel = -1, .enable = false},
180 {.channel = 0, .enable = true},
181 {.channel = 1, .enable = false},
182 {.channel = 2, .enable = true}},
Ram Mohane4064ce2022-12-20 18:05:14 +0530183 {{.channel = -1, .enable = false}, {.channel = 2, .enable = true}},
Ram Mohane4064ce2022-12-20 18:05:14 +0530184 {{.channel = 0, .enable = true}, {.channel = 1, .enable = true}}};
185
186// test value set for DynamicsProcessing::InputGain
187const std::set<std::vector<DynamicsProcessing::InputGain>>
188 DynamicsProcessingTestHelper::kInputGainTestSet = {
189 {{.channel = 0, .gainDb = 10.f},
190 {.channel = 1, .gainDb = 0.f},
191 {.channel = 2, .gainDb = -10.f}},
Ram Mohane4064ce2022-12-20 18:05:14 +0530192 {{.channel = -1, .gainDb = -10.f}, {.channel = -2, .gainDb = 10.f}},
Ram Mohanafdf90b2023-03-23 08:48:25 +0530193 {{.channel = -1, .gainDb = 10.f}, {.channel = 0, .gainDb = -10.f}},
194 {{.channel = 0, .gainDb = 10.f}, {.channel = 1, .gainDb = -10.f}}};
Ram Mohane4064ce2022-12-20 18:05:14 +0530195
Ram Mohanafdf90b2023-03-23 08:48:25 +0530196template <typename T>
197bool DynamicsProcessingTestHelper::isBandConfigValid(const std::vector<T>& cfgs, int bandCount) {
198 std::vector<float> freqs(cfgs.size(), -1);
199 for (auto cfg : cfgs) {
200 if (cfg.channel < 0 || cfg.channel >= mChannelCount) return false;
201 if (cfg.band < 0 || cfg.band >= bandCount) return false;
202 freqs[cfg.band] = cfg.cutoffFrequencyHz;
203 }
204 if (std::count(freqs.begin(), freqs.end(), -1)) return false;
205 return std::is_sorted(freqs.begin(), freqs.end());
206}
207
208bool DynamicsProcessingTestHelper::isParamValid(const DynamicsProcessing::Tag& tag,
209 const DynamicsProcessing& dp) {
210 switch (tag) {
211 case DynamicsProcessing::preEq: {
212 if (!mEngineConfigApplied.preEqStage.inUse) return false;
213 return isChannelConfigValid(dp.get<DynamicsProcessing::preEq>());
214 }
215 case DynamicsProcessing::postEq: {
216 if (!mEngineConfigApplied.postEqStage.inUse) return false;
217 return isChannelConfigValid(dp.get<DynamicsProcessing::postEq>());
218 }
219 case DynamicsProcessing::mbc: {
220 if (!mEngineConfigApplied.mbcStage.inUse) return false;
221 return isChannelConfigValid(dp.get<DynamicsProcessing::mbc>());
222 }
223 case DynamicsProcessing::preEqBand: {
224 if (!mEngineConfigApplied.preEqStage.inUse) return false;
225 return isBandConfigValid(dp.get<DynamicsProcessing::preEqBand>(),
226 mEngineConfigApplied.preEqStage.bandCount);
227 }
228 case DynamicsProcessing::postEqBand: {
229 if (!mEngineConfigApplied.postEqStage.inUse) return false;
230 return isBandConfigValid(dp.get<DynamicsProcessing::postEqBand>(),
231 mEngineConfigApplied.postEqStage.bandCount);
232 }
233 case DynamicsProcessing::mbcBand: {
234 if (!mEngineConfigApplied.mbcStage.inUse) return false;
235 return isBandConfigValid(dp.get<DynamicsProcessing::mbcBand>(),
236 mEngineConfigApplied.mbcStage.bandCount);
237 }
238 case DynamicsProcessing::limiter: {
239 if (!mEngineConfigApplied.limiterInUse) return false;
240 return isChannelConfigValid(dp.get<DynamicsProcessing::limiter>());
241 }
242 case DynamicsProcessing::inputGain: {
243 return isChannelConfigValid(dp.get<DynamicsProcessing::inputGain>());
244 }
245 default: {
246 return true;
247 }
248 }
249 return true;
250}
Ram Mohane4064ce2022-12-20 18:05:14 +0530251
Ram Mohane4064ce2022-12-20 18:05:14 +0530252bool DynamicsProcessingTestHelper::isParamEqual(const DynamicsProcessing::Tag& tag,
253 const DynamicsProcessing& dpRef,
254 const DynamicsProcessing& dpTest) {
255 switch (tag) {
256 case DynamicsProcessing::engineArchitecture: {
257 return isEngineConfigEqual(dpRef.get<DynamicsProcessing::engineArchitecture>(),
258 dpTest.get<DynamicsProcessing::engineArchitecture>());
259 }
260 case DynamicsProcessing::preEq: {
261 const auto& source = dpRef.get<DynamicsProcessing::preEq>();
262 const auto& target = dpTest.get<DynamicsProcessing::preEq>();
263 return isAidlVectorEqualAfterFilter<DynamicsProcessing::ChannelConfig>(source, target);
264 }
265 case DynamicsProcessing::postEq: {
266 return isAidlVectorEqualAfterFilter<DynamicsProcessing::ChannelConfig>(
267 dpRef.get<DynamicsProcessing::postEq>(),
268 dpTest.get<DynamicsProcessing::postEq>());
269 }
270 case DynamicsProcessing::mbc: {
271 return isAidlVectorEqualAfterFilter<DynamicsProcessing::ChannelConfig>(
272 dpRef.get<DynamicsProcessing::mbc>(), dpTest.get<DynamicsProcessing::mbc>());
273 }
274 case DynamicsProcessing::preEqBand: {
275 return isAidlVectorEqualAfterFilter<DynamicsProcessing::EqBandConfig>(
276 dpRef.get<DynamicsProcessing::preEqBand>(),
277 dpTest.get<DynamicsProcessing::preEqBand>());
278 }
279 case DynamicsProcessing::postEqBand: {
280 return isAidlVectorEqualAfterFilter<DynamicsProcessing::EqBandConfig>(
281 dpRef.get<DynamicsProcessing::postEqBand>(),
282 dpTest.get<DynamicsProcessing::postEqBand>());
283 }
284 case DynamicsProcessing::mbcBand: {
285 return isAidlVectorEqualAfterFilter<DynamicsProcessing::MbcBandConfig>(
286 dpRef.get<DynamicsProcessing::mbcBand>(),
287 dpTest.get<DynamicsProcessing::mbcBand>());
288 }
289 case DynamicsProcessing::limiter: {
290 return isAidlVectorEqualAfterFilter<DynamicsProcessing::LimiterConfig>(
291 dpRef.get<DynamicsProcessing::limiter>(),
292 dpTest.get<DynamicsProcessing::limiter>());
293 }
294 case DynamicsProcessing::inputGain: {
295 return isAidlVectorEqual<DynamicsProcessing::InputGain>(
296 dpRef.get<DynamicsProcessing::inputGain>(),
297 dpTest.get<DynamicsProcessing::inputGain>());
298 }
Shunkai Yaob2325e52023-03-03 19:34:47 +0000299 case DynamicsProcessing::vendor: {
Ram Mohane4064ce2022-12-20 18:05:14 +0530300 return false;
301 }
302 }
303}
304
Ram Mohane4064ce2022-12-20 18:05:14 +0530305bool DynamicsProcessingTestHelper::isEngineConfigEqual(
306 const DynamicsProcessing::EngineArchitecture& ref,
307 const DynamicsProcessing::EngineArchitecture& test) {
308 return ref == test;
309}
310
311template <typename T>
312std::vector<T> DynamicsProcessingTestHelper::filterEnabledVector(const std::vector<T>& vec) {
313 std::vector<T> ret;
314 std::copy_if(vec.begin(), vec.end(), std::back_inserter(ret),
315 [](const auto& v) { return v.enable; });
316 return ret;
317}
318
319template <typename T>
320bool DynamicsProcessingTestHelper::isAidlVectorEqual(const std::vector<T>& source,
321 const std::vector<T>& target) {
322 if (source.size() != target.size()) return false;
323
324 auto tempS = source;
325 auto tempT = target;
326 std::sort(tempS.begin(), tempS.end());
327 std::sort(tempT.begin(), tempT.end());
328 return tempS == tempT;
329}
330
331template <typename T>
332bool DynamicsProcessingTestHelper::isAidlVectorEqualAfterFilter(const std::vector<T>& source,
333 const std::vector<T>& target) {
334 return isAidlVectorEqual<T>(filterEnabledVector<T>(source), filterEnabledVector<T>(target));
335}
336
337void DynamicsProcessingTestHelper::SetAndGetDynamicsProcessingParameters() {
338 for (auto& it : mTags) {
339 auto& tag = it.first;
340 auto& dp = it.second;
341
342 // validate parameter
343 Descriptor desc;
344 ASSERT_STATUS(EX_NONE, mEffect->getDescriptor(&desc));
Ram Mohanafdf90b2023-03-23 08:48:25 +0530345 bool valid = isParamInRange(dp, desc.capability.range.get<Range::dynamicsProcessing>());
346 if (valid) valid = isParamValid(tag, dp);
Ram Mohane4064ce2022-12-20 18:05:14 +0530347 const binder_exception_t expected = valid ? EX_NONE : EX_ILLEGAL_ARGUMENT;
348
349 // set parameter
350 Parameter expectParam;
351 Parameter::Specific specific;
352 specific.set<Parameter::Specific::dynamicsProcessing>(dp);
353 expectParam.set<Parameter::specific>(specific);
Shunkai Yao0a0c45e2023-02-13 17:41:11 +0000354 ASSERT_STATUS(expected, mEffect->setParameter(expectParam))
355 << "\n"
356 << expectParam.toString() << "\n"
357 << desc.toString();
Ram Mohane4064ce2022-12-20 18:05:14 +0530358
359 // only get if parameter in range and set success
360 if (expected == EX_NONE) {
361 Parameter getParam;
362 Parameter::Id id;
363 DynamicsProcessing::Id dpId;
364 dpId.set<DynamicsProcessing::Id::commonTag>(tag);
365 id.set<Parameter::Id::dynamicsProcessingTag>(dpId);
366 // if set success, then get should match
367 EXPECT_STATUS(expected, mEffect->getParameter(id, &getParam));
368 Parameter::Specific specificTest = getParam.get<Parameter::specific>();
369 const auto& target = specificTest.get<Parameter::Specific::dynamicsProcessing>();
370 EXPECT_TRUE(isParamEqual(tag, dp, target)) << dp.toString() << "\n"
371 << target.toString();
372 // update mEngineConfigApplied after setting successfully
373 if (tag == DynamicsProcessing::engineArchitecture) {
374 mEngineConfigApplied = target.get<DynamicsProcessing::engineArchitecture>();
375 }
376 }
377 }
378}
379
380void DynamicsProcessingTestHelper::addEngineConfig(
381 const DynamicsProcessing::EngineArchitecture& cfg) {
382 DynamicsProcessing dp;
383 dp.set<DynamicsProcessing::engineArchitecture>(cfg);
384 mTags.push_back({DynamicsProcessing::engineArchitecture, dp});
385}
386
387void DynamicsProcessingTestHelper::addPreEqChannelConfig(
388 const std::vector<DynamicsProcessing::ChannelConfig>& cfgs) {
389 DynamicsProcessing dp;
390 dp.set<DynamicsProcessing::preEq>(cfgs);
391 mTags.push_back({DynamicsProcessing::preEq, dp});
392 for (auto& cfg : cfgs) {
393 if (cfg.enable) mPreEqChannelEnable.insert(cfg.channel);
394 }
395}
396
397void DynamicsProcessingTestHelper::addPostEqChannelConfig(
398 const std::vector<DynamicsProcessing::ChannelConfig>& cfgs) {
399 DynamicsProcessing dp;
400 dp.set<DynamicsProcessing::postEq>(cfgs);
401 mTags.push_back({DynamicsProcessing::postEq, dp});
402 for (auto& cfg : cfgs) {
403 if (cfg.enable) mPostEqChannelEnable.insert(cfg.channel);
404 }
405}
406
407void DynamicsProcessingTestHelper::addMbcChannelConfig(
408 const std::vector<DynamicsProcessing::ChannelConfig>& cfgs) {
409 DynamicsProcessing dp;
410 dp.set<DynamicsProcessing::mbc>(cfgs);
411 mTags.push_back({DynamicsProcessing::mbc, dp});
412 for (auto& cfg : cfgs) {
413 if (cfg.enable) mMbcChannelEnable.insert(cfg.channel);
414 }
415}
416
417void DynamicsProcessingTestHelper::addPreEqBandConfigs(
418 const std::vector<DynamicsProcessing::EqBandConfig>& cfgs) {
419 DynamicsProcessing dp;
420 dp.set<DynamicsProcessing::preEqBand>(cfgs);
421 mTags.push_back({DynamicsProcessing::preEqBand, dp});
422}
423
424void DynamicsProcessingTestHelper::addPostEqBandConfigs(
425 const std::vector<DynamicsProcessing::EqBandConfig>& cfgs) {
426 DynamicsProcessing dp;
427 dp.set<DynamicsProcessing::postEqBand>(cfgs);
428 mTags.push_back({DynamicsProcessing::postEqBand, dp});
429}
430
431void DynamicsProcessingTestHelper::addMbcBandConfigs(
432 const std::vector<DynamicsProcessing::MbcBandConfig>& cfgs) {
433 DynamicsProcessing dp;
434 dp.set<DynamicsProcessing::mbcBand>(cfgs);
435 mTags.push_back({DynamicsProcessing::mbcBand, dp});
436}
437
438void DynamicsProcessingTestHelper::addLimiterConfig(
439 const std::vector<DynamicsProcessing::LimiterConfig>& cfgs) {
440 DynamicsProcessing dp;
441 dp.set<DynamicsProcessing::limiter>(cfgs);
442 mTags.push_back({DynamicsProcessing::limiter, dp});
443 for (auto& cfg : cfgs) {
444 if (cfg.enable) mLimiterChannelEnable.insert(cfg.channel);
445 }
446}
447
448void DynamicsProcessingTestHelper::addInputGain(
449 const std::vector<DynamicsProcessing::InputGain>& inputGains) {
450 DynamicsProcessing dp;
451 dp.set<DynamicsProcessing::inputGain>(inputGains);
452 mTags.push_back({DynamicsProcessing::inputGain, dp});
453}
454
455/**
456 * Test DynamicsProcessing Engine Configuration
457 */
458enum EngineArchitectureTestParamName {
459 ENGINE_TEST_INSTANCE_NAME,
460 ENGINE_TEST_RESOLUTION_PREFERENCE,
461 ENGINE_TEST_PREFERRED_DURATION,
462 ENGINE_TEST_STAGE_ENABLEMENT,
463 ENGINE_TEST_LIMITER_IN_USE
464};
465using EngineArchitectureTestParams = std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>,
466 DynamicsProcessing::ResolutionPreference, float,
467 DynamicsProcessing::StageEnablement, bool>;
468
469void fillEngineArchConfig(DynamicsProcessing::EngineArchitecture& cfg,
470 const EngineArchitectureTestParams& params) {
471 cfg.resolutionPreference = std::get<ENGINE_TEST_RESOLUTION_PREFERENCE>(params);
472 cfg.preferredProcessingDurationMs = std::get<ENGINE_TEST_PREFERRED_DURATION>(params);
473 cfg.preEqStage = cfg.postEqStage = cfg.mbcStage =
474 std::get<ENGINE_TEST_STAGE_ENABLEMENT>(params);
475 cfg.limiterInUse = std::get<ENGINE_TEST_LIMITER_IN_USE>(params);
476}
477
478class DynamicsProcessingTestEngineArchitecture
479 : public ::testing::TestWithParam<EngineArchitectureTestParams>,
480 public DynamicsProcessingTestHelper {
481 public:
482 DynamicsProcessingTestEngineArchitecture()
483 : DynamicsProcessingTestHelper(std::get<ENGINE_TEST_INSTANCE_NAME>(GetParam())) {
484 fillEngineArchConfig(mCfg, GetParam());
485 };
486
487 void SetUp() override { SetUpDynamicsProcessingEffect(); }
488
489 void TearDown() override { TearDownDynamicsProcessingEffect(); }
490
491 DynamicsProcessing::EngineArchitecture mCfg;
492};
493
494TEST_P(DynamicsProcessingTestEngineArchitecture, SetAndGetEngineArch) {
495 EXPECT_NO_FATAL_FAILURE(addEngineConfig(mCfg));
496 SetAndGetDynamicsProcessingParameters();
497}
498
499INSTANTIATE_TEST_SUITE_P(
500 DynamicsProcessingTest, DynamicsProcessingTestEngineArchitecture,
501 ::testing::Combine(
502 testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
Shunkai Yaof8be1ac2023-03-06 18:41:27 +0000503 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
Ram Mohanafdf90b2023-03-23 08:48:25 +0530504 testing::Values(
505 DynamicsProcessing::ResolutionPreference::FAVOR_TIME_RESOLUTION,
506 DynamicsProcessing::ResolutionPreference::FAVOR_FREQUENCY_RESOLUTION,
507 static_cast<DynamicsProcessing::ResolutionPreference>(-1)), // variant
508 testing::Values(-10.f, 0.f, 10.f), // processing duration
Ram Mohane4064ce2022-12-20 18:05:14 +0530509 testing::ValuesIn(
510 DynamicsProcessingTestHelper::kStageEnablementTestSet), // preEQ/postEQ/mbc
511 testing::Bool()), // limiter enable
512 [](const auto& info) {
513 auto descriptor = std::get<ENGINE_TEST_INSTANCE_NAME>(info.param).second;
514 DynamicsProcessing::EngineArchitecture cfg;
515 fillEngineArchConfig(cfg, info.param);
Jaideep Sharmae4c7a962023-06-14 19:14:44 +0530516 std::string name = getPrefix(descriptor) + "_Cfg_" + cfg.toString();
Ram Mohane4064ce2022-12-20 18:05:14 +0530517 std::replace_if(
518 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
519 return name;
520 });
521GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestEngineArchitecture);
522
523/**
524 * Test DynamicsProcessing Input Gain
525 */
526enum InputGainTestParamName {
527 INPUT_GAIN_INSTANCE_NAME,
528 INPUT_GAIN_PARAM,
529};
530class DynamicsProcessingTestInputGain
531 : public ::testing::TestWithParam<std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>,
532 std::vector<DynamicsProcessing::InputGain>>>,
533 public DynamicsProcessingTestHelper {
534 public:
535 DynamicsProcessingTestInputGain()
536 : DynamicsProcessingTestHelper(std::get<INPUT_GAIN_INSTANCE_NAME>(GetParam())),
537 mInputGain(std::get<INPUT_GAIN_PARAM>(GetParam())){};
538
539 void SetUp() override { SetUpDynamicsProcessingEffect(); }
540
541 void TearDown() override { TearDownDynamicsProcessingEffect(); }
542
543 const std::vector<DynamicsProcessing::InputGain> mInputGain;
544};
545
546TEST_P(DynamicsProcessingTestInputGain, SetAndGetInputGain) {
547 EXPECT_NO_FATAL_FAILURE(addInputGain(mInputGain));
548 SetAndGetDynamicsProcessingParameters();
549}
550
551INSTANTIATE_TEST_SUITE_P(
552 DynamicsProcessingTest, DynamicsProcessingTestInputGain,
553 ::testing::Combine(testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
Shunkai Yaof8be1ac2023-03-06 18:41:27 +0000554 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
Ram Mohane4064ce2022-12-20 18:05:14 +0530555 testing::ValuesIn(DynamicsProcessingTestInputGain::kInputGainTestSet)),
556 [](const auto& info) {
557 auto descriptor = std::get<INPUT_GAIN_INSTANCE_NAME>(info.param).second;
558 std::string gains =
559 ::android::internal::ToString(std::get<INPUT_GAIN_PARAM>(info.param));
560 std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
561 descriptor.common.name + "_UUID_" +
562 descriptor.common.id.uuid.toString() + "_inputGains_" + gains;
563 std::replace_if(
564 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
565 return name;
566 });
567GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestInputGain);
568
569/**
570 * Test DynamicsProcessing Limiter Config
571 */
572enum LimiterConfigTestParamName {
573 LIMITER_INSTANCE_NAME,
574 LIMITER_CHANNEL,
575 LIMITER_ENABLE,
576 LIMITER_LINK_GROUP,
577 LIMITER_ENGINE_IN_USE,
578 LIMITER_ADDITIONAL,
579};
580enum LimiterConfigTestAdditionalParam {
581 LIMITER_ATTACK_TIME,
582 LIMITER_RELEASE_TIME,
583 LIMITER_RATIO,
584 LIMITER_THRESHOLD,
585 LIMITER_POST_GAIN,
586 LIMITER_MAX_NUM,
587};
588using LimiterConfigTestAdditional = std::array<float, LIMITER_MAX_NUM>;
Ram Mohanafdf90b2023-03-23 08:48:25 +0530589// attackTime, releaseTime, ratio, thresh, postGain
Ram Mohane4064ce2022-12-20 18:05:14 +0530590static constexpr std::array<LimiterConfigTestAdditional, 4> kLimiterConfigTestAdditionalParam = {
591 {{-1, -60, -2.5, -2, -3.14},
592 {-1, 60, -2.5, 2, -3.14},
593 {1, -60, 2.5, -2, 3.14},
Ram Mohanafdf90b2023-03-23 08:48:25 +0530594 {1, 60, 2.5, -2, 3.14}}};
Ram Mohane4064ce2022-12-20 18:05:14 +0530595
596using LimiterConfigTestParams =
597 std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, int32_t, bool, int32_t, bool,
598 LimiterConfigTestAdditional>;
599
600void fillLimiterConfig(DynamicsProcessing::LimiterConfig& cfg,
601 const LimiterConfigTestParams& params) {
602 const std::array<float, LIMITER_MAX_NUM> additional = std::get<LIMITER_ADDITIONAL>(params);
603 cfg.channel = std::get<LIMITER_CHANNEL>(params);
604 cfg.enable = std::get<LIMITER_ENABLE>(params);
605 cfg.linkGroup = std::get<LIMITER_LINK_GROUP>(params);
606 cfg.attackTimeMs = additional[LIMITER_ATTACK_TIME];
607 cfg.releaseTimeMs = additional[LIMITER_RELEASE_TIME];
608 cfg.ratio = additional[LIMITER_RATIO];
609 cfg.thresholdDb = additional[LIMITER_THRESHOLD];
610 cfg.postGainDb = additional[LIMITER_POST_GAIN];
611}
612
613class DynamicsProcessingTestLimiterConfig
614 : public ::testing::TestWithParam<LimiterConfigTestParams>,
615 public DynamicsProcessingTestHelper {
616 public:
617 DynamicsProcessingTestLimiterConfig()
618 : DynamicsProcessingTestHelper(std::get<LIMITER_INSTANCE_NAME>(GetParam())),
619 mLimiterInUseEngine(std::get<LIMITER_ENGINE_IN_USE>(GetParam())) {
620 fillLimiterConfig(mCfg, GetParam());
621 }
622
623 void SetUp() override { SetUpDynamicsProcessingEffect(); }
624
625 void TearDown() override { TearDownDynamicsProcessingEffect(); }
626
627 DynamicsProcessing::LimiterConfig mCfg;
628 bool mLimiterInUseEngine;
629};
630
631TEST_P(DynamicsProcessingTestLimiterConfig, SetAndGetLimiterConfig) {
632 mEngineConfigPreset.limiterInUse = mLimiterInUseEngine;
633 EXPECT_NO_FATAL_FAILURE(addEngineConfig(mEngineConfigPreset));
634 EXPECT_NO_FATAL_FAILURE(addLimiterConfig({mCfg}));
635 SetAndGetDynamicsProcessingParameters();
636}
637
638INSTANTIATE_TEST_SUITE_P(
639 DynamicsProcessingTest, DynamicsProcessingTestLimiterConfig,
640 ::testing::Combine(testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
Shunkai Yaof8be1ac2023-03-06 18:41:27 +0000641 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
Ram Mohane4064ce2022-12-20 18:05:14 +0530642 testing::Values(-1, 0, 1, 2), // channel count
643 testing::Bool(), // enable
644 testing::Values(3), // link group
645 testing::Bool(), // engine limiter enable
646 testing::ValuesIn(kLimiterConfigTestAdditionalParam)), // Additional
647 [](const auto& info) {
648 auto descriptor = std::get<LIMITER_INSTANCE_NAME>(info.param).second;
649 DynamicsProcessing::LimiterConfig cfg;
650 fillLimiterConfig(cfg, info.param);
651 std::string engineLimiterInUse =
652 std::to_string(std::get<LIMITER_ENGINE_IN_USE>(info.param));
653 std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
654 descriptor.common.name + "_UUID_" +
655 descriptor.common.id.uuid.toString() + "_limiterConfig_" +
656 cfg.toString() + "_engineSetting_" + engineLimiterInUse;
657 std::replace_if(
658 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
659 return name;
660 });
661GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestLimiterConfig);
662
663/**
664 * Test DynamicsProcessing ChannelConfig
665 */
666enum ChannelConfigTestParamName {
667 BAND_CHANNEL_TEST_INSTANCE_NAME,
668 BAND_CHANNEL_TEST_CHANNEL_CONFIG,
669 BAND_CHANNEL_TEST_ENGINE_IN_USE
670};
671using ChannelConfigTestParams = std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>,
672 std::vector<DynamicsProcessing::ChannelConfig>, bool>;
673
674class DynamicsProcessingTestChannelConfig
675 : public ::testing::TestWithParam<ChannelConfigTestParams>,
676 public DynamicsProcessingTestHelper {
677 public:
678 DynamicsProcessingTestChannelConfig()
679 : DynamicsProcessingTestHelper(std::get<BAND_CHANNEL_TEST_INSTANCE_NAME>(GetParam())),
680 mCfg(std::get<BAND_CHANNEL_TEST_CHANNEL_CONFIG>(GetParam())),
681 mInUseEngine(std::get<BAND_CHANNEL_TEST_ENGINE_IN_USE>(GetParam())) {}
682
683 void SetUp() override { SetUpDynamicsProcessingEffect(); }
684
685 void TearDown() override { TearDownDynamicsProcessingEffect(); }
686
687 std::vector<DynamicsProcessing::ChannelConfig> mCfg;
688 const bool mInUseEngine;
689};
690
691TEST_P(DynamicsProcessingTestChannelConfig, SetAndGetPreEqChannelConfig) {
692 mEngineConfigPreset.preEqStage.inUse = mInUseEngine;
693 EXPECT_NO_FATAL_FAILURE(addEngineConfig(mEngineConfigPreset));
694 EXPECT_NO_FATAL_FAILURE(addPreEqChannelConfig(mCfg));
695 SetAndGetDynamicsProcessingParameters();
696}
697
698TEST_P(DynamicsProcessingTestChannelConfig, SetAndGetPostEqChannelConfig) {
699 mEngineConfigPreset.postEqStage.inUse = mInUseEngine;
700 EXPECT_NO_FATAL_FAILURE(addEngineConfig(mEngineConfigPreset));
701 EXPECT_NO_FATAL_FAILURE(addPostEqChannelConfig(mCfg));
702 SetAndGetDynamicsProcessingParameters();
703}
704
705TEST_P(DynamicsProcessingTestChannelConfig, SetAndGetMbcChannelConfig) {
706 mEngineConfigPreset.mbcStage.inUse = mInUseEngine;
707 EXPECT_NO_FATAL_FAILURE(addEngineConfig(mEngineConfigPreset));
708 EXPECT_NO_FATAL_FAILURE(addMbcChannelConfig(mCfg));
709 SetAndGetDynamicsProcessingParameters();
710}
711
712INSTANTIATE_TEST_SUITE_P(
713 DynamicsProcessingTest, DynamicsProcessingTestChannelConfig,
714 ::testing::Combine(
715 testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
Shunkai Yaof8be1ac2023-03-06 18:41:27 +0000716 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
Ram Mohane4064ce2022-12-20 18:05:14 +0530717 testing::ValuesIn(
718 DynamicsProcessingTestHelper::kChannelConfigTestSet), // channel config
719 testing::Bool()), // Engine inUse
720 [](const auto& info) {
721 auto descriptor = std::get<BAND_CHANNEL_TEST_INSTANCE_NAME>(info.param).second;
722 std::string engineInUse =
723 std::to_string(std::get<BAND_CHANNEL_TEST_ENGINE_IN_USE>(info.param));
724 std::string channelConfig = ::android::internal::ToString(
725 std::get<BAND_CHANNEL_TEST_CHANNEL_CONFIG>(info.param));
726
727 std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
728 descriptor.common.name + "_UUID_" +
729 descriptor.common.id.uuid.toString() + "_" + channelConfig +
730 "_engineInUse_" + engineInUse;
731 std::replace_if(
732 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
733 return name;
734 });
735GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestChannelConfig);
736
737/**
738 * Test DynamicsProcessing EqBandConfig
739 */
740enum EqBandConfigTestParamName {
741 EQ_BAND_INSTANCE_NAME,
742 EQ_BAND_CHANNEL,
Ram Mohane4064ce2022-12-20 18:05:14 +0530743 EQ_BAND_ENABLE,
744 EQ_BAND_CUT_OFF_FREQ,
745 EQ_BAND_GAIN,
746 EQ_BAND_STAGE_IN_USE
747};
748using EqBandConfigTestParams = std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, int32_t,
Ram Mohanafdf90b2023-03-23 08:48:25 +0530749 bool, std::vector<std::pair<int, float>>, float, bool>;
Ram Mohane4064ce2022-12-20 18:05:14 +0530750
751void fillEqBandConfig(std::vector<DynamicsProcessing::EqBandConfig>& cfgs,
752 const EqBandConfigTestParams& params) {
753 const std::vector<std::pair<int, float>> cutOffFreqs = std::get<EQ_BAND_CUT_OFF_FREQ>(params);
754 int bandCount = cutOffFreqs.size();
755 cfgs.resize(bandCount);
756 for (int i = 0; i < bandCount; i++) {
757 cfgs[i].channel = std::get<EQ_BAND_CHANNEL>(params);
758 cfgs[i].band = cutOffFreqs[i].first;
759 cfgs[i].enable = std::get<EQ_BAND_ENABLE>(params);
760 cfgs[i].cutoffFrequencyHz = cutOffFreqs[i].second;
761 cfgs[i].gainDb = std::get<EQ_BAND_GAIN>(params);
762 }
763}
764
765class DynamicsProcessingTestEqBandConfig : public ::testing::TestWithParam<EqBandConfigTestParams>,
766 public DynamicsProcessingTestHelper {
767 public:
768 DynamicsProcessingTestEqBandConfig()
769 : DynamicsProcessingTestHelper(std::get<EQ_BAND_INSTANCE_NAME>(GetParam())),
Ram Mohanafdf90b2023-03-23 08:48:25 +0530770 mStageInUse(std::get<EQ_BAND_STAGE_IN_USE>(GetParam())) {
Ram Mohane4064ce2022-12-20 18:05:14 +0530771 fillEqBandConfig(mCfgs, GetParam());
772 }
773
774 void SetUp() override { SetUpDynamicsProcessingEffect(); }
775
776 void TearDown() override { TearDownDynamicsProcessingEffect(); }
777
778 std::vector<DynamicsProcessing::EqBandConfig> mCfgs;
779 const bool mStageInUse;
Ram Mohane4064ce2022-12-20 18:05:14 +0530780};
781
782TEST_P(DynamicsProcessingTestEqBandConfig, SetAndGetPreEqBandConfig) {
783 mEngineConfigPreset.preEqStage.inUse = mStageInUse;
784 mEngineConfigPreset.preEqStage.bandCount = mCfgs.size();
785 EXPECT_NO_FATAL_FAILURE(addEngineConfig(mEngineConfigPreset));
Ram Mohanafdf90b2023-03-23 08:48:25 +0530786 std::vector<DynamicsProcessing::ChannelConfig> cfgs(mChannelCount);
787 for (int i = 0; i < mChannelCount; i++) {
788 cfgs[i].channel = i;
789 cfgs[i].enable = true;
790 }
791 EXPECT_NO_FATAL_FAILURE(addPreEqChannelConfig(cfgs));
Ram Mohane4064ce2022-12-20 18:05:14 +0530792 EXPECT_NO_FATAL_FAILURE(addPreEqBandConfigs(mCfgs));
793 SetAndGetDynamicsProcessingParameters();
794}
795
796TEST_P(DynamicsProcessingTestEqBandConfig, SetAndGetPostEqBandConfig) {
797 mEngineConfigPreset.postEqStage.inUse = mStageInUse;
798 mEngineConfigPreset.postEqStage.bandCount = mCfgs.size();
799 EXPECT_NO_FATAL_FAILURE(addEngineConfig(mEngineConfigPreset));
Ram Mohanafdf90b2023-03-23 08:48:25 +0530800 std::vector<DynamicsProcessing::ChannelConfig> cfgs(mChannelCount);
801 for (int i = 0; i < mChannelCount; i++) {
802 cfgs[i].channel = i;
803 cfgs[i].enable = true;
804 }
805 EXPECT_NO_FATAL_FAILURE(addPostEqChannelConfig(cfgs));
Ram Mohane4064ce2022-12-20 18:05:14 +0530806 EXPECT_NO_FATAL_FAILURE(addPostEqBandConfigs(mCfgs));
807 SetAndGetDynamicsProcessingParameters();
808}
809
810std::vector<std::vector<std::pair<int, float>>> kBands{
811 {
812 {0, 600},
813 {1, 2000},
814 {2, 6000},
815 {3, 10000},
816 {4, 16000},
817 }, // 5 bands
818 {
819 {0, 800},
820 {3, 15000},
821 {2, 6000},
822 {1, 2000},
823 }, // 4 bands, unsorted
824 {
825 {0, 650},
826 {1, 2000},
827 {2, 6000},
828 {3, 10000},
829 {3, 16000},
830 }, // 5 bands, missing band
831 {
832 {0, 900},
833 {1, 8000},
834 {2, 4000},
835 {3, 12000},
836 }, // 4 bands, cutoff freq not increasing
837 {
838 {0, 450},
839 {1, 2000},
840 {7, 6000},
841 {3, 10000},
842 {4, 16000},
843 }, // bad band index
844 {
845 {0, 1},
846 {1, 8000},
847 }, // too low cutoff freq
848 {
849 {0, 1200},
850 {1, 80000},
851 }, // too high cutoff freq
852};
853
854INSTANTIATE_TEST_SUITE_P(
855 DynamicsProcessingTest, DynamicsProcessingTestEqBandConfig,
Ram Mohanafdf90b2023-03-23 08:48:25 +0530856 ::testing::Combine(testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
857 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
858 testing::Values(-1, 0, 10), // channel ID
859 testing::Bool(), // band enable
860 testing::ValuesIn(kBands), // cut off frequencies
861 testing::Values(-3.14f, 3.14f), // gain
862 testing::Values(true)), // stage in use
Ram Mohane4064ce2022-12-20 18:05:14 +0530863 [](const auto& info) {
864 auto descriptor = std::get<EQ_BAND_INSTANCE_NAME>(info.param).second;
865 std::vector<DynamicsProcessing::EqBandConfig> cfgs;
866 fillEqBandConfig(cfgs, info.param);
Ram Mohane4064ce2022-12-20 18:05:14 +0530867 std::string bands = ::android::internal::ToString(cfgs);
868 std::string stageInUse = std::to_string(std::get<EQ_BAND_STAGE_IN_USE>(info.param));
869 std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
870 descriptor.common.name + "_UUID_" +
Ram Mohanafdf90b2023-03-23 08:48:25 +0530871 descriptor.common.id.uuid.toString() + "_bands_" + bands +
872 "_stageInUse_" + stageInUse;
Ram Mohane4064ce2022-12-20 18:05:14 +0530873 std::replace_if(
874 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
875 return name;
876 });
877GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestEqBandConfig);
878
879/**
880 * Test DynamicsProcessing MbcBandConfig
881 */
882
883enum MbcBandConfigParamName {
884 MBC_BAND_INSTANCE_NAME,
885 MBC_BAND_CHANNEL,
Ram Mohane4064ce2022-12-20 18:05:14 +0530886 MBC_BAND_ENABLE,
887 MBC_BAND_CUTOFF_FREQ,
888 MBC_BAND_STAGE_IN_USE,
889 MBC_BAND_ADDITIONAL
890};
891enum MbcBandConfigAdditional {
892 MBC_ADD_ATTACK_TIME,
893 MBC_ADD_RELEASE_TIME,
894 MBC_ADD_RATIO,
895 MBC_ADD_THRESHOLD,
896 MBC_ADD_KNEE_WIDTH,
897 MBC_ADD_NOISE_GATE_THRESHOLD,
898 MBC_ADD_EXPENDER_RATIO,
899 MBC_ADD_PRE_GAIN,
900 MBC_ADD_POST_GAIN,
901 MBC_ADD_MAX_NUM
902};
903using TestParamsMbcBandConfigAdditional = std::array<float, MBC_ADD_MAX_NUM>;
904
Ram Mohanafdf90b2023-03-23 08:48:25 +0530905// attackTime, releaseTime, ratio, thresh, kneeWidth, noise, expander, preGain, postGain
Ram Mohane4064ce2022-12-20 18:05:14 +0530906static constexpr std::array<TestParamsMbcBandConfigAdditional, 4> kMbcBandConfigAdditionalParam = {
907 {{-3, -10, -2, -2, -5, -90, -2.5, -2, -2},
908 {0, 0, 0, 0, 0, 0, 0, 0, 0},
909 {-3, 10, -2, 2, -5, 90, -2.5, 2, -2},
Ram Mohanafdf90b2023-03-23 08:48:25 +0530910 {3, 10, 2, -2, -5, 90, 2.5, 2, 2}}};
Ram Mohane4064ce2022-12-20 18:05:14 +0530911
912using TestParamsMbcBandConfig =
Ram Mohanafdf90b2023-03-23 08:48:25 +0530913 std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, int32_t, bool,
Ram Mohane4064ce2022-12-20 18:05:14 +0530914 std::vector<std::pair<int, float>>, bool, TestParamsMbcBandConfigAdditional>;
915
916void fillMbcBandConfig(std::vector<DynamicsProcessing::MbcBandConfig>& cfgs,
917 const TestParamsMbcBandConfig& params) {
918 const std::vector<std::pair<int, float>> cutOffFreqs = std::get<MBC_BAND_CUTOFF_FREQ>(params);
919 const std::array<float, MBC_ADD_MAX_NUM> additional = std::get<MBC_BAND_ADDITIONAL>(params);
920 int bandCount = cutOffFreqs.size();
921 cfgs.resize(bandCount);
922 for (int i = 0; i < bandCount; i++) {
923 cfgs[i] = DynamicsProcessing::MbcBandConfig{
924 .channel = std::get<MBC_BAND_CHANNEL>(params),
925 .band = cutOffFreqs[i].first,
926 .enable = std::get<MBC_BAND_ENABLE>(params),
927 .cutoffFrequencyHz = cutOffFreqs[i].second,
928 .attackTimeMs = additional[MBC_ADD_ATTACK_TIME],
929 .releaseTimeMs = additional[MBC_ADD_RELEASE_TIME],
930 .ratio = additional[MBC_ADD_RATIO],
931 .thresholdDb = additional[MBC_ADD_THRESHOLD],
932 .kneeWidthDb = additional[MBC_ADD_KNEE_WIDTH],
933 .noiseGateThresholdDb = additional[MBC_ADD_NOISE_GATE_THRESHOLD],
934 .expanderRatio = additional[MBC_ADD_EXPENDER_RATIO],
935 .preGainDb = additional[MBC_ADD_PRE_GAIN],
936 .postGainDb = additional[MBC_ADD_POST_GAIN]};
937 }
938}
939
940class DynamicsProcessingTestMbcBandConfig
941 : public ::testing::TestWithParam<TestParamsMbcBandConfig>,
942 public DynamicsProcessingTestHelper {
943 public:
944 DynamicsProcessingTestMbcBandConfig()
945 : DynamicsProcessingTestHelper(std::get<MBC_BAND_INSTANCE_NAME>(GetParam())),
Ram Mohanafdf90b2023-03-23 08:48:25 +0530946 mStageInUse(std::get<MBC_BAND_STAGE_IN_USE>(GetParam())) {
Ram Mohane4064ce2022-12-20 18:05:14 +0530947 fillMbcBandConfig(mCfgs, GetParam());
948 }
949
950 void SetUp() override { SetUpDynamicsProcessingEffect(); }
951
952 void TearDown() override { TearDownDynamicsProcessingEffect(); }
953
954 std::vector<DynamicsProcessing::MbcBandConfig> mCfgs;
955 const bool mStageInUse;
Ram Mohane4064ce2022-12-20 18:05:14 +0530956};
957
958TEST_P(DynamicsProcessingTestMbcBandConfig, SetAndGetMbcBandConfig) {
959 mEngineConfigPreset.mbcStage.inUse = mStageInUse;
960 mEngineConfigPreset.mbcStage.bandCount = mCfgs.size();
961 EXPECT_NO_FATAL_FAILURE(addEngineConfig(mEngineConfigPreset));
Ram Mohanafdf90b2023-03-23 08:48:25 +0530962 std::vector<DynamicsProcessing::ChannelConfig> cfgs(mChannelCount);
963 for (int i = 0; i < mChannelCount; i++) {
964 cfgs[i].channel = i;
965 cfgs[i].enable = true;
966 }
967 EXPECT_NO_FATAL_FAILURE(addMbcChannelConfig(cfgs));
Ram Mohane4064ce2022-12-20 18:05:14 +0530968 EXPECT_NO_FATAL_FAILURE(addMbcBandConfigs(mCfgs));
969 SetAndGetDynamicsProcessingParameters();
970}
971
972INSTANTIATE_TEST_SUITE_P(
973 DynamicsProcessingTest, DynamicsProcessingTestMbcBandConfig,
Ram Mohanafdf90b2023-03-23 08:48:25 +0530974 ::testing::Combine(testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
975 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
976 testing::Values(-1, 0, 10), // channel count
977 testing::Bool(), // enable
978 testing::ValuesIn(kBands), // cut off frequencies
979 testing::Bool(), // stage in use
980 testing::ValuesIn(kMbcBandConfigAdditionalParam)), // Additional
Ram Mohane4064ce2022-12-20 18:05:14 +0530981 [](const auto& info) {
982 auto descriptor = std::get<MBC_BAND_INSTANCE_NAME>(info.param).second;
983 std::vector<DynamicsProcessing::MbcBandConfig> cfgs;
984 fillMbcBandConfig(cfgs, info.param);
Ram Mohane4064ce2022-12-20 18:05:14 +0530985 std::string mbcBands = ::android::internal::ToString(cfgs);
986 std::string stageInUse = std::to_string(std::get<MBC_BAND_STAGE_IN_USE>(info.param));
987 std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
988 descriptor.common.name + "_UUID_" +
Ram Mohanafdf90b2023-03-23 08:48:25 +0530989 descriptor.common.id.uuid.toString() + "_bands_" + mbcBands +
990 "_stageInUse_" + stageInUse;
Ram Mohane4064ce2022-12-20 18:05:14 +0530991 std::replace_if(
992 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
993 return name;
994 });
995GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestMbcBandConfig);
996
997int main(int argc, char** argv) {
998 ::testing::InitGoogleTest(&argc, argv);
999 ABinderProcess_setThreadPoolMaxThreadCount(1);
1000 ABinderProcess_startThreadPool();
1001 return RUN_ALL_TESTS();
1002}