blob: 325739c8697b1513517bda9dc33e56d617a9642c [file] [log] [blame]
Shunkai Yaodba8ba32023-01-27 17:02:21 +00001/*
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
17#include <cstdint>
18#include <cstring>
19#include <optional>
20#define LOG_TAG "AidlConversionDp"
21//#define LOG_NDEBUG 0
22
23#include <error/expected_utils.h>
24#include <media/AidlConversionCppNdk.h>
25#include <media/AidlConversionNdk.h>
26#include <media/AidlConversionEffect.h>
27#include <media/audiohal/AudioEffectUuid.h>
28#include <system/audio_effect.h>
29#include <system/audio_effects/effect_dynamicsprocessing.h>
Shunkai Yaod86851a2023-03-01 02:49:50 +000030#include <Utils.h>
Shunkai Yaodba8ba32023-01-27 17:02:21 +000031#include <utils/Log.h>
32
33#include "AidlConversionDynamicsProcessing.h"
34
35namespace android {
36namespace effect {
37
38using ::aidl::android::convertIntegral;
39using ::aidl::android::aidl_utils::statusTFromBinderStatus;
40using ::aidl::android::hardware::audio::effect::Capability;
41using ::aidl::android::hardware::audio::effect::DynamicsProcessing;
42using ::aidl::android::hardware::audio::effect::Parameter;
43using ::aidl::android::hardware::audio::effect::toString;
44using ::android::status_t;
45using utils::EffectParamReader;
46using utils::EffectParamWriter;
47
48status_t AidlConversionDp::setParameter(EffectParamReader& param) {
49 uint32_t type = 0;
Shunkai Yaod86851a2023-03-01 02:49:50 +000050 RETURN_STATUS_IF_ERROR(param.readFromParameter(&type));
Shunkai Yaodba8ba32023-01-27 17:02:21 +000051 Parameter aidlParam;
52 switch (type) {
53 case DP_PARAM_INPUT_GAIN: {
54 DynamicsProcessing::InputGain inputGainAidl;
Shunkai Yaod86851a2023-03-01 02:49:50 +000055 RETURN_STATUS_IF_ERROR(param.readFromParameter(&inputGainAidl.channel));
56 RETURN_STATUS_IF_ERROR(param.readFromValue(&inputGainAidl.gainDb));
Shunkai Yaodba8ba32023-01-27 17:02:21 +000057 aidlParam = MAKE_SPECIFIC_PARAMETER(DynamicsProcessing, dynamicsProcessing, inputGain,
58 {inputGainAidl});
59 break;
60 }
61 case DP_PARAM_ENGINE_ARCHITECTURE: {
62 DynamicsProcessing::EngineArchitecture engine =
63 VALUE_OR_RETURN_STATUS(readEngineArchitectureFromParam(param));
64 aidlParam = MAKE_SPECIFIC_PARAMETER(DynamicsProcessing, dynamicsProcessing,
65 engineArchitecture, engine);
66 mEngine = engine;
67 break;
68 }
69 case DP_PARAM_PRE_EQ: {
70 DynamicsProcessing::ChannelConfig chConfig =
71 VALUE_OR_RETURN_STATUS(readChannelConfigFromParam(param));
72 aidlParam = MAKE_SPECIFIC_PARAMETER(DynamicsProcessing, dynamicsProcessing, preEq,
73 {chConfig});
74 break;
75 }
76 case DP_PARAM_POST_EQ: {
77 DynamicsProcessing::ChannelConfig chConfig =
78 VALUE_OR_RETURN_STATUS(readChannelConfigFromParam(param));
79 aidlParam = MAKE_SPECIFIC_PARAMETER(DynamicsProcessing, dynamicsProcessing, postEq,
80 {chConfig});
81 break;
82 }
83 case DP_PARAM_MBC: {
84 DynamicsProcessing::ChannelConfig chConfig =
85 VALUE_OR_RETURN_STATUS(readChannelConfigFromParam(param));
86 aidlParam = MAKE_SPECIFIC_PARAMETER(DynamicsProcessing, dynamicsProcessing, mbc,
87 {chConfig});
88 break;
89 }
90 case DP_PARAM_PRE_EQ_BAND: {
91 DynamicsProcessing::EqBandConfig bandConfig =
92 VALUE_OR_RETURN_STATUS(readEqBandConfigFromParam(param));
93 aidlParam = MAKE_SPECIFIC_PARAMETER(DynamicsProcessing, dynamicsProcessing, preEqBand,
94 {bandConfig});
95 break;
96 }
97 case DP_PARAM_POST_EQ_BAND: {
98 DynamicsProcessing::EqBandConfig bandConfig =
99 VALUE_OR_RETURN_STATUS(readEqBandConfigFromParam(param));
100 aidlParam = MAKE_SPECIFIC_PARAMETER(DynamicsProcessing, dynamicsProcessing, postEqBand,
101 {bandConfig});
102 break;
103 }
104 case DP_PARAM_MBC_BAND: {
105 DynamicsProcessing::MbcBandConfig bandConfig =
106 VALUE_OR_RETURN_STATUS(readMbcBandConfigFromParam(param));
107 aidlParam = MAKE_SPECIFIC_PARAMETER(DynamicsProcessing, dynamicsProcessing, mbcBand,
108 {bandConfig});
109 break;
110 }
111 case DP_PARAM_LIMITER: {
112 DynamicsProcessing::LimiterConfig config =
113 VALUE_OR_RETURN_STATUS(readLimiterConfigFromParam(param));
114 aidlParam = MAKE_SPECIFIC_PARAMETER(DynamicsProcessing, dynamicsProcessing, limiter,
115 {config});
116 break;
117 }
118 default: {
119 ALOGW("%s unknown param %s", __func__, param.toString().c_str());
120 return BAD_VALUE;
121 }
122 }
123
124 return statusTFromBinderStatus(mEffect->setParameter(aidlParam));
125}
126
127status_t AidlConversionDp::getParameter(EffectParamWriter& param) {
128 uint32_t type = 0;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000129 RETURN_STATUS_IF_ERROR(param.readFromParameter(&type));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000130 Parameter aidlParam;
131 switch (type) {
132 case DP_PARAM_INPUT_GAIN: {
133 int32_t channel;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000134 RETURN_STATUS_IF_ERROR(param.readFromParameter(&channel));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000135 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(DynamicsProcessing, dynamicsProcessingTag,
136 DynamicsProcessing::inputGain);
137 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
138
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000139 std::vector<DynamicsProcessing::InputGain> gains =
140 VALUE_OR_RETURN_STATUS(aidl::android::GET_PARAMETER_SPECIFIC_FIELD(
141 aidlParam, DynamicsProcessing, dynamicsProcessing,
142 DynamicsProcessing::inputGain,
143 std::vector<DynamicsProcessing::InputGain>));
144 for (const auto& gain : gains) {
145 if (gain.channel == channel) {
146 return param.writeToValue(&gain.gainDb);
147 }
148 }
149 ALOGE("%s not able to find channel %d", __func__, channel);
150 return BAD_VALUE;
151 }
152 case DP_PARAM_ENGINE_ARCHITECTURE: {
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000153 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(DynamicsProcessing, dynamicsProcessingTag,
154 DynamicsProcessing::engineArchitecture);
155 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
156
157 DynamicsProcessing::EngineArchitecture engine =
158 VALUE_OR_RETURN_STATUS(aidl::android::GET_PARAMETER_SPECIFIC_FIELD(
159 aidlParam, DynamicsProcessing, dynamicsProcessing,
160 DynamicsProcessing::engineArchitecture,
161 DynamicsProcessing::EngineArchitecture));
162 int32_t resolution = VALUE_OR_RETURN_STATUS(
163 aidl::android::aidl2legacy_DynamicsProcessing_ResolutionPreference_int32(
164 engine.resolutionPreference));
165 int32_t preEqInUse =
166 VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(engine.preEqStage.inUse));
167 int32_t mbcInUse =
168 VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(engine.mbcStage.inUse));
169 int32_t postEqInUse =
170 VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(engine.postEqStage.inUse));
171 int32_t limiterInUse =
172 VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(engine.limiterInUse));
Shunkai Yaod86851a2023-03-01 02:49:50 +0000173 RETURN_STATUS_IF_ERROR(param.writeToValue(&resolution));
174 RETURN_STATUS_IF_ERROR(param.writeToValue(&engine.preferredProcessingDurationMs));
175 RETURN_STATUS_IF_ERROR(param.writeToValue(&preEqInUse));
176 RETURN_STATUS_IF_ERROR(param.writeToValue(&engine.preEqStage.bandCount));
177 RETURN_STATUS_IF_ERROR(param.writeToValue(&mbcInUse));
178 RETURN_STATUS_IF_ERROR(param.writeToValue(&engine.mbcStage.bandCount));
179 RETURN_STATUS_IF_ERROR(param.writeToValue(&postEqInUse));
180 RETURN_STATUS_IF_ERROR(param.writeToValue(&engine.postEqStage.bandCount));
181 RETURN_STATUS_IF_ERROR(param.writeToValue(&limiterInUse));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000182 mEngine = engine;
183 return OK;
184 }
185 case DP_PARAM_PRE_EQ: {
186 return getChannelConfig(DynamicsProcessing::preEq, param);
187 }
188 case DP_PARAM_POST_EQ: {
189 return getChannelConfig(DynamicsProcessing::postEq, param);
190 }
191 case DP_PARAM_MBC: {
192 return getChannelConfig(DynamicsProcessing::mbc, param);
193 }
194 case DP_PARAM_PRE_EQ_BAND: {
195 return getEqBandConfig(DynamicsProcessing::preEqBand, param);
196 }
197 case DP_PARAM_POST_EQ_BAND: {
198 return getEqBandConfig(DynamicsProcessing::postEqBand, param);
199 }
200 case DP_PARAM_MBC_BAND: {
201 return getMbcBandConfig(param);
202 }
203 case DP_PARAM_LIMITER: {
204 return getLimiterConfig(param);
205 }
206 case DP_PARAM_GET_CHANNEL_COUNT: {
Shunkai Yaod86851a2023-03-01 02:49:50 +0000207 uint32_t channel = ::android::hardware::audio::common::getChannelCount(
208 mCommon.input.base.channelMask);
209 RETURN_STATUS_IF_ERROR(param.writeToValue(&channel));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000210 return OK;
211 }
212 default: {
213 ALOGW("%s unknown param %s", __func__, param.toString().c_str());
214 return BAD_VALUE;
215 }
216 }
217}
218
219aidl::ConversionResult<DynamicsProcessing::ChannelConfig>
220AidlConversionDp::readChannelConfigFromParam(EffectParamReader& param) {
221 int32_t enable, channel;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000222 RETURN_IF_ERROR(param.readFromParameter(&channel));
223 RETURN_IF_ERROR(param.readFromValue(&enable));
224
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000225 return DynamicsProcessing::ChannelConfig(
226 {.enable = VALUE_OR_RETURN(convertIntegral<bool>(enable)), .channel = channel});
227}
228
229aidl::ConversionResult<DynamicsProcessing::EqBandConfig>
230AidlConversionDp::readEqBandConfigFromParam(EffectParamReader& param) {
231 DynamicsProcessing::EqBandConfig config;
232 int32_t enable;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000233 RETURN_IF_ERROR(param.readFromParameter(&config.channel));
234 RETURN_IF_ERROR(param.readFromParameter(&config.band));
235 RETURN_IF_ERROR(param.readFromValue(&enable));
236 RETURN_IF_ERROR(param.readFromValue(&config.cutoffFrequencyHz));
237 RETURN_IF_ERROR(param.readFromValue(&config.gainDb));
238
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000239 config.enable = VALUE_OR_RETURN(convertIntegral<bool>(enable));
240 return config;
241}
242
243aidl::ConversionResult<DynamicsProcessing::MbcBandConfig>
244AidlConversionDp::readMbcBandConfigFromParam(EffectParamReader& param) {
245 DynamicsProcessing::MbcBandConfig config;
246 int32_t enable;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000247 RETURN_IF_ERROR(param.readFromParameter(&config.channel));
248 RETURN_IF_ERROR(param.readFromParameter(&config.band));
249 RETURN_IF_ERROR(param.readFromValue(&enable));
250 RETURN_IF_ERROR(param.readFromValue(&config.cutoffFrequencyHz));
251 RETURN_IF_ERROR(param.readFromValue(&config.attackTimeMs));
252 RETURN_IF_ERROR(param.readFromValue(&config.releaseTimeMs));
253 RETURN_IF_ERROR(param.readFromValue(&config.ratio));
254 RETURN_IF_ERROR(param.readFromValue(&config.thresholdDb));
255 RETURN_IF_ERROR(param.readFromValue(&config.kneeWidthDb));
256 RETURN_IF_ERROR(param.readFromValue(&config.noiseGateThresholdDb));
257 RETURN_IF_ERROR(param.readFromValue(&config.expanderRatio));
258 RETURN_IF_ERROR(param.readFromValue(&config.preGainDb));
259 RETURN_IF_ERROR(param.readFromValue(&config.postGainDb));
260
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000261 config.enable = VALUE_OR_RETURN(convertIntegral<bool>(enable));
262 return config;
263}
264
265aidl::ConversionResult<DynamicsProcessing::LimiterConfig>
266AidlConversionDp::readLimiterConfigFromParam(EffectParamReader& param) {
267 DynamicsProcessing::LimiterConfig config;
268 int32_t enable, inUse;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000269 RETURN_IF_ERROR(param.readFromParameter(&config.channel));
270 RETURN_IF_ERROR(param.readFromValue(&inUse));
271 RETURN_IF_ERROR(param.readFromValue(&enable));
272 RETURN_IF_ERROR(param.readFromValue(&config.linkGroup));
273 RETURN_IF_ERROR(param.readFromValue(&config.attackTimeMs));
274 RETURN_IF_ERROR(param.readFromValue(&config.releaseTimeMs));
275 RETURN_IF_ERROR(param.readFromValue(&config.ratio));
276 RETURN_IF_ERROR(param.readFromValue(&config.thresholdDb));
277 RETURN_IF_ERROR(param.readFromValue(&config.postGainDb));
278
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000279 config.enable = VALUE_OR_RETURN(convertIntegral<bool>(enable));
280 return config;
281}
282
283aidl::ConversionResult<DynamicsProcessing::EngineArchitecture>
284AidlConversionDp::readEngineArchitectureFromParam(EffectParamReader& param) {
285 DynamicsProcessing::EngineArchitecture engine;
286 int32_t variant, preEqInUse, mbcInUse, postEqInUse, limiterInUse;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000287 RETURN_IF_ERROR(param.readFromValue(&variant));
288 RETURN_IF_ERROR(param.readFromValue(&engine.preferredProcessingDurationMs));
289 RETURN_IF_ERROR(param.readFromValue(&preEqInUse));
290 RETURN_IF_ERROR(param.readFromValue(&engine.preEqStage.bandCount));
291 RETURN_IF_ERROR(param.readFromValue(&mbcInUse));
292 RETURN_IF_ERROR(param.readFromValue(&engine.mbcStage.bandCount));
293 RETURN_IF_ERROR(param.readFromValue(&postEqInUse));
294 RETURN_IF_ERROR(param.readFromValue(&engine.postEqStage.bandCount));
295 RETURN_IF_ERROR(param.readFromValue(&limiterInUse));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000296
297 engine.resolutionPreference = VALUE_OR_RETURN(
298 aidl::android::legacy2aidl_int32_DynamicsProcessing_ResolutionPreference(variant));
299 engine.preEqStage.inUse = VALUE_OR_RETURN(convertIntegral<bool>(preEqInUse));
300 engine.mbcStage.inUse = VALUE_OR_RETURN(convertIntegral<bool>(mbcInUse));
301 engine.postEqStage.inUse = VALUE_OR_RETURN(convertIntegral<bool>(postEqInUse));
302 engine.limiterInUse = VALUE_OR_RETURN(convertIntegral<bool>(limiterInUse));
303 return engine;
304}
305
306status_t AidlConversionDp::getChannelConfig(DynamicsProcessing::Tag tag, EffectParamWriter& param) {
307 int32_t channel;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000308 RETURN_STATUS_IF_ERROR(param.readFromParameter(&channel));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000309
310 Parameter aidlParam;
311 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(DynamicsProcessing, dynamicsProcessingTag, tag);
312 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
313
314 std::vector<DynamicsProcessing::ChannelConfig> channels;
315 int32_t inUse, bandCount;
316 switch (tag) {
317 case DynamicsProcessing::preEq: {
318 inUse = mEngine.preEqStage.inUse;
319 bandCount = mEngine.preEqStage.bandCount;
320 channels = VALUE_OR_RETURN_STATUS(aidl::android::GET_PARAMETER_SPECIFIC_FIELD(
321 aidlParam, DynamicsProcessing, dynamicsProcessing, DynamicsProcessing::preEq,
322 std::vector<DynamicsProcessing::ChannelConfig>));
323 break;
324 }
325 case DynamicsProcessing::postEq: {
326 inUse = mEngine.postEqStage.inUse;
327 bandCount = mEngine.postEqStage.bandCount;
328 channels = VALUE_OR_RETURN_STATUS(aidl::android::GET_PARAMETER_SPECIFIC_FIELD(
329 aidlParam, DynamicsProcessing, dynamicsProcessing, DynamicsProcessing::postEq,
330 std::vector<DynamicsProcessing::ChannelConfig>));
331 break;
332 }
333 case DynamicsProcessing::mbc: {
334 inUse = mEngine.mbcStage.inUse;
335 bandCount = mEngine.mbcStage.bandCount;
336 channels = VALUE_OR_RETURN_STATUS(aidl::android::GET_PARAMETER_SPECIFIC_FIELD(
337 aidlParam, DynamicsProcessing, dynamicsProcessing, DynamicsProcessing::mbc,
338 std::vector<DynamicsProcessing::ChannelConfig>));
339 break;
340 }
341 default: {
342 ALOGE("%s unsupported tag %s", __func__, toString(tag).c_str());
343 return BAD_VALUE;
344 }
345 }
346
347 for (const auto& ch : channels) {
348 if (ch.channel == channel) {
349 int32_t enable = ch.enable;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000350 RETURN_STATUS_IF_ERROR(param.writeToValue(&inUse));
351 RETURN_STATUS_IF_ERROR(param.writeToValue(&enable));
352 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandCount));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000353 return OK;
354 }
355 }
356 ALOGE("%s not able to find channel %d", __func__, channel);
357 return BAD_VALUE;
358}
359
360status_t AidlConversionDp::getEqBandConfig(DynamicsProcessing::Tag tag, EffectParamWriter& param) {
361 int32_t channel, band;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000362 RETURN_STATUS_IF_ERROR(param.readFromParameter(&channel));
363 RETURN_STATUS_IF_ERROR(param.readFromParameter(&band));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000364
365 Parameter aidlParam;
366 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(DynamicsProcessing, dynamicsProcessingTag, tag);
367 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
368
369 std::vector<DynamicsProcessing::EqBandConfig> bands;
370 if (tag == DynamicsProcessing::preEqBand) {
371 bands = VALUE_OR_RETURN_STATUS(aidl::android::GET_PARAMETER_SPECIFIC_FIELD(
372 aidlParam, DynamicsProcessing, dynamicsProcessing, preEqBand,
373 std::vector<DynamicsProcessing::EqBandConfig>));
374 } else if (tag == DynamicsProcessing::postEqBand) {
375 bands = VALUE_OR_RETURN_STATUS(aidl::android::GET_PARAMETER_SPECIFIC_FIELD(
376 aidlParam, DynamicsProcessing, dynamicsProcessing, postEqBand,
377 std::vector<DynamicsProcessing::EqBandConfig>));
378 } else {
379 return BAD_VALUE;
380 }
381
382 for (const auto& bandIt : bands) {
383 if (bandIt.channel == channel && bandIt.band == band) {
384 int32_t enable = bandIt.enable;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000385 RETURN_STATUS_IF_ERROR(param.writeToValue(&enable));
386 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandIt.cutoffFrequencyHz));
387 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandIt.gainDb));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000388 return OK;
389 }
390 }
391 ALOGE("%s not able to find channel %d band %d", __func__, channel, band);
392 return BAD_VALUE;
393}
394
395status_t AidlConversionDp::getMbcBandConfig(EffectParamWriter& param) {
396 int32_t channel, band;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000397 RETURN_STATUS_IF_ERROR(param.readFromParameter(&channel));
398 RETURN_STATUS_IF_ERROR(param.readFromParameter(&band));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000399 Parameter aidlParam;
400 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(DynamicsProcessing, dynamicsProcessingTag,
401 DynamicsProcessing::mbcBand);
402 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
403
404 std::vector<DynamicsProcessing::MbcBandConfig> bands =
405 VALUE_OR_RETURN_STATUS(aidl::android::GET_PARAMETER_SPECIFIC_FIELD(
406 aidlParam, DynamicsProcessing, dynamicsProcessing, mbcBand,
407 std::vector<DynamicsProcessing::MbcBandConfig>));
408
409 for (const auto& bandIt : bands) {
410 if (bandIt.channel == channel && bandIt.band == band) {
411 int32_t enable = bandIt.enable;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000412 RETURN_STATUS_IF_ERROR(param.writeToValue(&enable));
413 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandIt.cutoffFrequencyHz));
414 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandIt.attackTimeMs));
415 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandIt.releaseTimeMs));
416 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandIt.ratio));
417 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandIt.thresholdDb));
418 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandIt.kneeWidthDb));
419 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandIt.noiseGateThresholdDb));
420 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandIt.expanderRatio));
421 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandIt.preGainDb));
422 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandIt.postGainDb));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000423 return OK;
424 }
425 }
426 ALOGE("%s not able to find channel %d band %d", __func__, channel, band);
427 return BAD_VALUE;
428}
429
430status_t AidlConversionDp::getLimiterConfig(EffectParamWriter& param) {
431 int32_t channel;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000432 RETURN_STATUS_IF_ERROR(param.readFromParameter(&channel));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000433 Parameter aidlParam;
434 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(DynamicsProcessing, dynamicsProcessingTag,
435 DynamicsProcessing::limiter);
436 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
437
438 std::vector<DynamicsProcessing::LimiterConfig> configs =
439 VALUE_OR_RETURN_STATUS(aidl::android::GET_PARAMETER_SPECIFIC_FIELD(
440 aidlParam, DynamicsProcessing, dynamicsProcessing, limiter,
441 std::vector<DynamicsProcessing::LimiterConfig>));
442
443 for (const auto& config : configs) {
444 if (config.channel == channel) {
445 int32_t inUse = mEngine.limiterInUse;
446 int32_t enable = config.enable;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000447 RETURN_STATUS_IF_ERROR(param.writeToValue(&inUse));
448 RETURN_STATUS_IF_ERROR(param.writeToValue(&enable));
449 RETURN_STATUS_IF_ERROR(param.writeToValue(&config.linkGroup));
450 RETURN_STATUS_IF_ERROR(param.writeToValue(&config.attackTimeMs));
451 RETURN_STATUS_IF_ERROR(param.writeToValue(&config.releaseTimeMs));
452 RETURN_STATUS_IF_ERROR(param.writeToValue(&config.ratio));
453 RETURN_STATUS_IF_ERROR(param.writeToValue(&config.thresholdDb));
454 RETURN_STATUS_IF_ERROR(param.writeToValue(&config.postGainDb));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000455 return OK;
456 }
457 }
458 ALOGE("%s not able to find channel %d", __func__, channel);
459 return BAD_VALUE;
460}
461
462} // namespace effect
463} // namespace android