blob: 8c19612f6ba91d6ab43ff49fc6bdf6d7fd6fce01 [file] [log] [blame]
Shunkai Yao61ce9572023-02-28 23:55:33 +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 "AidlConversionAgc1"
21//#define LOG_NDEBUG 0
22
23#include <error/expected_utils.h>
24#include <media/AidlConversionNdk.h>
25#include <media/AidlConversionEffect.h>
26#include <media/audiohal/AudioEffectUuid.h>
27#include <system/audio_effects/effect_agc.h>
28
29#include <utils/Log.h>
30
31#include "AidlConversionAgc1.h"
32
33namespace android {
34namespace effect {
35
Shunkai Yaoda4a6402023-03-03 19:38:17 +000036using ::aidl::android::getParameterSpecificField;
Shunkai Yao61ce9572023-02-28 23:55:33 +000037using ::aidl::android::aidl_utils::statusTFromBinderStatus;
38using ::aidl::android::hardware::audio::effect::AutomaticGainControlV1;
39using ::aidl::android::hardware::audio::effect::Parameter;
Shunkai Yaoda4a6402023-03-03 19:38:17 +000040using ::aidl::android::hardware::audio::effect::VendorExtension;
Shunkai Yao61ce9572023-02-28 23:55:33 +000041using ::android::status_t;
42using utils::EffectParamReader;
43using utils::EffectParamWriter;
44
45status_t AidlConversionAgc1::setParameterLevel(EffectParamReader& param) {
46 int16_t level;
47 RETURN_STATUS_IF_ERROR(param.readFromValue(&level));
48 Parameter aidlParam = MAKE_SPECIFIC_PARAMETER(AutomaticGainControlV1, automaticGainControlV1,
49 targetPeakLevelDbFs, level);
50 return statusTFromBinderStatus(mEffect->setParameter(aidlParam));
51}
52
53status_t AidlConversionAgc1::setParameterGain(EffectParamReader& param) {
54 int16_t gain;
55 RETURN_STATUS_IF_ERROR(param.readFromValue(&gain));
56 Parameter aidlParam = MAKE_SPECIFIC_PARAMETER(AutomaticGainControlV1, automaticGainControlV1,
57 maxCompressionGainDb, gain);
58 return statusTFromBinderStatus(mEffect->setParameter(aidlParam));
59}
60
61status_t AidlConversionAgc1::setParameterLimiterEnable(EffectParamReader& param) {
62 bool enable;
63 RETURN_STATUS_IF_ERROR(param.readFromValue(&enable));
64 Parameter aidlParam = MAKE_SPECIFIC_PARAMETER(AutomaticGainControlV1, automaticGainControlV1,
65 enableLimiter, enable);
66 return statusTFromBinderStatus(mEffect->setParameter(aidlParam));
67}
68
69status_t AidlConversionAgc1::setParameter(EffectParamReader& param) {
70 uint32_t type = 0;
71 if (OK != param.readFromParameter(&type)) {
72 ALOGE("%s invalid param %s", __func__, param.toString().c_str());
73 return BAD_VALUE;
74 }
75 switch (type) {
76 case AGC_PARAM_TARGET_LEVEL: {
77 return setParameterLevel(param);
78 }
79 case AGC_PARAM_COMP_GAIN: {
80 return setParameterGain(param);
81 }
82 case AGC_PARAM_LIMITER_ENA: {
83 return setParameterLimiterEnable(param);
84 }
85 case AGC_PARAM_PROPERTIES: {
86 RETURN_STATUS_IF_ERROR(setParameterLevel(param));
87 RETURN_STATUS_IF_ERROR(setParameterGain(param));
88 RETURN_STATUS_IF_ERROR(setParameterLimiterEnable(param));
89 return OK;
90 }
91 default: {
Shunkai Yaoda4a6402023-03-03 19:38:17 +000092 // for vendor extension, copy data area to the DefaultExtension, parameter ignored
93 VendorExtension ext = VALUE_OR_RETURN_STATUS(
94 aidl::android::legacy2aidl_EffectParameterReader_Data_VendorExtension(param));
95 Parameter aidlParam = MAKE_SPECIFIC_PARAMETER(AutomaticGainControlV1,
96 automaticGainControlV1, vendor, ext);
97 return statusTFromBinderStatus(mEffect->setParameter(aidlParam));
Shunkai Yao61ce9572023-02-28 23:55:33 +000098 }
99 }
100}
101
102status_t AidlConversionAgc1::getParameterLevel(EffectParamWriter& param) {
103 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(AutomaticGainControlV1, automaticGainControlV1Tag,
104 AutomaticGainControlV1::targetPeakLevelDbFs);
105 Parameter aidlParam;
106 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
107 int32_t level = VALUE_OR_RETURN_STATUS(
108 GET_PARAMETER_SPECIFIC_FIELD(aidlParam, AutomaticGainControlV1, automaticGainControlV1,
109 AutomaticGainControlV1::targetPeakLevelDbFs, int32_t));
110 return param.writeToValue(&level);
111}
112
113status_t AidlConversionAgc1::getParameterGain(EffectParamWriter& param) {
114 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(AutomaticGainControlV1, automaticGainControlV1Tag,
115 AutomaticGainControlV1::maxCompressionGainDb);
116 Parameter aidlParam;
117 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
118 int32_t gain = VALUE_OR_RETURN_STATUS(
119 GET_PARAMETER_SPECIFIC_FIELD(aidlParam, AutomaticGainControlV1, automaticGainControlV1,
120 AutomaticGainControlV1::maxCompressionGainDb, int32_t));
121 return param.writeToValue(&gain);
122}
123
124status_t AidlConversionAgc1::getParameterLimiterEnable(EffectParamWriter& param) {
125 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(AutomaticGainControlV1, automaticGainControlV1Tag,
126 AutomaticGainControlV1::enableLimiter);
127 Parameter aidlParam;
128 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
129 bool enable = VALUE_OR_RETURN_STATUS(
130 GET_PARAMETER_SPECIFIC_FIELD(aidlParam, AutomaticGainControlV1, automaticGainControlV1,
131 AutomaticGainControlV1::enableLimiter, bool));
132 return param.writeToValue(&enable);
133}
134
135status_t AidlConversionAgc1::getParameter(EffectParamWriter& param) {
136 uint32_t type = 0;
137 if (OK != param.readFromParameter(&type)) {
138 ALOGE("%s invalid param %s", __func__, param.toString().c_str());
139 return BAD_VALUE;
140 }
141 switch (type) {
142 case AGC_PARAM_TARGET_LEVEL: {
143 return getParameterLevel(param);
144 }
145 case AGC_PARAM_COMP_GAIN: {
146 return getParameterGain(param);
147 }
148 case AGC_PARAM_LIMITER_ENA: {
149 return getParameterLimiterEnable(param);
150 }
151 case AGC_PARAM_PROPERTIES: {
152 RETURN_STATUS_IF_ERROR(getParameterLevel(param));
153 RETURN_STATUS_IF_ERROR(getParameterGain(param));
154 RETURN_STATUS_IF_ERROR(getParameterLimiterEnable(param));
155 return OK;
156 }
157 default: {
Shunkai Yaoda4a6402023-03-03 19:38:17 +0000158 VENDOR_EXTENSION_GET_AND_RETURN(AutomaticGainControlV1, automaticGainControlV1, param);
Shunkai Yao61ce9572023-02-28 23:55:33 +0000159 }
160 }
161}
162
163} // namespace effect
164} // namespace android