blob: 033e3b5f3f07d6e9cb7f67965370adedb1de8c29 [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);
516 std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
517 descriptor.common.name + "_UUID_" +
518 descriptor.common.id.uuid.toString() + "_Cfg_" + cfg.toString();
519 std::replace_if(
520 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
521 return name;
522 });
523GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestEngineArchitecture);
524
525/**
526 * Test DynamicsProcessing Input Gain
527 */
528enum InputGainTestParamName {
529 INPUT_GAIN_INSTANCE_NAME,
530 INPUT_GAIN_PARAM,
531};
532class DynamicsProcessingTestInputGain
533 : public ::testing::TestWithParam<std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>,
534 std::vector<DynamicsProcessing::InputGain>>>,
535 public DynamicsProcessingTestHelper {
536 public:
537 DynamicsProcessingTestInputGain()
538 : DynamicsProcessingTestHelper(std::get<INPUT_GAIN_INSTANCE_NAME>(GetParam())),
539 mInputGain(std::get<INPUT_GAIN_PARAM>(GetParam())){};
540
541 void SetUp() override { SetUpDynamicsProcessingEffect(); }
542
543 void TearDown() override { TearDownDynamicsProcessingEffect(); }
544
545 const std::vector<DynamicsProcessing::InputGain> mInputGain;
546};
547
548TEST_P(DynamicsProcessingTestInputGain, SetAndGetInputGain) {
549 EXPECT_NO_FATAL_FAILURE(addInputGain(mInputGain));
550 SetAndGetDynamicsProcessingParameters();
551}
552
553INSTANTIATE_TEST_SUITE_P(
554 DynamicsProcessingTest, DynamicsProcessingTestInputGain,
555 ::testing::Combine(testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
Shunkai Yaof8be1ac2023-03-06 18:41:27 +0000556 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
Ram Mohane4064ce2022-12-20 18:05:14 +0530557 testing::ValuesIn(DynamicsProcessingTestInputGain::kInputGainTestSet)),
558 [](const auto& info) {
559 auto descriptor = std::get<INPUT_GAIN_INSTANCE_NAME>(info.param).second;
560 std::string gains =
561 ::android::internal::ToString(std::get<INPUT_GAIN_PARAM>(info.param));
562 std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
563 descriptor.common.name + "_UUID_" +
564 descriptor.common.id.uuid.toString() + "_inputGains_" + gains;
565 std::replace_if(
566 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
567 return name;
568 });
569GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestInputGain);
570
571/**
572 * Test DynamicsProcessing Limiter Config
573 */
574enum LimiterConfigTestParamName {
575 LIMITER_INSTANCE_NAME,
576 LIMITER_CHANNEL,
577 LIMITER_ENABLE,
578 LIMITER_LINK_GROUP,
579 LIMITER_ENGINE_IN_USE,
580 LIMITER_ADDITIONAL,
581};
582enum LimiterConfigTestAdditionalParam {
583 LIMITER_ATTACK_TIME,
584 LIMITER_RELEASE_TIME,
585 LIMITER_RATIO,
586 LIMITER_THRESHOLD,
587 LIMITER_POST_GAIN,
588 LIMITER_MAX_NUM,
589};
590using LimiterConfigTestAdditional = std::array<float, LIMITER_MAX_NUM>;
Ram Mohanafdf90b2023-03-23 08:48:25 +0530591// attackTime, releaseTime, ratio, thresh, postGain
Ram Mohane4064ce2022-12-20 18:05:14 +0530592static constexpr std::array<LimiterConfigTestAdditional, 4> kLimiterConfigTestAdditionalParam = {
593 {{-1, -60, -2.5, -2, -3.14},
594 {-1, 60, -2.5, 2, -3.14},
595 {1, -60, 2.5, -2, 3.14},
Ram Mohanafdf90b2023-03-23 08:48:25 +0530596 {1, 60, 2.5, -2, 3.14}}};
Ram Mohane4064ce2022-12-20 18:05:14 +0530597
598using LimiterConfigTestParams =
599 std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, int32_t, bool, int32_t, bool,
600 LimiterConfigTestAdditional>;
601
602void fillLimiterConfig(DynamicsProcessing::LimiterConfig& cfg,
603 const LimiterConfigTestParams& params) {
604 const std::array<float, LIMITER_MAX_NUM> additional = std::get<LIMITER_ADDITIONAL>(params);
605 cfg.channel = std::get<LIMITER_CHANNEL>(params);
606 cfg.enable = std::get<LIMITER_ENABLE>(params);
607 cfg.linkGroup = std::get<LIMITER_LINK_GROUP>(params);
608 cfg.attackTimeMs = additional[LIMITER_ATTACK_TIME];
609 cfg.releaseTimeMs = additional[LIMITER_RELEASE_TIME];
610 cfg.ratio = additional[LIMITER_RATIO];
611 cfg.thresholdDb = additional[LIMITER_THRESHOLD];
612 cfg.postGainDb = additional[LIMITER_POST_GAIN];
613}
614
615class DynamicsProcessingTestLimiterConfig
616 : public ::testing::TestWithParam<LimiterConfigTestParams>,
617 public DynamicsProcessingTestHelper {
618 public:
619 DynamicsProcessingTestLimiterConfig()
620 : DynamicsProcessingTestHelper(std::get<LIMITER_INSTANCE_NAME>(GetParam())),
621 mLimiterInUseEngine(std::get<LIMITER_ENGINE_IN_USE>(GetParam())) {
622 fillLimiterConfig(mCfg, GetParam());
623 }
624
625 void SetUp() override { SetUpDynamicsProcessingEffect(); }
626
627 void TearDown() override { TearDownDynamicsProcessingEffect(); }
628
629 DynamicsProcessing::LimiterConfig mCfg;
630 bool mLimiterInUseEngine;
631};
632
633TEST_P(DynamicsProcessingTestLimiterConfig, SetAndGetLimiterConfig) {
634 mEngineConfigPreset.limiterInUse = mLimiterInUseEngine;
635 EXPECT_NO_FATAL_FAILURE(addEngineConfig(mEngineConfigPreset));
636 EXPECT_NO_FATAL_FAILURE(addLimiterConfig({mCfg}));
637 SetAndGetDynamicsProcessingParameters();
638}
639
640INSTANTIATE_TEST_SUITE_P(
641 DynamicsProcessingTest, DynamicsProcessingTestLimiterConfig,
642 ::testing::Combine(testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
Shunkai Yaof8be1ac2023-03-06 18:41:27 +0000643 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
Ram Mohane4064ce2022-12-20 18:05:14 +0530644 testing::Values(-1, 0, 1, 2), // channel count
645 testing::Bool(), // enable
646 testing::Values(3), // link group
647 testing::Bool(), // engine limiter enable
648 testing::ValuesIn(kLimiterConfigTestAdditionalParam)), // Additional
649 [](const auto& info) {
650 auto descriptor = std::get<LIMITER_INSTANCE_NAME>(info.param).second;
651 DynamicsProcessing::LimiterConfig cfg;
652 fillLimiterConfig(cfg, info.param);
653 std::string engineLimiterInUse =
654 std::to_string(std::get<LIMITER_ENGINE_IN_USE>(info.param));
655 std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
656 descriptor.common.name + "_UUID_" +
657 descriptor.common.id.uuid.toString() + "_limiterConfig_" +
658 cfg.toString() + "_engineSetting_" + engineLimiterInUse;
659 std::replace_if(
660 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
661 return name;
662 });
663GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestLimiterConfig);
664
665/**
666 * Test DynamicsProcessing ChannelConfig
667 */
668enum ChannelConfigTestParamName {
669 BAND_CHANNEL_TEST_INSTANCE_NAME,
670 BAND_CHANNEL_TEST_CHANNEL_CONFIG,
671 BAND_CHANNEL_TEST_ENGINE_IN_USE
672};
673using ChannelConfigTestParams = std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>,
674 std::vector<DynamicsProcessing::ChannelConfig>, bool>;
675
676class DynamicsProcessingTestChannelConfig
677 : public ::testing::TestWithParam<ChannelConfigTestParams>,
678 public DynamicsProcessingTestHelper {
679 public:
680 DynamicsProcessingTestChannelConfig()
681 : DynamicsProcessingTestHelper(std::get<BAND_CHANNEL_TEST_INSTANCE_NAME>(GetParam())),
682 mCfg(std::get<BAND_CHANNEL_TEST_CHANNEL_CONFIG>(GetParam())),
683 mInUseEngine(std::get<BAND_CHANNEL_TEST_ENGINE_IN_USE>(GetParam())) {}
684
685 void SetUp() override { SetUpDynamicsProcessingEffect(); }
686
687 void TearDown() override { TearDownDynamicsProcessingEffect(); }
688
689 std::vector<DynamicsProcessing::ChannelConfig> mCfg;
690 const bool mInUseEngine;
691};
692
693TEST_P(DynamicsProcessingTestChannelConfig, SetAndGetPreEqChannelConfig) {
694 mEngineConfigPreset.preEqStage.inUse = mInUseEngine;
695 EXPECT_NO_FATAL_FAILURE(addEngineConfig(mEngineConfigPreset));
696 EXPECT_NO_FATAL_FAILURE(addPreEqChannelConfig(mCfg));
697 SetAndGetDynamicsProcessingParameters();
698}
699
700TEST_P(DynamicsProcessingTestChannelConfig, SetAndGetPostEqChannelConfig) {
701 mEngineConfigPreset.postEqStage.inUse = mInUseEngine;
702 EXPECT_NO_FATAL_FAILURE(addEngineConfig(mEngineConfigPreset));
703 EXPECT_NO_FATAL_FAILURE(addPostEqChannelConfig(mCfg));
704 SetAndGetDynamicsProcessingParameters();
705}
706
707TEST_P(DynamicsProcessingTestChannelConfig, SetAndGetMbcChannelConfig) {
708 mEngineConfigPreset.mbcStage.inUse = mInUseEngine;
709 EXPECT_NO_FATAL_FAILURE(addEngineConfig(mEngineConfigPreset));
710 EXPECT_NO_FATAL_FAILURE(addMbcChannelConfig(mCfg));
711 SetAndGetDynamicsProcessingParameters();
712}
713
714INSTANTIATE_TEST_SUITE_P(
715 DynamicsProcessingTest, DynamicsProcessingTestChannelConfig,
716 ::testing::Combine(
717 testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
Shunkai Yaof8be1ac2023-03-06 18:41:27 +0000718 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
Ram Mohane4064ce2022-12-20 18:05:14 +0530719 testing::ValuesIn(
720 DynamicsProcessingTestHelper::kChannelConfigTestSet), // channel config
721 testing::Bool()), // Engine inUse
722 [](const auto& info) {
723 auto descriptor = std::get<BAND_CHANNEL_TEST_INSTANCE_NAME>(info.param).second;
724 std::string engineInUse =
725 std::to_string(std::get<BAND_CHANNEL_TEST_ENGINE_IN_USE>(info.param));
726 std::string channelConfig = ::android::internal::ToString(
727 std::get<BAND_CHANNEL_TEST_CHANNEL_CONFIG>(info.param));
728
729 std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
730 descriptor.common.name + "_UUID_" +
731 descriptor.common.id.uuid.toString() + "_" + channelConfig +
732 "_engineInUse_" + engineInUse;
733 std::replace_if(
734 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
735 return name;
736 });
737GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestChannelConfig);
738
739/**
740 * Test DynamicsProcessing EqBandConfig
741 */
742enum EqBandConfigTestParamName {
743 EQ_BAND_INSTANCE_NAME,
744 EQ_BAND_CHANNEL,
Ram Mohane4064ce2022-12-20 18:05:14 +0530745 EQ_BAND_ENABLE,
746 EQ_BAND_CUT_OFF_FREQ,
747 EQ_BAND_GAIN,
748 EQ_BAND_STAGE_IN_USE
749};
750using EqBandConfigTestParams = std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, int32_t,
Ram Mohanafdf90b2023-03-23 08:48:25 +0530751 bool, std::vector<std::pair<int, float>>, float, bool>;
Ram Mohane4064ce2022-12-20 18:05:14 +0530752
753void fillEqBandConfig(std::vector<DynamicsProcessing::EqBandConfig>& cfgs,
754 const EqBandConfigTestParams& params) {
755 const std::vector<std::pair<int, float>> cutOffFreqs = std::get<EQ_BAND_CUT_OFF_FREQ>(params);
756 int bandCount = cutOffFreqs.size();
757 cfgs.resize(bandCount);
758 for (int i = 0; i < bandCount; i++) {
759 cfgs[i].channel = std::get<EQ_BAND_CHANNEL>(params);
760 cfgs[i].band = cutOffFreqs[i].first;
761 cfgs[i].enable = std::get<EQ_BAND_ENABLE>(params);
762 cfgs[i].cutoffFrequencyHz = cutOffFreqs[i].second;
763 cfgs[i].gainDb = std::get<EQ_BAND_GAIN>(params);
764 }
765}
766
767class DynamicsProcessingTestEqBandConfig : public ::testing::TestWithParam<EqBandConfigTestParams>,
768 public DynamicsProcessingTestHelper {
769 public:
770 DynamicsProcessingTestEqBandConfig()
771 : DynamicsProcessingTestHelper(std::get<EQ_BAND_INSTANCE_NAME>(GetParam())),
Ram Mohanafdf90b2023-03-23 08:48:25 +0530772 mStageInUse(std::get<EQ_BAND_STAGE_IN_USE>(GetParam())) {
Ram Mohane4064ce2022-12-20 18:05:14 +0530773 fillEqBandConfig(mCfgs, GetParam());
774 }
775
776 void SetUp() override { SetUpDynamicsProcessingEffect(); }
777
778 void TearDown() override { TearDownDynamicsProcessingEffect(); }
779
780 std::vector<DynamicsProcessing::EqBandConfig> mCfgs;
781 const bool mStageInUse;
Ram Mohane4064ce2022-12-20 18:05:14 +0530782};
783
784TEST_P(DynamicsProcessingTestEqBandConfig, SetAndGetPreEqBandConfig) {
785 mEngineConfigPreset.preEqStage.inUse = mStageInUse;
786 mEngineConfigPreset.preEqStage.bandCount = mCfgs.size();
787 EXPECT_NO_FATAL_FAILURE(addEngineConfig(mEngineConfigPreset));
Ram Mohanafdf90b2023-03-23 08:48:25 +0530788 std::vector<DynamicsProcessing::ChannelConfig> cfgs(mChannelCount);
789 for (int i = 0; i < mChannelCount; i++) {
790 cfgs[i].channel = i;
791 cfgs[i].enable = true;
792 }
793 EXPECT_NO_FATAL_FAILURE(addPreEqChannelConfig(cfgs));
Ram Mohane4064ce2022-12-20 18:05:14 +0530794 EXPECT_NO_FATAL_FAILURE(addPreEqBandConfigs(mCfgs));
795 SetAndGetDynamicsProcessingParameters();
796}
797
798TEST_P(DynamicsProcessingTestEqBandConfig, SetAndGetPostEqBandConfig) {
799 mEngineConfigPreset.postEqStage.inUse = mStageInUse;
800 mEngineConfigPreset.postEqStage.bandCount = mCfgs.size();
801 EXPECT_NO_FATAL_FAILURE(addEngineConfig(mEngineConfigPreset));
Ram Mohanafdf90b2023-03-23 08:48:25 +0530802 std::vector<DynamicsProcessing::ChannelConfig> cfgs(mChannelCount);
803 for (int i = 0; i < mChannelCount; i++) {
804 cfgs[i].channel = i;
805 cfgs[i].enable = true;
806 }
807 EXPECT_NO_FATAL_FAILURE(addPostEqChannelConfig(cfgs));
Ram Mohane4064ce2022-12-20 18:05:14 +0530808 EXPECT_NO_FATAL_FAILURE(addPostEqBandConfigs(mCfgs));
809 SetAndGetDynamicsProcessingParameters();
810}
811
812std::vector<std::vector<std::pair<int, float>>> kBands{
813 {
814 {0, 600},
815 {1, 2000},
816 {2, 6000},
817 {3, 10000},
818 {4, 16000},
819 }, // 5 bands
820 {
821 {0, 800},
822 {3, 15000},
823 {2, 6000},
824 {1, 2000},
825 }, // 4 bands, unsorted
826 {
827 {0, 650},
828 {1, 2000},
829 {2, 6000},
830 {3, 10000},
831 {3, 16000},
832 }, // 5 bands, missing band
833 {
834 {0, 900},
835 {1, 8000},
836 {2, 4000},
837 {3, 12000},
838 }, // 4 bands, cutoff freq not increasing
839 {
840 {0, 450},
841 {1, 2000},
842 {7, 6000},
843 {3, 10000},
844 {4, 16000},
845 }, // bad band index
846 {
847 {0, 1},
848 {1, 8000},
849 }, // too low cutoff freq
850 {
851 {0, 1200},
852 {1, 80000},
853 }, // too high cutoff freq
854};
855
856INSTANTIATE_TEST_SUITE_P(
857 DynamicsProcessingTest, DynamicsProcessingTestEqBandConfig,
Ram Mohanafdf90b2023-03-23 08:48:25 +0530858 ::testing::Combine(testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
859 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
860 testing::Values(-1, 0, 10), // channel ID
861 testing::Bool(), // band enable
862 testing::ValuesIn(kBands), // cut off frequencies
863 testing::Values(-3.14f, 3.14f), // gain
864 testing::Values(true)), // stage in use
Ram Mohane4064ce2022-12-20 18:05:14 +0530865 [](const auto& info) {
866 auto descriptor = std::get<EQ_BAND_INSTANCE_NAME>(info.param).second;
867 std::vector<DynamicsProcessing::EqBandConfig> cfgs;
868 fillEqBandConfig(cfgs, info.param);
Ram Mohane4064ce2022-12-20 18:05:14 +0530869 std::string bands = ::android::internal::ToString(cfgs);
870 std::string stageInUse = std::to_string(std::get<EQ_BAND_STAGE_IN_USE>(info.param));
871 std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
872 descriptor.common.name + "_UUID_" +
Ram Mohanafdf90b2023-03-23 08:48:25 +0530873 descriptor.common.id.uuid.toString() + "_bands_" + bands +
874 "_stageInUse_" + stageInUse;
Ram Mohane4064ce2022-12-20 18:05:14 +0530875 std::replace_if(
876 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
877 return name;
878 });
879GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestEqBandConfig);
880
881/**
882 * Test DynamicsProcessing MbcBandConfig
883 */
884
885enum MbcBandConfigParamName {
886 MBC_BAND_INSTANCE_NAME,
887 MBC_BAND_CHANNEL,
Ram Mohane4064ce2022-12-20 18:05:14 +0530888 MBC_BAND_ENABLE,
889 MBC_BAND_CUTOFF_FREQ,
890 MBC_BAND_STAGE_IN_USE,
891 MBC_BAND_ADDITIONAL
892};
893enum MbcBandConfigAdditional {
894 MBC_ADD_ATTACK_TIME,
895 MBC_ADD_RELEASE_TIME,
896 MBC_ADD_RATIO,
897 MBC_ADD_THRESHOLD,
898 MBC_ADD_KNEE_WIDTH,
899 MBC_ADD_NOISE_GATE_THRESHOLD,
900 MBC_ADD_EXPENDER_RATIO,
901 MBC_ADD_PRE_GAIN,
902 MBC_ADD_POST_GAIN,
903 MBC_ADD_MAX_NUM
904};
905using TestParamsMbcBandConfigAdditional = std::array<float, MBC_ADD_MAX_NUM>;
906
Ram Mohanafdf90b2023-03-23 08:48:25 +0530907// attackTime, releaseTime, ratio, thresh, kneeWidth, noise, expander, preGain, postGain
Ram Mohane4064ce2022-12-20 18:05:14 +0530908static constexpr std::array<TestParamsMbcBandConfigAdditional, 4> kMbcBandConfigAdditionalParam = {
909 {{-3, -10, -2, -2, -5, -90, -2.5, -2, -2},
910 {0, 0, 0, 0, 0, 0, 0, 0, 0},
911 {-3, 10, -2, 2, -5, 90, -2.5, 2, -2},
Ram Mohanafdf90b2023-03-23 08:48:25 +0530912 {3, 10, 2, -2, -5, 90, 2.5, 2, 2}}};
Ram Mohane4064ce2022-12-20 18:05:14 +0530913
914using TestParamsMbcBandConfig =
Ram Mohanafdf90b2023-03-23 08:48:25 +0530915 std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, int32_t, bool,
Ram Mohane4064ce2022-12-20 18:05:14 +0530916 std::vector<std::pair<int, float>>, bool, TestParamsMbcBandConfigAdditional>;
917
918void fillMbcBandConfig(std::vector<DynamicsProcessing::MbcBandConfig>& cfgs,
919 const TestParamsMbcBandConfig& params) {
920 const std::vector<std::pair<int, float>> cutOffFreqs = std::get<MBC_BAND_CUTOFF_FREQ>(params);
921 const std::array<float, MBC_ADD_MAX_NUM> additional = std::get<MBC_BAND_ADDITIONAL>(params);
922 int bandCount = cutOffFreqs.size();
923 cfgs.resize(bandCount);
924 for (int i = 0; i < bandCount; i++) {
925 cfgs[i] = DynamicsProcessing::MbcBandConfig{
926 .channel = std::get<MBC_BAND_CHANNEL>(params),
927 .band = cutOffFreqs[i].first,
928 .enable = std::get<MBC_BAND_ENABLE>(params),
929 .cutoffFrequencyHz = cutOffFreqs[i].second,
930 .attackTimeMs = additional[MBC_ADD_ATTACK_TIME],
931 .releaseTimeMs = additional[MBC_ADD_RELEASE_TIME],
932 .ratio = additional[MBC_ADD_RATIO],
933 .thresholdDb = additional[MBC_ADD_THRESHOLD],
934 .kneeWidthDb = additional[MBC_ADD_KNEE_WIDTH],
935 .noiseGateThresholdDb = additional[MBC_ADD_NOISE_GATE_THRESHOLD],
936 .expanderRatio = additional[MBC_ADD_EXPENDER_RATIO],
937 .preGainDb = additional[MBC_ADD_PRE_GAIN],
938 .postGainDb = additional[MBC_ADD_POST_GAIN]};
939 }
940}
941
942class DynamicsProcessingTestMbcBandConfig
943 : public ::testing::TestWithParam<TestParamsMbcBandConfig>,
944 public DynamicsProcessingTestHelper {
945 public:
946 DynamicsProcessingTestMbcBandConfig()
947 : DynamicsProcessingTestHelper(std::get<MBC_BAND_INSTANCE_NAME>(GetParam())),
Ram Mohanafdf90b2023-03-23 08:48:25 +0530948 mStageInUse(std::get<MBC_BAND_STAGE_IN_USE>(GetParam())) {
Ram Mohane4064ce2022-12-20 18:05:14 +0530949 fillMbcBandConfig(mCfgs, GetParam());
950 }
951
952 void SetUp() override { SetUpDynamicsProcessingEffect(); }
953
954 void TearDown() override { TearDownDynamicsProcessingEffect(); }
955
956 std::vector<DynamicsProcessing::MbcBandConfig> mCfgs;
957 const bool mStageInUse;
Ram Mohane4064ce2022-12-20 18:05:14 +0530958};
959
960TEST_P(DynamicsProcessingTestMbcBandConfig, SetAndGetMbcBandConfig) {
961 mEngineConfigPreset.mbcStage.inUse = mStageInUse;
962 mEngineConfigPreset.mbcStage.bandCount = mCfgs.size();
963 EXPECT_NO_FATAL_FAILURE(addEngineConfig(mEngineConfigPreset));
Ram Mohanafdf90b2023-03-23 08:48:25 +0530964 std::vector<DynamicsProcessing::ChannelConfig> cfgs(mChannelCount);
965 for (int i = 0; i < mChannelCount; i++) {
966 cfgs[i].channel = i;
967 cfgs[i].enable = true;
968 }
969 EXPECT_NO_FATAL_FAILURE(addMbcChannelConfig(cfgs));
Ram Mohane4064ce2022-12-20 18:05:14 +0530970 EXPECT_NO_FATAL_FAILURE(addMbcBandConfigs(mCfgs));
971 SetAndGetDynamicsProcessingParameters();
972}
973
974INSTANTIATE_TEST_SUITE_P(
975 DynamicsProcessingTest, DynamicsProcessingTestMbcBandConfig,
Ram Mohanafdf90b2023-03-23 08:48:25 +0530976 ::testing::Combine(testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
977 IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
978 testing::Values(-1, 0, 10), // channel count
979 testing::Bool(), // enable
980 testing::ValuesIn(kBands), // cut off frequencies
981 testing::Bool(), // stage in use
982 testing::ValuesIn(kMbcBandConfigAdditionalParam)), // Additional
Ram Mohane4064ce2022-12-20 18:05:14 +0530983 [](const auto& info) {
984 auto descriptor = std::get<MBC_BAND_INSTANCE_NAME>(info.param).second;
985 std::vector<DynamicsProcessing::MbcBandConfig> cfgs;
986 fillMbcBandConfig(cfgs, info.param);
Ram Mohane4064ce2022-12-20 18:05:14 +0530987 std::string mbcBands = ::android::internal::ToString(cfgs);
988 std::string stageInUse = std::to_string(std::get<MBC_BAND_STAGE_IN_USE>(info.param));
989 std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
990 descriptor.common.name + "_UUID_" +
Ram Mohanafdf90b2023-03-23 08:48:25 +0530991 descriptor.common.id.uuid.toString() + "_bands_" + mbcBands +
992 "_stageInUse_" + stageInUse;
Ram Mohane4064ce2022-12-20 18:05:14 +0530993 std::replace_if(
994 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
995 return name;
996 });
997GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestMbcBandConfig);
998
999int main(int argc, char** argv) {
1000 ::testing::InitGoogleTest(&argc, argv);
1001 ABinderProcess_setThreadPoolMaxThreadCount(1);
1002 ABinderProcess_startThreadPool();
1003 return RUN_ALL_TESTS();
1004}