blob: 0c19ac81bc538974c4ca995e88e0972907b60b1a [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
Mikhail Naganov5e406ba2023-01-13 00:27:22 +000023#include <error/expected_utils.h>
Shunkai Yao51202502022-12-12 06:11:46 +000024#include <media/AidlConversionCppNdk.h>
Shunkai Yaoa03533e2023-01-25 06:38:10 +000025#include <media/AidlConversionEffect.h>
Mikhail Naganov5e406ba2023-01-13 00:27:22 +000026#include <media/AidlConversionUtil.h>
Shunkai Yao51202502022-12-12 06:11:46 +000027#include <media/EffectsFactoryApi.h>
28#include <mediautils/TimeCheck.h>
Shunkai Yao242521c2023-01-29 18:08:09 +000029#include <system/audio.h>
Shunkai Yao399be682023-03-06 18:54:18 +000030#include <system/audio_effects/effect_uuid.h>
Shunkai Yao51202502022-12-12 06:11:46 +000031#include <utils/Log.h>
32
33#include "EffectHalAidl.h"
34
Shunkai Yao51202502022-12-12 06:11:46 +000035#include <aidl/android/hardware/audio/effect/IEffect.h>
36
Shunkai Yaodba8ba32023-01-27 17:02:21 +000037#include "effectsAidlConversion/AidlConversionAec.h"
Shunkai Yao61ce9572023-02-28 23:55:33 +000038#include "effectsAidlConversion/AidlConversionAgc1.h"
Shunkai Yaodba8ba32023-01-27 17:02:21 +000039#include "effectsAidlConversion/AidlConversionAgc2.h"
40#include "effectsAidlConversion/AidlConversionBassBoost.h"
41#include "effectsAidlConversion/AidlConversionDownmix.h"
42#include "effectsAidlConversion/AidlConversionDynamicsProcessing.h"
Shunkai Yao242521c2023-01-29 18:08:09 +000043#include "effectsAidlConversion/AidlConversionEnvReverb.h"
44#include "effectsAidlConversion/AidlConversionEq.h"
45#include "effectsAidlConversion/AidlConversionHapticGenerator.h"
46#include "effectsAidlConversion/AidlConversionLoudnessEnhancer.h"
47#include "effectsAidlConversion/AidlConversionNoiseSuppression.h"
48#include "effectsAidlConversion/AidlConversionPresetReverb.h"
49#include "effectsAidlConversion/AidlConversionSpatializer.h"
50#include "effectsAidlConversion/AidlConversionVendorExtension.h"
51#include "effectsAidlConversion/AidlConversionVirtualizer.h"
52#include "effectsAidlConversion/AidlConversionVisualizer.h"
Shunkai Yaodba8ba32023-01-27 17:02:21 +000053
Mikhail Naganov5e406ba2023-01-13 00:27:22 +000054using ::aidl::android::aidl_utils::statusTFromBinderStatus;
Shunkai Yao51202502022-12-12 06:11:46 +000055using ::aidl::android::hardware::audio::effect::Descriptor;
56using ::aidl::android::hardware::audio::effect::IEffect;
Shunkai Yao44bdbad2023-01-14 05:11:58 +000057using ::aidl::android::hardware::audio::effect::IFactory;
Shunkai Yao51202502022-12-12 06:11:46 +000058
59namespace android {
60namespace effect {
61
Shunkai Yao399be682023-03-06 18:54:18 +000062EffectHalAidl::EffectHalAidl(const std::shared_ptr<IFactory>& factory,
63 const std::shared_ptr<IEffect>& effect, uint64_t effectId,
64 int32_t sessionId, int32_t ioId, const Descriptor& desc)
Shunkai Yaodba8ba32023-01-27 17:02:21 +000065 : mFactory(factory),
Shunkai Yao44bdbad2023-01-14 05:11:58 +000066 mEffect(effect),
Shunkai Yao284bb0d2023-01-10 00:42:36 +000067 mEffectId(effectId),
68 mSessionId(sessionId),
69 mIoId(ioId),
Shunkai Yaodba8ba32023-01-27 17:02:21 +000070 mDesc(desc) {
71 createAidlConversion(effect, sessionId, ioId, desc);
72}
Shunkai Yao51202502022-12-12 06:11:46 +000073
Shunkai Yao44bdbad2023-01-14 05:11:58 +000074EffectHalAidl::~EffectHalAidl() {
75 if (mFactory) {
76 mFactory->destroyEffect(mEffect);
77 }
78}
Shunkai Yao51202502022-12-12 06:11:46 +000079
Shunkai Yaodba8ba32023-01-27 17:02:21 +000080status_t EffectHalAidl::createAidlConversion(
Shunkai Yao399be682023-03-06 18:54:18 +000081 std::shared_ptr<IEffect> effect,
Shunkai Yaodba8ba32023-01-27 17:02:21 +000082 int32_t sessionId, int32_t ioId,
Shunkai Yao399be682023-03-06 18:54:18 +000083 const Descriptor& desc) {
Shunkai Yaodba8ba32023-01-27 17:02:21 +000084 const auto& typeUuid = desc.common.id.type;
Shunkai Yao242521c2023-01-29 18:08:09 +000085 ALOGI("%s create UUID %s", __func__, typeUuid.toString().c_str());
Shunkai Yao399be682023-03-06 18:54:18 +000086 if (typeUuid ==
87 ::aidl::android::hardware::audio::effect::getEffectTypeUuidAcousticEchoCanceler()) {
Shunkai Yaodba8ba32023-01-27 17:02:21 +000088 mConversion =
89 std::make_unique<android::effect::AidlConversionAec>(effect, sessionId, ioId, desc);
Shunkai Yao399be682023-03-06 18:54:18 +000090 } else if (typeUuid == ::aidl::android::hardware::audio::effect::
91 getEffectTypeUuidAutomaticGainControlV1()) {
Shunkai Yao61ce9572023-02-28 23:55:33 +000092 mConversion = std::make_unique<android::effect::AidlConversionAgc1>(effect, sessionId, ioId,
93 desc);
Shunkai Yao399be682023-03-06 18:54:18 +000094 } else if (typeUuid == ::aidl::android::hardware::audio::effect::
95 getEffectTypeUuidAutomaticGainControlV2()) {
Shunkai Yaodba8ba32023-01-27 17:02:21 +000096 mConversion = std::make_unique<android::effect::AidlConversionAgc2>(effect, sessionId, ioId,
97 desc);
Shunkai Yao399be682023-03-06 18:54:18 +000098 } else if (typeUuid == ::aidl::android::hardware::audio::effect::getEffectTypeUuidBassBoost()) {
Shunkai Yaodba8ba32023-01-27 17:02:21 +000099 mConversion = std::make_unique<android::effect::AidlConversionBassBoost>(effect, sessionId,
100 ioId, desc);
Shunkai Yao399be682023-03-06 18:54:18 +0000101 } else if (typeUuid == ::aidl::android::hardware::audio::effect::getEffectTypeUuidDownmix()) {
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000102 mConversion = std::make_unique<android::effect::AidlConversionDownmix>(effect, sessionId,
103 ioId, desc);
Shunkai Yao399be682023-03-06 18:54:18 +0000104 } else if (typeUuid ==
105 ::aidl::android::hardware::audio::effect::getEffectTypeUuidDynamicsProcessing()) {
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000106 mConversion =
107 std::make_unique<android::effect::AidlConversionDp>(effect, sessionId, ioId, desc);
Shunkai Yao399be682023-03-06 18:54:18 +0000108 } else if (typeUuid == ::aidl::android::hardware::audio::effect::getEffectTypeUuidEnvReverb()) {
Shunkai Yao242521c2023-01-29 18:08:09 +0000109 mConversion = std::make_unique<android::effect::AidlConversionEnvReverb>(effect, sessionId,
110 ioId, desc);
Shunkai Yao399be682023-03-06 18:54:18 +0000111 } else if (typeUuid == ::aidl::android::hardware::audio::effect::getEffectTypeUuidEqualizer()) {
Shunkai Yao242521c2023-01-29 18:08:09 +0000112 mConversion =
113 std::make_unique<android::effect::AidlConversionEq>(effect, sessionId, ioId, desc);
Shunkai Yao399be682023-03-06 18:54:18 +0000114 } else if (typeUuid ==
115 ::aidl::android::hardware::audio::effect::getEffectTypeUuidHapticGenerator()) {
Shunkai Yao242521c2023-01-29 18:08:09 +0000116 mConversion = std::make_unique<android::effect::AidlConversionHapticGenerator>(
117 effect, sessionId, ioId, desc);
Shunkai Yao399be682023-03-06 18:54:18 +0000118 } else if (typeUuid ==
119 ::aidl::android::hardware::audio::effect::getEffectTypeUuidLoudnessEnhancer()) {
Shunkai Yao242521c2023-01-29 18:08:09 +0000120 mConversion = std::make_unique<android::effect::AidlConversionLoudnessEnhancer>(
121 effect, sessionId, ioId, desc);
Shunkai Yao399be682023-03-06 18:54:18 +0000122 } else if (typeUuid ==
123 ::aidl::android::hardware::audio::effect::getEffectTypeUuidNoiseSuppression()) {
Shunkai Yao242521c2023-01-29 18:08:09 +0000124 mConversion = std::make_unique<android::effect::AidlConversionNoiseSuppression>(
125 effect, sessionId, ioId, desc);
Shunkai Yao399be682023-03-06 18:54:18 +0000126 } else if (typeUuid ==
127 ::aidl::android::hardware::audio::effect::getEffectTypeUuidPresetReverb()) {
Shunkai Yao242521c2023-01-29 18:08:09 +0000128 mConversion = std::make_unique<android::effect::AidlConversionPresetReverb>(
129 effect, sessionId, ioId, desc);
Shunkai Yao399be682023-03-06 18:54:18 +0000130 } else if (typeUuid ==
131 ::aidl::android::hardware::audio::effect::getEffectTypeUuidSpatializer()) {
Shunkai Yao242521c2023-01-29 18:08:09 +0000132 mConversion = std::make_unique<android::effect::AidlConversionSpatializer>(
133 effect, sessionId, ioId, desc);
Shunkai Yao399be682023-03-06 18:54:18 +0000134 } else if (typeUuid ==
135 ::aidl::android::hardware::audio::effect::getEffectTypeUuidVirtualizer()) {
Shunkai Yao242521c2023-01-29 18:08:09 +0000136 mConversion = std::make_unique<android::effect::AidlConversionVirtualizer>(
137 effect, sessionId, ioId, desc);
Shunkai Yao399be682023-03-06 18:54:18 +0000138 } else if (typeUuid ==
139 ::aidl::android::hardware::audio::effect::getEffectTypeUuidVisualizer()) {
Shunkai Yao242521c2023-01-29 18:08:09 +0000140 mConversion = std::make_unique<android::effect::AidlConversionVisualizer>(effect, sessionId,
141 ioId, desc);
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000142 } else {
Shunkai Yao242521c2023-01-29 18:08:09 +0000143 // For unknown UUID, use vendor extension implementation
144 mConversion = std::make_unique<android::effect::AidlConversionVendorExtension>(
145 effect, sessionId, ioId, desc);
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000146 }
147 return OK;
148}
149
Shunkai Yao51202502022-12-12 06:11:46 +0000150status_t EffectHalAidl::setInBuffer(const sp<EffectBufferHalInterface>& buffer) {
Shunkai Yaoc6308712023-02-22 17:53:04 +0000151 mInBuffer = buffer;
Shunkai Yao51202502022-12-12 06:11:46 +0000152 return OK;
153}
154
155status_t EffectHalAidl::setOutBuffer(const sp<EffectBufferHalInterface>& buffer) {
Shunkai Yaoc6308712023-02-22 17:53:04 +0000156 mOutBuffer = buffer;
Shunkai Yao51202502022-12-12 06:11:46 +0000157 return OK;
158}
159
Shunkai Yaoc6308712023-02-22 17:53:04 +0000160
161// write to input FMQ here, wait for statusMQ STATUS_OK, and read from output FMQ
Shunkai Yao51202502022-12-12 06:11:46 +0000162status_t EffectHalAidl::process() {
Shunkai Yaoc6308712023-02-22 17:53:04 +0000163 size_t available = mInputQ->availableToWrite();
164 size_t floatsToWrite = std::min(available, mInBuffer->getSize() / sizeof(float));
165 if (floatsToWrite == 0) {
166 ALOGW("%s not able to write, floats in buffer %zu, space in FMQ %zu", __func__,
167 mInBuffer->getSize() / sizeof(float), available);
168 return INVALID_OPERATION;
169 }
170 if (!mInputQ->write((float*)mInBuffer->ptr(), floatsToWrite)) {
171 ALOGW("%s failed to write %zu into inputQ", __func__, floatsToWrite);
172 return INVALID_OPERATION;
173 }
174
175 IEffect::Status retStatus{};
176 if (!mStatusQ->readBlocking(&retStatus, 1) || retStatus.status != OK ||
177 (size_t)retStatus.fmqConsumed != floatsToWrite || retStatus.fmqProduced == 0) {
178 ALOGW("%s read status failed: %s", __func__, retStatus.toString().c_str());
179 return INVALID_OPERATION;
180 }
181
182 available = mOutputQ->availableToRead();
183 size_t floatsToRead = std::min(available, mOutBuffer->getSize() / sizeof(float));
184 if (floatsToRead == 0) {
185 ALOGW("%s not able to read, buffer space %zu, floats in FMQ %zu", __func__,
186 mOutBuffer->getSize() / sizeof(float), available);
187 return INVALID_OPERATION;
188 }
189 if (!mOutputQ->read((float*)mOutBuffer->ptr(), floatsToRead)) {
190 ALOGW("%s failed to read %zu from outputQ", __func__, floatsToRead);
191 return INVALID_OPERATION;
192 }
193
194 ALOGD("%s %s consumed %zu produced %zu", __func__, mDesc.common.name.c_str(), floatsToWrite,
195 floatsToRead);
Shunkai Yao51202502022-12-12 06:11:46 +0000196 return OK;
197}
198
199// TODO: no one using, maybe deprecate this interface
200status_t EffectHalAidl::processReverse() {
201 ALOGW("%s not implemented yet", __func__);
202 return OK;
203}
204
Shunkai Yao51202502022-12-12 06:11:46 +0000205status_t EffectHalAidl::command(uint32_t cmdCode, uint32_t cmdSize, void* pCmdData,
206 uint32_t* replySize, void* pReplyData) {
Shunkai Yaoc6308712023-02-22 17:53:04 +0000207 TIME_CHECK();
208 if (!mConversion) {
209 ALOGE("%s can not handle command %d when conversion not exist", __func__, cmdCode);
210 return INVALID_OPERATION;
211 }
212
213 status_t ret = mConversion->handleCommand(cmdCode, cmdSize, pCmdData, replySize, pReplyData);
214 // update FMQs when effect open successfully
215 if (ret == OK && cmdCode == EFFECT_CMD_INIT) {
216 const auto& retParam = mConversion->getEffectReturnParam();
217 mStatusQ = std::make_unique<StatusMQ>(retParam.statusMQ);
218 mInputQ = std::make_unique<DataMQ>(retParam.inputDataMQ);
219 mOutputQ = std::make_unique<DataMQ>(retParam.outputDataMQ);
220 if (!mStatusQ->isValid() || !mInputQ->isValid() || !mOutputQ->isValid()) {
221 ALOGE("%s return with invalid FMQ", __func__);
222 return NO_INIT;
223 }
224 }
225
226 return ret;
Shunkai Yao51202502022-12-12 06:11:46 +0000227}
228
229status_t EffectHalAidl::getDescriptor(effect_descriptor_t* pDescriptor) {
Shunkai Yaoc6308712023-02-22 17:53:04 +0000230 TIME_CHECK();
Shunkai Yao51202502022-12-12 06:11:46 +0000231 if (pDescriptor == nullptr) {
Shunkai Yaoc6308712023-02-22 17:53:04 +0000232 ALOGE("%s null descriptor pointer", __func__);
Shunkai Yao51202502022-12-12 06:11:46 +0000233 return BAD_VALUE;
234 }
235 Descriptor aidlDesc;
Mikhail Naganov5e406ba2023-01-13 00:27:22 +0000236 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getDescriptor(&aidlDesc)));
Shunkai Yao51202502022-12-12 06:11:46 +0000237
238 *pDescriptor = VALUE_OR_RETURN_STATUS(
239 ::aidl::android::aidl2legacy_Descriptor_effect_descriptor(aidlDesc));
240 return OK;
241}
242
243status_t EffectHalAidl::close() {
Shunkai Yaoc6308712023-02-22 17:53:04 +0000244 TIME_CHECK();
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000245 return statusTFromBinderStatus(mEffect->close());
Shunkai Yao51202502022-12-12 06:11:46 +0000246}
247
248status_t EffectHalAidl::dump(int fd) {
Shunkai Yaoc6308712023-02-22 17:53:04 +0000249 TIME_CHECK();
250 return mEffect->dump(fd, nullptr, 0);
Shunkai Yao51202502022-12-12 06:11:46 +0000251}
252
253} // namespace effect
254} // namespace android