blob: d8fea47a67381edd1527101db49e4364d4104394 [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;
Shunkai Yaoda4a6402023-03-03 19:38:17 +000039using ::aidl::android::getParameterSpecificField;
Shunkai Yaodba8ba32023-01-27 17:02:21 +000040using ::aidl::android::aidl_utils::statusTFromBinderStatus;
41using ::aidl::android::hardware::audio::effect::Capability;
42using ::aidl::android::hardware::audio::effect::DynamicsProcessing;
43using ::aidl::android::hardware::audio::effect::Parameter;
44using ::aidl::android::hardware::audio::effect::toString;
Shunkai Yaoda4a6402023-03-03 19:38:17 +000045using ::aidl::android::hardware::audio::effect::VendorExtension;
Shunkai Yaodba8ba32023-01-27 17:02:21 +000046using ::android::status_t;
47using utils::EffectParamReader;
48using utils::EffectParamWriter;
49
50status_t AidlConversionDp::setParameter(EffectParamReader& param) {
51 uint32_t type = 0;
Shunkai Yaod86851a2023-03-01 02:49:50 +000052 RETURN_STATUS_IF_ERROR(param.readFromParameter(&type));
Shunkai Yaodba8ba32023-01-27 17:02:21 +000053 Parameter aidlParam;
54 switch (type) {
55 case DP_PARAM_INPUT_GAIN: {
56 DynamicsProcessing::InputGain inputGainAidl;
Shunkai Yaod86851a2023-03-01 02:49:50 +000057 RETURN_STATUS_IF_ERROR(param.readFromParameter(&inputGainAidl.channel));
58 RETURN_STATUS_IF_ERROR(param.readFromValue(&inputGainAidl.gainDb));
Shunkai Yaodba8ba32023-01-27 17:02:21 +000059 aidlParam = MAKE_SPECIFIC_PARAMETER(DynamicsProcessing, dynamicsProcessing, inputGain,
60 {inputGainAidl});
61 break;
62 }
63 case DP_PARAM_ENGINE_ARCHITECTURE: {
64 DynamicsProcessing::EngineArchitecture engine =
65 VALUE_OR_RETURN_STATUS(readEngineArchitectureFromParam(param));
66 aidlParam = MAKE_SPECIFIC_PARAMETER(DynamicsProcessing, dynamicsProcessing,
67 engineArchitecture, engine);
68 mEngine = engine;
69 break;
70 }
71 case DP_PARAM_PRE_EQ: {
72 DynamicsProcessing::ChannelConfig chConfig =
73 VALUE_OR_RETURN_STATUS(readChannelConfigFromParam(param));
74 aidlParam = MAKE_SPECIFIC_PARAMETER(DynamicsProcessing, dynamicsProcessing, preEq,
75 {chConfig});
76 break;
77 }
78 case DP_PARAM_POST_EQ: {
79 DynamicsProcessing::ChannelConfig chConfig =
80 VALUE_OR_RETURN_STATUS(readChannelConfigFromParam(param));
81 aidlParam = MAKE_SPECIFIC_PARAMETER(DynamicsProcessing, dynamicsProcessing, postEq,
82 {chConfig});
83 break;
84 }
85 case DP_PARAM_MBC: {
86 DynamicsProcessing::ChannelConfig chConfig =
87 VALUE_OR_RETURN_STATUS(readChannelConfigFromParam(param));
88 aidlParam = MAKE_SPECIFIC_PARAMETER(DynamicsProcessing, dynamicsProcessing, mbc,
89 {chConfig});
90 break;
91 }
92 case DP_PARAM_PRE_EQ_BAND: {
93 DynamicsProcessing::EqBandConfig bandConfig =
94 VALUE_OR_RETURN_STATUS(readEqBandConfigFromParam(param));
95 aidlParam = MAKE_SPECIFIC_PARAMETER(DynamicsProcessing, dynamicsProcessing, preEqBand,
96 {bandConfig});
97 break;
98 }
99 case DP_PARAM_POST_EQ_BAND: {
100 DynamicsProcessing::EqBandConfig bandConfig =
101 VALUE_OR_RETURN_STATUS(readEqBandConfigFromParam(param));
102 aidlParam = MAKE_SPECIFIC_PARAMETER(DynamicsProcessing, dynamicsProcessing, postEqBand,
103 {bandConfig});
104 break;
105 }
106 case DP_PARAM_MBC_BAND: {
107 DynamicsProcessing::MbcBandConfig bandConfig =
108 VALUE_OR_RETURN_STATUS(readMbcBandConfigFromParam(param));
109 aidlParam = MAKE_SPECIFIC_PARAMETER(DynamicsProcessing, dynamicsProcessing, mbcBand,
110 {bandConfig});
111 break;
112 }
113 case DP_PARAM_LIMITER: {
114 DynamicsProcessing::LimiterConfig config =
115 VALUE_OR_RETURN_STATUS(readLimiterConfigFromParam(param));
116 aidlParam = MAKE_SPECIFIC_PARAMETER(DynamicsProcessing, dynamicsProcessing, limiter,
117 {config});
118 break;
119 }
120 default: {
Shunkai Yaoda4a6402023-03-03 19:38:17 +0000121 // for vendor extension, copy data area to the DefaultExtension, parameter ignored
122 VendorExtension ext = VALUE_OR_RETURN_STATUS(
123 aidl::android::legacy2aidl_EffectParameterReader_Data_VendorExtension(param));
124 aidlParam =
125 MAKE_SPECIFIC_PARAMETER(DynamicsProcessing, dynamicsProcessing, vendor, ext);
126 break;
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000127 }
128 }
129
130 return statusTFromBinderStatus(mEffect->setParameter(aidlParam));
131}
132
133status_t AidlConversionDp::getParameter(EffectParamWriter& param) {
134 uint32_t type = 0;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000135 RETURN_STATUS_IF_ERROR(param.readFromParameter(&type));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000136 Parameter aidlParam;
137 switch (type) {
138 case DP_PARAM_INPUT_GAIN: {
139 int32_t channel;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000140 RETURN_STATUS_IF_ERROR(param.readFromParameter(&channel));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000141 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(DynamicsProcessing, dynamicsProcessingTag,
142 DynamicsProcessing::inputGain);
143 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
144
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000145 std::vector<DynamicsProcessing::InputGain> gains =
146 VALUE_OR_RETURN_STATUS(aidl::android::GET_PARAMETER_SPECIFIC_FIELD(
147 aidlParam, DynamicsProcessing, dynamicsProcessing,
148 DynamicsProcessing::inputGain,
149 std::vector<DynamicsProcessing::InputGain>));
150 for (const auto& gain : gains) {
151 if (gain.channel == channel) {
152 return param.writeToValue(&gain.gainDb);
153 }
154 }
155 ALOGE("%s not able to find channel %d", __func__, channel);
156 return BAD_VALUE;
157 }
158 case DP_PARAM_ENGINE_ARCHITECTURE: {
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000159 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(DynamicsProcessing, dynamicsProcessingTag,
160 DynamicsProcessing::engineArchitecture);
161 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
162
163 DynamicsProcessing::EngineArchitecture engine =
164 VALUE_OR_RETURN_STATUS(aidl::android::GET_PARAMETER_SPECIFIC_FIELD(
165 aidlParam, DynamicsProcessing, dynamicsProcessing,
166 DynamicsProcessing::engineArchitecture,
167 DynamicsProcessing::EngineArchitecture));
168 int32_t resolution = VALUE_OR_RETURN_STATUS(
169 aidl::android::aidl2legacy_DynamicsProcessing_ResolutionPreference_int32(
170 engine.resolutionPreference));
171 int32_t preEqInUse =
172 VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(engine.preEqStage.inUse));
173 int32_t mbcInUse =
174 VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(engine.mbcStage.inUse));
175 int32_t postEqInUse =
176 VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(engine.postEqStage.inUse));
177 int32_t limiterInUse =
178 VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(engine.limiterInUse));
Shunkai Yaod86851a2023-03-01 02:49:50 +0000179 RETURN_STATUS_IF_ERROR(param.writeToValue(&resolution));
180 RETURN_STATUS_IF_ERROR(param.writeToValue(&engine.preferredProcessingDurationMs));
181 RETURN_STATUS_IF_ERROR(param.writeToValue(&preEqInUse));
182 RETURN_STATUS_IF_ERROR(param.writeToValue(&engine.preEqStage.bandCount));
183 RETURN_STATUS_IF_ERROR(param.writeToValue(&mbcInUse));
184 RETURN_STATUS_IF_ERROR(param.writeToValue(&engine.mbcStage.bandCount));
185 RETURN_STATUS_IF_ERROR(param.writeToValue(&postEqInUse));
186 RETURN_STATUS_IF_ERROR(param.writeToValue(&engine.postEqStage.bandCount));
187 RETURN_STATUS_IF_ERROR(param.writeToValue(&limiterInUse));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000188 mEngine = engine;
189 return OK;
190 }
191 case DP_PARAM_PRE_EQ: {
192 return getChannelConfig(DynamicsProcessing::preEq, param);
193 }
194 case DP_PARAM_POST_EQ: {
195 return getChannelConfig(DynamicsProcessing::postEq, param);
196 }
197 case DP_PARAM_MBC: {
198 return getChannelConfig(DynamicsProcessing::mbc, param);
199 }
200 case DP_PARAM_PRE_EQ_BAND: {
201 return getEqBandConfig(DynamicsProcessing::preEqBand, param);
202 }
203 case DP_PARAM_POST_EQ_BAND: {
204 return getEqBandConfig(DynamicsProcessing::postEqBand, param);
205 }
206 case DP_PARAM_MBC_BAND: {
207 return getMbcBandConfig(param);
208 }
209 case DP_PARAM_LIMITER: {
210 return getLimiterConfig(param);
211 }
212 case DP_PARAM_GET_CHANNEL_COUNT: {
Mikhail Naganov6352e822023-03-09 18:22:36 -0800213 uint32_t channel = ::aidl::android::hardware::audio::common::getChannelCount(
Shunkai Yaod86851a2023-03-01 02:49:50 +0000214 mCommon.input.base.channelMask);
215 RETURN_STATUS_IF_ERROR(param.writeToValue(&channel));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000216 return OK;
217 }
218 default: {
Shunkai Yaoda4a6402023-03-03 19:38:17 +0000219 VENDOR_EXTENSION_GET_AND_RETURN(DynamicsProcessing, dynamicsProcessing, param);
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000220 }
221 }
222}
223
224aidl::ConversionResult<DynamicsProcessing::ChannelConfig>
225AidlConversionDp::readChannelConfigFromParam(EffectParamReader& param) {
226 int32_t enable, channel;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000227 RETURN_IF_ERROR(param.readFromParameter(&channel));
228 RETURN_IF_ERROR(param.readFromValue(&enable));
229
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000230 return DynamicsProcessing::ChannelConfig(
231 {.enable = VALUE_OR_RETURN(convertIntegral<bool>(enable)), .channel = channel});
232}
233
234aidl::ConversionResult<DynamicsProcessing::EqBandConfig>
235AidlConversionDp::readEqBandConfigFromParam(EffectParamReader& param) {
236 DynamicsProcessing::EqBandConfig config;
237 int32_t enable;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000238 RETURN_IF_ERROR(param.readFromParameter(&config.channel));
239 RETURN_IF_ERROR(param.readFromParameter(&config.band));
240 RETURN_IF_ERROR(param.readFromValue(&enable));
241 RETURN_IF_ERROR(param.readFromValue(&config.cutoffFrequencyHz));
242 RETURN_IF_ERROR(param.readFromValue(&config.gainDb));
243
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000244 config.enable = VALUE_OR_RETURN(convertIntegral<bool>(enable));
245 return config;
246}
247
248aidl::ConversionResult<DynamicsProcessing::MbcBandConfig>
249AidlConversionDp::readMbcBandConfigFromParam(EffectParamReader& param) {
250 DynamicsProcessing::MbcBandConfig config;
251 int32_t enable;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000252 RETURN_IF_ERROR(param.readFromParameter(&config.channel));
253 RETURN_IF_ERROR(param.readFromParameter(&config.band));
254 RETURN_IF_ERROR(param.readFromValue(&enable));
255 RETURN_IF_ERROR(param.readFromValue(&config.cutoffFrequencyHz));
256 RETURN_IF_ERROR(param.readFromValue(&config.attackTimeMs));
257 RETURN_IF_ERROR(param.readFromValue(&config.releaseTimeMs));
258 RETURN_IF_ERROR(param.readFromValue(&config.ratio));
259 RETURN_IF_ERROR(param.readFromValue(&config.thresholdDb));
260 RETURN_IF_ERROR(param.readFromValue(&config.kneeWidthDb));
261 RETURN_IF_ERROR(param.readFromValue(&config.noiseGateThresholdDb));
262 RETURN_IF_ERROR(param.readFromValue(&config.expanderRatio));
263 RETURN_IF_ERROR(param.readFromValue(&config.preGainDb));
264 RETURN_IF_ERROR(param.readFromValue(&config.postGainDb));
265
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000266 config.enable = VALUE_OR_RETURN(convertIntegral<bool>(enable));
267 return config;
268}
269
270aidl::ConversionResult<DynamicsProcessing::LimiterConfig>
271AidlConversionDp::readLimiterConfigFromParam(EffectParamReader& param) {
272 DynamicsProcessing::LimiterConfig config;
273 int32_t enable, inUse;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000274 RETURN_IF_ERROR(param.readFromParameter(&config.channel));
275 RETURN_IF_ERROR(param.readFromValue(&inUse));
276 RETURN_IF_ERROR(param.readFromValue(&enable));
277 RETURN_IF_ERROR(param.readFromValue(&config.linkGroup));
278 RETURN_IF_ERROR(param.readFromValue(&config.attackTimeMs));
279 RETURN_IF_ERROR(param.readFromValue(&config.releaseTimeMs));
280 RETURN_IF_ERROR(param.readFromValue(&config.ratio));
281 RETURN_IF_ERROR(param.readFromValue(&config.thresholdDb));
282 RETURN_IF_ERROR(param.readFromValue(&config.postGainDb));
283
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000284 config.enable = VALUE_OR_RETURN(convertIntegral<bool>(enable));
285 return config;
286}
287
288aidl::ConversionResult<DynamicsProcessing::EngineArchitecture>
289AidlConversionDp::readEngineArchitectureFromParam(EffectParamReader& param) {
290 DynamicsProcessing::EngineArchitecture engine;
291 int32_t variant, preEqInUse, mbcInUse, postEqInUse, limiterInUse;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000292 RETURN_IF_ERROR(param.readFromValue(&variant));
293 RETURN_IF_ERROR(param.readFromValue(&engine.preferredProcessingDurationMs));
294 RETURN_IF_ERROR(param.readFromValue(&preEqInUse));
295 RETURN_IF_ERROR(param.readFromValue(&engine.preEqStage.bandCount));
296 RETURN_IF_ERROR(param.readFromValue(&mbcInUse));
297 RETURN_IF_ERROR(param.readFromValue(&engine.mbcStage.bandCount));
298 RETURN_IF_ERROR(param.readFromValue(&postEqInUse));
299 RETURN_IF_ERROR(param.readFromValue(&engine.postEqStage.bandCount));
300 RETURN_IF_ERROR(param.readFromValue(&limiterInUse));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000301
302 engine.resolutionPreference = VALUE_OR_RETURN(
303 aidl::android::legacy2aidl_int32_DynamicsProcessing_ResolutionPreference(variant));
304 engine.preEqStage.inUse = VALUE_OR_RETURN(convertIntegral<bool>(preEqInUse));
305 engine.mbcStage.inUse = VALUE_OR_RETURN(convertIntegral<bool>(mbcInUse));
306 engine.postEqStage.inUse = VALUE_OR_RETURN(convertIntegral<bool>(postEqInUse));
307 engine.limiterInUse = VALUE_OR_RETURN(convertIntegral<bool>(limiterInUse));
308 return engine;
309}
310
311status_t AidlConversionDp::getChannelConfig(DynamicsProcessing::Tag tag, EffectParamWriter& param) {
312 int32_t channel;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000313 RETURN_STATUS_IF_ERROR(param.readFromParameter(&channel));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000314
315 Parameter aidlParam;
316 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(DynamicsProcessing, dynamicsProcessingTag, tag);
317 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
318
319 std::vector<DynamicsProcessing::ChannelConfig> channels;
320 int32_t inUse, bandCount;
321 switch (tag) {
322 case DynamicsProcessing::preEq: {
323 inUse = mEngine.preEqStage.inUse;
324 bandCount = mEngine.preEqStage.bandCount;
325 channels = VALUE_OR_RETURN_STATUS(aidl::android::GET_PARAMETER_SPECIFIC_FIELD(
326 aidlParam, DynamicsProcessing, dynamicsProcessing, DynamicsProcessing::preEq,
327 std::vector<DynamicsProcessing::ChannelConfig>));
328 break;
329 }
330 case DynamicsProcessing::postEq: {
331 inUse = mEngine.postEqStage.inUse;
332 bandCount = mEngine.postEqStage.bandCount;
333 channels = VALUE_OR_RETURN_STATUS(aidl::android::GET_PARAMETER_SPECIFIC_FIELD(
334 aidlParam, DynamicsProcessing, dynamicsProcessing, DynamicsProcessing::postEq,
335 std::vector<DynamicsProcessing::ChannelConfig>));
336 break;
337 }
338 case DynamicsProcessing::mbc: {
339 inUse = mEngine.mbcStage.inUse;
340 bandCount = mEngine.mbcStage.bandCount;
341 channels = VALUE_OR_RETURN_STATUS(aidl::android::GET_PARAMETER_SPECIFIC_FIELD(
342 aidlParam, DynamicsProcessing, dynamicsProcessing, DynamicsProcessing::mbc,
343 std::vector<DynamicsProcessing::ChannelConfig>));
344 break;
345 }
346 default: {
347 ALOGE("%s unsupported tag %s", __func__, toString(tag).c_str());
348 return BAD_VALUE;
349 }
350 }
351
352 for (const auto& ch : channels) {
353 if (ch.channel == channel) {
354 int32_t enable = ch.enable;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000355 RETURN_STATUS_IF_ERROR(param.writeToValue(&inUse));
356 RETURN_STATUS_IF_ERROR(param.writeToValue(&enable));
357 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandCount));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000358 return OK;
359 }
360 }
361 ALOGE("%s not able to find channel %d", __func__, channel);
362 return BAD_VALUE;
363}
364
365status_t AidlConversionDp::getEqBandConfig(DynamicsProcessing::Tag tag, EffectParamWriter& param) {
366 int32_t channel, band;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000367 RETURN_STATUS_IF_ERROR(param.readFromParameter(&channel));
368 RETURN_STATUS_IF_ERROR(param.readFromParameter(&band));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000369
370 Parameter aidlParam;
371 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(DynamicsProcessing, dynamicsProcessingTag, tag);
372 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
373
374 std::vector<DynamicsProcessing::EqBandConfig> bands;
375 if (tag == DynamicsProcessing::preEqBand) {
376 bands = VALUE_OR_RETURN_STATUS(aidl::android::GET_PARAMETER_SPECIFIC_FIELD(
377 aidlParam, DynamicsProcessing, dynamicsProcessing, preEqBand,
378 std::vector<DynamicsProcessing::EqBandConfig>));
379 } else if (tag == DynamicsProcessing::postEqBand) {
380 bands = VALUE_OR_RETURN_STATUS(aidl::android::GET_PARAMETER_SPECIFIC_FIELD(
381 aidlParam, DynamicsProcessing, dynamicsProcessing, postEqBand,
382 std::vector<DynamicsProcessing::EqBandConfig>));
383 } else {
384 return BAD_VALUE;
385 }
386
387 for (const auto& bandIt : bands) {
388 if (bandIt.channel == channel && bandIt.band == band) {
389 int32_t enable = bandIt.enable;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000390 RETURN_STATUS_IF_ERROR(param.writeToValue(&enable));
391 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandIt.cutoffFrequencyHz));
392 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandIt.gainDb));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000393 return OK;
394 }
395 }
396 ALOGE("%s not able to find channel %d band %d", __func__, channel, band);
397 return BAD_VALUE;
398}
399
400status_t AidlConversionDp::getMbcBandConfig(EffectParamWriter& param) {
401 int32_t channel, band;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000402 RETURN_STATUS_IF_ERROR(param.readFromParameter(&channel));
403 RETURN_STATUS_IF_ERROR(param.readFromParameter(&band));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000404 Parameter aidlParam;
405 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(DynamicsProcessing, dynamicsProcessingTag,
406 DynamicsProcessing::mbcBand);
407 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
408
409 std::vector<DynamicsProcessing::MbcBandConfig> bands =
410 VALUE_OR_RETURN_STATUS(aidl::android::GET_PARAMETER_SPECIFIC_FIELD(
411 aidlParam, DynamicsProcessing, dynamicsProcessing, mbcBand,
412 std::vector<DynamicsProcessing::MbcBandConfig>));
413
414 for (const auto& bandIt : bands) {
415 if (bandIt.channel == channel && bandIt.band == band) {
416 int32_t enable = bandIt.enable;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000417 RETURN_STATUS_IF_ERROR(param.writeToValue(&enable));
418 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandIt.cutoffFrequencyHz));
419 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandIt.attackTimeMs));
420 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandIt.releaseTimeMs));
421 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandIt.ratio));
422 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandIt.thresholdDb));
423 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandIt.kneeWidthDb));
424 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandIt.noiseGateThresholdDb));
425 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandIt.expanderRatio));
426 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandIt.preGainDb));
427 RETURN_STATUS_IF_ERROR(param.writeToValue(&bandIt.postGainDb));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000428 return OK;
429 }
430 }
431 ALOGE("%s not able to find channel %d band %d", __func__, channel, band);
432 return BAD_VALUE;
433}
434
435status_t AidlConversionDp::getLimiterConfig(EffectParamWriter& param) {
436 int32_t channel;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000437 RETURN_STATUS_IF_ERROR(param.readFromParameter(&channel));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000438 Parameter aidlParam;
439 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(DynamicsProcessing, dynamicsProcessingTag,
440 DynamicsProcessing::limiter);
441 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
442
443 std::vector<DynamicsProcessing::LimiterConfig> configs =
444 VALUE_OR_RETURN_STATUS(aidl::android::GET_PARAMETER_SPECIFIC_FIELD(
445 aidlParam, DynamicsProcessing, dynamicsProcessing, limiter,
446 std::vector<DynamicsProcessing::LimiterConfig>));
447
448 for (const auto& config : configs) {
449 if (config.channel == channel) {
450 int32_t inUse = mEngine.limiterInUse;
451 int32_t enable = config.enable;
Shunkai Yaod86851a2023-03-01 02:49:50 +0000452 RETURN_STATUS_IF_ERROR(param.writeToValue(&inUse));
453 RETURN_STATUS_IF_ERROR(param.writeToValue(&enable));
454 RETURN_STATUS_IF_ERROR(param.writeToValue(&config.linkGroup));
455 RETURN_STATUS_IF_ERROR(param.writeToValue(&config.attackTimeMs));
456 RETURN_STATUS_IF_ERROR(param.writeToValue(&config.releaseTimeMs));
457 RETURN_STATUS_IF_ERROR(param.writeToValue(&config.ratio));
458 RETURN_STATUS_IF_ERROR(param.writeToValue(&config.thresholdDb));
459 RETURN_STATUS_IF_ERROR(param.writeToValue(&config.postGainDb));
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000460 return OK;
461 }
462 }
463 ALOGE("%s not able to find channel %d", __func__, channel);
464 return BAD_VALUE;
465}
466
467} // namespace effect
468} // namespace android