blob: 08040f3d5983a4e1193108187faa1093b52f4ce3 [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 Yaodba8ba32023-01-27 17:02:21 +000017#include <memory>
Shunkai Yao51202502022-12-12 06:11:46 +000018#define LOG_TAG "EffectHalAidl"
19//#define LOG_NDEBUG 0
20
Mikhail Naganov5e406ba2023-01-13 00:27:22 +000021#include <error/expected_utils.h>
Shunkai Yao51202502022-12-12 06:11:46 +000022#include <media/AidlConversionCppNdk.h>
Shunkai Yaoa03533e2023-01-25 06:38:10 +000023#include <media/AidlConversionEffect.h>
Mikhail Naganov5e406ba2023-01-13 00:27:22 +000024#include <media/AidlConversionUtil.h>
Shunkai Yaodba8ba32023-01-27 17:02:21 +000025#include <media/audiohal/AudioEffectUuid.h>
Shunkai Yao51202502022-12-12 06:11:46 +000026#include <media/EffectsFactoryApi.h>
27#include <mediautils/TimeCheck.h>
28#include <utils/Log.h>
29
Shunkai Yao284bb0d2023-01-10 00:42:36 +000030#include <system/audio_effects/effect_aec.h>
31#include <system/audio_effects/effect_downmix.h>
32#include <system/audio_effects/effect_dynamicsprocessing.h>
33#include <system/audio_effects/effect_hapticgenerator.h>
34#include <system/audio_effects/effect_ns.h>
35#include <system/audio_effects/effect_spatializer.h>
36#include <system/audio_effects/effect_visualizer.h>
37
Shunkai Yao51202502022-12-12 06:11:46 +000038#include "EffectHalAidl.h"
39
40#include <system/audio.h>
Shunkai Yao51202502022-12-12 06:11:46 +000041#include <aidl/android/hardware/audio/effect/IEffect.h>
42
Shunkai Yaodba8ba32023-01-27 17:02:21 +000043#include "effectsAidlConversion/AidlConversionAec.h"
44#include "effectsAidlConversion/AidlConversionAgc2.h"
45#include "effectsAidlConversion/AidlConversionBassBoost.h"
46#include "effectsAidlConversion/AidlConversionDownmix.h"
47#include "effectsAidlConversion/AidlConversionDynamicsProcessing.h"
48
Mikhail Naganov5e406ba2023-01-13 00:27:22 +000049using ::aidl::android::aidl_utils::statusTFromBinderStatus;
Shunkai Yao51202502022-12-12 06:11:46 +000050using ::aidl::android::hardware::audio::effect::CommandId;
51using ::aidl::android::hardware::audio::effect::Descriptor;
52using ::aidl::android::hardware::audio::effect::IEffect;
Shunkai Yao44bdbad2023-01-14 05:11:58 +000053using ::aidl::android::hardware::audio::effect::IFactory;
Shunkai Yao51202502022-12-12 06:11:46 +000054using ::aidl::android::hardware::audio::effect::Parameter;
55
56namespace android {
57namespace effect {
58
Shunkai Yao44bdbad2023-01-14 05:11:58 +000059EffectHalAidl::EffectHalAidl(
60 const std::shared_ptr<::aidl::android::hardware::audio::effect::IFactory>& factory,
61 const std::shared_ptr<::aidl::android::hardware::audio::effect::IEffect>& effect,
62 uint64_t effectId, int32_t sessionId, int32_t ioId,
63 const ::aidl::android::hardware::audio::effect::Descriptor& desc)
Shunkai Yaodba8ba32023-01-27 17:02:21 +000064 : mFactory(factory),
Shunkai Yao44bdbad2023-01-14 05:11:58 +000065 mEffect(effect),
Shunkai Yao284bb0d2023-01-10 00:42:36 +000066 mEffectId(effectId),
67 mSessionId(sessionId),
68 mIoId(ioId),
Shunkai Yaodba8ba32023-01-27 17:02:21 +000069 mDesc(desc) {
70 createAidlConversion(effect, sessionId, ioId, desc);
71}
Shunkai Yao51202502022-12-12 06:11:46 +000072
Shunkai Yao44bdbad2023-01-14 05:11:58 +000073EffectHalAidl::~EffectHalAidl() {
74 if (mFactory) {
75 mFactory->destroyEffect(mEffect);
76 }
77}
Shunkai Yao51202502022-12-12 06:11:46 +000078
Shunkai Yaodba8ba32023-01-27 17:02:21 +000079status_t EffectHalAidl::createAidlConversion(
80 std::shared_ptr<::aidl::android::hardware::audio::effect::IEffect> effect,
81 int32_t sessionId, int32_t ioId,
82 const ::aidl::android::hardware::audio::effect::Descriptor& desc) {
83 const auto& typeUuid = desc.common.id.type;
84 if (typeUuid == kAcousticEchoCancelerTypeUUID) {
85 mConversion =
86 std::make_unique<android::effect::AidlConversionAec>(effect, sessionId, ioId, desc);
87 } else if (typeUuid == kAutomaticGainControlTypeUUID) {
88 mConversion = std::make_unique<android::effect::AidlConversionAgc2>(effect, sessionId, ioId,
89 desc);
90 } else if (typeUuid == kBassBoostTypeUUID) {
91 mConversion = std::make_unique<android::effect::AidlConversionBassBoost>(effect, sessionId,
92 ioId, desc);
93 } else if (typeUuid == kDownmixTypeUUID) {
94 mConversion = std::make_unique<android::effect::AidlConversionDownmix>(effect, sessionId,
95 ioId, desc);
96 } else if (typeUuid == kDynamicsProcessingTypeUUID) {
97 mConversion =
98 std::make_unique<android::effect::AidlConversionDp>(effect, sessionId, ioId, desc);
99 } else {
100 ALOGE("%s effect not implemented yet, UUID type: %s", __func__,
101 typeUuid.toString().c_str());
102 return BAD_VALUE;
103 }
104 return OK;
105}
106
Shunkai Yao51202502022-12-12 06:11:46 +0000107status_t EffectHalAidl::setInBuffer(const sp<EffectBufferHalInterface>& buffer) {
108 if (buffer == nullptr) {
109 return BAD_VALUE;
110 }
111 ALOGW("%s not implemented yet", __func__);
112 return OK;
113}
114
115status_t EffectHalAidl::setOutBuffer(const sp<EffectBufferHalInterface>& buffer) {
116 if (buffer == nullptr) {
117 return BAD_VALUE;
118 }
119 ALOGW("%s not implemented yet", __func__);
120 return OK;
121}
122
123status_t EffectHalAidl::process() {
124 ALOGW("%s not implemented yet", __func__);
Shunkai Yao284bb0d2023-01-10 00:42:36 +0000125 // write to input FMQ here, and wait for statusMQ STATUS_OK
Shunkai Yao51202502022-12-12 06:11:46 +0000126 return OK;
127}
128
129// TODO: no one using, maybe deprecate this interface
130status_t EffectHalAidl::processReverse() {
131 ALOGW("%s not implemented yet", __func__);
132 return OK;
133}
134
Shunkai Yao51202502022-12-12 06:11:46 +0000135status_t EffectHalAidl::command(uint32_t cmdCode, uint32_t cmdSize, void* pCmdData,
136 uint32_t* replySize, void* pReplyData) {
Shunkai Yaodba8ba32023-01-27 17:02:21 +0000137 return mConversion
138 ? mConversion->handleCommand(cmdCode, cmdSize, pCmdData, replySize, pReplyData)
139 : INVALID_OPERATION;
Shunkai Yao51202502022-12-12 06:11:46 +0000140}
141
142status_t EffectHalAidl::getDescriptor(effect_descriptor_t* pDescriptor) {
143 ALOGW("%s %p", __func__, pDescriptor);
144 if (pDescriptor == nullptr) {
145 return BAD_VALUE;
146 }
147 Descriptor aidlDesc;
Mikhail Naganov5e406ba2023-01-13 00:27:22 +0000148 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getDescriptor(&aidlDesc)));
Shunkai Yao51202502022-12-12 06:11:46 +0000149
150 *pDescriptor = VALUE_OR_RETURN_STATUS(
151 ::aidl::android::aidl2legacy_Descriptor_effect_descriptor(aidlDesc));
152 return OK;
153}
154
155status_t EffectHalAidl::close() {
Shunkai Yao44bdbad2023-01-14 05:11:58 +0000156 return statusTFromBinderStatus(mEffect->close());
Shunkai Yao51202502022-12-12 06:11:46 +0000157}
158
159status_t EffectHalAidl::dump(int fd) {
160 ALOGW("%s not implemented yet, fd %d", __func__, fd);
161 return OK;
162}
163
164} // namespace effect
165} // namespace android