blob: ff521aace0c220526f44f745da3566ab1cbdb85b [file] [log] [blame]
Shunkai Yao284bb0d2023-01-10 00:42:36 +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>
Shunkai Yao44bdbad2023-01-14 05:11:58 +000019#include <optional>
Shunkai Yao284bb0d2023-01-10 00:42:36 +000020#define LOG_TAG "EffectConversionHelperAidl"
21//#define LOG_NDEBUG 0
22
23#include <error/expected_utils.h>
Shunkai Yaoa03533e2023-01-25 06:38:10 +000024#include <media/AidlConversionNdk.h>
25#include <media/AidlConversionEffect.h>
Shunkai Yao284bb0d2023-01-10 00:42:36 +000026#include <media/audiohal/AudioEffectUuid.h>
Shunkai Yao44bdbad2023-01-14 05:11:58 +000027#include <system/audio_effects/effect_aec.h>
28#include <system/audio_effects/effect_agc2.h>
29#include <system/audio_effects/effect_bassboost.h>
30#include <system/audio_effects/effect_downmix.h>
31#include <system/audio_effects/effect_dynamicsprocessing.h>
32#include <system/audio_effects/effect_environmentalreverb.h>
33#include <system/audio_effects/effect_equalizer.h>
34#include <system/audio_effects/effect_hapticgenerator.h>
35#include <system/audio_effects/effect_loudnessenhancer.h>
36#include <system/audio_effects/effect_ns.h>
37#include <system/audio_effects/effect_presetreverb.h>
38#include <system/audio_effects/effect_spatializer.h>
39#include <system/audio_effects/effect_virtualizer.h>
40#include <system/audio_effects/effect_visualizer.h>
41
Shunkai Yao284bb0d2023-01-10 00:42:36 +000042#include <utils/Log.h>
43
44#include "EffectConversionHelperAidl.h"
45
46namespace android {
47namespace effect {
48
49using ::aidl::android::aidl_utils::statusTFromBinderStatus;
50using ::aidl::android::hardware::audio::effect::AcousticEchoCanceler;
Shunkai Yao44bdbad2023-01-14 05:11:58 +000051using ::aidl::android::hardware::audio::effect::AutomaticGainControl;
52using ::aidl::android::hardware::audio::effect::BassBoost;
Shunkai Yao284bb0d2023-01-10 00:42:36 +000053using ::aidl::android::hardware::audio::effect::CommandId;
Shunkai Yao44bdbad2023-01-14 05:11:58 +000054using ::aidl::android::hardware::audio::effect::Descriptor;
55using ::aidl::android::hardware::audio::effect::Downmix;
Shunkai Yao284bb0d2023-01-10 00:42:36 +000056using ::aidl::android::hardware::audio::effect::Parameter;
57using ::aidl::android::media::audio::common::AudioDeviceDescription;
58using ::aidl::android::media::audio::common::AudioUuid;
Shunkai Yao44bdbad2023-01-14 05:11:58 +000059using android::effect::utils::EffectParamReader;
60using android::effect::utils::EffectParamWriter;
Shunkai Yao284bb0d2023-01-10 00:42:36 +000061
62using ::android::status_t;
63
64const std::map<uint32_t /* effect_command_e */, EffectConversionHelperAidl::CommandHandler>
65 EffectConversionHelperAidl::mCommandHandlerMap = {
66 {EFFECT_CMD_INIT, &EffectConversionHelperAidl::handleInit},
67 {EFFECT_CMD_SET_PARAM, &EffectConversionHelperAidl::handleSetParameter},
68 {EFFECT_CMD_GET_PARAM, &EffectConversionHelperAidl::handleGetParameter},
69 {EFFECT_CMD_SET_CONFIG, &EffectConversionHelperAidl::handleSetConfig},
70 {EFFECT_CMD_GET_CONFIG, &EffectConversionHelperAidl::handleGetConfig},
71 {EFFECT_CMD_RESET, &EffectConversionHelperAidl::handleReset},
72 {EFFECT_CMD_ENABLE, &EffectConversionHelperAidl::handleEnable},
73 {EFFECT_CMD_DISABLE, &EffectConversionHelperAidl::handleDisable},
74 {EFFECT_CMD_SET_DEVICE, &EffectConversionHelperAidl::handleSetDevice},
75 {EFFECT_CMD_SET_INPUT_DEVICE, &EffectConversionHelperAidl::handleSetDevice},
76 {EFFECT_CMD_SET_VOLUME, &EffectConversionHelperAidl::handleSetVolume},
77 {EFFECT_CMD_OFFLOAD, &EffectConversionHelperAidl::handleSetOffload},
78 {EFFECT_CMD_FIRST_PROPRIETARY, &EffectConversionHelperAidl::handleFirstPriority}};
79
80const std::map<AudioUuid /* TypeUUID */, std::pair<EffectConversionHelperAidl::SetParameter,
81 EffectConversionHelperAidl::GetParameter>>
82 EffectConversionHelperAidl::mParameterHandlerMap = {
83 {kAcousticEchoCancelerTypeUUID,
84 {&EffectConversionHelperAidl::setAecParameter,
Shunkai Yao44bdbad2023-01-14 05:11:58 +000085 &EffectConversionHelperAidl::getAecParameter}},
86 {kAutomaticGainControlTypeUUID,
87 {&EffectConversionHelperAidl::setAgcParameter,
88 &EffectConversionHelperAidl::getAgcParameter}},
89 {kBassBoostTypeUUID,
90 {&EffectConversionHelperAidl::setBassBoostParameter,
91 &EffectConversionHelperAidl::getBassBoostParameter}},
92 {kDownmixTypeUUID,
93 {&EffectConversionHelperAidl::setDownmixParameter,
94 &EffectConversionHelperAidl::getDownmixParameter}}};
Shunkai Yao284bb0d2023-01-10 00:42:36 +000095
Shunkai Yao44bdbad2023-01-14 05:11:58 +000096EffectConversionHelperAidl::EffectConversionHelperAidl(
97 std::shared_ptr<::aidl::android::hardware::audio::effect::IEffect> effect,
98 int32_t sessionId, int32_t ioId,
99 const ::aidl::android::hardware::audio::effect::Descriptor& desc)
100 : mSessionId(sessionId), mIoId(ioId), mDesc(desc), mEffect(std::move(effect)) {
101 mCommon.session = sessionId;
102 mCommon.ioHandle = ioId;
103 mCommon.input = mCommon.output = kDefaultAudioConfig;
104}
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000105
106status_t EffectConversionHelperAidl::handleCommand(uint32_t cmdCode, uint32_t cmdSize,
107 void* pCmdData, uint32_t* replySize,
108 void* pReplyData) {
109 const auto& handler = mCommandHandlerMap.find(cmdCode);
110 if (handler == mCommandHandlerMap.end() || !handler->second) {
111 ALOGE("%s handler for command %u doesn't exist", __func__, cmdCode);
112 return BAD_VALUE;
113 }
114 return (this->*handler->second)(cmdSize, pCmdData, replySize, pReplyData);
115}
116
117status_t EffectConversionHelperAidl::handleInit(uint32_t cmdSize __unused,
118 const void* pCmdData __unused, uint32_t* replySize,
119 void* pReplyData) {
120 if (!replySize || *replySize < sizeof(int) || !pReplyData) {
121 return BAD_VALUE;
122 }
123
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000124 return *(status_t*)pReplyData =
125 statusTFromBinderStatus(mEffect->open(mCommon, std::nullopt, &mOpenReturn));
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000126}
127
128status_t EffectConversionHelperAidl::handleSetParameter(uint32_t cmdSize, const void* pCmdData,
129 uint32_t* replySize, void* pReplyData) {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000130 if (cmdSize < sizeof(effect_param_t) || !pCmdData || !replySize ||
131 *replySize < sizeof(int) || !pReplyData) {
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000132 return BAD_VALUE;
133 }
134
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000135 auto reader = EffectParamReader(*(effect_param_t*)pCmdData);
136 if (!reader.validateCmdSize(cmdSize)) {
137 ALOGE("%s illegal param %s size %u", __func__, reader.toString().c_str(), cmdSize);
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000138 return BAD_VALUE;
139 }
140
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000141 const auto& handler = mParameterHandlerMap.find(mDesc.common.id.type);
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000142 if (handler == mParameterHandlerMap.end() || !handler->second.first) {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000143 ALOGE("%s handler for uuid %s not found", __func__,
144 mDesc.common.id.type.toString().c_str());
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000145 return BAD_VALUE;
146 }
147 const SetParameter& functor = handler->second.first;
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000148 return *(status_t*)pReplyData = (this->*functor)(reader);
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000149}
150
151status_t EffectConversionHelperAidl::handleGetParameter(uint32_t cmdSize, const void* pCmdData,
152 uint32_t* replySize, void* pReplyData) {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000153 if (cmdSize < sizeof(effect_param_t) || !pCmdData || !replySize || !pReplyData) {
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000154 return BAD_VALUE;
155 }
156
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000157 const auto reader = EffectParamReader(*(effect_param_t*)pCmdData);
158 if (!reader.validateCmdSize(cmdSize)) {
159 ALOGE("%s illegal param %s, replysize %u", __func__, reader.toString().c_str(),
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000160 *replySize);
161 return BAD_VALUE;
162 }
163
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000164 const auto& handler = mParameterHandlerMap.find(mDesc.common.id.type);
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000165 if (handler == mParameterHandlerMap.end() || !handler->second.second) {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000166 ALOGE("%s handler for uuid %s not found", __func__,
167 mDesc.common.id.type.toString().c_str());
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000168 return BAD_VALUE;
169 }
170 const GetParameter& functor = handler->second.second;
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000171 memcpy(pReplyData, pCmdData, sizeof(effect_param_t) + reader.getParameterSize());
172 auto writer = EffectParamWriter(*(effect_param_t *)pReplyData);
173 (this->*functor)(writer);
174 *replySize = writer.getTotalSize();
175 return writer.getStatus();
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000176}
177
178status_t EffectConversionHelperAidl::handleSetConfig(uint32_t cmdSize, const void* pCmdData,
179 uint32_t* replySize, void* pReplyData) {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000180 if (!replySize || *replySize != sizeof(int) || !pReplyData ||
181 cmdSize != sizeof(effect_config_t)) {
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000182 return BAD_VALUE;
183 }
184
185 const auto& legacyConfig = static_cast<const effect_config_t*>(pCmdData);
186 // already open, apply latest settings
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000187 mCommon.input.base =
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000188 VALUE_OR_RETURN_STATUS(::aidl::android::legacy2aidl_buffer_config_t_AudioConfigBase(
189 legacyConfig->inputCfg, true /* isInput */));
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000190 mCommon.output.base =
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000191 VALUE_OR_RETURN_STATUS(::aidl::android::legacy2aidl_buffer_config_t_AudioConfigBase(
192 legacyConfig->outputCfg, false /* isInput */));
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000193 mCommon.session = mSessionId;
194 mCommon.ioHandle = mIoId;
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000195 // TODO: add access mode support
196 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000197 mEffect->setParameter(Parameter::make<Parameter::common>(mCommon))));
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000198 return *static_cast<int32_t*>(pReplyData) = OK;
199}
200
201status_t EffectConversionHelperAidl::handleGetConfig(uint32_t cmdSize __unused,
202 const void* pCmdData __unused,
203 uint32_t* replySize, void* pReplyData) {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000204 if (!replySize || *replySize != sizeof(effect_config_t) || !pReplyData) {
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000205 ALOGE("%s parameter invalid %p %p", __func__, replySize, pReplyData);
206 return BAD_VALUE;
207 }
208
209 Parameter param;
210 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(
211 Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common), &param)));
212
213 const auto& common = param.get<Parameter::common>();
214 effect_config_t* pConfig = (effect_config_t*)pReplyData;
215 pConfig->inputCfg = VALUE_OR_RETURN_STATUS(
216 ::aidl::android::aidl2legacy_AudioConfigBase_buffer_config_t(common.input.base, true));
217 pConfig->outputCfg =
218 VALUE_OR_RETURN_STATUS(::aidl::android::aidl2legacy_AudioConfigBase_buffer_config_t(
219 common.output.base, false));
220 return OK;
221}
222
223status_t EffectConversionHelperAidl::handleReset(uint32_t cmdSize __unused,
224 const void* pCmdData __unused, uint32_t* replySize,
225 void* pReplyData) {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000226 if (!replySize || *replySize != sizeof(effect_config_t) || !pReplyData) {
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000227 ALOGE("%s parameter invalid %p %p", __func__, replySize, pReplyData);
228 return BAD_VALUE;
229 }
230
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000231 return statusTFromBinderStatus(mEffect->command(CommandId::RESET));
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000232}
233
234status_t EffectConversionHelperAidl::handleEnable(uint32_t cmdSize __unused,
235 const void* pCmdData __unused, uint32_t* replySize,
236 void* pReplyData) {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000237 if (!replySize || *replySize != sizeof(effect_config_t) || !pReplyData) {
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000238 ALOGE("%s parameter invalid %p %p", __func__, replySize, pReplyData);
239 return BAD_VALUE;
240 }
241
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000242 return statusTFromBinderStatus(mEffect->command(CommandId::START));
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000243}
244
245status_t EffectConversionHelperAidl::handleDisable(uint32_t cmdSize __unused,
246 const void* pCmdData __unused,
247 uint32_t* replySize, void* pReplyData) {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000248 if (!replySize || *replySize != sizeof(effect_config_t) || !pReplyData) {
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000249 ALOGE("%s parameter invalid %p %p", __func__, replySize, pReplyData);
250 return BAD_VALUE;
251 }
252
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000253 return statusTFromBinderStatus(mEffect->command(CommandId::STOP));
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000254}
255
256status_t EffectConversionHelperAidl::handleSetDevice(uint32_t cmdSize, const void* pCmdData,
257 uint32_t* replySize, void* pReplyData) {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000258 if (cmdSize != sizeof(uint32_t) || !pCmdData || !replySize ||
259 *replySize != sizeof(effect_config_t) || !pReplyData) {
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000260 ALOGE("%s parameter invalid %u %p %p %p", __func__, cmdSize, pCmdData, replySize,
261 pReplyData);
262 return BAD_VALUE;
263 }
264 // TODO: convert from audio_devices_t to std::vector<AudioDeviceDescription>
265 // const auto& legacyDevice = *(uint32_t*)(pCmdData);
266 std::vector<AudioDeviceDescription> aidlDevices;
267 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
268 mEffect->setParameter(Parameter::make<Parameter::deviceDescription>(aidlDevices))));
269 return *static_cast<int32_t*>(pReplyData) = OK;
270}
271
272status_t EffectConversionHelperAidl::handleSetVolume(uint32_t cmdSize, const void* pCmdData,
273 uint32_t* replySize, void* pReplyData) {
274 if (cmdSize != 2 * sizeof(uint32_t) || !pCmdData || !replySize ||
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000275 *replySize != sizeof(effect_config_t) || !pReplyData) {
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000276 ALOGE("%s parameter invalid %u %p %p %p", __func__, cmdSize, pCmdData, replySize,
277 pReplyData);
278 return BAD_VALUE;
279 }
280 Parameter::VolumeStereo volume = {.left = (float)(*(uint32_t*)pCmdData) / (1 << 24),
281 .right = (float)(*(uint32_t*)pCmdData + 1) / (1 << 24)};
282 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
283 mEffect->setParameter(Parameter::make<Parameter::volumeStereo>(volume))));
284 return *static_cast<int32_t*>(pReplyData) = OK;
285}
286
287status_t EffectConversionHelperAidl::handleSetOffload(uint32_t cmdSize, const void* pCmdData,
288 uint32_t* replySize, void* pReplyData) {
289 if (cmdSize < sizeof(effect_offload_param_t) || !pCmdData || !replySize ||
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000290 *replySize != sizeof(effect_config_t) || !pReplyData) {
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000291 ALOGE("%s parameter invalid %u %p %p %p", __func__, cmdSize, pCmdData, replySize,
292 pReplyData);
293 return BAD_VALUE;
294 }
295 // TODO: handle this after effectproxy implemented in libaudiohal
296 return *static_cast<int32_t*>(pReplyData) = OK;
297}
298
299status_t EffectConversionHelperAidl::handleFirstPriority(uint32_t cmdSize __unused,
300 const void* pCmdData __unused,
301 uint32_t* replySize, void* pReplyData) {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000302 if (!replySize || *replySize != sizeof(effect_config_t) || !pReplyData) {
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000303 ALOGE("%s parameter invalid %p %p", __func__, replySize, pReplyData);
304 return BAD_VALUE;
305 }
306
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000307 // TODO to be implemented
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000308 return OK;
309}
310
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000311status_t EffectConversionHelperAidl::setAecParameter(EffectParamReader& param) {
312 uint32_t type, value = 0;
313 if (!param.validateParamValueSize(sizeof(uint32_t), sizeof(uint32_t)) ||
314 OK != param.readFromParameter(&type) ||
315 OK != param.readFromValue(&value)) {
316 ALOGW("%s invalid param %s", __func__, param.toString().c_str());
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000317 return BAD_VALUE;
318 }
319
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000320 Parameter aidlParam;
321 switch (type) {
322 case AEC_PARAM_ECHO_DELAY:
323 FALLTHROUGH_INTENDED;
324 case AEC_PARAM_PROPERTIES: {
325 aidlParam = VALUE_OR_RETURN_STATUS(
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000326 aidl::android::legacy2aidl_uint32_echoDelay_Parameter_aec(value));
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000327 break;
328 }
329 case AEC_PARAM_MOBILE_MODE: {
330 aidlParam = VALUE_OR_RETURN_STATUS(
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000331 aidl::android::legacy2aidl_uint32_mobileMode_Parameter_aec(value));
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000332 break;
333 }
334 default: {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000335 ALOGW("%s unknown param %s", __func__, param.toString().c_str());
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000336 return BAD_VALUE;
337 }
338 }
339
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000340 return statusTFromBinderStatus(mEffect->setParameter(aidlParam));
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000341}
342
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000343status_t EffectConversionHelperAidl::getAecParameter(EffectParamWriter& param) {
344 uint32_t type = 0, value = 0;
345 if (!param.validateParamValueSize(sizeof(uint32_t), sizeof(uint32_t)) ||
346 OK != param.readFromParameter(&type) || OK != param.readFromValue(&value)) {
347 param.setStatus(BAD_VALUE);
348 ALOGW("%s invalid param %s", __func__, param.toString().c_str());
349 return BAD_VALUE;
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000350 }
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000351 Parameter aidlParam;
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000352 switch (type) {
353 case AEC_PARAM_ECHO_DELAY:
354 FALLTHROUGH_INTENDED;
355 case AEC_PARAM_PROPERTIES: {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000356 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(AcousticEchoCanceler,
357 acousticEchoCancelerTag, echoDelayUs);
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000358 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
359 value = VALUE_OR_RETURN_STATUS(
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000360 aidl::android::aidl2legacy_Parameter_aec_uint32_echoDelay(aidlParam));
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000361 break;
362 }
363 case AEC_PARAM_MOBILE_MODE: {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000364 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(AcousticEchoCanceler,
365 acousticEchoCancelerTag, mobileMode);
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000366 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
367 value = VALUE_OR_RETURN_STATUS(
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000368 aidl::android::aidl2legacy_Parameter_aec_uint32_mobileMode(aidlParam));
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000369 break;
370 }
371 default:
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000372 ALOGW("%s unknown param %s", __func__, param.toString().c_str());
373 return BAD_VALUE;
374 }
375 param.writeToValue(&value);
376 return OK;
377}
378
379status_t EffectConversionHelperAidl::setAgcParameter(EffectParamReader& param) {
380 uint32_t type = 0, value = 0;
381 if (!param.validateParamValueSize(sizeof(uint32_t), sizeof(uint32_t)) ||
382 OK != param.readFromParameter(&type) || OK != param.readFromValue(&value)) {
383 ALOGW("%s invalid param %s", __func__, param.toString().c_str());
384 return BAD_VALUE;
385 }
386 Parameter aidlParam;
387 switch (type) {
388 case AGC2_PARAM_FIXED_DIGITAL_GAIN: {
389 aidlParam = VALUE_OR_RETURN_STATUS(
390 aidl::android::legacy2aidl_uint32_fixedDigitalGain_Parameter_agc(value));
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000391 break;
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000392 }
393 case AGC2_PARAM_ADAPT_DIGI_LEVEL_ESTIMATOR: {
394 aidlParam = VALUE_OR_RETURN_STATUS(
395 aidl::android::legacy2aidl_uint32_levelEstimator_Parameter_agc(value));
396 break;
397 }
398 case AGC2_PARAM_ADAPT_DIGI_EXTRA_SATURATION_MARGIN: {
399 aidlParam = VALUE_OR_RETURN_STATUS(
400 aidl::android::legacy2aidl_uint32_saturationMargin_Parameter_agc(value));
401 break;
402 }
403 default: {
404 ALOGW("%s unknown param %s", __func__, param.toString().c_str());
405 return BAD_VALUE;
406 }
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000407 }
408
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000409 return statusTFromBinderStatus(mEffect->setParameter(aidlParam));
410}
411
412status_t EffectConversionHelperAidl::getAgcParameter(EffectParamWriter& param) {
413 uint32_t type = 0, value = 0;
414 if (!param.validateParamValueSize(sizeof(uint32_t), sizeof(uint32_t)) ||
415 OK != param.readFromParameter(&type) || OK != param.readFromValue(&value)) {
416 ALOGW("%s invalid param %s", __func__, param.toString().c_str());
417 return BAD_VALUE;
418 }
419 Parameter aidlParam;
420 switch (type) {
421 case AGC2_PARAM_FIXED_DIGITAL_GAIN: {
422 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(
423 AutomaticGainControl, automaticGainControlTag, fixedDigitalGainMb);
424 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
425 value = VALUE_OR_RETURN_STATUS(
426 aidl::android::aidl2legacy_Parameter_agc_uint32_fixedDigitalGain(aidlParam));
427 break;
428 }
429 case AGC2_PARAM_ADAPT_DIGI_LEVEL_ESTIMATOR: {
430 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(AutomaticGainControl,
431 automaticGainControlTag, levelEstimator);
432 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
433 value = VALUE_OR_RETURN_STATUS(
434 aidl::android::aidl2legacy_Parameter_agc_uint32_levelEstimator(aidlParam));
435 break;
436 }
437 case AGC2_PARAM_ADAPT_DIGI_EXTRA_SATURATION_MARGIN: {
438 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(
439 AutomaticGainControl, automaticGainControlTag, saturationMarginMb);
440 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
441 value = VALUE_OR_RETURN_STATUS(
442 aidl::android::aidl2legacy_Parameter_agc_uint32_saturationMargin(aidlParam));
443 break;
444 }
445 default: {
446 ALOGW("%s unknown param %s", __func__, param.toString().c_str());
447 return BAD_VALUE;
448 }
449 }
450
451 param.writeToValue(&value);
452 return OK;
453}
454
455status_t EffectConversionHelperAidl::setBassBoostParameter(EffectParamReader& param) {
456 uint32_t type = 0;
457 uint16_t value = 0;
458 if (!param.validateParamValueSize(sizeof(uint32_t), sizeof(uint16_t)) ||
459 OK != param.readFromParameter(&type) || OK != param.readFromValue(&value)) {
460 ALOGW("%s invalid param %s", __func__, param.toString().c_str());
461 return BAD_VALUE;
462 }
463 Parameter aidlParam;
464 switch (type) {
465 case BASSBOOST_PARAM_STRENGTH: {
466 aidlParam = VALUE_OR_RETURN_STATUS(
467 aidl::android::legacy2aidl_uint16_strengthPm_Parameter_BassBoost(value));
468 break;
469 }
470 case BASSBOOST_PARAM_STRENGTH_SUPPORTED: {
471 ALOGW("%s set BASSBOOST_PARAM_STRENGTH_SUPPORTED not supported", __func__);
472 return BAD_VALUE;
473 }
474 default: {
475 ALOGW("%s unknown param %s", __func__, param.toString().c_str());
476 return BAD_VALUE;
477 }
478 }
479
480 return statusTFromBinderStatus(mEffect->setParameter(aidlParam));
481}
482
483status_t EffectConversionHelperAidl::getBassBoostParameter(EffectParamWriter& param) {
484 uint32_t type = 0, value = 0;
485 if (!param.validateParamValueSize(sizeof(uint32_t), sizeof(uint32_t)) ||
486 OK != param.readFromParameter(&type) || OK != param.readFromValue(&value)) {
487 ALOGW("%s invalid param %s", __func__, param.toString().c_str());
488 param.setStatus(BAD_VALUE);
489 return BAD_VALUE;
490 }
491 Parameter aidlParam;
492 switch (type) {
493 case BASSBOOST_PARAM_STRENGTH: {
494 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(BassBoost, bassBoostTag, strengthPm);
495 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
496 value = VALUE_OR_RETURN_STATUS(
497 aidl::android::aidl2legacy_Parameter_BassBoost_uint16_strengthPm(aidlParam));
498 break;
499 }
500 case BASSBOOST_PARAM_STRENGTH_SUPPORTED: {
501 const auto& cap =
502 VALUE_OR_RETURN_STATUS(aidl::android::UNION_GET(mDesc.capability, bassBoost));
503 value = VALUE_OR_RETURN_STATUS(
504 aidl::android::convertIntegral<uint32_t>(cap.strengthSupported));
505 break;
506 }
507 default: {
508 ALOGW("%s unknown param %s", __func__, param.toString().c_str());
509 return BAD_VALUE;
510 }
511 }
512
513 param.writeToValue(&value);
514 return OK;
515}
516
517status_t EffectConversionHelperAidl::setDownmixParameter(EffectParamReader& param) {
518 uint32_t type = 0;
519 int16_t value = 0;
520 if (!param.validateParamValueSize(sizeof(uint32_t), sizeof(int16_t)) ||
521 OK != param.readFromParameter(&type) || OK != param.readFromValue(&value)) {
522 ALOGW("%s invalid param %s", __func__, param.toString().c_str());
523 return BAD_VALUE;
524 }
525 Parameter aidlParam;
526 switch (type) {
527 case DOWNMIX_PARAM_TYPE: {
528 aidlParam = VALUE_OR_RETURN_STATUS(
529 aidl::android::legacy2aidl_int16_type_Parameter_Downmix(value));
530 break;
531 }
532 default: {
533 ALOGW("%s unknown param %s", __func__, param.toString().c_str());
534 return BAD_VALUE;
535 }
536 }
537
538 return statusTFromBinderStatus(mEffect->setParameter(aidlParam));
539}
540
541status_t EffectConversionHelperAidl::getDownmixParameter(EffectParamWriter& param) {
542 int16_t value = 0;
543 uint32_t type = 0;
544 if (!param.validateParamValueSize(sizeof(uint32_t), sizeof(uint16_t)) ||
545 OK != param.readFromParameter(&type) || OK != param.readFromValue(&value)) {
546 param.setStatus(BAD_VALUE);
547 return BAD_VALUE;
548 }
549 Parameter aidlParam;
550 switch (type) {
551 case DOWNMIX_PARAM_TYPE: {
552 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(Downmix, downmixTag, type);
553 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
554 value = VALUE_OR_RETURN_STATUS(
555 aidl::android::aidl2legacy_Parameter_Downmix_int16_type(aidlParam));
556 break;
557 }
558 default: {
559 ALOGW("%s unknown param %s", __func__, param.toString().c_str());
560 return BAD_VALUE;
561 }
562 }
563
564 param.writeToValue(&value);
565 return OK;
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000566}
567
568} // namespace effect
569} // namespace android