blob: fdc16e38d78b2faece0f1cf52fec0c4a5c8fb1a1 [file] [log] [blame]
Shunkai Yao725af212023-01-05 23:01:40 +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#define LOG_TAG "AHAL_DynamicsProcessingLibEffects"
18
19#include <android-base/logging.h>
Shunkai Yao399be682023-03-06 18:54:18 +000020#include <system/audio_effects/effect_uuid.h>
Shunkai Yao725af212023-01-05 23:01:40 +000021
22#include "DynamicsProcessing.h"
23
24#include <dsp/DPBase.h>
25#include <dsp/DPFrequency.h>
26
27using aidl::android::hardware::audio::effect::Descriptor;
28using aidl::android::hardware::audio::effect::DynamicsProcessingImpl;
Shunkai Yao399be682023-03-06 18:54:18 +000029using aidl::android::hardware::audio::effect::getEffectImplUuidDynamicsProcessing;
30using aidl::android::hardware::audio::effect::getEffectTypeUuidDynamicsProcessing;
Shunkai Yao725af212023-01-05 23:01:40 +000031using aidl::android::hardware::audio::effect::IEffect;
Shunkai Yao725af212023-01-05 23:01:40 +000032using aidl::android::hardware::audio::effect::State;
33using aidl::android::media::audio::common::AudioUuid;
34using aidl::android::media::audio::common::PcmType;
35
36extern "C" binder_exception_t createEffect(const AudioUuid* in_impl_uuid,
37 std::shared_ptr<IEffect>* instanceSpp) {
Shunkai Yao399be682023-03-06 18:54:18 +000038 if (!in_impl_uuid || *in_impl_uuid != getEffectImplUuidDynamicsProcessing()) {
Shunkai Yao725af212023-01-05 23:01:40 +000039 LOG(ERROR) << __func__ << "uuid not supported";
40 return EX_ILLEGAL_ARGUMENT;
41 }
42 if (instanceSpp) {
43 *instanceSpp = ndk::SharedRefBase::make<DynamicsProcessingImpl>();
Shunkai Yao725af212023-01-05 23:01:40 +000044 return EX_NONE;
45 } else {
46 LOG(ERROR) << __func__ << " invalid input parameter!";
47 return EX_ILLEGAL_ARGUMENT;
48 }
49}
50
51extern "C" binder_exception_t queryEffect(const AudioUuid* in_impl_uuid, Descriptor* _aidl_return) {
Shunkai Yao399be682023-03-06 18:54:18 +000052 if (!in_impl_uuid || *in_impl_uuid != getEffectImplUuidDynamicsProcessing()) {
Shunkai Yao725af212023-01-05 23:01:40 +000053 LOG(ERROR) << __func__ << "uuid not supported";
54 return EX_ILLEGAL_ARGUMENT;
55 }
56 *_aidl_return = DynamicsProcessingImpl::kDescriptor;
57 return EX_NONE;
58}
59
60namespace aidl::android::hardware::audio::effect {
61
62const std::string DynamicsProcessingImpl::kEffectName = "DynamicsProcessing";
Shunkai Yao6b857c92023-02-13 17:44:52 +000063
Ram Mohanc89817d2023-03-14 21:39:26 +053064static const Range::DynamicsProcessingRange kEngineConfigRange = {
65 .min = DynamicsProcessing::make<
66 DynamicsProcessing::engineArchitecture>(DynamicsProcessing::EngineArchitecture(
67 {.resolutionPreference =
68 DynamicsProcessing::ResolutionPreference::FAVOR_FREQUENCY_RESOLUTION,
Ram Mohanf045ba42023-04-11 11:51:20 +053069 .preferredProcessingDurationMs = 1.0f,
Ram Mohanc89817d2023-03-14 21:39:26 +053070 .preEqStage = {.inUse = false, .bandCount = 0},
71 .postEqStage = {.inUse = false, .bandCount = 0},
72 .mbcStage = {.inUse = false, .bandCount = 0},
73 .limiterInUse = false})),
74 .max = DynamicsProcessing::make<
75 DynamicsProcessing::engineArchitecture>(DynamicsProcessing::EngineArchitecture(
76 {.resolutionPreference =
Ram Mohanf045ba42023-04-11 11:51:20 +053077 DynamicsProcessing::ResolutionPreference::FAVOR_TIME_RESOLUTION,
78 .preferredProcessingDurationMs = 1000.0f,
79 .preEqStage = {.inUse = true, .bandCount = 128},
80 .postEqStage = {.inUse = true, .bandCount = 128},
81 .mbcStage = {.inUse = true, .bandCount = 128},
Ram Mohanc89817d2023-03-14 21:39:26 +053082 .limiterInUse = true}))};
83
84static const DynamicsProcessing::ChannelConfig kChannelConfigMin =
85 DynamicsProcessing::ChannelConfig({.channel = 0, .enable = false});
86
87static const DynamicsProcessing::ChannelConfig kChannelConfigMax =
88 DynamicsProcessing::ChannelConfig(
89 {.channel = std::numeric_limits<int>::max(), .enable = true});
90
91static const Range::DynamicsProcessingRange kPreEqChannelConfigRange = {
92 .min = DynamicsProcessing::make<DynamicsProcessing::preEq>({kChannelConfigMin}),
93 .max = DynamicsProcessing::make<DynamicsProcessing::preEq>({kChannelConfigMax})};
94
95static const Range::DynamicsProcessingRange kPostEqChannelConfigRange = {
96 .min = DynamicsProcessing::make<DynamicsProcessing::postEq>({kChannelConfigMin}),
97 .max = DynamicsProcessing::make<DynamicsProcessing::postEq>({kChannelConfigMax})};
98
99static const Range::DynamicsProcessingRange kMbcChannelConfigRange = {
100 .min = DynamicsProcessing::make<DynamicsProcessing::mbc>({kChannelConfigMin}),
101 .max = DynamicsProcessing::make<DynamicsProcessing::mbc>({kChannelConfigMax})};
102
103static const DynamicsProcessing::EqBandConfig kEqBandConfigMin =
Shunkai Yao6b857c92023-02-13 17:44:52 +0000104 DynamicsProcessing::EqBandConfig({.channel = 0,
105 .band = 0,
106 .enable = false,
David Licb5bcc42023-11-13 16:01:48 +0800107 .cutoffFrequencyHz = 0,
Ram Mohanf045ba42023-04-11 11:51:20 +0530108 .gainDb = -200});
Ram Mohanc89817d2023-03-14 21:39:26 +0530109
110static const DynamicsProcessing::EqBandConfig kEqBandConfigMax =
Shunkai Yao6b857c92023-02-13 17:44:52 +0000111 DynamicsProcessing::EqBandConfig({.channel = std::numeric_limits<int>::max(),
112 .band = std::numeric_limits<int>::max(),
113 .enable = true,
David Licb5bcc42023-11-13 16:01:48 +0800114 .cutoffFrequencyHz = 192000,
Ram Mohanf045ba42023-04-11 11:51:20 +0530115 .gainDb = 200});
Shunkai Yao6b857c92023-02-13 17:44:52 +0000116
Ram Mohanc89817d2023-03-14 21:39:26 +0530117static const Range::DynamicsProcessingRange kPreEqBandConfigRange = {
118 .min = DynamicsProcessing::make<DynamicsProcessing::preEqBand>({kEqBandConfigMin}),
119 .max = DynamicsProcessing::make<DynamicsProcessing::preEqBand>({kEqBandConfigMax})};
120
121static const Range::DynamicsProcessingRange kPostEqBandConfigRange = {
122 .min = DynamicsProcessing::make<DynamicsProcessing::postEqBand>({kEqBandConfigMin}),
123 .max = DynamicsProcessing::make<DynamicsProcessing::postEqBand>({kEqBandConfigMax})};
124
125static const Range::DynamicsProcessingRange kMbcBandConfigRange = {
126 .min = DynamicsProcessing::make<DynamicsProcessing::mbcBand>(
127 {DynamicsProcessing::MbcBandConfig(
128 {.channel = 0,
129 .band = 0,
130 .enable = false,
David Licb5bcc42023-11-13 16:01:48 +0800131 .cutoffFrequencyHz = 0,
Ram Mohanc89817d2023-03-14 21:39:26 +0530132 .attackTimeMs = 0,
133 .releaseTimeMs = 0,
Ram Mohanf045ba42023-04-11 11:51:20 +0530134 .ratio = 1,
135 .thresholdDb = -200,
Ram Mohanc89817d2023-03-14 21:39:26 +0530136 .kneeWidthDb = 0,
Ram Mohanf045ba42023-04-11 11:51:20 +0530137 .noiseGateThresholdDb = -200,
138 .expanderRatio = 1,
139 .preGainDb = -200,
140 .postGainDb = -200})}),
Ram Mohanc89817d2023-03-14 21:39:26 +0530141 .max = DynamicsProcessing::make<DynamicsProcessing::mbcBand>(
142 {DynamicsProcessing::MbcBandConfig(
143 {.channel = std::numeric_limits<int>::max(),
144 .band = std::numeric_limits<int>::max(),
145 .enable = true,
David Licb5bcc42023-11-13 16:01:48 +0800146 .cutoffFrequencyHz = 192000,
Ram Mohanf045ba42023-04-11 11:51:20 +0530147 .attackTimeMs = 60000,
148 .releaseTimeMs = 60000,
149 .ratio = 50,
150 .thresholdDb = 200,
151 .kneeWidthDb = 100,
152 .noiseGateThresholdDb = 200,
153 .expanderRatio = 50,
154 .preGainDb = 200,
155 .postGainDb = 200})})};
Ram Mohanc89817d2023-03-14 21:39:26 +0530156
157static const Range::DynamicsProcessingRange kInputGainRange = {
158 .min = DynamicsProcessing::make<DynamicsProcessing::inputGain>(
159 {DynamicsProcessing::InputGain(
Ram Mohanf045ba42023-04-11 11:51:20 +0530160 {.channel = 0, .gainDb = -200.0f})}),
Ram Mohanc89817d2023-03-14 21:39:26 +0530161 .max = DynamicsProcessing::make<DynamicsProcessing::inputGain>(
162 {DynamicsProcessing::InputGain({.channel = std::numeric_limits<int>::max(),
Ram Mohanf045ba42023-04-11 11:51:20 +0530163 .gainDb = 200.0f})})};
Ram Mohanc89817d2023-03-14 21:39:26 +0530164
165static const Range::DynamicsProcessingRange kLimiterRange = {
166 .min = DynamicsProcessing::make<DynamicsProcessing::limiter>(
167 {DynamicsProcessing::LimiterConfig(
168 {.channel = 0,
169 .enable = false,
170 .linkGroup = std::numeric_limits<int>::min(),
171 .attackTimeMs = 0,
172 .releaseTimeMs = 0,
Ram Mohanf045ba42023-04-11 11:51:20 +0530173 .ratio = 1,
174 .thresholdDb = -200,
175 .postGainDb = -200})}),
Ram Mohanc89817d2023-03-14 21:39:26 +0530176 .max = DynamicsProcessing::make<DynamicsProcessing::limiter>(
177 {DynamicsProcessing::LimiterConfig(
178 {.channel = std::numeric_limits<int>::max(),
179 .enable = true,
180 .linkGroup = std::numeric_limits<int>::max(),
Ram Mohanf045ba42023-04-11 11:51:20 +0530181 .attackTimeMs = 60000,
182 .releaseTimeMs = 60000,
183 .ratio = 50,
184 .thresholdDb = 200,
185 .postGainDb = 200})})};
Ram Mohanc89817d2023-03-14 21:39:26 +0530186
187const std::vector<Range::DynamicsProcessingRange> kRanges = {
188 kEngineConfigRange, kPreEqChannelConfigRange, kPostEqChannelConfigRange,
189 kMbcChannelConfigRange, kPreEqBandConfigRange, kPostEqBandConfigRange,
190 kMbcBandConfigRange, kInputGainRange, kLimiterRange};
191
192const Capability DynamicsProcessingImpl::kCapability = {.range = kRanges};
Shunkai Yao6b857c92023-02-13 17:44:52 +0000193
Shunkai Yao725af212023-01-05 23:01:40 +0000194const Descriptor DynamicsProcessingImpl::kDescriptor = {
Shunkai Yao399be682023-03-06 18:54:18 +0000195 .common = {.id = {.type = getEffectTypeUuidDynamicsProcessing(),
196 .uuid = getEffectImplUuidDynamicsProcessing(),
Shunkai Yao725af212023-01-05 23:01:40 +0000197 .proxy = std::nullopt},
198 .flags = {.type = Flags::Type::INSERT,
199 .insert = Flags::Insert::LAST,
200 .volume = Flags::Volume::CTRL},
201 .name = DynamicsProcessingImpl::kEffectName,
202 .implementor = "The Android Open Source Project"},
Shunkai Yao6b857c92023-02-13 17:44:52 +0000203 .capability = DynamicsProcessingImpl::kCapability};
Shunkai Yao725af212023-01-05 23:01:40 +0000204
205ndk::ScopedAStatus DynamicsProcessingImpl::open(const Parameter::Common& common,
206 const std::optional<Parameter::Specific>& specific,
207 OpenEffectReturn* ret) {
Shunkai Yao725af212023-01-05 23:01:40 +0000208 // effect only support 32bits float
209 RETURN_IF(common.input.base.format.pcm != common.output.base.format.pcm ||
210 common.input.base.format.pcm != PcmType::FLOAT_32_BIT,
211 EX_ILLEGAL_ARGUMENT, "dataMustBe32BitsFloat");
Shunkai Yao1afb46c2024-01-09 20:40:45 +0000212 std::lock_guard lg(mImplMutex);
Shunkai Yao725af212023-01-05 23:01:40 +0000213 RETURN_OK_IF(mState != State::INIT);
Shunkai Yao1afb46c2024-01-09 20:40:45 +0000214 mImplContext = createContext(common);
215 RETURN_IF(!mContext || !mImplContext, EX_NULL_POINTER, "createContextFailed");
Shunkai Yao2839b852024-02-03 06:48:10 +0000216 int version = 0;
217 RETURN_IF(!getInterfaceVersion(&version).isOk(), EX_UNSUPPORTED_OPERATION,
218 "FailedToGetInterfaceVersion");
219 mImplContext->setVersion(version);
Shunkai Yao1afb46c2024-01-09 20:40:45 +0000220 mEventFlag = mImplContext->getStatusEventFlag();
Shunkai Yao725af212023-01-05 23:01:40 +0000221
Shunkai Yao725af212023-01-05 23:01:40 +0000222 if (specific.has_value()) {
223 RETURN_IF_ASTATUS_NOT_OK(setParameterSpecific(specific.value()), "setSpecParamErr");
224 } else {
225 Parameter::Specific defaultSpecific =
226 Parameter::Specific::make<Parameter::Specific::dynamicsProcessing>(
227 DynamicsProcessing::make<DynamicsProcessing::engineArchitecture>(
228 mContext->getEngineArchitecture()));
229 RETURN_IF_ASTATUS_NOT_OK(setParameterSpecific(defaultSpecific), "setDefaultEngineErr");
230 }
231
232 mState = State::IDLE;
Shunkai Yao1afb46c2024-01-09 20:40:45 +0000233 mContext->dupeFmq(ret);
234 RETURN_IF(createThread(getEffectName()) != RetCode::SUCCESS, EX_UNSUPPORTED_OPERATION,
Shunkai Yao725af212023-01-05 23:01:40 +0000235 "FailedToCreateWorker");
236 return ndk::ScopedAStatus::ok();
237}
238
239ndk::ScopedAStatus DynamicsProcessingImpl::getDescriptor(Descriptor* _aidl_return) {
240 RETURN_IF(!_aidl_return, EX_ILLEGAL_ARGUMENT, "Parameter:nullptr");
Shunkai Yao725af212023-01-05 23:01:40 +0000241 *_aidl_return = kDescriptor;
242 return ndk::ScopedAStatus::ok();
243}
244
245ndk::ScopedAStatus DynamicsProcessingImpl::commandImpl(CommandId command) {
246 RETURN_IF(!mContext, EX_NULL_POINTER, "nullContext");
247 switch (command) {
248 case CommandId::START:
249 mContext->enable();
250 return ndk::ScopedAStatus::ok();
251 case CommandId::STOP:
252 mContext->disable();
253 return ndk::ScopedAStatus::ok();
254 case CommandId::RESET:
255 mContext->disable();
256 mContext->resetBuffer();
257 return ndk::ScopedAStatus::ok();
258 default:
259 // Need this default handling for vendor extendable CommandId::VENDOR_COMMAND_*
260 LOG(ERROR) << __func__ << " commandId " << toString(command) << " not supported";
261 return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
262 "commandIdNotSupported");
263 }
264}
265
Ram Mohanc89817d2023-03-14 21:39:26 +0530266bool DynamicsProcessingImpl::isParamInRange(const Parameter::Specific& specific) {
267 auto& dp = specific.get<Parameter::Specific::dynamicsProcessing>();
268 return DynamicsProcessingRanges::isParamInRange(dp, kRanges);
269}
270
Shunkai Yao725af212023-01-05 23:01:40 +0000271ndk::ScopedAStatus DynamicsProcessingImpl::setParameterSpecific(
272 const Parameter::Specific& specific) {
273 RETURN_IF(Parameter::Specific::dynamicsProcessing != specific.getTag(), EX_ILLEGAL_ARGUMENT,
274 "EffectNotSupported");
275 RETURN_IF(!mContext, EX_NULL_POINTER, "nullContext");
276
Ram Mohanc89817d2023-03-14 21:39:26 +0530277 RETURN_IF(!isParamInRange(specific), EX_ILLEGAL_ARGUMENT, "outOfRange");
Shunkai Yao725af212023-01-05 23:01:40 +0000278 auto& param = specific.get<Parameter::Specific::dynamicsProcessing>();
Shunkai Yao725af212023-01-05 23:01:40 +0000279 auto tag = param.getTag();
280
281 switch (tag) {
282 case DynamicsProcessing::engineArchitecture: {
283 RETURN_IF(mContext->setEngineArchitecture(
284 param.get<DynamicsProcessing::engineArchitecture>()) !=
285 RetCode::SUCCESS,
286 EX_ILLEGAL_ARGUMENT, "setEngineArchitectureFailed");
287 return ndk::ScopedAStatus::ok();
288 }
289 case DynamicsProcessing::preEq: {
290 RETURN_IF(
291 mContext->setPreEq(param.get<DynamicsProcessing::preEq>()) != RetCode::SUCCESS,
292 EX_ILLEGAL_ARGUMENT, "setPreEqFailed");
293 return ndk::ScopedAStatus::ok();
294 }
295 case DynamicsProcessing::postEq: {
296 RETURN_IF(mContext->setPostEq(param.get<DynamicsProcessing::postEq>()) !=
297 RetCode::SUCCESS,
298 EX_ILLEGAL_ARGUMENT, "setPostEqFailed");
299 return ndk::ScopedAStatus::ok();
300 }
301 case DynamicsProcessing::preEqBand: {
302 RETURN_IF(mContext->setPreEqBand(param.get<DynamicsProcessing::preEqBand>()) !=
303 RetCode::SUCCESS,
304 EX_ILLEGAL_ARGUMENT, "setPreEqBandFailed");
305 return ndk::ScopedAStatus::ok();
306 }
307 case DynamicsProcessing::postEqBand: {
308 RETURN_IF(mContext->setPostEqBand(param.get<DynamicsProcessing::postEqBand>()) !=
309 RetCode::SUCCESS,
310 EX_ILLEGAL_ARGUMENT, "setPostEqBandFailed");
311 return ndk::ScopedAStatus::ok();
312 }
313 case DynamicsProcessing::mbc: {
314 RETURN_IF(mContext->setMbc(param.get<DynamicsProcessing::mbc>()) != RetCode::SUCCESS,
315 EX_ILLEGAL_ARGUMENT, "setMbcFailed");
316 return ndk::ScopedAStatus::ok();
317 }
318 case DynamicsProcessing::mbcBand: {
319 RETURN_IF(mContext->setMbcBand(param.get<DynamicsProcessing::mbcBand>()) !=
320 RetCode::SUCCESS,
321 EX_ILLEGAL_ARGUMENT, "setMbcBandFailed");
322 return ndk::ScopedAStatus::ok();
323 }
324 case DynamicsProcessing::limiter: {
325 RETURN_IF(mContext->setLimiter(param.get<DynamicsProcessing::limiter>()) !=
326 RetCode::SUCCESS,
327 EX_ILLEGAL_ARGUMENT, "setLimiterFailed");
328 return ndk::ScopedAStatus::ok();
329 }
330 case DynamicsProcessing::inputGain: {
331 RETURN_IF(mContext->setInputGain(param.get<DynamicsProcessing::inputGain>()) !=
332 RetCode::SUCCESS,
333 EX_ILLEGAL_ARGUMENT, "setInputGainFailed");
334 return ndk::ScopedAStatus::ok();
335 }
Shunkai Yaoda4a6402023-03-03 19:38:17 +0000336 case DynamicsProcessing::vendor: {
Shunkai Yao725af212023-01-05 23:01:40 +0000337 LOG(ERROR) << __func__ << " unsupported tag: " << toString(tag);
338 return ndk::ScopedAStatus::fromExceptionCodeWithMessage(
339 EX_ILLEGAL_ARGUMENT, "DPVendorExtensionTagNotSupported");
340 }
341 }
342}
343
344ndk::ScopedAStatus DynamicsProcessingImpl::getParameterSpecific(const Parameter::Id& id,
345 Parameter::Specific* specific) {
346 RETURN_IF(!specific, EX_NULL_POINTER, "nullPtr");
347 auto tag = id.getTag();
348 RETURN_IF(Parameter::Id::dynamicsProcessingTag != tag, EX_ILLEGAL_ARGUMENT, "wrongIdTag");
349 auto dpId = id.get<Parameter::Id::dynamicsProcessingTag>();
350 auto dpIdTag = dpId.getTag();
351 switch (dpIdTag) {
352 case DynamicsProcessing::Id::commonTag:
353 return getParameterDynamicsProcessing(dpId.get<DynamicsProcessing::Id::commonTag>(),
354 specific);
355 case DynamicsProcessing::Id::vendorExtensionTag:
356 LOG(ERROR) << __func__ << " unsupported ID: " << toString(dpIdTag);
357 return ndk::ScopedAStatus::fromExceptionCodeWithMessage(
358 EX_ILLEGAL_ARGUMENT, "DPVendorExtensionIdNotSupported");
359 }
360}
361
362ndk::ScopedAStatus DynamicsProcessingImpl::getParameterDynamicsProcessing(
363 const DynamicsProcessing::Tag& tag, Parameter::Specific* specific) {
364 RETURN_IF(!mContext, EX_NULL_POINTER, "nullContext");
365
366 switch (tag) {
367 case DynamicsProcessing::engineArchitecture: {
368 specific->set<Parameter::Specific::dynamicsProcessing>(
369 DynamicsProcessing::make<DynamicsProcessing::engineArchitecture>(
370 mContext->getEngineArchitecture()));
371 return ndk::ScopedAStatus::ok();
372 }
373 case DynamicsProcessing::preEq: {
374 specific->set<Parameter::Specific::dynamicsProcessing>(
375 DynamicsProcessing::make<DynamicsProcessing::preEq>(mContext->getPreEq()));
376 return ndk::ScopedAStatus::ok();
377 }
378 case DynamicsProcessing::postEq: {
379 specific->set<Parameter::Specific::dynamicsProcessing>(
380 DynamicsProcessing::make<DynamicsProcessing::postEq>(mContext->getPostEq()));
381 return ndk::ScopedAStatus::ok();
382 }
383 case DynamicsProcessing::preEqBand: {
384 specific->set<Parameter::Specific::dynamicsProcessing>(
385 DynamicsProcessing::make<DynamicsProcessing::preEqBand>(
386 mContext->getPreEqBand()));
387 return ndk::ScopedAStatus::ok();
388 }
389 case DynamicsProcessing::postEqBand: {
390 specific->set<Parameter::Specific::dynamicsProcessing>(
391 DynamicsProcessing::make<DynamicsProcessing::postEqBand>(
392 mContext->getPostEqBand()));
393 return ndk::ScopedAStatus::ok();
394 }
395 case DynamicsProcessing::mbc: {
396 specific->set<Parameter::Specific::dynamicsProcessing>(
397 DynamicsProcessing::make<DynamicsProcessing::mbc>(mContext->getMbc()));
398 return ndk::ScopedAStatus::ok();
399 }
400 case DynamicsProcessing::mbcBand: {
401 specific->set<Parameter::Specific::dynamicsProcessing>(
402 DynamicsProcessing::make<DynamicsProcessing::mbcBand>(mContext->getMbcBand()));
403 return ndk::ScopedAStatus::ok();
404 }
405 case DynamicsProcessing::limiter: {
406 specific->set<Parameter::Specific::dynamicsProcessing>(
407 DynamicsProcessing::make<DynamicsProcessing::limiter>(mContext->getLimiter()));
408 return ndk::ScopedAStatus::ok();
409 }
410 case DynamicsProcessing::inputGain: {
411 specific->set<Parameter::Specific::dynamicsProcessing>(
412 DynamicsProcessing::make<DynamicsProcessing::inputGain>(
413 mContext->getInputGain()));
414 return ndk::ScopedAStatus::ok();
415 }
Shunkai Yaoda4a6402023-03-03 19:38:17 +0000416 case DynamicsProcessing::vendor: {
Shunkai Yao725af212023-01-05 23:01:40 +0000417 LOG(ERROR) << __func__ << " wrong vendor tag in CommonTag: " << toString(tag);
418 return ndk::ScopedAStatus::fromExceptionCodeWithMessage(
419 EX_ILLEGAL_ARGUMENT, "DPVendorExtensionTagInWrongId");
420 }
421 }
422}
423
424std::shared_ptr<EffectContext> DynamicsProcessingImpl::createContext(
425 const Parameter::Common& common) {
426 if (mContext) {
427 LOG(DEBUG) << __func__ << " context already exist";
428 return mContext;
429 }
430
431 mContext = std::make_shared<DynamicsProcessingContext>(1 /* statusFmqDepth */, common);
432 return mContext;
433}
434
435RetCode DynamicsProcessingImpl::releaseContext() {
436 if (mContext) {
437 mContext->disable();
438 mContext->resetBuffer();
439 mContext.reset();
440 }
441 return RetCode::SUCCESS;
442}
443
444// Processing method running in EffectWorker thread.
445IEffect::Status DynamicsProcessingImpl::effectProcessImpl(float* in, float* out, int samples) {
446 IEffect::Status status = {EX_NULL_POINTER, 0, 0};
447 RETURN_VALUE_IF(!mContext, status, "nullContext");
David Licb5bcc42023-11-13 16:01:48 +0800448 return mContext->dpeProcess(in, out, samples);
Shunkai Yao725af212023-01-05 23:01:40 +0000449}
450
451} // namespace aidl::android::hardware::audio::effect