1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker *
4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker *
8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker *
10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker */
16*4d7e907cSAndroid Build Coastguard Worker
17*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/audio/effect/DynamicsProcessing.h>
18*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/audio/effect/Range.h>
19*4d7e907cSAndroid Build Coastguard Worker
20*4d7e907cSAndroid Build Coastguard Worker #include "EffectRangeSpecific.h"
21*4d7e907cSAndroid Build Coastguard Worker #include "effect-impl/EffectRange.h"
22*4d7e907cSAndroid Build Coastguard Worker
23*4d7e907cSAndroid Build Coastguard Worker namespace aidl::android::hardware::audio::effect {
24*4d7e907cSAndroid Build Coastguard Worker
25*4d7e907cSAndroid Build Coastguard Worker namespace DynamicsProcessingRanges {
26*4d7e907cSAndroid Build Coastguard Worker
isInputGainConfigInRange(const std::vector<DynamicsProcessing::InputGain> & cfgs,const DynamicsProcessing::InputGain & min,const DynamicsProcessing::InputGain & max)27*4d7e907cSAndroid Build Coastguard Worker static bool isInputGainConfigInRange(const std::vector<DynamicsProcessing::InputGain>& cfgs,
28*4d7e907cSAndroid Build Coastguard Worker const DynamicsProcessing::InputGain& min,
29*4d7e907cSAndroid Build Coastguard Worker const DynamicsProcessing::InputGain& max) {
30*4d7e907cSAndroid Build Coastguard Worker auto func = [](const DynamicsProcessing::InputGain& arg) {
31*4d7e907cSAndroid Build Coastguard Worker return std::make_tuple(arg.channel, arg.gainDb);
32*4d7e907cSAndroid Build Coastguard Worker };
33*4d7e907cSAndroid Build Coastguard Worker return isTupleInRange(cfgs, min, max, func);
34*4d7e907cSAndroid Build Coastguard Worker }
35*4d7e907cSAndroid Build Coastguard Worker
isLimiterConfigInRange(const std::vector<DynamicsProcessing::LimiterConfig> & cfgs,const DynamicsProcessing::LimiterConfig & min,const DynamicsProcessing::LimiterConfig & max)36*4d7e907cSAndroid Build Coastguard Worker static bool isLimiterConfigInRange(const std::vector<DynamicsProcessing::LimiterConfig>& cfgs,
37*4d7e907cSAndroid Build Coastguard Worker const DynamicsProcessing::LimiterConfig& min,
38*4d7e907cSAndroid Build Coastguard Worker const DynamicsProcessing::LimiterConfig& max) {
39*4d7e907cSAndroid Build Coastguard Worker auto func = [](const DynamicsProcessing::LimiterConfig& arg) {
40*4d7e907cSAndroid Build Coastguard Worker return std::make_tuple(arg.channel, arg.enable, arg.linkGroup, arg.attackTimeMs,
41*4d7e907cSAndroid Build Coastguard Worker arg.releaseTimeMs, arg.ratio, arg.thresholdDb, arg.postGainDb);
42*4d7e907cSAndroid Build Coastguard Worker };
43*4d7e907cSAndroid Build Coastguard Worker return isTupleInRange(cfgs, min, max, func);
44*4d7e907cSAndroid Build Coastguard Worker }
45*4d7e907cSAndroid Build Coastguard Worker
isMbcBandConfigInRange(const std::vector<DynamicsProcessing::MbcBandConfig> & cfgs,const DynamicsProcessing::MbcBandConfig & min,const DynamicsProcessing::MbcBandConfig & max)46*4d7e907cSAndroid Build Coastguard Worker static bool isMbcBandConfigInRange(const std::vector<DynamicsProcessing::MbcBandConfig>& cfgs,
47*4d7e907cSAndroid Build Coastguard Worker const DynamicsProcessing::MbcBandConfig& min,
48*4d7e907cSAndroid Build Coastguard Worker const DynamicsProcessing::MbcBandConfig& max) {
49*4d7e907cSAndroid Build Coastguard Worker auto func = [](const DynamicsProcessing::MbcBandConfig& arg) {
50*4d7e907cSAndroid Build Coastguard Worker return std::make_tuple(arg.channel, arg.band, arg.enable, arg.cutoffFrequencyHz,
51*4d7e907cSAndroid Build Coastguard Worker arg.attackTimeMs, arg.releaseTimeMs, arg.ratio, arg.thresholdDb,
52*4d7e907cSAndroid Build Coastguard Worker arg.kneeWidthDb, arg.noiseGateThresholdDb, arg.expanderRatio,
53*4d7e907cSAndroid Build Coastguard Worker arg.preGainDb, arg.postGainDb);
54*4d7e907cSAndroid Build Coastguard Worker };
55*4d7e907cSAndroid Build Coastguard Worker return isTupleInRange(cfgs, min, max, func);
56*4d7e907cSAndroid Build Coastguard Worker }
57*4d7e907cSAndroid Build Coastguard Worker
isEqBandConfigInRange(const std::vector<DynamicsProcessing::EqBandConfig> & cfgs,const DynamicsProcessing::EqBandConfig & min,const DynamicsProcessing::EqBandConfig & max)58*4d7e907cSAndroid Build Coastguard Worker static bool isEqBandConfigInRange(const std::vector<DynamicsProcessing::EqBandConfig>& cfgs,
59*4d7e907cSAndroid Build Coastguard Worker const DynamicsProcessing::EqBandConfig& min,
60*4d7e907cSAndroid Build Coastguard Worker const DynamicsProcessing::EqBandConfig& max) {
61*4d7e907cSAndroid Build Coastguard Worker auto func = [](const DynamicsProcessing::EqBandConfig& arg) {
62*4d7e907cSAndroid Build Coastguard Worker return std::make_tuple(arg.channel, arg.band, arg.enable, arg.cutoffFrequencyHz,
63*4d7e907cSAndroid Build Coastguard Worker arg.gainDb);
64*4d7e907cSAndroid Build Coastguard Worker };
65*4d7e907cSAndroid Build Coastguard Worker return isTupleInRange(cfgs, min, max, func);
66*4d7e907cSAndroid Build Coastguard Worker }
67*4d7e907cSAndroid Build Coastguard Worker
isChannelConfigInRange(const std::vector<DynamicsProcessing::ChannelConfig> & cfgs,const DynamicsProcessing::ChannelConfig & min,const DynamicsProcessing::ChannelConfig & max)68*4d7e907cSAndroid Build Coastguard Worker static bool isChannelConfigInRange(const std::vector<DynamicsProcessing::ChannelConfig>& cfgs,
69*4d7e907cSAndroid Build Coastguard Worker const DynamicsProcessing::ChannelConfig& min,
70*4d7e907cSAndroid Build Coastguard Worker const DynamicsProcessing::ChannelConfig& max) {
71*4d7e907cSAndroid Build Coastguard Worker auto func = [](const DynamicsProcessing::ChannelConfig& arg) {
72*4d7e907cSAndroid Build Coastguard Worker return std::make_tuple(arg.channel, arg.enable);
73*4d7e907cSAndroid Build Coastguard Worker };
74*4d7e907cSAndroid Build Coastguard Worker return isTupleInRange(cfgs, min, max, func);
75*4d7e907cSAndroid Build Coastguard Worker }
76*4d7e907cSAndroid Build Coastguard Worker
isEngineConfigInRange(const DynamicsProcessing::EngineArchitecture & cfg,const DynamicsProcessing::EngineArchitecture & min,const DynamicsProcessing::EngineArchitecture & max)77*4d7e907cSAndroid Build Coastguard Worker static bool isEngineConfigInRange(const DynamicsProcessing::EngineArchitecture& cfg,
78*4d7e907cSAndroid Build Coastguard Worker const DynamicsProcessing::EngineArchitecture& min,
79*4d7e907cSAndroid Build Coastguard Worker const DynamicsProcessing::EngineArchitecture& max) {
80*4d7e907cSAndroid Build Coastguard Worker auto func = [](const DynamicsProcessing::EngineArchitecture& arg) {
81*4d7e907cSAndroid Build Coastguard Worker return std::make_tuple(arg.resolutionPreference, arg.preferredProcessingDurationMs,
82*4d7e907cSAndroid Build Coastguard Worker arg.preEqStage.inUse, arg.preEqStage.bandCount,
83*4d7e907cSAndroid Build Coastguard Worker arg.postEqStage.inUse, arg.postEqStage.bandCount, arg.mbcStage.inUse,
84*4d7e907cSAndroid Build Coastguard Worker arg.mbcStage.bandCount, arg.limiterInUse);
85*4d7e907cSAndroid Build Coastguard Worker };
86*4d7e907cSAndroid Build Coastguard Worker return isTupleInRange(func(cfg), func(min), func(max));
87*4d7e907cSAndroid Build Coastguard Worker }
88*4d7e907cSAndroid Build Coastguard Worker
locateMinMaxForTag(DynamicsProcessing::Tag tag,const std::vector<Range::DynamicsProcessingRange> & ranges)89*4d7e907cSAndroid Build Coastguard Worker static int locateMinMaxForTag(DynamicsProcessing::Tag tag,
90*4d7e907cSAndroid Build Coastguard Worker const std::vector<Range::DynamicsProcessingRange>& ranges) {
91*4d7e907cSAndroid Build Coastguard Worker for (int i = 0; i < (int)ranges.size(); i++) {
92*4d7e907cSAndroid Build Coastguard Worker if (tag == ranges[i].min.getTag() && tag == ranges[i].max.getTag()) {
93*4d7e907cSAndroid Build Coastguard Worker return i;
94*4d7e907cSAndroid Build Coastguard Worker }
95*4d7e907cSAndroid Build Coastguard Worker }
96*4d7e907cSAndroid Build Coastguard Worker return -1;
97*4d7e907cSAndroid Build Coastguard Worker }
98*4d7e907cSAndroid Build Coastguard Worker
isParamInRange(const DynamicsProcessing & dp,const std::vector<Range::DynamicsProcessingRange> & ranges)99*4d7e907cSAndroid Build Coastguard Worker bool isParamInRange(const DynamicsProcessing& dp,
100*4d7e907cSAndroid Build Coastguard Worker const std::vector<Range::DynamicsProcessingRange>& ranges) {
101*4d7e907cSAndroid Build Coastguard Worker auto tag = dp.getTag();
102*4d7e907cSAndroid Build Coastguard Worker int i = locateMinMaxForTag(tag, ranges);
103*4d7e907cSAndroid Build Coastguard Worker if (i == -1) return true;
104*4d7e907cSAndroid Build Coastguard Worker
105*4d7e907cSAndroid Build Coastguard Worker switch (tag) {
106*4d7e907cSAndroid Build Coastguard Worker case DynamicsProcessing::engineArchitecture: {
107*4d7e907cSAndroid Build Coastguard Worker return isEngineConfigInRange(
108*4d7e907cSAndroid Build Coastguard Worker dp.get<DynamicsProcessing::engineArchitecture>(),
109*4d7e907cSAndroid Build Coastguard Worker ranges[i].min.get<DynamicsProcessing::engineArchitecture>(),
110*4d7e907cSAndroid Build Coastguard Worker ranges[i].max.get<DynamicsProcessing::engineArchitecture>());
111*4d7e907cSAndroid Build Coastguard Worker }
112*4d7e907cSAndroid Build Coastguard Worker case DynamicsProcessing::preEq: {
113*4d7e907cSAndroid Build Coastguard Worker return isChannelConfigInRange(dp.get<DynamicsProcessing::preEq>(),
114*4d7e907cSAndroid Build Coastguard Worker ranges[i].min.get<DynamicsProcessing::preEq>()[0],
115*4d7e907cSAndroid Build Coastguard Worker ranges[i].max.get<DynamicsProcessing::preEq>()[0]);
116*4d7e907cSAndroid Build Coastguard Worker }
117*4d7e907cSAndroid Build Coastguard Worker case DynamicsProcessing::postEq: {
118*4d7e907cSAndroid Build Coastguard Worker return isChannelConfigInRange(dp.get<DynamicsProcessing::postEq>(),
119*4d7e907cSAndroid Build Coastguard Worker ranges[i].min.get<DynamicsProcessing::postEq>()[0],
120*4d7e907cSAndroid Build Coastguard Worker ranges[i].max.get<DynamicsProcessing::postEq>()[0]);
121*4d7e907cSAndroid Build Coastguard Worker }
122*4d7e907cSAndroid Build Coastguard Worker case DynamicsProcessing::mbc: {
123*4d7e907cSAndroid Build Coastguard Worker return isChannelConfigInRange(dp.get<DynamicsProcessing::mbc>(),
124*4d7e907cSAndroid Build Coastguard Worker ranges[i].min.get<DynamicsProcessing::mbc>()[0],
125*4d7e907cSAndroid Build Coastguard Worker ranges[i].max.get<DynamicsProcessing::mbc>()[0]);
126*4d7e907cSAndroid Build Coastguard Worker }
127*4d7e907cSAndroid Build Coastguard Worker case DynamicsProcessing::preEqBand: {
128*4d7e907cSAndroid Build Coastguard Worker return isEqBandConfigInRange(dp.get<DynamicsProcessing::preEqBand>(),
129*4d7e907cSAndroid Build Coastguard Worker ranges[i].min.get<DynamicsProcessing::preEqBand>()[0],
130*4d7e907cSAndroid Build Coastguard Worker ranges[i].max.get<DynamicsProcessing::preEqBand>()[0]);
131*4d7e907cSAndroid Build Coastguard Worker }
132*4d7e907cSAndroid Build Coastguard Worker case DynamicsProcessing::postEqBand: {
133*4d7e907cSAndroid Build Coastguard Worker return isEqBandConfigInRange(dp.get<DynamicsProcessing::postEqBand>(),
134*4d7e907cSAndroid Build Coastguard Worker ranges[i].min.get<DynamicsProcessing::postEqBand>()[0],
135*4d7e907cSAndroid Build Coastguard Worker ranges[i].max.get<DynamicsProcessing::postEqBand>()[0]);
136*4d7e907cSAndroid Build Coastguard Worker }
137*4d7e907cSAndroid Build Coastguard Worker case DynamicsProcessing::mbcBand: {
138*4d7e907cSAndroid Build Coastguard Worker return isMbcBandConfigInRange(dp.get<DynamicsProcessing::mbcBand>(),
139*4d7e907cSAndroid Build Coastguard Worker ranges[i].min.get<DynamicsProcessing::mbcBand>()[0],
140*4d7e907cSAndroid Build Coastguard Worker ranges[i].max.get<DynamicsProcessing::mbcBand>()[0]);
141*4d7e907cSAndroid Build Coastguard Worker }
142*4d7e907cSAndroid Build Coastguard Worker case DynamicsProcessing::limiter: {
143*4d7e907cSAndroid Build Coastguard Worker return isLimiterConfigInRange(dp.get<DynamicsProcessing::limiter>(),
144*4d7e907cSAndroid Build Coastguard Worker ranges[i].min.get<DynamicsProcessing::limiter>()[0],
145*4d7e907cSAndroid Build Coastguard Worker ranges[i].max.get<DynamicsProcessing::limiter>()[0]);
146*4d7e907cSAndroid Build Coastguard Worker }
147*4d7e907cSAndroid Build Coastguard Worker case DynamicsProcessing::inputGain: {
148*4d7e907cSAndroid Build Coastguard Worker return isInputGainConfigInRange(dp.get<DynamicsProcessing::inputGain>(),
149*4d7e907cSAndroid Build Coastguard Worker ranges[i].min.get<DynamicsProcessing::inputGain>()[0],
150*4d7e907cSAndroid Build Coastguard Worker ranges[i].max.get<DynamicsProcessing::inputGain>()[0]);
151*4d7e907cSAndroid Build Coastguard Worker }
152*4d7e907cSAndroid Build Coastguard Worker default: {
153*4d7e907cSAndroid Build Coastguard Worker return true;
154*4d7e907cSAndroid Build Coastguard Worker }
155*4d7e907cSAndroid Build Coastguard Worker }
156*4d7e907cSAndroid Build Coastguard Worker return true;
157*4d7e907cSAndroid Build Coastguard Worker }
158*4d7e907cSAndroid Build Coastguard Worker
159*4d7e907cSAndroid Build Coastguard Worker } // namespace DynamicsProcessingRanges
160*4d7e907cSAndroid Build Coastguard Worker
161*4d7e907cSAndroid Build Coastguard Worker } // namespace aidl::android::hardware::audio::effect