blob: 8fa301aaceaf894ddcb48cd0cc991d61b7493bec [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
17#define LOG_TAG "EffectHalAidl"
18//#define LOG_NDEBUG 0
19
Shunkai Yao242521c2023-01-29 18:08:09 +000020#include <memory>
21
Mikhail Naganov5e406ba2023-01-13 00:27:22 +000022#include <error/expected_utils.h>
Shunkai Yao51202502022-12-12 06:11:46 +000023#include <media/AidlConversionCppNdk.h>
Shunkai Yaoa03533e2023-01-25 06:38:10 +000024#include <media/AidlConversionEffect.h>
Mikhail Naganov5e406ba2023-01-13 00:27:22 +000025#include <media/AidlConversionUtil.h>
Shunkai Yaodba8ba32023-01-27 17:02:21 +000026#include <media/audiohal/AudioEffectUuid.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 Yao51202502022-12-12 06:11:46 +000030#include <utils/Log.h>
31
32#include "EffectHalAidl.h"
33
Shunkai Yao51202502022-12-12 06:11:46 +000034#include <aidl/android/hardware/audio/effect/IEffect.h>
35
Shunkai Yaodba8ba32023-01-27 17:02:21 +000036#include "effectsAidlConversion/AidlConversionAec.h"
37#include "effectsAidlConversion/AidlConversionAgc2.h"
38#include "effectsAidlConversion/AidlConversionBassBoost.h"
39#include "effectsAidlConversion/AidlConversionDownmix.h"
40#include "effectsAidlConversion/AidlConversionDynamicsProcessing.h"
Shunkai Yao242521c2023-01-29 18:08:09 +000041#include "effectsAidlConversion/AidlConversionEnvReverb.h"
42#include "effectsAidlConversion/AidlConversionEq.h"
43#include "effectsAidlConversion/AidlConversionHapticGenerator.h"
44#include "effectsAidlConversion/AidlConversionLoudnessEnhancer.h"
45#include "effectsAidlConversion/AidlConversionNoiseSuppression.h"
46#include "effectsAidlConversion/AidlConversionPresetReverb.h"
47#include "effectsAidlConversion/AidlConversionSpatializer.h"
48#include "effectsAidlConversion/AidlConversionVendorExtension.h"
49#include "effectsAidlConversion/AidlConversionVirtualizer.h"
50#include "effectsAidlConversion/AidlConversionVisualizer.h"
Shunkai Yaodba8ba32023-01-27 17:02:21 +000051
Mikhail Naganov5e406ba2023-01-13 00:27:22 +000052using ::aidl::android::aidl_utils::statusTFromBinderStatus;
Shunkai Yao51202502022-12-12 06:11:46 +000053using ::aidl::android::hardware::audio::effect::CommandId;
54using ::aidl::android::hardware::audio::effect::Descriptor;
55using ::aidl::android::hardware::audio::effect::IEffect;
Shunkai Yao44bdbad2023-01-14 05:11:58 +000056using ::aidl::android::hardware::audio::effect::IFactory;
Shunkai Yao51202502022-12-12 06:11:46 +000057using ::aidl::android::hardware::audio::effect::Parameter;
58
59namespace android {
60namespace effect {
61
Shunkai Yao44bdbad2023-01-14 05:11:58 +000062EffectHalAidl::EffectHalAidl(
63 const std::shared_ptr<::aidl::android::hardware::audio::effect::IFactory>& factory,
64 const std::shared_ptr<::aidl::android::hardware::audio::effect::IEffect>& effect,
65 uint64_t effectId, int32_t sessionId, int32_t ioId,
66 const ::aidl::android::hardware::audio::effect::Descriptor& desc)
Shunkai Yaodba8ba32023-01-27 17:02:21 +000067 : mFactory(factory),
Shunkai Yao44bdbad2023-01-14 05:11:58 +000068 mEffect(effect),
Shunkai Yao284bb0d2023-01-10 00:42:36 +000069 mEffectId(effectId),
70 mSessionId(sessionId),
71 mIoId(ioId),
Shunkai Yaodba8ba32023-01-27 17:02:21 +000072 mDesc(desc) {
73 createAidlConversion(effect, sessionId, ioId, desc);
74}
Shunkai Yao51202502022-12-12 06:11:46 +000075
Shunkai Yao44bdbad2023-01-14 05:11:58 +000076EffectHalAidl::~EffectHalAidl() {
77 if (mFactory) {
78 mFactory->destroyEffect(mEffect);
79 }
80}
Shunkai Yao51202502022-12-12 06:11:46 +000081
Shunkai Yaodba8ba32023-01-27 17:02:21 +000082status_t EffectHalAidl::createAidlConversion(
83 std::shared_ptr<::aidl::android::hardware::audio::effect::IEffect> effect,
84 int32_t sessionId, int32_t ioId,
85 const ::aidl::android::hardware::audio::effect::Descriptor& desc) {
86 const auto& typeUuid = desc.common.id.type;
Shunkai Yao242521c2023-01-29 18:08:09 +000087 ALOGI("%s create UUID %s", __func__, typeUuid.toString().c_str());
Shunkai Yaodba8ba32023-01-27 17:02:21 +000088 if (typeUuid == kAcousticEchoCancelerTypeUUID) {
89 mConversion =
90 std::make_unique<android::effect::AidlConversionAec>(effect, sessionId, ioId, desc);
Shunkai Yao242521c2023-01-29 18:08:09 +000091 } else if (typeUuid == kAutomaticGainControl2TypeUUID) {
Shunkai Yaodba8ba32023-01-27 17:02:21 +000092 mConversion = std::make_unique<android::effect::AidlConversionAgc2>(effect, sessionId, ioId,
93 desc);
94 } else if (typeUuid == kBassBoostTypeUUID) {
95 mConversion = std::make_unique<android::effect::AidlConversionBassBoost>(effect, sessionId,
96 ioId, desc);
97 } else if (typeUuid == kDownmixTypeUUID) {
98 mConversion = std::make_unique<android::effect::AidlConversionDownmix>(effect, sessionId,
99 ioId, desc);
100 } else if (typeUuid == kDynamicsProcessingTypeUUID) {
101 mConversion =
102 std::make_unique<android::effect::AidlConversionDp>(effect, sessionId, ioId, desc);
Shunkai Yao242521c2023-01-29 18:08:09 +0000103 } else if (typeUuid == kEnvReverbTypeUUID) {
104 mConversion = std::make_unique<android::effect::AidlConversionEnvReverb>(effect, sessionId,
105 ioId, desc);
106 } else if (typeUuid == kEqualizerTypeUUID) {
107 mConversion =
108 std::make_unique<android::effect::AidlConversionEq>(effect, sessionId, ioId, desc);
109 } else if (typeUuid == kHapticGeneratorTypeUUID) {
110 mConversion = std::make_unique<android::effect::AidlConversionHapticGenerator>(
111 effect, sessionId, ioId, desc);
112 } else if (typeUuid == kLoudnessEnhancerTypeUUID) {
113 mConversion = std::make_unique<android::effect::AidlConversionLoudnessEnhancer>(
114 effect, sessionId, ioId, desc);
115 } else if (typeUuid == kNoiseSuppressionTypeUUID) {
116 mConversion = std::make_unique<android::effect::AidlConversionNoiseSuppression>(
117 effect, sessionId, ioId, desc);
118 } else if (typeUuid == kPresetReverbTypeUUID) {
119 mConversion = std::make_unique<android::effect::AidlConversionPresetReverb>(
120 effect, sessionId, ioId, desc);
121 } else if (typeUuid == kSpatializerTypeUUID) {
122 mConversion = std::make_unique<android::effect::AidlConversionSpatializer>(
123 effect, sessionId, ioId, desc);
124 } else if (typeUuid == kVirtualizerTypeUUID) {
125 mConversion = std::make_unique<android::effect::AidlConversionVirtualizer>(
126 effect, sessionId, ioId, desc);
127 } else if (typeUuid == kVisualizerTypeUUID) {
128 mConversion = std::make_unique<android::effect::AidlConversionVisualizer>(effect, sessionId,
129 ioId, desc);
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000130 } else {
Shunkai Yao242521c2023-01-29 18:08:09 +0000131 // For unknown UUID, use vendor extension implementation
132 mConversion = std::make_unique<android::effect::AidlConversionVendorExtension>(
133 effect, sessionId, ioId, desc);
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000134 }
135 return OK;
136}
137
Shunkai Yao51202502022-12-12 06:11:46 +0000138status_t EffectHalAidl::setInBuffer(const sp<EffectBufferHalInterface>& buffer) {
139 if (buffer == nullptr) {
140 return BAD_VALUE;
141 }
142 ALOGW("%s not implemented yet", __func__);
143 return OK;
144}
145
146status_t EffectHalAidl::setOutBuffer(const sp<EffectBufferHalInterface>& buffer) {
147 if (buffer == nullptr) {
148 return BAD_VALUE;
149 }
150 ALOGW("%s not implemented yet", __func__);
151 return OK;
152}
153
154status_t EffectHalAidl::process() {
155 ALOGW("%s not implemented yet", __func__);
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000156 // write to input FMQ here, and wait for statusMQ STATUS_OK
Shunkai Yao51202502022-12-12 06:11:46 +0000157 return OK;
158}
159
160// TODO: no one using, maybe deprecate this interface
161status_t EffectHalAidl::processReverse() {
162 ALOGW("%s not implemented yet", __func__);
163 return OK;
164}
165
Shunkai Yao51202502022-12-12 06:11:46 +0000166status_t EffectHalAidl::command(uint32_t cmdCode, uint32_t cmdSize, void* pCmdData,
167 uint32_t* replySize, void* pReplyData) {
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000168 return mConversion
169 ? mConversion->handleCommand(cmdCode, cmdSize, pCmdData, replySize, pReplyData)
170 : INVALID_OPERATION;
Shunkai Yao51202502022-12-12 06:11:46 +0000171}
172
173status_t EffectHalAidl::getDescriptor(effect_descriptor_t* pDescriptor) {
174 ALOGW("%s %p", __func__, pDescriptor);
175 if (pDescriptor == nullptr) {
176 return BAD_VALUE;
177 }
178 Descriptor aidlDesc;
Mikhail Naganov5e406ba2023-01-13 00:27:22 +0000179 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getDescriptor(&aidlDesc)));
Shunkai Yao51202502022-12-12 06:11:46 +0000180
181 *pDescriptor = VALUE_OR_RETURN_STATUS(
182 ::aidl::android::aidl2legacy_Descriptor_effect_descriptor(aidlDesc));
183 return OK;
184}
185
186status_t EffectHalAidl::close() {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000187 return statusTFromBinderStatus(mEffect->close());
Shunkai Yao51202502022-12-12 06:11:46 +0000188}
189
190status_t EffectHalAidl::dump(int fd) {
191 ALOGW("%s not implemented yet, fd %d", __func__, fd);
192 return OK;
193}
194
195} // namespace effect
196} // namespace android