blob: 960273b4779a2a49b8a6ccc8ee261c6e19128a4e [file] [log] [blame]
Shunkai Yao242521c2023-01-29 18:08:09 +00001/*
2 * Copyright (C) 2023 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#include <cstdint>
18#include <cstring>
19#include <optional>
20#define LOG_TAG "AidlConversionEnvReverb"
21//#define LOG_NDEBUG 0
22
23#include <error/expected_utils.h>
24#include <media/AidlConversionCppNdk.h>
25#include <media/AidlConversionNdk.h>
26#include <media/AidlConversionEffect.h>
27#include <media/audiohal/AudioEffectUuid.h>
28#include <system/audio_effects/effect_environmentalreverb.h>
29
30#include <utils/Log.h>
31
32#include "AidlConversionEnvReverb.h"
33
34namespace android {
35namespace effect {
36
37using ::aidl::android::convertIntegral;
38using ::aidl::android::getParameterSpecificField;
39using ::aidl::android::aidl_utils::statusTFromBinderStatus;
40using ::aidl::android::hardware::audio::effect::EnvironmentalReverb;
41using ::aidl::android::hardware::audio::effect::Parameter;
42using ::android::status_t;
43using utils::EffectParamReader;
44using utils::EffectParamWriter;
45
46#define MAKE_AIDL_PARAMETER(aidlParam, param, value, tag) \
47 { \
48 if (OK != param.readFromValue(&value)) { \
49 ALOGE("%s invalid parameter %s %d", __func__, #tag, value); \
50 return BAD_VALUE; \
51 } \
52 aidlParam = MAKE_SPECIFIC_PARAMETER( \
53 EnvironmentalReverb, environmentalReverb, tag, \
54 VALUE_OR_RETURN_STATUS(aidl::android::convertIntegral<int>(value))); \
55 }
56
57#define GET_AIDL_PARAMETER(tag, value, param) \
58 { \
59 Parameter aidlParam; \
60 Parameter::Id id = MAKE_SPECIFIC_PARAMETER_ID(EnvironmentalReverb, environmentalReverbTag, \
61 EnvironmentalReverb::tag); \
62 RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam))); \
63 value = VALUE_OR_RETURN_STATUS(GET_PARAMETER_SPECIFIC_FIELD( \
64 aidlParam, EnvironmentalReverb, environmentalReverb, EnvironmentalReverb::tag, \
65 std::decay_t<decltype(value)>)); \
66 return param.writeToValue(&value); \
67 }
68
69status_t AidlConversionEnvReverb::setParameter(EffectParamReader& param) {
70 uint32_t type = 0;
71 if (!param.validateParamValueSize(sizeof(uint32_t), sizeof(uint16_t)) ||
72 OK != param.readFromParameter(&type)) {
73 ALOGE("%s invalid param %s", __func__, param.toString().c_str());
74 return BAD_VALUE;
75 }
76 Parameter aidlParam;
77 uint16_t value16;
78 uint32_t value32;
79 switch (type) {
80 case REVERB_PARAM_ROOM_LEVEL: {
81 MAKE_AIDL_PARAMETER(aidlParam, param, value16, roomLevelMb);
82 break;
83 }
84 case REVERB_PARAM_ROOM_HF_LEVEL: {
85 MAKE_AIDL_PARAMETER(aidlParam, param, value16, roomHfLevelMb);
86 break;
87 }
88 case REVERB_PARAM_DECAY_TIME: {
89 MAKE_AIDL_PARAMETER(aidlParam, param, value32, decayTimeMs);
90 break;
91 }
92 case REVERB_PARAM_DECAY_HF_RATIO: {
93 MAKE_AIDL_PARAMETER(aidlParam, param, value16, decayHfRatioPm);
94 break;
95 }
96 case REVERB_PARAM_REVERB_LEVEL: {
97 MAKE_AIDL_PARAMETER(aidlParam, param, value16, levelMb);
98 break;
99 }
100 case REVERB_PARAM_REVERB_DELAY: {
101 MAKE_AIDL_PARAMETER(aidlParam, param, value32, delayMs);
102 break;
103 }
104 case REVERB_PARAM_DIFFUSION: {
105 MAKE_AIDL_PARAMETER(aidlParam, param, value16, diffusionPm);
106 break;
107 }
108 case REVERB_PARAM_DENSITY: {
109 MAKE_AIDL_PARAMETER(aidlParam, param, value16, densityPm);
110 break;
111 }
112 case REVERB_PARAM_BYPASS: {
113 if (OK != param.readFromValue(&value32)) {
114 ALOGE("%s invalid bypass parameter %d", __func__, value32);
115 return BAD_VALUE;
116 }
117 bool isByPass = VALUE_OR_RETURN_STATUS(aidl::android::convertIntegral<bool>(value32));
118 aidlParam = MAKE_SPECIFIC_PARAMETER(EnvironmentalReverb, environmentalReverb, bypass,
119 isByPass);
120 break;
121 }
122 case REVERB_PARAM_REFLECTIONS_LEVEL: {
123 // TODO
124 break;
125 }
126 case REVERB_PARAM_REFLECTIONS_DELAY: {
127 // TODO
128 break;
129 }
130 case REVERB_PARAM_PROPERTIES: {
131 // TODO
132 break;
133 }
134 default: {
135 // TODO: handle with vendor extension
136 }
137 }
138 return statusTFromBinderStatus(mEffect->setParameter(aidlParam));
139}
140
141status_t AidlConversionEnvReverb::getParameter(EffectParamWriter& param) {
142 uint32_t type = 0;
143 if (!param.validateParamValueSize(sizeof(uint32_t), sizeof(uint32_t)) ||
144 OK != param.readFromParameter(&type)) {
145 ALOGE("%s invalid param %s", __func__, param.toString().c_str());
146 param.setStatus(BAD_VALUE);
147 return BAD_VALUE;
148 }
149 uint16_t value16;
150 uint32_t value32;
151 switch (type) {
152 case REVERB_PARAM_ROOM_LEVEL: {
153 GET_AIDL_PARAMETER(roomLevelMb, value16, param);
154 }
155 case REVERB_PARAM_ROOM_HF_LEVEL: {
156 GET_AIDL_PARAMETER(roomHfLevelMb, value16, param);
157 }
158 case REVERB_PARAM_DECAY_TIME: {
159 GET_AIDL_PARAMETER(decayTimeMs, value32, param);
160 }
161 case REVERB_PARAM_DECAY_HF_RATIO: {
162 GET_AIDL_PARAMETER(decayHfRatioPm, value16, param);
163 }
164 case REVERB_PARAM_REVERB_LEVEL: {
165 GET_AIDL_PARAMETER(levelMb, value16, param);
166 }
167 case REVERB_PARAM_REVERB_DELAY: {
168 GET_AIDL_PARAMETER(delayMs, value32, param);
169 }
170 case REVERB_PARAM_DIFFUSION: {
171 GET_AIDL_PARAMETER(diffusionPm, value16, param);
172 }
173 case REVERB_PARAM_DENSITY: {
174 GET_AIDL_PARAMETER(densityPm, value16, param);
175 }
176 case REVERB_PARAM_BYPASS: {
177 bool isByPass;
178 GET_AIDL_PARAMETER(bypass, isByPass, param);
179 }
180 case REVERB_PARAM_REFLECTIONS_LEVEL: {
181 // TODO
182 break;
183 }
184 case REVERB_PARAM_REFLECTIONS_DELAY: {
185 // TODO
186 break;
187 }
188 case REVERB_PARAM_PROPERTIES: {
189 // TODO
190 break;
191 }
192 default: {
193 // TODO: handle with vendor extension
194 }
195 }
196 return BAD_VALUE;
197}
198
199} // namespace effect
200} // namespace android