blob: 0c7f78e046356dc367c2b71acb71989321f59035 [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 Yao51202502022-12-12 06:11:46 +000018#define LOG_TAG "EffectHalAidl"
19//#define LOG_NDEBUG 0
20
Shunkai Yao242521c2023-01-29 18:08:09 +000021#include <memory>
22
Shunkai Yao919b73f2024-03-13 00:52:08 +000023#include <audio_utils/primitives.h>
Mikhail Naganov5e406ba2023-01-13 00:27:22 +000024#include <error/expected_utils.h>
Shunkai Yao51202502022-12-12 06:11:46 +000025#include <media/AidlConversionCppNdk.h>
Shunkai Yaoa03533e2023-01-25 06:38:10 +000026#include <media/AidlConversionEffect.h>
Mikhail Naganov5e406ba2023-01-13 00:27:22 +000027#include <media/AidlConversionUtil.h>
Shunkai Yao51202502022-12-12 06:11:46 +000028#include <media/EffectsFactoryApi.h>
29#include <mediautils/TimeCheck.h>
Shunkai Yao242521c2023-01-29 18:08:09 +000030#include <system/audio.h>
Shunkai Yao399be682023-03-06 18:54:18 +000031#include <system/audio_effects/effect_uuid.h>
Shunkai Yao51202502022-12-12 06:11:46 +000032#include <utils/Log.h>
33
34#include "EffectHalAidl.h"
Shunkai Yao5c718342023-02-23 23:49:51 +000035#include "EffectProxy.h"
Shunkai Yao51202502022-12-12 06:11:46 +000036
Shunkai Yao51202502022-12-12 06:11:46 +000037#include <aidl/android/hardware/audio/effect/IEffect.h>
38
Shunkai Yaodba8ba32023-01-27 17:02:21 +000039#include "effectsAidlConversion/AidlConversionAec.h"
Shunkai Yao61ce9572023-02-28 23:55:33 +000040#include "effectsAidlConversion/AidlConversionAgc1.h"
Shunkai Yaodba8ba32023-01-27 17:02:21 +000041#include "effectsAidlConversion/AidlConversionAgc2.h"
42#include "effectsAidlConversion/AidlConversionBassBoost.h"
43#include "effectsAidlConversion/AidlConversionDownmix.h"
44#include "effectsAidlConversion/AidlConversionDynamicsProcessing.h"
Shunkai Yao242521c2023-01-29 18:08:09 +000045#include "effectsAidlConversion/AidlConversionEnvReverb.h"
46#include "effectsAidlConversion/AidlConversionEq.h"
47#include "effectsAidlConversion/AidlConversionHapticGenerator.h"
48#include "effectsAidlConversion/AidlConversionLoudnessEnhancer.h"
49#include "effectsAidlConversion/AidlConversionNoiseSuppression.h"
50#include "effectsAidlConversion/AidlConversionPresetReverb.h"
51#include "effectsAidlConversion/AidlConversionSpatializer.h"
52#include "effectsAidlConversion/AidlConversionVendorExtension.h"
53#include "effectsAidlConversion/AidlConversionVirtualizer.h"
54#include "effectsAidlConversion/AidlConversionVisualizer.h"
Shunkai Yaodba8ba32023-01-27 17:02:21 +000055
Mikhail Naganov5e406ba2023-01-13 00:27:22 +000056using ::aidl::android::aidl_utils::statusTFromBinderStatus;
David Lia6913432024-02-20 09:54:14 +080057using ::aidl::android::hardware::audio::effect::CommandId;
Shunkai Yao51202502022-12-12 06:11:46 +000058using ::aidl::android::hardware::audio::effect::Descriptor;
59using ::aidl::android::hardware::audio::effect::IEffect;
Shunkai Yao44bdbad2023-01-14 05:11:58 +000060using ::aidl::android::hardware::audio::effect::IFactory;
Shunkai Yaoe910bfd2024-04-18 04:36:42 +000061using ::aidl::android::hardware::audio::effect::kEventFlagDataMqNotEmpty;
Shunkai Yao1afb46c2024-01-09 20:40:45 +000062using ::aidl::android::hardware::audio::effect::kEventFlagDataMqUpdate;
Shunkai Yaoe910bfd2024-04-18 04:36:42 +000063using ::aidl::android::hardware::audio::effect::kEventFlagNotEmpty;
Shunkai Yaoe317e332024-02-06 00:39:49 +000064using ::aidl::android::hardware::audio::effect::kReopenSupportedVersion;
Shunkai Yao26689d92023-08-01 23:06:13 +000065using ::aidl::android::hardware::audio::effect::State;
Shunkai Yao51202502022-12-12 06:11:46 +000066
67namespace android {
68namespace effect {
69
Shunkai Yao399be682023-03-06 18:54:18 +000070EffectHalAidl::EffectHalAidl(const std::shared_ptr<IFactory>& factory,
Shunkai Yaoe317e332024-02-06 00:39:49 +000071 const std::shared_ptr<IEffect>& effect, int32_t sessionId,
72 int32_t ioId, const Descriptor& desc, bool isProxyEffect)
Shunkai Yaodba8ba32023-01-27 17:02:21 +000073 : mFactory(factory),
Shunkai Yao44bdbad2023-01-14 05:11:58 +000074 mEffect(effect),
Shunkai Yao284bb0d2023-01-10 00:42:36 +000075 mSessionId(sessionId),
76 mIoId(ioId),
Shunkai Yao5c718342023-02-23 23:49:51 +000077 mIsProxyEffect(isProxyEffect) {
Shunkai Yaoe317e332024-02-06 00:39:49 +000078 assert(mFactory != nullptr);
79 assert(mEffect != nullptr);
Shunkai Yaodba8ba32023-01-27 17:02:21 +000080 createAidlConversion(effect, sessionId, ioId, desc);
81}
Shunkai Yao51202502022-12-12 06:11:46 +000082
Shunkai Yao44bdbad2023-01-14 05:11:58 +000083EffectHalAidl::~EffectHalAidl() {
Shunkai Yao5c718342023-02-23 23:49:51 +000084 if (mEffect) {
Shunkai Yao79f98742023-05-03 23:54:43 +000085 if (mIsProxyEffect) {
86 std::static_pointer_cast<EffectProxy>(mEffect)->destroy();
87 } else if (mFactory) {
88 mFactory->destroyEffect(mEffect);
89 }
Shunkai Yao44bdbad2023-01-14 05:11:58 +000090 }
91}
Shunkai Yao51202502022-12-12 06:11:46 +000092
Shunkai Yaodba8ba32023-01-27 17:02:21 +000093status_t EffectHalAidl::createAidlConversion(
Shunkai Yao399be682023-03-06 18:54:18 +000094 std::shared_ptr<IEffect> effect,
Shunkai Yaodba8ba32023-01-27 17:02:21 +000095 int32_t sessionId, int32_t ioId,
Shunkai Yao399be682023-03-06 18:54:18 +000096 const Descriptor& desc) {
Shunkai Yaodba8ba32023-01-27 17:02:21 +000097 const auto& typeUuid = desc.common.id.type;
Shunkai Yao242521c2023-01-29 18:08:09 +000098 ALOGI("%s create UUID %s", __func__, typeUuid.toString().c_str());
Shunkai Yao399be682023-03-06 18:54:18 +000099 if (typeUuid ==
100 ::aidl::android::hardware::audio::effect::getEffectTypeUuidAcousticEchoCanceler()) {
Shunkai Yao323273d2023-05-24 00:45:43 +0000101 mConversion = std::make_unique<android::effect::AidlConversionAec>(effect, sessionId, ioId,
102 desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000103 } else if (typeUuid == ::aidl::android::hardware::audio::effect::
104 getEffectTypeUuidAutomaticGainControlV1()) {
Shunkai Yao61ce9572023-02-28 23:55:33 +0000105 mConversion = std::make_unique<android::effect::AidlConversionAgc1>(effect, sessionId, ioId,
Shunkai Yao323273d2023-05-24 00:45:43 +0000106 desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000107 } else if (typeUuid == ::aidl::android::hardware::audio::effect::
108 getEffectTypeUuidAutomaticGainControlV2()) {
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000109 mConversion = std::make_unique<android::effect::AidlConversionAgc2>(effect, sessionId, ioId,
Shunkai Yao323273d2023-05-24 00:45:43 +0000110 desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000111 } else if (typeUuid == ::aidl::android::hardware::audio::effect::getEffectTypeUuidBassBoost()) {
Shunkai Yao323273d2023-05-24 00:45:43 +0000112 mConversion = std::make_unique<android::effect::AidlConversionBassBoost>(
113 effect, sessionId, ioId, desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000114 } else if (typeUuid == ::aidl::android::hardware::audio::effect::getEffectTypeUuidDownmix()) {
Shunkai Yao323273d2023-05-24 00:45:43 +0000115 mConversion = std::make_unique<android::effect::AidlConversionDownmix>(
116 effect, sessionId, ioId, desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000117 } else if (typeUuid ==
118 ::aidl::android::hardware::audio::effect::getEffectTypeUuidDynamicsProcessing()) {
Shunkai Yao323273d2023-05-24 00:45:43 +0000119 mConversion = std::make_unique<android::effect::AidlConversionDp>(effect, sessionId, ioId,
120 desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000121 } else if (typeUuid == ::aidl::android::hardware::audio::effect::getEffectTypeUuidEnvReverb()) {
Shunkai Yao323273d2023-05-24 00:45:43 +0000122 mConversion = std::make_unique<android::effect::AidlConversionEnvReverb>(
123 effect, sessionId, ioId, desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000124 } else if (typeUuid == ::aidl::android::hardware::audio::effect::getEffectTypeUuidEqualizer()) {
Shunkai Yao323273d2023-05-24 00:45:43 +0000125 mConversion = std::make_unique<android::effect::AidlConversionEq>(effect, sessionId, ioId,
126 desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000127 } else if (typeUuid ==
128 ::aidl::android::hardware::audio::effect::getEffectTypeUuidHapticGenerator()) {
Shunkai Yao242521c2023-01-29 18:08:09 +0000129 mConversion = std::make_unique<android::effect::AidlConversionHapticGenerator>(
Shunkai Yao323273d2023-05-24 00:45:43 +0000130 effect, sessionId, ioId, desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000131 } else if (typeUuid ==
132 ::aidl::android::hardware::audio::effect::getEffectTypeUuidLoudnessEnhancer()) {
Shunkai Yao242521c2023-01-29 18:08:09 +0000133 mConversion = std::make_unique<android::effect::AidlConversionLoudnessEnhancer>(
Shunkai Yao323273d2023-05-24 00:45:43 +0000134 effect, sessionId, ioId, desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000135 } else if (typeUuid ==
136 ::aidl::android::hardware::audio::effect::getEffectTypeUuidNoiseSuppression()) {
Shunkai Yao242521c2023-01-29 18:08:09 +0000137 mConversion = std::make_unique<android::effect::AidlConversionNoiseSuppression>(
Shunkai Yao323273d2023-05-24 00:45:43 +0000138 effect, sessionId, ioId, desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000139 } else if (typeUuid ==
140 ::aidl::android::hardware::audio::effect::getEffectTypeUuidPresetReverb()) {
Shunkai Yao242521c2023-01-29 18:08:09 +0000141 mConversion = std::make_unique<android::effect::AidlConversionPresetReverb>(
Shunkai Yao323273d2023-05-24 00:45:43 +0000142 effect, sessionId, ioId, desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000143 } else if (typeUuid ==
144 ::aidl::android::hardware::audio::effect::getEffectTypeUuidSpatializer()) {
Shunkai Yao242521c2023-01-29 18:08:09 +0000145 mConversion = std::make_unique<android::effect::AidlConversionSpatializer>(
Shunkai Yao323273d2023-05-24 00:45:43 +0000146 effect, sessionId, ioId, desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000147 } else if (typeUuid ==
148 ::aidl::android::hardware::audio::effect::getEffectTypeUuidVirtualizer()) {
Shunkai Yao242521c2023-01-29 18:08:09 +0000149 mConversion = std::make_unique<android::effect::AidlConversionVirtualizer>(
Shunkai Yao323273d2023-05-24 00:45:43 +0000150 effect, sessionId, ioId, desc, mIsProxyEffect);
Shunkai Yao399be682023-03-06 18:54:18 +0000151 } else if (typeUuid ==
152 ::aidl::android::hardware::audio::effect::getEffectTypeUuidVisualizer()) {
Shunkai Yao323273d2023-05-24 00:45:43 +0000153 mConversion = std::make_unique<android::effect::AidlConversionVisualizer>(
154 effect, sessionId, ioId, desc, mIsProxyEffect);
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000155 } else {
Shunkai Yao242521c2023-01-29 18:08:09 +0000156 // For unknown UUID, use vendor extension implementation
157 mConversion = std::make_unique<android::effect::AidlConversionVendorExtension>(
Shunkai Yao323273d2023-05-24 00:45:43 +0000158 effect, sessionId, ioId, desc, mIsProxyEffect);
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000159 }
160 return OK;
161}
162
Shunkai Yao51202502022-12-12 06:11:46 +0000163status_t EffectHalAidl::setInBuffer(const sp<EffectBufferHalInterface>& buffer) {
Shunkai Yaoc6308712023-02-22 17:53:04 +0000164 mInBuffer = buffer;
Shunkai Yao51202502022-12-12 06:11:46 +0000165 return OK;
166}
167
168status_t EffectHalAidl::setOutBuffer(const sp<EffectBufferHalInterface>& buffer) {
Shunkai Yaoc6308712023-02-22 17:53:04 +0000169 mOutBuffer = buffer;
Shunkai Yao51202502022-12-12 06:11:46 +0000170 return OK;
171}
172
Shunkai Yaoc6308712023-02-22 17:53:04 +0000173// write to input FMQ here, wait for statusMQ STATUS_OK, and read from output FMQ
Shunkai Yao51202502022-12-12 06:11:46 +0000174status_t EffectHalAidl::process() {
Shunkai Yao1afb46c2024-01-09 20:40:45 +0000175 const std::string effectName = mConversion->getDescriptor().common.name;
Shunkai Yao26689d92023-08-01 23:06:13 +0000176 State state = State::INIT;
177 if (mConversion->isBypassing() || !mEffect->getState(&state).isOk() ||
178 state != State::PROCESSING) {
Shunkai Yao1afb46c2024-01-09 20:40:45 +0000179 ALOGI("%s skipping %s process because it's %s", __func__, effectName.c_str(),
Shunkai Yao26689d92023-08-01 23:06:13 +0000180 mConversion->isBypassing()
181 ? "bypassing"
182 : aidl::android::hardware::audio::effect::toString(state).c_str());
Jaideep Sharmabd9b0d32023-09-20 11:50:25 +0530183 return -ENODATA;
Shunkai Yao26689d92023-08-01 23:06:13 +0000184 }
185
Shunkai Yao1afb46c2024-01-09 20:40:45 +0000186 // check if the DataMq needs any update, timeout at 1ns to avoid being blocked
187 auto efGroup = mConversion->getEventFlagGroup();
188 if (!efGroup) {
189 ALOGE("%s invalid efGroup", __func__);
190 return INVALID_OPERATION;
191 }
192
Shunkai Yaoe317e332024-02-06 00:39:49 +0000193 // use IFactory HAL version because IEffect can be an EffectProxy instance
194 static const int halVersion = [&]() {
195 int version = 0;
196 return mFactory->getInterfaceVersion(&version).isOk() ? version : 0;
197 }();
198
199 if (uint32_t efState = 0; halVersion >= kReopenSupportedVersion &&
200 ::android::OK == efGroup->wait(kEventFlagDataMqUpdate, &efState,
201 1 /* ns */, true /* retry */) &&
202 efState & kEventFlagDataMqUpdate) {
Shunkai Yaoac61ee92024-03-14 21:57:46 +0000203 ALOGV("%s %s V%d receive dataMQUpdate eventFlag from HAL", __func__, effectName.c_str(),
Shunkai Yaoe317e332024-02-06 00:39:49 +0000204 halVersion);
Shunkai Yaoe910bfd2024-04-18 04:36:42 +0000205
Shunkai Yao1afb46c2024-01-09 20:40:45 +0000206 mConversion->reopen();
207 }
Shunkai Yao5c718342023-02-23 23:49:51 +0000208 auto statusQ = mConversion->getStatusMQ();
209 auto inputQ = mConversion->getInputMQ();
210 auto outputQ = mConversion->getOutputMQ();
211 if (!statusQ || !statusQ->isValid() || !inputQ || !inputQ->isValid() || !outputQ ||
Shunkai Yao1afb46c2024-01-09 20:40:45 +0000212 !outputQ->isValid()) {
213 ALOGE("%s invalid FMQ [Status %d I %d O %d]", __func__, statusQ ? statusQ->isValid() : 0,
214 inputQ ? inputQ->isValid() : 0, outputQ ? outputQ->isValid() : 0);
Shunkai Yao5c718342023-02-23 23:49:51 +0000215 return INVALID_OPERATION;
216 }
217
218 size_t available = inputQ->availableToWrite();
Shunkai Yaoc6308712023-02-22 17:53:04 +0000219 size_t floatsToWrite = std::min(available, mInBuffer->getSize() / sizeof(float));
220 if (floatsToWrite == 0) {
Shunkai Yao5c718342023-02-23 23:49:51 +0000221 ALOGE("%s not able to write, floats in buffer %zu, space in FMQ %zu", __func__,
Shunkai Yaoc6308712023-02-22 17:53:04 +0000222 mInBuffer->getSize() / sizeof(float), available);
223 return INVALID_OPERATION;
224 }
Shunkai Yao5c718342023-02-23 23:49:51 +0000225 if (!mInBuffer->audioBuffer() ||
226 !inputQ->write((float*)mInBuffer->audioBuffer()->f32, floatsToWrite)) {
227 ALOGE("%s failed to write %zu floats from audiobuffer %p to inputQ [avail %zu]", __func__,
228 floatsToWrite, mInBuffer->audioBuffer(), inputQ->availableToWrite());
Shunkai Yaoc6308712023-02-22 17:53:04 +0000229 return INVALID_OPERATION;
230 }
Shunkai Yaoe910bfd2024-04-18 04:36:42 +0000231
232 // for V2 audio effect HAL, expect different EventFlag to avoid bit conflict with FMQ_NOT_EMPTY
233 efGroup->wake(halVersion >= kReopenSupportedVersion ? kEventFlagDataMqNotEmpty
234 : kEventFlagNotEmpty);
Shunkai Yaoc6308712023-02-22 17:53:04 +0000235
236 IEffect::Status retStatus{};
Shunkai Yaoe910bfd2024-04-18 04:36:42 +0000237 if (!statusQ->readBlocking(&retStatus, 1)) {
238 ALOGE("%s %s V%d read status from status FMQ failed", __func__, effectName.c_str(),
239 halVersion);
240 return INVALID_OPERATION;
241 }
242 if (retStatus.status != OK || (size_t)retStatus.fmqConsumed != floatsToWrite ||
243 retStatus.fmqProduced == 0) {
244 ALOGE("%s read status failed: %s, consumed %d (of %zu) produced %d", __func__,
245 retStatus.toString().c_str(), retStatus.fmqConsumed, floatsToWrite,
246 retStatus.fmqProduced);
Shunkai Yaoc6308712023-02-22 17:53:04 +0000247 return INVALID_OPERATION;
248 }
249
Shunkai Yao5c718342023-02-23 23:49:51 +0000250 available = outputQ->availableToRead();
Shunkai Yaoc6308712023-02-22 17:53:04 +0000251 size_t floatsToRead = std::min(available, mOutBuffer->getSize() / sizeof(float));
252 if (floatsToRead == 0) {
Shunkai Yao5c718342023-02-23 23:49:51 +0000253 ALOGE("%s not able to read, buffer space %zu, floats in FMQ %zu", __func__,
Shunkai Yaoc6308712023-02-22 17:53:04 +0000254 mOutBuffer->getSize() / sizeof(float), available);
255 return INVALID_OPERATION;
256 }
Shunkai Yao919b73f2024-03-13 00:52:08 +0000257
258 float *outputRawBuffer = mOutBuffer->audioBuffer()->f32;
259 std::vector<float> tempBuffer;
260 if (mConversion->mOutputAccessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE) {
261 tempBuffer.resize(floatsToRead);
262 outputRawBuffer = tempBuffer.data();
263 }
Shunkai Yao5c718342023-02-23 23:49:51 +0000264 // always read floating point data for AIDL
Shunkai Yao919b73f2024-03-13 00:52:08 +0000265 if (!outputQ->read(outputRawBuffer, floatsToRead)) {
Shunkai Yao5c718342023-02-23 23:49:51 +0000266 ALOGE("%s failed to read %zu from outputQ to audioBuffer %p", __func__, floatsToRead,
267 mOutBuffer->audioBuffer());
Shunkai Yaoc6308712023-02-22 17:53:04 +0000268 return INVALID_OPERATION;
269 }
Shunkai Yao919b73f2024-03-13 00:52:08 +0000270 if (mConversion->mOutputAccessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE) {
271 accumulate_float(mOutBuffer->audioBuffer()->f32, outputRawBuffer, floatsToRead);
272 }
Shunkai Yaoc6308712023-02-22 17:53:04 +0000273
Shunkai Yao51202502022-12-12 06:11:46 +0000274 return OK;
275}
276
277// TODO: no one using, maybe deprecate this interface
278status_t EffectHalAidl::processReverse() {
279 ALOGW("%s not implemented yet", __func__);
280 return OK;
281}
282
Shunkai Yao51202502022-12-12 06:11:46 +0000283status_t EffectHalAidl::command(uint32_t cmdCode, uint32_t cmdSize, void* pCmdData,
284 uint32_t* replySize, void* pReplyData) {
Shunkai Yaoc6308712023-02-22 17:53:04 +0000285 TIME_CHECK();
286 if (!mConversion) {
287 ALOGE("%s can not handle command %d when conversion not exist", __func__, cmdCode);
288 return INVALID_OPERATION;
289 }
290
Shunkai Yao5c718342023-02-23 23:49:51 +0000291 return mConversion->handleCommand(cmdCode, cmdSize, pCmdData, replySize, pReplyData);
Shunkai Yao51202502022-12-12 06:11:46 +0000292}
293
294status_t EffectHalAidl::getDescriptor(effect_descriptor_t* pDescriptor) {
Shunkai Yaoc6308712023-02-22 17:53:04 +0000295 TIME_CHECK();
Shunkai Yao51202502022-12-12 06:11:46 +0000296 if (pDescriptor == nullptr) {
Shunkai Yaoc6308712023-02-22 17:53:04 +0000297 ALOGE("%s null descriptor pointer", __func__);
Shunkai Yao51202502022-12-12 06:11:46 +0000298 return BAD_VALUE;
299 }
300 Descriptor aidlDesc;
Mikhail Naganov5e406ba2023-01-13 00:27:22 +0000301 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getDescriptor(&aidlDesc)));
Shunkai Yao51202502022-12-12 06:11:46 +0000302
303 *pDescriptor = VALUE_OR_RETURN_STATUS(
304 ::aidl::android::aidl2legacy_Descriptor_effect_descriptor(aidlDesc));
305 return OK;
306}
307
308status_t EffectHalAidl::close() {
Shunkai Yaoc6308712023-02-22 17:53:04 +0000309 TIME_CHECK();
David Lia6913432024-02-20 09:54:14 +0800310 mEffect->command(CommandId::STOP);
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000311 return statusTFromBinderStatus(mEffect->close());
Shunkai Yao51202502022-12-12 06:11:46 +0000312}
313
314status_t EffectHalAidl::dump(int fd) {
Shunkai Yaoc6308712023-02-22 17:53:04 +0000315 TIME_CHECK();
316 return mEffect->dump(fd, nullptr, 0);
Shunkai Yao51202502022-12-12 06:11:46 +0000317}
318
319} // namespace effect
320} // namespace android