blob: 7937a6a2471f22067671156696d31d3d07962e99 [file] [log] [blame]
Shunkai Yao6afc8552022-10-26 22:47:20 +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 Yao6afc8552022-10-26 22:47:20 +000017#include <algorithm>
Mikhail Naganov872d4a62023-03-09 18:19:01 -080018#include <cstddef>
Shunkai Yao6afc8552022-10-26 22:47:20 +000019#include <unordered_set>
20
Mikhail Naganov872d4a62023-03-09 18:19:01 -080021#define LOG_TAG "AHAL_EnvReverbSw"
Shunkai Yao6afc8552022-10-26 22:47:20 +000022#include <android-base/logging.h>
23#include <fmq/AidlMessageQueue.h>
Shunkai Yaof8be1ac2023-03-06 18:41:27 +000024#include <system/audio_effects/effect_uuid.h>
Shunkai Yao6afc8552022-10-26 22:47:20 +000025
Shunkai Yao812d5b42022-11-16 18:08:50 +000026#include "EnvReverbSw.h"
Shunkai Yao6afc8552022-10-26 22:47:20 +000027
Shunkai Yaoc12e0822022-12-12 07:13:58 +000028using aidl::android::hardware::audio::effect::Descriptor;
Shunkai Yao812d5b42022-11-16 18:08:50 +000029using aidl::android::hardware::audio::effect::EnvReverbSw;
Shunkai Yaof8be1ac2023-03-06 18:41:27 +000030using aidl::android::hardware::audio::effect::getEffectImplUuidEnvReverbSw;
31using aidl::android::hardware::audio::effect::getEffectTypeUuidEnvReverb;
Shunkai Yao6afc8552022-10-26 22:47:20 +000032using aidl::android::hardware::audio::effect::IEffect;
Shunkai Yao6afc8552022-10-26 22:47:20 +000033using aidl::android::hardware::audio::effect::State;
34using aidl::android::media::audio::common::AudioUuid;
35
36extern "C" binder_exception_t createEffect(const AudioUuid* in_impl_uuid,
37 std::shared_ptr<IEffect>* instanceSpp) {
Shunkai Yaof8be1ac2023-03-06 18:41:27 +000038 if (!in_impl_uuid || *in_impl_uuid != getEffectImplUuidEnvReverbSw()) {
Shunkai Yao6afc8552022-10-26 22:47:20 +000039 LOG(ERROR) << __func__ << "uuid not supported";
40 return EX_ILLEGAL_ARGUMENT;
41 }
42 if (instanceSpp) {
Shunkai Yao812d5b42022-11-16 18:08:50 +000043 *instanceSpp = ndk::SharedRefBase::make<EnvReverbSw>();
Shunkai Yao6afc8552022-10-26 22:47:20 +000044 LOG(DEBUG) << __func__ << " instance " << instanceSpp->get() << " created";
45 return EX_NONE;
46 } else {
47 LOG(ERROR) << __func__ << " invalid input parameter!";
48 return EX_ILLEGAL_ARGUMENT;
49 }
50}
51
Shunkai Yaoc12e0822022-12-12 07:13:58 +000052extern "C" binder_exception_t queryEffect(const AudioUuid* in_impl_uuid, Descriptor* _aidl_return) {
Shunkai Yaof8be1ac2023-03-06 18:41:27 +000053 if (!in_impl_uuid || *in_impl_uuid != getEffectImplUuidEnvReverbSw()) {
Shunkai Yaoc12e0822022-12-12 07:13:58 +000054 LOG(ERROR) << __func__ << "uuid not supported";
55 return EX_ILLEGAL_ARGUMENT;
Shunkai Yao6afc8552022-10-26 22:47:20 +000056 }
Shunkai Yaoc12e0822022-12-12 07:13:58 +000057 *_aidl_return = EnvReverbSw::kDescriptor;
Shunkai Yao6afc8552022-10-26 22:47:20 +000058 return EX_NONE;
59}
60
61namespace aidl::android::hardware::audio::effect {
62
Shunkai Yaoc12e0822022-12-12 07:13:58 +000063const std::string EnvReverbSw::kEffectName = "EnvReverbSw";
Shunkai Yao87811022023-02-13 17:40:37 +000064
65const std::vector<Range::EnvironmentalReverbRange> EnvReverbSw::kRanges = {
66 MAKE_RANGE(EnvironmentalReverb, roomLevelMb, -6000, 0),
67 MAKE_RANGE(EnvironmentalReverb, roomHfLevelMb, -4000, 0),
68 MAKE_RANGE(EnvironmentalReverb, decayTimeMs, 0, 7000),
69 MAKE_RANGE(EnvironmentalReverb, decayHfRatioPm, 100, 2000),
Shunkai Yao2ddafc22023-02-21 18:02:10 +000070 MAKE_RANGE(EnvironmentalReverb, reflectionsLevelMb, -6000, 0),
71 MAKE_RANGE(EnvironmentalReverb, reflectionsDelayMs, 0, 65),
Shunkai Yao87811022023-02-13 17:40:37 +000072 MAKE_RANGE(EnvironmentalReverb, levelMb, -6000, 0),
73 MAKE_RANGE(EnvironmentalReverb, delayMs, 0, 65),
74 MAKE_RANGE(EnvironmentalReverb, diffusionPm, 0, 1000),
75 MAKE_RANGE(EnvironmentalReverb, densityPm, 0, 1000)};
76
77const Capability EnvReverbSw::kCapability = {
78 .range = Range::make<Range::environmentalReverb>(EnvReverbSw::kRanges)};
79
Shunkai Yaoc12e0822022-12-12 07:13:58 +000080const Descriptor EnvReverbSw::kDescriptor = {
Shunkai Yaof8be1ac2023-03-06 18:41:27 +000081 .common = {.id = {.type = getEffectTypeUuidEnvReverb(),
82 .uuid = getEffectImplUuidEnvReverbSw(),
Shunkai Yaoc12e0822022-12-12 07:13:58 +000083 .proxy = std::nullopt},
84 .flags = {.type = Flags::Type::INSERT,
85 .insert = Flags::Insert::FIRST,
86 .volume = Flags::Volume::CTRL},
87 .name = EnvReverbSw::kEffectName,
88 .implementor = "The Android Open Source Project"},
Shunkai Yao87811022023-02-13 17:40:37 +000089 .capability = EnvReverbSw::kCapability};
Shunkai Yaoc12e0822022-12-12 07:13:58 +000090
Shunkai Yao812d5b42022-11-16 18:08:50 +000091ndk::ScopedAStatus EnvReverbSw::getDescriptor(Descriptor* _aidl_return) {
Shunkai Yao6afc8552022-10-26 22:47:20 +000092 LOG(DEBUG) << __func__ << kDescriptor.toString();
93 *_aidl_return = kDescriptor;
94 return ndk::ScopedAStatus::ok();
95}
96
Shunkai Yao812d5b42022-11-16 18:08:50 +000097ndk::ScopedAStatus EnvReverbSw::setParameterSpecific(const Parameter::Specific& specific) {
Shunkai Yaoc12e0822022-12-12 07:13:58 +000098 RETURN_IF(Parameter::Specific::environmentalReverb != specific.getTag(), EX_ILLEGAL_ARGUMENT,
Shunkai Yao6afc8552022-10-26 22:47:20 +000099 "EffectNotSupported");
Shunkai Yao6afc8552022-10-26 22:47:20 +0000100
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530101 auto& erParam = specific.get<Parameter::Specific::environmentalReverb>();
Shunkai Yao87811022023-02-13 17:40:37 +0000102 RETURN_IF(!inRange(erParam, kRanges), EX_ILLEGAL_ARGUMENT, "outOfRange");
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530103 auto tag = erParam.getTag();
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530104 switch (tag) {
105 case EnvironmentalReverb::roomLevelMb: {
106 RETURN_IF(mContext->setErRoomLevel(erParam.get<EnvironmentalReverb::roomLevelMb>()) !=
107 RetCode::SUCCESS,
108 EX_ILLEGAL_ARGUMENT, "setRoomLevelFailed");
109 return ndk::ScopedAStatus::ok();
110 }
111 case EnvironmentalReverb::roomHfLevelMb: {
112 RETURN_IF(
113 mContext->setErRoomHfLevel(erParam.get<EnvironmentalReverb::roomHfLevelMb>()) !=
114 RetCode::SUCCESS,
115 EX_ILLEGAL_ARGUMENT, "setRoomHfLevelFailed");
116 return ndk::ScopedAStatus::ok();
117 }
118 case EnvironmentalReverb::decayTimeMs: {
119 RETURN_IF(mContext->setErDecayTime(erParam.get<EnvironmentalReverb::decayTimeMs>()) !=
120 RetCode::SUCCESS,
121 EX_ILLEGAL_ARGUMENT, "setDecayTimeFailed");
122 return ndk::ScopedAStatus::ok();
123 }
124 case EnvironmentalReverb::decayHfRatioPm: {
125 RETURN_IF(
126 mContext->setErDecayHfRatio(
127 erParam.get<EnvironmentalReverb::decayHfRatioPm>()) != RetCode::SUCCESS,
128 EX_ILLEGAL_ARGUMENT, "setDecayHfRatioFailed");
129 return ndk::ScopedAStatus::ok();
130 }
Shunkai Yao2ddafc22023-02-21 18:02:10 +0000131 case EnvironmentalReverb::reflectionsLevelMb: {
132 RETURN_IF(mContext->setErReflectionsLevel(
133 erParam.get<EnvironmentalReverb::reflectionsLevelMb>()) !=
134 RetCode::SUCCESS,
135 EX_ILLEGAL_ARGUMENT, "setReflectionsLevelFailed");
136 return ndk::ScopedAStatus::ok();
137 }
138 case EnvironmentalReverb::reflectionsDelayMs: {
139 RETURN_IF(mContext->setErReflectionsDelay(
140 erParam.get<EnvironmentalReverb::reflectionsDelayMs>()) !=
141 RetCode::SUCCESS,
142 EX_ILLEGAL_ARGUMENT, "setReflectionsDelayFailed");
143 return ndk::ScopedAStatus::ok();
144 }
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530145 case EnvironmentalReverb::levelMb: {
146 RETURN_IF(mContext->setErLevel(erParam.get<EnvironmentalReverb::levelMb>()) !=
147 RetCode::SUCCESS,
148 EX_ILLEGAL_ARGUMENT, "setLevelFailed");
149 return ndk::ScopedAStatus::ok();
150 }
151 case EnvironmentalReverb::delayMs: {
152 RETURN_IF(mContext->setErDelay(erParam.get<EnvironmentalReverb::delayMs>()) !=
153 RetCode::SUCCESS,
154 EX_ILLEGAL_ARGUMENT, "setDelayFailed");
155 return ndk::ScopedAStatus::ok();
156 }
157 case EnvironmentalReverb::diffusionPm: {
158 RETURN_IF(mContext->setErDiffusion(erParam.get<EnvironmentalReverb::diffusionPm>()) !=
159 RetCode::SUCCESS,
160 EX_ILLEGAL_ARGUMENT, "setDiffusionFailed");
161 return ndk::ScopedAStatus::ok();
162 }
163 case EnvironmentalReverb::densityPm: {
164 RETURN_IF(mContext->setErDensity(erParam.get<EnvironmentalReverb::densityPm>()) !=
165 RetCode::SUCCESS,
166 EX_ILLEGAL_ARGUMENT, "setDensityFailed");
167 return ndk::ScopedAStatus::ok();
168 }
169 case EnvironmentalReverb::bypass: {
170 RETURN_IF(mContext->setErBypass(erParam.get<EnvironmentalReverb::bypass>()) !=
171 RetCode::SUCCESS,
172 EX_ILLEGAL_ARGUMENT, "setBypassFailed");
173 return ndk::ScopedAStatus::ok();
174 }
175 default: {
176 LOG(ERROR) << __func__ << " unsupported tag: " << toString(tag);
177 return ndk::ScopedAStatus::fromExceptionCodeWithMessage(
178 EX_ILLEGAL_ARGUMENT, "EnvironmentalReverbTagNotSupported");
179 }
180 }
Shunkai Yao6afc8552022-10-26 22:47:20 +0000181}
182
Shunkai Yao812d5b42022-11-16 18:08:50 +0000183ndk::ScopedAStatus EnvReverbSw::getParameterSpecific(const Parameter::Id& id,
184 Parameter::Specific* specific) {
Shunkai Yao6afc8552022-10-26 22:47:20 +0000185 auto tag = id.getTag();
Shunkai Yaoc12e0822022-12-12 07:13:58 +0000186 RETURN_IF(Parameter::Id::environmentalReverbTag != tag, EX_ILLEGAL_ARGUMENT, "wrongIdTag");
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530187 auto erId = id.get<Parameter::Id::environmentalReverbTag>();
188 auto erIdTag = erId.getTag();
189 switch (erIdTag) {
190 case EnvironmentalReverb::Id::commonTag:
191 return getParameterEnvironmentalReverb(erId.get<EnvironmentalReverb::Id::commonTag>(),
192 specific);
193 default:
194 LOG(ERROR) << __func__ << " unsupported tag: " << toString(erIdTag);
195 return ndk::ScopedAStatus::fromExceptionCodeWithMessage(
196 EX_ILLEGAL_ARGUMENT, "EnvironmentalReverbTagNotSupported");
197 }
198}
199
200ndk::ScopedAStatus EnvReverbSw::getParameterEnvironmentalReverb(const EnvironmentalReverb::Tag& tag,
201 Parameter::Specific* specific) {
202 RETURN_IF(!mContext, EX_NULL_POINTER, "nullContext");
203 EnvironmentalReverb erParam;
204 switch (tag) {
205 case EnvironmentalReverb::roomLevelMb: {
206 erParam.set<EnvironmentalReverb::roomLevelMb>(mContext->getErRoomLevel());
207 break;
208 }
209 case EnvironmentalReverb::roomHfLevelMb: {
210 erParam.set<EnvironmentalReverb::roomHfLevelMb>(mContext->getErRoomHfLevel());
211 break;
212 }
213 case EnvironmentalReverb::decayTimeMs: {
214 erParam.set<EnvironmentalReverb::decayTimeMs>(mContext->getErDecayTime());
215 break;
216 }
217 case EnvironmentalReverb::decayHfRatioPm: {
218 erParam.set<EnvironmentalReverb::decayHfRatioPm>(mContext->getErDecayHfRatio());
219 break;
220 }
Shunkai Yao2ddafc22023-02-21 18:02:10 +0000221 case EnvironmentalReverb::reflectionsLevelMb: {
222 erParam.set<EnvironmentalReverb::reflectionsLevelMb>(mContext->getErReflectionsLevel());
223 break;
224 }
225 case EnvironmentalReverb::reflectionsDelayMs: {
226 erParam.set<EnvironmentalReverb::reflectionsDelayMs>(mContext->getErReflectionsDelay());
227 break;
228 }
Shraddha Basantwanidbb0ed62022-11-17 20:32:18 +0530229 case EnvironmentalReverb::levelMb: {
230 erParam.set<EnvironmentalReverb::levelMb>(mContext->getErLevel());
231 break;
232 }
233 case EnvironmentalReverb::delayMs: {
234 erParam.set<EnvironmentalReverb::delayMs>(mContext->getErDelay());
235 break;
236 }
237 case EnvironmentalReverb::diffusionPm: {
238 erParam.set<EnvironmentalReverb::diffusionPm>(mContext->getErDiffusion());
239 break;
240 }
241 case EnvironmentalReverb::densityPm: {
242 erParam.set<EnvironmentalReverb::densityPm>(mContext->getErDensity());
243 break;
244 }
245 case EnvironmentalReverb::bypass: {
246 erParam.set<EnvironmentalReverb::bypass>(mContext->getErBypass());
247 break;
248 }
249 default: {
250 LOG(ERROR) << __func__ << " unsupported tag: " << toString(tag);
251 return ndk::ScopedAStatus::fromExceptionCodeWithMessage(
252 EX_ILLEGAL_ARGUMENT, "EnvironmentalReverbTagNotSupported");
253 }
254 }
255
256 specific->set<Parameter::Specific::environmentalReverb>(erParam);
Shunkai Yao6afc8552022-10-26 22:47:20 +0000257 return ndk::ScopedAStatus::ok();
258}
259
Shunkai Yao812d5b42022-11-16 18:08:50 +0000260std::shared_ptr<EffectContext> EnvReverbSw::createContext(const Parameter::Common& common) {
Shunkai Yao6afc8552022-10-26 22:47:20 +0000261 if (mContext) {
262 LOG(DEBUG) << __func__ << " context already exist";
Shraddha Basantwanif627d802022-11-08 14:45:07 +0530263 } else {
264 mContext = std::make_shared<EnvReverbSwContext>(1 /* statusFmqDepth */, common);
Shunkai Yao6afc8552022-10-26 22:47:20 +0000265 }
Shraddha Basantwanif627d802022-11-08 14:45:07 +0530266
267 return mContext;
268}
269
Shunkai Yao812d5b42022-11-16 18:08:50 +0000270RetCode EnvReverbSw::releaseContext() {
Shunkai Yao6afc8552022-10-26 22:47:20 +0000271 if (mContext) {
272 mContext.reset();
273 }
274 return RetCode::SUCCESS;
275}
276
277// Processing method running in EffectWorker thread.
Shraddha Basantwanif627d802022-11-08 14:45:07 +0530278IEffect::Status EnvReverbSw::effectProcessImpl(float* in, float* out, int samples) {
Shunkai Yao6afc8552022-10-26 22:47:20 +0000279 // TODO: get data buffer and process.
Shraddha Basantwanif627d802022-11-08 14:45:07 +0530280 LOG(DEBUG) << __func__ << " in " << in << " out " << out << " samples " << samples;
281 for (int i = 0; i < samples; i++) {
Shunkai Yao6afc8552022-10-26 22:47:20 +0000282 *out++ = *in++;
283 }
Shraddha Basantwanif627d802022-11-08 14:45:07 +0530284 return {STATUS_OK, samples, samples};
Shunkai Yao6afc8552022-10-26 22:47:20 +0000285}
286
Sham Rathode362a462023-01-05 18:46:21 +0530287RetCode EnvReverbSwContext::setErRoomLevel(int roomLevel) {
Sham Rathode362a462023-01-05 18:46:21 +0530288 mRoomLevel = roomLevel;
289 return RetCode::SUCCESS;
290}
291
292RetCode EnvReverbSwContext::setErRoomHfLevel(int roomHfLevel) {
Sham Rathode362a462023-01-05 18:46:21 +0530293 mRoomHfLevel = roomHfLevel;
294 return RetCode::SUCCESS;
295}
296
297RetCode EnvReverbSwContext::setErDecayTime(int decayTime) {
Sham Rathode362a462023-01-05 18:46:21 +0530298 mDecayTime = decayTime;
299 return RetCode::SUCCESS;
300}
301
302RetCode EnvReverbSwContext::setErDecayHfRatio(int decayHfRatio) {
Sham Rathode362a462023-01-05 18:46:21 +0530303 mDecayHfRatio = decayHfRatio;
304 return RetCode::SUCCESS;
305}
306
307RetCode EnvReverbSwContext::setErLevel(int level) {
Sham Rathode362a462023-01-05 18:46:21 +0530308 mLevel = level;
309 return RetCode::SUCCESS;
310}
311
312RetCode EnvReverbSwContext::setErDelay(int delay) {
Sham Rathode362a462023-01-05 18:46:21 +0530313 mDelay = delay;
314 return RetCode::SUCCESS;
315}
316
317RetCode EnvReverbSwContext::setErDiffusion(int diffusion) {
Sham Rathode362a462023-01-05 18:46:21 +0530318 mDiffusion = diffusion;
319 return RetCode::SUCCESS;
320}
321
322RetCode EnvReverbSwContext::setErDensity(int density) {
Sham Rathode362a462023-01-05 18:46:21 +0530323 mDensity = density;
324 return RetCode::SUCCESS;
325}
326
Shunkai Yao6afc8552022-10-26 22:47:20 +0000327} // namespace aidl::android::hardware::audio::effect