xref: /aosp_15_r20/hardware/interfaces/audio/aidl/common/EffectRangeSpecific.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
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