blob: ec8abd7d981797c2ba47c2107fc96b356ee34710 [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>
24#include <media/audiohal/AudioEffectUuid.h>
Shunkai Yao44bdbad2023-01-14 05:11:58 +000025#include <system/audio_effects/effect_aec.h>
26#include <system/audio_effects/effect_agc2.h>
27#include <system/audio_effects/effect_bassboost.h>
28#include <system/audio_effects/effect_downmix.h>
29#include <system/audio_effects/effect_dynamicsprocessing.h>
30#include <system/audio_effects/effect_environmentalreverb.h>
31#include <system/audio_effects/effect_equalizer.h>
32#include <system/audio_effects/effect_hapticgenerator.h>
33#include <system/audio_effects/effect_loudnessenhancer.h>
34#include <system/audio_effects/effect_ns.h>
35#include <system/audio_effects/effect_presetreverb.h>
36#include <system/audio_effects/effect_spatializer.h>
37#include <system/audio_effects/effect_virtualizer.h>
38#include <system/audio_effects/effect_visualizer.h>
39
Shunkai Yao284bb0d2023-01-10 00:42:36 +000040#include <utils/Log.h>
41
42#include "EffectConversionHelperAidl.h"
43
44namespace android {
45namespace effect {
46
47using ::aidl::android::aidl_utils::statusTFromBinderStatus;
48using ::aidl::android::hardware::audio::effect::AcousticEchoCanceler;
Shunkai Yao44bdbad2023-01-14 05:11:58 +000049using ::aidl::android::hardware::audio::effect::AutomaticGainControl;
50using ::aidl::android::hardware::audio::effect::BassBoost;
Shunkai Yao284bb0d2023-01-10 00:42:36 +000051using ::aidl::android::hardware::audio::effect::CommandId;
Shunkai Yao44bdbad2023-01-14 05:11:58 +000052using ::aidl::android::hardware::audio::effect::Descriptor;
53using ::aidl::android::hardware::audio::effect::Downmix;
Shunkai Yao284bb0d2023-01-10 00:42:36 +000054using ::aidl::android::hardware::audio::effect::Parameter;
55using ::aidl::android::media::audio::common::AudioDeviceDescription;
56using ::aidl::android::media::audio::common::AudioUuid;
Shunkai Yao44bdbad2023-01-14 05:11:58 +000057using android::effect::utils::EffectParamReader;
58using android::effect::utils::EffectParamWriter;
Shunkai Yao284bb0d2023-01-10 00:42:36 +000059
60using ::android::status_t;
61
62const std::map<uint32_t /* effect_command_e */, EffectConversionHelperAidl::CommandHandler>
63 EffectConversionHelperAidl::mCommandHandlerMap = {
64 {EFFECT_CMD_INIT, &EffectConversionHelperAidl::handleInit},
65 {EFFECT_CMD_SET_PARAM, &EffectConversionHelperAidl::handleSetParameter},
66 {EFFECT_CMD_GET_PARAM, &EffectConversionHelperAidl::handleGetParameter},
67 {EFFECT_CMD_SET_CONFIG, &EffectConversionHelperAidl::handleSetConfig},
68 {EFFECT_CMD_GET_CONFIG, &EffectConversionHelperAidl::handleGetConfig},
69 {EFFECT_CMD_RESET, &EffectConversionHelperAidl::handleReset},
70 {EFFECT_CMD_ENABLE, &EffectConversionHelperAidl::handleEnable},
71 {EFFECT_CMD_DISABLE, &EffectConversionHelperAidl::handleDisable},
72 {EFFECT_CMD_SET_DEVICE, &EffectConversionHelperAidl::handleSetDevice},
73 {EFFECT_CMD_SET_INPUT_DEVICE, &EffectConversionHelperAidl::handleSetDevice},
74 {EFFECT_CMD_SET_VOLUME, &EffectConversionHelperAidl::handleSetVolume},
75 {EFFECT_CMD_OFFLOAD, &EffectConversionHelperAidl::handleSetOffload},
76 {EFFECT_CMD_FIRST_PROPRIETARY, &EffectConversionHelperAidl::handleFirstPriority}};
77
78const std::map<AudioUuid /* TypeUUID */, std::pair<EffectConversionHelperAidl::SetParameter,
79 EffectConversionHelperAidl::GetParameter>>
80 EffectConversionHelperAidl::mParameterHandlerMap = {
81 {kAcousticEchoCancelerTypeUUID,
82 {&EffectConversionHelperAidl::setAecParameter,
Shunkai Yao44bdbad2023-01-14 05:11:58 +000083 &EffectConversionHelperAidl::getAecParameter}},
84 {kAutomaticGainControlTypeUUID,
85 {&EffectConversionHelperAidl::setAgcParameter,
86 &EffectConversionHelperAidl::getAgcParameter}},
87 {kBassBoostTypeUUID,
88 {&EffectConversionHelperAidl::setBassBoostParameter,
89 &EffectConversionHelperAidl::getBassBoostParameter}},
90 {kDownmixTypeUUID,
91 {&EffectConversionHelperAidl::setDownmixParameter,
92 &EffectConversionHelperAidl::getDownmixParameter}}};
Shunkai Yao284bb0d2023-01-10 00:42:36 +000093
Shunkai Yao44bdbad2023-01-14 05:11:58 +000094EffectConversionHelperAidl::EffectConversionHelperAidl(
95 std::shared_ptr<::aidl::android::hardware::audio::effect::IEffect> effect,
96 int32_t sessionId, int32_t ioId,
97 const ::aidl::android::hardware::audio::effect::Descriptor& desc)
98 : mSessionId(sessionId), mIoId(ioId), mDesc(desc), mEffect(std::move(effect)) {
99 mCommon.session = sessionId;
100 mCommon.ioHandle = ioId;
101 mCommon.input = mCommon.output = kDefaultAudioConfig;
102}
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000103
104status_t EffectConversionHelperAidl::handleCommand(uint32_t cmdCode, uint32_t cmdSize,
105 void* pCmdData, uint32_t* replySize,
106 void* pReplyData) {
107 const auto& handler = mCommandHandlerMap.find(cmdCode);
108 if (handler == mCommandHandlerMap.end() || !handler->second) {
109 ALOGE("%s handler for command %u doesn't exist", __func__, cmdCode);
110 return BAD_VALUE;
111 }
112 return (this->*handler->second)(cmdSize, pCmdData, replySize, pReplyData);
113}
114
115status_t EffectConversionHelperAidl::handleInit(uint32_t cmdSize __unused,
116 const void* pCmdData __unused, uint32_t* replySize,
117 void* pReplyData) {
118 if (!replySize || *replySize < sizeof(int) || !pReplyData) {
119 return BAD_VALUE;
120 }
121
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000122 return *(status_t*)pReplyData =
123 statusTFromBinderStatus(mEffect->open(mCommon, std::nullopt, &mOpenReturn));
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000124}
125
126status_t EffectConversionHelperAidl::handleSetParameter(uint32_t cmdSize, const void* pCmdData,
127 uint32_t* replySize, void* pReplyData) {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000128 if (cmdSize < sizeof(effect_param_t) || !pCmdData || !replySize ||
129 *replySize < sizeof(int) || !pReplyData) {
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000130 return BAD_VALUE;
131 }
132
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000133 auto reader = EffectParamReader(*(effect_param_t*)pCmdData);
134 if (!reader.validateCmdSize(cmdSize)) {
135 ALOGE("%s illegal param %s size %u", __func__, reader.toString().c_str(), cmdSize);
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000136 return BAD_VALUE;
137 }
138
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000139 const auto& handler = mParameterHandlerMap.find(mDesc.common.id.type);
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000140 if (handler == mParameterHandlerMap.end() || !handler->second.first) {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000141 ALOGE("%s handler for uuid %s not found", __func__,
142 mDesc.common.id.type.toString().c_str());
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000143 return BAD_VALUE;
144 }
145 const SetParameter& functor = handler->second.first;
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000146 return *(status_t*)pReplyData = (this->*functor)(reader);
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000147}
148
149status_t EffectConversionHelperAidl::handleGetParameter(uint32_t cmdSize, const void* pCmdData,
150 uint32_t* replySize, void* pReplyData) {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000151 if (cmdSize < sizeof(effect_param_t) || !pCmdData || !replySize || !pReplyData) {
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000152 return BAD_VALUE;
153 }
154
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000155 const auto reader = EffectParamReader(*(effect_param_t*)pCmdData);
156 if (!reader.validateCmdSize(cmdSize)) {
157 ALOGE("%s illegal param %s, replysize %u", __func__, reader.toString().c_str(),
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000158 *replySize);
159 return BAD_VALUE;
160 }
161
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000162 const auto& handler = mParameterHandlerMap.find(mDesc.common.id.type);
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000163 if (handler == mParameterHandlerMap.end() || !handler->second.second) {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000164 ALOGE("%s handler for uuid %s not found", __func__,
165 mDesc.common.id.type.toString().c_str());
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000166 return BAD_VALUE;
167 }
168 const GetParameter& functor = handler->second.second;
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000169 memcpy(pReplyData, pCmdData, sizeof(effect_param_t) + reader.getParameterSize());
170 auto writer = EffectParamWriter(*(effect_param_t *)pReplyData);
171 (this->*functor)(writer);
172 *replySize = writer.getTotalSize();
173 return writer.getStatus();
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000174}
175
176status_t EffectConversionHelperAidl::handleSetConfig(uint32_t cmdSize, const void* pCmdData,
177 uint32_t* replySize, void* pReplyData) {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000178 if (!replySize || *replySize != sizeof(int) || !pReplyData ||
179 cmdSize != sizeof(effect_config_t)) {
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000180 return BAD_VALUE;
181 }
182
183 const auto& legacyConfig = static_cast<const effect_config_t*>(pCmdData);
184 // already open, apply latest settings
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000185 mCommon.input.base =
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000186 VALUE_OR_RETURN_STATUS(::aidl::android::legacy2aidl_buffer_config_t_AudioConfigBase(
187 legacyConfig->inputCfg, true /* isInput */));
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000188 mCommon.output.base =
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000189 VALUE_OR_RETURN_STATUS(::aidl::android::legacy2aidl_buffer_config_t_AudioConfigBase(
190 legacyConfig->outputCfg, false /* isInput */));
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000191 mCommon.session = mSessionId;
192 mCommon.ioHandle = mIoId;
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000193 // TODO: add access mode support
194 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000195 mEffect->setParameter(Parameter::make<Parameter::common>(mCommon))));
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000196 return *static_cast<int32_t*>(pReplyData) = OK;
197}
198
199status_t EffectConversionHelperAidl::handleGetConfig(uint32_t cmdSize __unused,
200 const void* pCmdData __unused,
201 uint32_t* replySize, void* pReplyData) {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000202 if (!replySize || *replySize != sizeof(effect_config_t) || !pReplyData) {
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000203 ALOGE("%s parameter invalid %p %p", __func__, replySize, pReplyData);
204 return BAD_VALUE;
205 }
206
207 Parameter param;
208 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(
209 Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common), &param)));
210
211 const auto& common = param.get<Parameter::common>();
212 effect_config_t* pConfig = (effect_config_t*)pReplyData;
213 pConfig->inputCfg = VALUE_OR_RETURN_STATUS(
214 ::aidl::android::aidl2legacy_AudioConfigBase_buffer_config_t(common.input.base, true));
215 pConfig->outputCfg =
216 VALUE_OR_RETURN_STATUS(::aidl::android::aidl2legacy_AudioConfigBase_buffer_config_t(
217 common.output.base, false));
218 return OK;
219}
220
221status_t EffectConversionHelperAidl::handleReset(uint32_t cmdSize __unused,
222 const void* pCmdData __unused, uint32_t* replySize,
223 void* pReplyData) {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000224 if (!replySize || *replySize != sizeof(effect_config_t) || !pReplyData) {
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000225 ALOGE("%s parameter invalid %p %p", __func__, replySize, pReplyData);
226 return BAD_VALUE;
227 }
228
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000229 return statusTFromBinderStatus(mEffect->command(CommandId::RESET));
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000230}
231
232status_t EffectConversionHelperAidl::handleEnable(uint32_t cmdSize __unused,
233 const void* pCmdData __unused, uint32_t* replySize,
234 void* pReplyData) {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000235 if (!replySize || *replySize != sizeof(effect_config_t) || !pReplyData) {
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000236 ALOGE("%s parameter invalid %p %p", __func__, replySize, pReplyData);
237 return BAD_VALUE;
238 }
239
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000240 return statusTFromBinderStatus(mEffect->command(CommandId::START));
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000241}
242
243status_t EffectConversionHelperAidl::handleDisable(uint32_t cmdSize __unused,
244 const void* pCmdData __unused,
245 uint32_t* replySize, void* pReplyData) {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000246 if (!replySize || *replySize != sizeof(effect_config_t) || !pReplyData) {
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000247 ALOGE("%s parameter invalid %p %p", __func__, replySize, pReplyData);
248 return BAD_VALUE;
249 }
250
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000251 return statusTFromBinderStatus(mEffect->command(CommandId::STOP));
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000252}
253
254status_t EffectConversionHelperAidl::handleSetDevice(uint32_t cmdSize, const void* pCmdData,
255 uint32_t* replySize, void* pReplyData) {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000256 if (cmdSize != sizeof(uint32_t) || !pCmdData || !replySize ||
257 *replySize != sizeof(effect_config_t) || !pReplyData) {
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000258 ALOGE("%s parameter invalid %u %p %p %p", __func__, cmdSize, pCmdData, replySize,
259 pReplyData);
260 return BAD_VALUE;
261 }
262 // TODO: convert from audio_devices_t to std::vector<AudioDeviceDescription>
263 // const auto& legacyDevice = *(uint32_t*)(pCmdData);
264 std::vector<AudioDeviceDescription> aidlDevices;
265 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
266 mEffect->setParameter(Parameter::make<Parameter::deviceDescription>(aidlDevices))));
267 return *static_cast<int32_t*>(pReplyData) = OK;
268}
269
270status_t EffectConversionHelperAidl::handleSetVolume(uint32_t cmdSize, const void* pCmdData,
271 uint32_t* replySize, void* pReplyData) {
272 if (cmdSize != 2 * sizeof(uint32_t) || !pCmdData || !replySize ||
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000273 *replySize != sizeof(effect_config_t) || !pReplyData) {
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000274 ALOGE("%s parameter invalid %u %p %p %p", __func__, cmdSize, pCmdData, replySize,
275 pReplyData);
276 return BAD_VALUE;
277 }
278 Parameter::VolumeStereo volume = {.left = (float)(*(uint32_t*)pCmdData) / (1 << 24),
279 .right = (float)(*(uint32_t*)pCmdData + 1) / (1 << 24)};
280 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
281 mEffect->setParameter(Parameter::make<Parameter::volumeStereo>(volume))));
282 return *static_cast<int32_t*>(pReplyData) = OK;
283}
284
285status_t EffectConversionHelperAidl::handleSetOffload(uint32_t cmdSize, const void* pCmdData,
286 uint32_t* replySize, void* pReplyData) {
287 if (cmdSize < sizeof(effect_offload_param_t) || !pCmdData || !replySize ||
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000288 *replySize != sizeof(effect_config_t) || !pReplyData) {
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000289 ALOGE("%s parameter invalid %u %p %p %p", __func__, cmdSize, pCmdData, replySize,
290 pReplyData);
291 return BAD_VALUE;
292 }
293 // TODO: handle this after effectproxy implemented in libaudiohal
294 return *static_cast<int32_t*>(pReplyData) = OK;
295}
296
297status_t EffectConversionHelperAidl::handleFirstPriority(uint32_t cmdSize __unused,
298 const void* pCmdData __unused,
299 uint32_t* replySize, void* pReplyData) {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000300 if (!replySize || *replySize != sizeof(effect_config_t) || !pReplyData) {
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000301 ALOGE("%s parameter invalid %p %p", __func__, replySize, pReplyData);
302 return BAD_VALUE;
303 }
304
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000305 // TODO to be implemented
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000306 return OK;
307}
308
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000309status_t EffectConversionHelperAidl::setAecParameter(EffectParamReader& param) {
310 uint32_t type, value = 0;
311 if (!param.validateParamValueSize(sizeof(uint32_t), sizeof(uint32_t)) ||
312 OK != param.readFromParameter(&type) ||
313 OK != param.readFromValue(&value)) {
314 ALOGW("%s invalid param %s", __func__, param.toString().c_str());
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000315 return BAD_VALUE;
316 }
317
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000318 Parameter aidlParam;
319 switch (type) {
320 case AEC_PARAM_ECHO_DELAY:
321 FALLTHROUGH_INTENDED;
322 case AEC_PARAM_PROPERTIES: {
323 aidlParam = VALUE_OR_RETURN_STATUS(
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000324 aidl::android::legacy2aidl_uint32_echoDelay_Parameter_aec(value));
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000325 break;
326 }
327 case AEC_PARAM_MOBILE_MODE: {
328 aidlParam = VALUE_OR_RETURN_STATUS(
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000329 aidl::android::legacy2aidl_uint32_mobileMode_Parameter_aec(value));
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000330 break;
331 }
332 default: {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000333 ALOGW("%s unknown param %s", __func__, param.toString().c_str());
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000334 return BAD_VALUE;
335 }
336 }
337
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000338 return statusTFromBinderStatus(mEffect->setParameter(aidlParam));
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000339}
340
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000341status_t EffectConversionHelperAidl::getAecParameter(EffectParamWriter& param) {
342 uint32_t type = 0, value = 0;
343 if (!param.validateParamValueSize(sizeof(uint32_t), sizeof(uint32_t)) ||
344 OK != param.readFromParameter(&type) || OK != param.readFromValue(&value)) {
345 param.setStatus(BAD_VALUE);
346 ALOGW("%s invalid param %s", __func__, param.toString().c_str());
347 return BAD_VALUE;
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000348 }
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000349 Parameter aidlParam;
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000350 switch (type) {
351 case AEC_PARAM_ECHO_DELAY:
352 FALLTHROUGH_INTENDED;
353 case AEC_PARAM_PROPERTIES: {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000354 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(AcousticEchoCanceler,
355 acousticEchoCancelerTag, echoDelayUs);
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000356 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
357 value = VALUE_OR_RETURN_STATUS(
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000358 aidl::android::aidl2legacy_Parameter_aec_uint32_echoDelay(aidlParam));
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000359 break;
360 }
361 case AEC_PARAM_MOBILE_MODE: {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000362 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(AcousticEchoCanceler,
363 acousticEchoCancelerTag, mobileMode);
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000364 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
365 value = VALUE_OR_RETURN_STATUS(
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000366 aidl::android::aidl2legacy_Parameter_aec_uint32_mobileMode(aidlParam));
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000367 break;
368 }
369 default:
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000370 ALOGW("%s unknown param %s", __func__, param.toString().c_str());
371 return BAD_VALUE;
372 }
373 param.writeToValue(&value);
374 return OK;
375}
376
377status_t EffectConversionHelperAidl::setAgcParameter(EffectParamReader& param) {
378 uint32_t type = 0, value = 0;
379 if (!param.validateParamValueSize(sizeof(uint32_t), sizeof(uint32_t)) ||
380 OK != param.readFromParameter(&type) || OK != param.readFromValue(&value)) {
381 ALOGW("%s invalid param %s", __func__, param.toString().c_str());
382 return BAD_VALUE;
383 }
384 Parameter aidlParam;
385 switch (type) {
386 case AGC2_PARAM_FIXED_DIGITAL_GAIN: {
387 aidlParam = VALUE_OR_RETURN_STATUS(
388 aidl::android::legacy2aidl_uint32_fixedDigitalGain_Parameter_agc(value));
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000389 break;
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000390 }
391 case AGC2_PARAM_ADAPT_DIGI_LEVEL_ESTIMATOR: {
392 aidlParam = VALUE_OR_RETURN_STATUS(
393 aidl::android::legacy2aidl_uint32_levelEstimator_Parameter_agc(value));
394 break;
395 }
396 case AGC2_PARAM_ADAPT_DIGI_EXTRA_SATURATION_MARGIN: {
397 aidlParam = VALUE_OR_RETURN_STATUS(
398 aidl::android::legacy2aidl_uint32_saturationMargin_Parameter_agc(value));
399 break;
400 }
401 default: {
402 ALOGW("%s unknown param %s", __func__, param.toString().c_str());
403 return BAD_VALUE;
404 }
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000405 }
406
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000407 return statusTFromBinderStatus(mEffect->setParameter(aidlParam));
408}
409
410status_t EffectConversionHelperAidl::getAgcParameter(EffectParamWriter& param) {
411 uint32_t type = 0, value = 0;
412 if (!param.validateParamValueSize(sizeof(uint32_t), sizeof(uint32_t)) ||
413 OK != param.readFromParameter(&type) || OK != param.readFromValue(&value)) {
414 ALOGW("%s invalid param %s", __func__, param.toString().c_str());
415 return BAD_VALUE;
416 }
417 Parameter aidlParam;
418 switch (type) {
419 case AGC2_PARAM_FIXED_DIGITAL_GAIN: {
420 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(
421 AutomaticGainControl, automaticGainControlTag, fixedDigitalGainMb);
422 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
423 value = VALUE_OR_RETURN_STATUS(
424 aidl::android::aidl2legacy_Parameter_agc_uint32_fixedDigitalGain(aidlParam));
425 break;
426 }
427 case AGC2_PARAM_ADAPT_DIGI_LEVEL_ESTIMATOR: {
428 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(AutomaticGainControl,
429 automaticGainControlTag, levelEstimator);
430 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
431 value = VALUE_OR_RETURN_STATUS(
432 aidl::android::aidl2legacy_Parameter_agc_uint32_levelEstimator(aidlParam));
433 break;
434 }
435 case AGC2_PARAM_ADAPT_DIGI_EXTRA_SATURATION_MARGIN: {
436 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(
437 AutomaticGainControl, automaticGainControlTag, saturationMarginMb);
438 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
439 value = VALUE_OR_RETURN_STATUS(
440 aidl::android::aidl2legacy_Parameter_agc_uint32_saturationMargin(aidlParam));
441 break;
442 }
443 default: {
444 ALOGW("%s unknown param %s", __func__, param.toString().c_str());
445 return BAD_VALUE;
446 }
447 }
448
449 param.writeToValue(&value);
450 return OK;
451}
452
453status_t EffectConversionHelperAidl::setBassBoostParameter(EffectParamReader& param) {
454 uint32_t type = 0;
455 uint16_t value = 0;
456 if (!param.validateParamValueSize(sizeof(uint32_t), sizeof(uint16_t)) ||
457 OK != param.readFromParameter(&type) || OK != param.readFromValue(&value)) {
458 ALOGW("%s invalid param %s", __func__, param.toString().c_str());
459 return BAD_VALUE;
460 }
461 Parameter aidlParam;
462 switch (type) {
463 case BASSBOOST_PARAM_STRENGTH: {
464 aidlParam = VALUE_OR_RETURN_STATUS(
465 aidl::android::legacy2aidl_uint16_strengthPm_Parameter_BassBoost(value));
466 break;
467 }
468 case BASSBOOST_PARAM_STRENGTH_SUPPORTED: {
469 ALOGW("%s set BASSBOOST_PARAM_STRENGTH_SUPPORTED not supported", __func__);
470 return BAD_VALUE;
471 }
472 default: {
473 ALOGW("%s unknown param %s", __func__, param.toString().c_str());
474 return BAD_VALUE;
475 }
476 }
477
478 return statusTFromBinderStatus(mEffect->setParameter(aidlParam));
479}
480
481status_t EffectConversionHelperAidl::getBassBoostParameter(EffectParamWriter& param) {
482 uint32_t type = 0, value = 0;
483 if (!param.validateParamValueSize(sizeof(uint32_t), sizeof(uint32_t)) ||
484 OK != param.readFromParameter(&type) || OK != param.readFromValue(&value)) {
485 ALOGW("%s invalid param %s", __func__, param.toString().c_str());
486 param.setStatus(BAD_VALUE);
487 return BAD_VALUE;
488 }
489 Parameter aidlParam;
490 switch (type) {
491 case BASSBOOST_PARAM_STRENGTH: {
492 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(BassBoost, bassBoostTag, strengthPm);
493 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
494 value = VALUE_OR_RETURN_STATUS(
495 aidl::android::aidl2legacy_Parameter_BassBoost_uint16_strengthPm(aidlParam));
496 break;
497 }
498 case BASSBOOST_PARAM_STRENGTH_SUPPORTED: {
499 const auto& cap =
500 VALUE_OR_RETURN_STATUS(aidl::android::UNION_GET(mDesc.capability, bassBoost));
501 value = VALUE_OR_RETURN_STATUS(
502 aidl::android::convertIntegral<uint32_t>(cap.strengthSupported));
503 break;
504 }
505 default: {
506 ALOGW("%s unknown param %s", __func__, param.toString().c_str());
507 return BAD_VALUE;
508 }
509 }
510
511 param.writeToValue(&value);
512 return OK;
513}
514
515status_t EffectConversionHelperAidl::setDownmixParameter(EffectParamReader& param) {
516 uint32_t type = 0;
517 int16_t value = 0;
518 if (!param.validateParamValueSize(sizeof(uint32_t), sizeof(int16_t)) ||
519 OK != param.readFromParameter(&type) || OK != param.readFromValue(&value)) {
520 ALOGW("%s invalid param %s", __func__, param.toString().c_str());
521 return BAD_VALUE;
522 }
523 Parameter aidlParam;
524 switch (type) {
525 case DOWNMIX_PARAM_TYPE: {
526 aidlParam = VALUE_OR_RETURN_STATUS(
527 aidl::android::legacy2aidl_int16_type_Parameter_Downmix(value));
528 break;
529 }
530 default: {
531 ALOGW("%s unknown param %s", __func__, param.toString().c_str());
532 return BAD_VALUE;
533 }
534 }
535
536 return statusTFromBinderStatus(mEffect->setParameter(aidlParam));
537}
538
539status_t EffectConversionHelperAidl::getDownmixParameter(EffectParamWriter& param) {
540 int16_t value = 0;
541 uint32_t type = 0;
542 if (!param.validateParamValueSize(sizeof(uint32_t), sizeof(uint16_t)) ||
543 OK != param.readFromParameter(&type) || OK != param.readFromValue(&value)) {
544 param.setStatus(BAD_VALUE);
545 return BAD_VALUE;
546 }
547 Parameter aidlParam;
548 switch (type) {
549 case DOWNMIX_PARAM_TYPE: {
550 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(Downmix, downmixTag, type);
551 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
552 value = VALUE_OR_RETURN_STATUS(
553 aidl::android::aidl2legacy_Parameter_Downmix_int16_type(aidlParam));
554 break;
555 }
556 default: {
557 ALOGW("%s unknown param %s", __func__, param.toString().c_str());
558 return BAD_VALUE;
559 }
560 }
561
562 param.writeToValue(&value);
563 return OK;
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000564}
565
566} // namespace effect
567} // namespace android