blob: ea4dbf69a671c966471ba389006582f09f5e0259 [file] [log] [blame]
Shunkai Yao51202502022-12-12 06:11:46 +00001/*
2 * Copyright (C) 2022 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
Shunkai Yaoc6308712023-02-22 17:53:04 +000017#include <cstddef>
Shunkai Yao57b93392024-04-26 04:12:21 +000018#include <cstring>
Shunkai Yao51202502022-12-12 06:11:46 +000019#define LOG_TAG "EffectHalAidl"
20//#define LOG_NDEBUG 0
21
Shunkai Yao242521c2023-01-29 18:08:09 +000022#include <memory>
23
Shunkai Yao919b73f2024-03-13 00:52:08 +000024#include <audio_utils/primitives.h>
Mikhail Naganov5e406ba2023-01-13 00:27:22 +000025#include <error/expected_utils.h>
Shunkai Yao51202502022-12-12 06:11:46 +000026#include <media/AidlConversionCppNdk.h>
Shunkai Yaoa03533e2023-01-25 06:38:10 +000027#include <media/AidlConversionEffect.h>
Mikhail Naganov5e406ba2023-01-13 00:27:22 +000028#include <media/AidlConversionUtil.h>
Shunkai Yao51202502022-12-12 06:11:46 +000029#include <media/EffectsFactoryApi.h>
30#include <mediautils/TimeCheck.h>
Shunkai Yao242521c2023-01-29 18:08:09 +000031#include <system/audio.h>
Shunkai Yao399be682023-03-06 18:54:18 +000032#include <system/audio_effects/effect_uuid.h>
Shunkai Yao51202502022-12-12 06:11:46 +000033#include <utils/Log.h>
34
35#include "EffectHalAidl.h"
Shunkai Yao5c718342023-02-23 23:49:51 +000036#include "EffectProxy.h"
Shunkai Yao51202502022-12-12 06:11:46 +000037
Shunkai Yao51202502022-12-12 06:11:46 +000038#include <aidl/android/hardware/audio/effect/IEffect.h>
39
Shunkai Yaodba8ba32023-01-27 17:02:21 +000040#include "effectsAidlConversion/AidlConversionAec.h"
Shunkai Yao61ce9572023-02-28 23:55:33 +000041#include "effectsAidlConversion/AidlConversionAgc1.h"
Shunkai Yaodba8ba32023-01-27 17:02:21 +000042#include "effectsAidlConversion/AidlConversionAgc2.h"
43#include "effectsAidlConversion/AidlConversionBassBoost.h"
44#include "effectsAidlConversion/AidlConversionDownmix.h"
45#include "effectsAidlConversion/AidlConversionDynamicsProcessing.h"
Shunkai Yao242521c2023-01-29 18:08:09 +000046#include "effectsAidlConversion/AidlConversionEnvReverb.h"
47#include "effectsAidlConversion/AidlConversionEq.h"
48#include "effectsAidlConversion/AidlConversionHapticGenerator.h"
49#include "effectsAidlConversion/AidlConversionLoudnessEnhancer.h"
50#include "effectsAidlConversion/AidlConversionNoiseSuppression.h"
51#include "effectsAidlConversion/AidlConversionPresetReverb.h"
52#include "effectsAidlConversion/AidlConversionSpatializer.h"
53#include "effectsAidlConversion/AidlConversionVendorExtension.h"
54#include "effectsAidlConversion/AidlConversionVirtualizer.h"
55#include "effectsAidlConversion/AidlConversionVisualizer.h"
Shunkai Yaodba8ba32023-01-27 17:02:21 +000056
Mikhail Naganov5e406ba2023-01-13 00:27:22 +000057using ::aidl::android::aidl_utils::statusTFromBinderStatus;
David Lia6913432024-02-20 09:54:14 +080058using ::aidl::android::hardware::audio::effect::CommandId;
Shunkai Yao51202502022-12-12 06:11:46 +000059using ::aidl::android::hardware::audio::effect::Descriptor;
60using ::aidl::android::hardware::audio::effect::IEffect;
Shunkai Yao44bdbad2023-01-14 05:11:58 +000061using ::aidl::android::hardware::audio::effect::IFactory;
Shunkai Yaoe910bfd2024-04-18 04:36:42 +000062using ::aidl::android::hardware::audio::effect::kEventFlagDataMqNotEmpty;
Shunkai Yao1afb46c2024-01-09 20:40:45 +000063using ::aidl::android::hardware::audio::effect::kEventFlagDataMqUpdate;
Shunkai Yaoe910bfd2024-04-18 04:36:42 +000064using ::aidl::android::hardware::audio::effect::kEventFlagNotEmpty;
Shunkai Yaoe317e332024-02-06 00:39:49 +000065using ::aidl::android::hardware::audio::effect::kReopenSupportedVersion;
Shunkai Yao26689d92023-08-01 23:06:13 +000066using ::aidl::android::hardware::audio::effect::State;
Shunkai Yao51202502022-12-12 06:11:46 +000067
68namespace android {
69namespace effect {
70
Shunkai Yao399be682023-03-06 18:54:18 +000071EffectHalAidl::EffectHalAidl(const std::shared_ptr<IFactory>& factory,
Shunkai Yaoe317e332024-02-06 00:39:49 +000072 const std::shared_ptr<IEffect>& effect, int32_t sessionId,
73 int32_t ioId, const Descriptor& desc, bool isProxyEffect)
Shunkai Yaodba8ba32023-01-27 17:02:21 +000074 : mFactory(factory),
Shunkai Yao44bdbad2023-01-14 05:11:58 +000075 mEffect(effect),
Shunkai Yao284bb0d2023-01-10 00:42:36 +000076 mSessionId(sessionId),
77 mIoId(ioId),
Shunkai Yao5c718342023-02-23 23:49:51 +000078 mIsProxyEffect(isProxyEffect) {
Shunkai Yaoe317e332024-02-06 00:39:49 +000079 assert(mFactory != nullptr);
80 assert(mEffect != nullptr);
Shunkai Yaodba8ba32023-01-27 17:02:21 +000081 createAidlConversion(effect, sessionId, ioId, desc);
82}
Shunkai Yao51202502022-12-12 06:11:46 +000083
Shunkai Yao44bdbad2023-01-14 05:11:58 +000084EffectHalAidl::~EffectHalAidl() {
Shunkai Yao5c718342023-02-23 23:49:51 +000085 if (mEffect) {
Shunkai Yao79f98742023-05-03 23:54:43 +000086 if (mIsProxyEffect) {
87 std::static_pointer_cast<EffectProxy>(mEffect)->destroy();
88 } else if (mFactory) {
89 mFactory->destroyEffect(mEffect);
90 }
Shunkai Yao44bdbad2023-01-14 05:11:58 +000091 }
92}
Shunkai Yao51202502022-12-12 06:11:46 +000093
Shunkai Yaodba8ba32023-01-27 17:02:21 +000094status_t EffectHalAidl::createAidlConversion(
Shunkai Yao399be682023-03-06 18:54:18 +000095 std::shared_ptr<IEffect> effect,
Shunkai Yaodba8ba32023-01-27 17:02:21 +000096 int32_t sessionId, int32_t ioId,
Shunkai Yao399be682023-03-06 18:54:18 +000097 const Descriptor& desc) {
Shunkai Yaodba8ba32023-01-27 17:02:21 +000098 const auto& typeUuid = desc.common.id.type;
Shunkai Yao242521c2023-01-29 18:08:09 +000099 ALOGI("%s create UUID %s", __func__, typeUuid.toString().c_str());
Shunkai Yao399be682023-03-06 18:54:18 +0000100 if (typeUuid ==
101 ::aidl::android::hardware::audio::effect::getEffectTypeUuidAcousticEchoCanceler()) {
Shunkai Yao323273d2023-05-24 00:45:43 +0000102 mConversion = std::make_unique<android::effect::AidlConversionAec>(effect, sessionId, ioId,
103 desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000104 } else if (typeUuid == ::aidl::android::hardware::audio::effect::
105 getEffectTypeUuidAutomaticGainControlV1()) {
Shunkai Yao61ce9572023-02-28 23:55:33 +0000106 mConversion = std::make_unique<android::effect::AidlConversionAgc1>(effect, sessionId, ioId,
Shunkai Yao323273d2023-05-24 00:45:43 +0000107 desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000108 } else if (typeUuid == ::aidl::android::hardware::audio::effect::
109 getEffectTypeUuidAutomaticGainControlV2()) {
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000110 mConversion = std::make_unique<android::effect::AidlConversionAgc2>(effect, sessionId, ioId,
Shunkai Yao323273d2023-05-24 00:45:43 +0000111 desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000112 } else if (typeUuid == ::aidl::android::hardware::audio::effect::getEffectTypeUuidBassBoost()) {
Shunkai Yao323273d2023-05-24 00:45:43 +0000113 mConversion = std::make_unique<android::effect::AidlConversionBassBoost>(
114 effect, sessionId, ioId, desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000115 } else if (typeUuid == ::aidl::android::hardware::audio::effect::getEffectTypeUuidDownmix()) {
Shunkai Yao323273d2023-05-24 00:45:43 +0000116 mConversion = std::make_unique<android::effect::AidlConversionDownmix>(
117 effect, sessionId, ioId, desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000118 } else if (typeUuid ==
119 ::aidl::android::hardware::audio::effect::getEffectTypeUuidDynamicsProcessing()) {
Shunkai Yao323273d2023-05-24 00:45:43 +0000120 mConversion = std::make_unique<android::effect::AidlConversionDp>(effect, sessionId, ioId,
121 desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000122 } else if (typeUuid == ::aidl::android::hardware::audio::effect::getEffectTypeUuidEnvReverb()) {
Shunkai Yao323273d2023-05-24 00:45:43 +0000123 mConversion = std::make_unique<android::effect::AidlConversionEnvReverb>(
124 effect, sessionId, ioId, desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000125 } else if (typeUuid == ::aidl::android::hardware::audio::effect::getEffectTypeUuidEqualizer()) {
Shunkai Yao323273d2023-05-24 00:45:43 +0000126 mConversion = std::make_unique<android::effect::AidlConversionEq>(effect, sessionId, ioId,
127 desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000128 } else if (typeUuid ==
129 ::aidl::android::hardware::audio::effect::getEffectTypeUuidHapticGenerator()) {
Shunkai Yao242521c2023-01-29 18:08:09 +0000130 mConversion = std::make_unique<android::effect::AidlConversionHapticGenerator>(
Shunkai Yao323273d2023-05-24 00:45:43 +0000131 effect, sessionId, ioId, desc, mIsProxyEffect);
Shunkai Yao57b93392024-04-26 04:12:21 +0000132 mIsHapticGenerator = true;
Shunkai Yao399be682023-03-06 18:54:18 +0000133 } else if (typeUuid ==
134 ::aidl::android::hardware::audio::effect::getEffectTypeUuidLoudnessEnhancer()) {
Shunkai Yao242521c2023-01-29 18:08:09 +0000135 mConversion = std::make_unique<android::effect::AidlConversionLoudnessEnhancer>(
Shunkai Yao323273d2023-05-24 00:45:43 +0000136 effect, sessionId, ioId, desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000137 } else if (typeUuid ==
138 ::aidl::android::hardware::audio::effect::getEffectTypeUuidNoiseSuppression()) {
Shunkai Yao242521c2023-01-29 18:08:09 +0000139 mConversion = std::make_unique<android::effect::AidlConversionNoiseSuppression>(
Shunkai Yao323273d2023-05-24 00:45:43 +0000140 effect, sessionId, ioId, desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000141 } else if (typeUuid ==
142 ::aidl::android::hardware::audio::effect::getEffectTypeUuidPresetReverb()) {
Shunkai Yao242521c2023-01-29 18:08:09 +0000143 mConversion = std::make_unique<android::effect::AidlConversionPresetReverb>(
Shunkai Yao323273d2023-05-24 00:45:43 +0000144 effect, sessionId, ioId, desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000145 } else if (typeUuid ==
146 ::aidl::android::hardware::audio::effect::getEffectTypeUuidSpatializer()) {
Shunkai Yao242521c2023-01-29 18:08:09 +0000147 mConversion = std::make_unique<android::effect::AidlConversionSpatializer>(
Shunkai Yao323273d2023-05-24 00:45:43 +0000148 effect, sessionId, ioId, desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000149 } else if (typeUuid ==
150 ::aidl::android::hardware::audio::effect::getEffectTypeUuidVirtualizer()) {
Shunkai Yao242521c2023-01-29 18:08:09 +0000151 mConversion = std::make_unique<android::effect::AidlConversionVirtualizer>(
Shunkai Yao323273d2023-05-24 00:45:43 +0000152 effect, sessionId, ioId, desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000153 } else if (typeUuid ==
154 ::aidl::android::hardware::audio::effect::getEffectTypeUuidVisualizer()) {
Shunkai Yao323273d2023-05-24 00:45:43 +0000155 mConversion = std::make_unique<android::effect::AidlConversionVisualizer>(
156 effect, sessionId, ioId, desc, mIsProxyEffect);
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000157 } else {
Shunkai Yao242521c2023-01-29 18:08:09 +0000158 // For unknown UUID, use vendor extension implementation
159 mConversion = std::make_unique<android::effect::AidlConversionVendorExtension>(
Shunkai Yao323273d2023-05-24 00:45:43 +0000160 effect, sessionId, ioId, desc, mIsProxyEffect);
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000161 }
162 return OK;
163}
164
Shunkai Yao51202502022-12-12 06:11:46 +0000165status_t EffectHalAidl::setInBuffer(const sp<EffectBufferHalInterface>& buffer) {
Shunkai Yaoc6308712023-02-22 17:53:04 +0000166 mInBuffer = buffer;
Shunkai Yao51202502022-12-12 06:11:46 +0000167 return OK;
168}
169
170status_t EffectHalAidl::setOutBuffer(const sp<EffectBufferHalInterface>& buffer) {
Shunkai Yaoc6308712023-02-22 17:53:04 +0000171 mOutBuffer = buffer;
Shunkai Yao51202502022-12-12 06:11:46 +0000172 return OK;
173}
174
Shunkai Yaoc6308712023-02-22 17:53:04 +0000175// write to input FMQ here, wait for statusMQ STATUS_OK, and read from output FMQ
Shunkai Yao51202502022-12-12 06:11:46 +0000176status_t EffectHalAidl::process() {
Shunkai Yao1afb46c2024-01-09 20:40:45 +0000177 const std::string effectName = mConversion->getDescriptor().common.name;
Shunkai Yao26689d92023-08-01 23:06:13 +0000178 State state = State::INIT;
179 if (mConversion->isBypassing() || !mEffect->getState(&state).isOk() ||
180 state != State::PROCESSING) {
Shunkai Yao1afb46c2024-01-09 20:40:45 +0000181 ALOGI("%s skipping %s process because it's %s", __func__, effectName.c_str(),
Shunkai Yao26689d92023-08-01 23:06:13 +0000182 mConversion->isBypassing()
183 ? "bypassing"
184 : aidl::android::hardware::audio::effect::toString(state).c_str());
Jaideep Sharmabd9b0d32023-09-20 11:50:25 +0530185 return -ENODATA;
Shunkai Yao26689d92023-08-01 23:06:13 +0000186 }
187
Shunkai Yao1afb46c2024-01-09 20:40:45 +0000188 // check if the DataMq needs any update, timeout at 1ns to avoid being blocked
189 auto efGroup = mConversion->getEventFlagGroup();
190 if (!efGroup) {
191 ALOGE("%s invalid efGroup", __func__);
192 return INVALID_OPERATION;
193 }
194
Shunkai Yaoe317e332024-02-06 00:39:49 +0000195 // use IFactory HAL version because IEffect can be an EffectProxy instance
196 static const int halVersion = [&]() {
197 int version = 0;
198 return mFactory->getInterfaceVersion(&version).isOk() ? version : 0;
199 }();
200
201 if (uint32_t efState = 0; halVersion >= kReopenSupportedVersion &&
202 ::android::OK == efGroup->wait(kEventFlagDataMqUpdate, &efState,
203 1 /* ns */, true /* retry */) &&
204 efState & kEventFlagDataMqUpdate) {
Shunkai Yao57b93392024-04-26 04:12:21 +0000205 ALOGD("%s %s V%d receive dataMQUpdate eventFlag from HAL", __func__, effectName.c_str(),
Shunkai Yaoe317e332024-02-06 00:39:49 +0000206 halVersion);
Shunkai Yaoe910bfd2024-04-18 04:36:42 +0000207
Shunkai Yao1afb46c2024-01-09 20:40:45 +0000208 mConversion->reopen();
209 }
Shunkai Yao5c718342023-02-23 23:49:51 +0000210 auto statusQ = mConversion->getStatusMQ();
211 auto inputQ = mConversion->getInputMQ();
212 auto outputQ = mConversion->getOutputMQ();
213 if (!statusQ || !statusQ->isValid() || !inputQ || !inputQ->isValid() || !outputQ ||
Shunkai Yao1afb46c2024-01-09 20:40:45 +0000214 !outputQ->isValid()) {
215 ALOGE("%s invalid FMQ [Status %d I %d O %d]", __func__, statusQ ? statusQ->isValid() : 0,
216 inputQ ? inputQ->isValid() : 0, outputQ ? outputQ->isValid() : 0);
Shunkai Yao5c718342023-02-23 23:49:51 +0000217 return INVALID_OPERATION;
218 }
219
220 size_t available = inputQ->availableToWrite();
Shunkai Yao57b93392024-04-26 04:12:21 +0000221 const size_t floatsToWrite = std::min(available, mInBuffer->getSize() / sizeof(float));
Shunkai Yaoc6308712023-02-22 17:53:04 +0000222 if (floatsToWrite == 0) {
Shunkai Yao5c718342023-02-23 23:49:51 +0000223 ALOGE("%s not able to write, floats in buffer %zu, space in FMQ %zu", __func__,
Shunkai Yaoc6308712023-02-22 17:53:04 +0000224 mInBuffer->getSize() / sizeof(float), available);
225 return INVALID_OPERATION;
226 }
Shunkai Yao5c718342023-02-23 23:49:51 +0000227 if (!mInBuffer->audioBuffer() ||
228 !inputQ->write((float*)mInBuffer->audioBuffer()->f32, floatsToWrite)) {
229 ALOGE("%s failed to write %zu floats from audiobuffer %p to inputQ [avail %zu]", __func__,
230 floatsToWrite, mInBuffer->audioBuffer(), inputQ->availableToWrite());
Shunkai Yaoc6308712023-02-22 17:53:04 +0000231 return INVALID_OPERATION;
232 }
Shunkai Yaoe910bfd2024-04-18 04:36:42 +0000233
234 // for V2 audio effect HAL, expect different EventFlag to avoid bit conflict with FMQ_NOT_EMPTY
235 efGroup->wake(halVersion >= kReopenSupportedVersion ? kEventFlagDataMqNotEmpty
236 : kEventFlagNotEmpty);
Shunkai Yaoc6308712023-02-22 17:53:04 +0000237
238 IEffect::Status retStatus{};
Shunkai Yaoe910bfd2024-04-18 04:36:42 +0000239 if (!statusQ->readBlocking(&retStatus, 1)) {
240 ALOGE("%s %s V%d read status from status FMQ failed", __func__, effectName.c_str(),
241 halVersion);
242 return INVALID_OPERATION;
243 }
244 if (retStatus.status != OK || (size_t)retStatus.fmqConsumed != floatsToWrite ||
245 retStatus.fmqProduced == 0) {
246 ALOGE("%s read status failed: %s, consumed %d (of %zu) produced %d", __func__,
247 retStatus.toString().c_str(), retStatus.fmqConsumed, floatsToWrite,
248 retStatus.fmqProduced);
Shunkai Yaoc6308712023-02-22 17:53:04 +0000249 return INVALID_OPERATION;
250 }
251
Shunkai Yao5c718342023-02-23 23:49:51 +0000252 available = outputQ->availableToRead();
Shunkai Yao57b93392024-04-26 04:12:21 +0000253 const size_t floatsToRead = std::min(available, mOutBuffer->getSize() / sizeof(float));
Shunkai Yaoc6308712023-02-22 17:53:04 +0000254 if (floatsToRead == 0) {
Shunkai Yao5c718342023-02-23 23:49:51 +0000255 ALOGE("%s not able to read, buffer space %zu, floats in FMQ %zu", __func__,
Shunkai Yaoc6308712023-02-22 17:53:04 +0000256 mOutBuffer->getSize() / sizeof(float), available);
257 return INVALID_OPERATION;
258 }
Shunkai Yao919b73f2024-03-13 00:52:08 +0000259
260 float *outputRawBuffer = mOutBuffer->audioBuffer()->f32;
261 std::vector<float> tempBuffer;
Shunkai Yao57b93392024-04-26 04:12:21 +0000262 // keep original data in the output buffer for accumulate mode or HapticGenerator effect
263 if (mConversion->mOutputAccessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE || mIsHapticGenerator) {
Shunkai Yao919b73f2024-03-13 00:52:08 +0000264 tempBuffer.resize(floatsToRead);
265 outputRawBuffer = tempBuffer.data();
266 }
Shunkai Yao5c718342023-02-23 23:49:51 +0000267 // always read floating point data for AIDL
Shunkai Yao919b73f2024-03-13 00:52:08 +0000268 if (!outputQ->read(outputRawBuffer, floatsToRead)) {
Shunkai Yao5c718342023-02-23 23:49:51 +0000269 ALOGE("%s failed to read %zu from outputQ to audioBuffer %p", __func__, floatsToRead,
270 mOutBuffer->audioBuffer());
Shunkai Yaoc6308712023-02-22 17:53:04 +0000271 return INVALID_OPERATION;
272 }
Shunkai Yao57b93392024-04-26 04:12:21 +0000273
274 // HapticGenerator needs special handling because the generated haptic samples should append to
275 // the end of audio samples, the generated haptic data pass back from HAL in output FMQ at same
276 // offset as input buffer, here we skip the audio samples in output FMQ and append haptic
277 // samples to the end of input buffer
278 if (mIsHapticGenerator) {
279 static constexpr float kHalFloatSampleLimit = 2.0f;
280 assert(floatsToRead == floatsToWrite);
281 const auto audioChNum = mConversion->getAudioChannelCount();
282 const auto audioSamples =
283 floatsToWrite * audioChNum / (audioChNum + mConversion->getHapticChannelCount());
284 // accumulate or copy input to output, haptic samples remains all zero
285 if (mConversion->mOutputAccessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE) {
286 accumulate_float(mOutBuffer->audioBuffer()->f32, mInBuffer->audioBuffer()->f32,
287 audioSamples);
288 } else {
289 memcpy_to_float_from_float_with_clamping(mOutBuffer->audioBuffer()->f32,
290 mInBuffer->audioBuffer()->f32, audioSamples,
291 kHalFloatSampleLimit);
292 }
293 // append the haptic sample at the end of input audio samples
294 memcpy_to_float_from_float_with_clamping(mInBuffer->audioBuffer()->f32 + audioSamples,
295 outputRawBuffer + audioSamples,
296 floatsToRead - audioSamples, kHalFloatSampleLimit);
297 } else if (mConversion->mOutputAccessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE) {
Shunkai Yao919b73f2024-03-13 00:52:08 +0000298 accumulate_float(mOutBuffer->audioBuffer()->f32, outputRawBuffer, floatsToRead);
299 }
Shunkai Yaoc6308712023-02-22 17:53:04 +0000300
Shunkai Yao51202502022-12-12 06:11:46 +0000301 return OK;
302}
303
304// TODO: no one using, maybe deprecate this interface
305status_t EffectHalAidl::processReverse() {
306 ALOGW("%s not implemented yet", __func__);
307 return OK;
308}
309
Shunkai Yao51202502022-12-12 06:11:46 +0000310status_t EffectHalAidl::command(uint32_t cmdCode, uint32_t cmdSize, void* pCmdData,
311 uint32_t* replySize, void* pReplyData) {
Shunkai Yaoc6308712023-02-22 17:53:04 +0000312 TIME_CHECK();
313 if (!mConversion) {
314 ALOGE("%s can not handle command %d when conversion not exist", __func__, cmdCode);
315 return INVALID_OPERATION;
316 }
317
Shunkai Yao5c718342023-02-23 23:49:51 +0000318 return mConversion->handleCommand(cmdCode, cmdSize, pCmdData, replySize, pReplyData);
Shunkai Yao51202502022-12-12 06:11:46 +0000319}
320
321status_t EffectHalAidl::getDescriptor(effect_descriptor_t* pDescriptor) {
Shunkai Yaoc6308712023-02-22 17:53:04 +0000322 TIME_CHECK();
Shunkai Yao51202502022-12-12 06:11:46 +0000323 if (pDescriptor == nullptr) {
Shunkai Yaoc6308712023-02-22 17:53:04 +0000324 ALOGE("%s null descriptor pointer", __func__);
Shunkai Yao51202502022-12-12 06:11:46 +0000325 return BAD_VALUE;
326 }
327 Descriptor aidlDesc;
Mikhail Naganov5e406ba2023-01-13 00:27:22 +0000328 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getDescriptor(&aidlDesc)));
Shunkai Yao51202502022-12-12 06:11:46 +0000329
330 *pDescriptor = VALUE_OR_RETURN_STATUS(
331 ::aidl::android::aidl2legacy_Descriptor_effect_descriptor(aidlDesc));
332 return OK;
333}
334
335status_t EffectHalAidl::close() {
Shunkai Yaoc6308712023-02-22 17:53:04 +0000336 TIME_CHECK();
David Lia6913432024-02-20 09:54:14 +0800337 mEffect->command(CommandId::STOP);
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000338 return statusTFromBinderStatus(mEffect->close());
Shunkai Yao51202502022-12-12 06:11:46 +0000339}
340
341status_t EffectHalAidl::dump(int fd) {
Shunkai Yaoc6308712023-02-22 17:53:04 +0000342 TIME_CHECK();
343 return mEffect->dump(fd, nullptr, 0);
Shunkai Yao51202502022-12-12 06:11:46 +0000344}
345
346} // namespace effect
347} // namespace android