blob: f0b65df0b971a390019df6387ffc4fe2ecbc8af1 [file] [log] [blame]
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -07001/*
Kevin Rocard96d2cd92018-11-14 16:22:07 -08002 * Copyright (C) 2018 The Android Open Source Project
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -07003 *
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
Kevin Rocard96d2cd92018-11-14 16:22:07 -080017#ifndef ANDROID_HARDWARE_AUDIO_EFFECT_EFFECT_H
18#define ANDROID_HARDWARE_AUDIO_EFFECT_EFFECT_H
19
20#include PATH(android/hardware/audio/effect/FILE_VERSION/IEffect.h)
21
22#include "AudioBufferManager.h"
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -070023
Mikhail Naganova331de12017-01-04 16:33:55 -080024#include <atomic>
Mikhail Naganov6e81e9b2016-11-16 16:30:17 -080025#include <memory>
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -070026#include <vector>
27
Mikhail Naganova331de12017-01-04 16:33:55 -080028#include <fmq/EventFlag.h>
29#include <fmq/MessageQueue.h>
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -070030#include <hidl/MQDescriptor.h>
Mikhail Naganova331de12017-01-04 16:33:55 -080031#include <hidl/Status.h>
Andy Hung502f9d02022-04-26 18:37:36 -070032#include <mediautils/MethodStatistics.h>
Mikhail Naganova331de12017-01-04 16:33:55 -080033#include <utils/Thread.h>
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -070034
35#include <hardware/audio_effect.h>
36
Kevin Rocard30a7fcc2018-03-01 15:08:07 -080037#include "VersionUtils.h"
38
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -070039namespace android {
40namespace hardware {
41namespace audio {
42namespace effect {
Kevin Rocard96d2cd92018-11-14 16:22:07 -080043namespace CPP_VERSION {
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -070044namespace implementation {
45
Kevin Rocard55b10612018-11-12 12:33:16 -080046using ::android::sp;
47using ::android::hardware::hidl_string;
48using ::android::hardware::hidl_vec;
49using ::android::hardware::Return;
50using ::android::hardware::Void;
Mikhail Naganov9036eda2020-12-10 18:47:51 -080051#if MAJOR_VERSION <= 6
Mikhail Naganov7d015382022-01-15 01:15:12 +000052using ::android::hardware::audio::common::COMMON_TYPES_CPP_VERSION::implementation::
53 AudioDeviceBitfield;
Mikhail Naganov9036eda2020-12-10 18:47:51 -080054#endif
Mikhail Naganov7d015382022-01-15 01:15:12 +000055using namespace ::android::hardware::audio::common::COMMON_TYPES_CPP_VERSION;
Mikhail Naganov3907f762018-12-13 09:42:17 -080056using namespace ::android::hardware::audio::effect::CPP_VERSION;
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -070057
58struct Effect : public IEffect {
Mikhail Naganova331de12017-01-04 16:33:55 -080059 typedef MessageQueue<Result, kSynchronizedReadWrite> StatusMQ;
Mikhail Naganov9f289042017-02-23 08:39:36 -080060 using GetParameterSuccessCallback =
Kevin Rocard22505e62017-12-14 18:50:12 -080061 std::function<void(uint32_t valueSize, const void* valueData)>;
Mikhail Naganova331de12017-01-04 16:33:55 -080062
Mikhail Naganov9036eda2020-12-10 18:47:51 -080063 Effect(bool isInput, effect_handle_t handle);
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -070064
Kevin Rocard96d2cd92018-11-14 16:22:07 -080065 // Methods from ::android::hardware::audio::effect::CPP_VERSION::IEffect follow.
Kevin Rocard22505e62017-12-14 18:50:12 -080066 Return<Result> init() override;
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -070067 Return<Result> setConfig(
Kevin Rocard22505e62017-12-14 18:50:12 -080068 const EffectConfig& config, const sp<IEffectBufferProviderCallback>& inputBufferProvider,
69 const sp<IEffectBufferProviderCallback>& outputBufferProvider) override;
70 Return<Result> reset() override;
71 Return<Result> enable() override;
72 Return<Result> disable() override;
Mikhail Naganov9036eda2020-12-10 18:47:51 -080073#if MAJOR_VERSION <= 6
74 Return<Result> setAudioSource(AudioSource source) override;
Kevin Rocard30a7fcc2018-03-01 15:08:07 -080075 Return<Result> setDevice(AudioDeviceBitfield device) override;
Mikhail Naganov9036eda2020-12-10 18:47:51 -080076 Return<Result> setInputDevice(AudioDeviceBitfield device) override;
77#else
78 Return<Result> setAudioSource(const AudioSource& source) override;
79 Return<Result> setDevice(const DeviceAddress& device) override;
80 Return<Result> setInputDevice(const DeviceAddress& device) override;
81#endif
Kevin Rocard22505e62017-12-14 18:50:12 -080082 Return<void> setAndGetVolume(const hidl_vec<uint32_t>& volumes,
83 setAndGetVolume_cb _hidl_cb) override;
84 Return<Result> volumeChangeNotification(const hidl_vec<uint32_t>& volumes) override;
85 Return<Result> setAudioMode(AudioMode mode) override;
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -070086 Return<Result> setConfigReverse(
Kevin Rocard22505e62017-12-14 18:50:12 -080087 const EffectConfig& config, const sp<IEffectBufferProviderCallback>& inputBufferProvider,
88 const sp<IEffectBufferProviderCallback>& outputBufferProvider) override;
Kevin Rocard22505e62017-12-14 18:50:12 -080089 Return<void> getConfig(getConfig_cb _hidl_cb) override;
90 Return<void> getConfigReverse(getConfigReverse_cb _hidl_cb) override;
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -070091 Return<void> getSupportedAuxChannelsConfigs(
Kevin Rocard22505e62017-12-14 18:50:12 -080092 uint32_t maxConfigs, getSupportedAuxChannelsConfigs_cb _hidl_cb) override;
93 Return<void> getAuxChannelsConfig(getAuxChannelsConfig_cb _hidl_cb) override;
94 Return<Result> setAuxChannelsConfig(const EffectAuxChannelsConfig& config) override;
Kevin Rocard22505e62017-12-14 18:50:12 -080095 Return<Result> offload(const EffectOffloadParameter& param) override;
96 Return<void> getDescriptor(getDescriptor_cb _hidl_cb) override;
97 Return<void> prepareForProcessing(prepareForProcessing_cb _hidl_cb) override;
98 Return<Result> setProcessBuffers(const AudioBuffer& inBuffer,
99 const AudioBuffer& outBuffer) override;
100 Return<void> command(uint32_t commandId, const hidl_vec<uint8_t>& data, uint32_t resultMaxSize,
101 command_cb _hidl_cb) override;
102 Return<Result> setParameter(const hidl_vec<uint8_t>& parameter,
103 const hidl_vec<uint8_t>& value) override;
104 Return<void> getParameter(const hidl_vec<uint8_t>& parameter, uint32_t valueMaxSize,
105 getParameter_cb _hidl_cb) override;
106 Return<void> getSupportedConfigsForFeature(uint32_t featureId, uint32_t maxConfigs,
107 uint32_t configSize,
108 getSupportedConfigsForFeature_cb _hidl_cb) override;
109 Return<void> getCurrentConfigForFeature(uint32_t featureId, uint32_t configSize,
110 getCurrentConfigForFeature_cb _hidl_cb) override;
111 Return<Result> setCurrentConfigForFeature(uint32_t featureId,
112 const hidl_vec<uint8_t>& configData) override;
113 Return<Result> close() override;
Mikhail Naganovfa021442019-02-22 14:28:26 -0800114 Return<void> debug(const hidl_handle& fd, const hidl_vec<hidl_string>& options) override;
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -0700115
116 // Utility methods for extending interfaces.
Mikhail Naganov9036eda2020-12-10 18:47:51 -0800117 static const char* sContextConversion;
118
119 Result analyzeStatus(const char* funcName, const char* subFuncName,
120 const char* contextDescription, status_t status);
Kevin Rocard22505e62017-12-14 18:50:12 -0800121 template <typename T>
122 Return<void> getIntegerParam(uint32_t paramId,
123 std::function<void(Result retval, T paramValue)> cb) {
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -0700124 T value;
Kevin Rocard22505e62017-12-14 18:50:12 -0800125 Result retval = getParameterImpl(sizeof(uint32_t), &paramId, sizeof(T),
126 [&](uint32_t valueSize, const void* valueData) {
127 if (valueSize > sizeof(T)) valueSize = sizeof(T);
128 memcpy(&value, valueData, valueSize);
129 });
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -0700130 cb(retval, value);
131 return Void();
132 }
133
Kevin Rocard22505e62017-12-14 18:50:12 -0800134 template <typename T>
135 Result getParam(uint32_t paramId, T& paramValue) {
136 return getParameterImpl(sizeof(uint32_t), &paramId, sizeof(T),
137 [&](uint32_t valueSize, const void* valueData) {
138 if (valueSize > sizeof(T)) valueSize = sizeof(T);
139 memcpy(&paramValue, valueData, valueSize);
140 });
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -0700141 }
142
Kevin Rocard22505e62017-12-14 18:50:12 -0800143 template <typename T>
144 Result getParam(uint32_t paramId, uint32_t paramArg, T& paramValue) {
145 uint32_t params[2] = {paramId, paramArg};
146 return getParameterImpl(sizeof(params), params, sizeof(T),
147 [&](uint32_t valueSize, const void* valueData) {
148 if (valueSize > sizeof(T)) valueSize = sizeof(T);
149 memcpy(&paramValue, valueData, valueSize);
150 });
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -0700151 }
152
Kevin Rocard22505e62017-12-14 18:50:12 -0800153 template <typename T>
154 Result setParam(uint32_t paramId, const T& paramValue) {
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -0700155 return setParameterImpl(sizeof(uint32_t), &paramId, sizeof(T), &paramValue);
156 }
157
Kevin Rocard22505e62017-12-14 18:50:12 -0800158 template <typename T>
159 Result setParam(uint32_t paramId, uint32_t paramArg, const T& paramValue) {
160 uint32_t params[2] = {paramId, paramArg};
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -0700161 return setParameterImpl(sizeof(params), params, sizeof(T), &paramValue);
162 }
163
Kevin Rocard22505e62017-12-14 18:50:12 -0800164 Result getParameterImpl(uint32_t paramSize, const void* paramData, uint32_t valueSize,
165 GetParameterSuccessCallback onSuccess) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800166 return getParameterImpl(paramSize, paramData, valueSize, valueSize, onSuccess);
167 }
Kevin Rocard22505e62017-12-14 18:50:12 -0800168 Result getParameterImpl(uint32_t paramSize, const void* paramData, uint32_t requestValueSize,
169 uint32_t replyValueSize, GetParameterSuccessCallback onSuccess);
170 Result setParameterImpl(uint32_t paramSize, const void* paramData, uint32_t valueSize,
171 const void* valueData);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800172
Andy Hung502f9d02022-04-26 18:37:36 -0700173 // process execution statistics
174 const std::shared_ptr<mediautils::MethodStatistics<std::string>> mStatistics =
175 std::make_shared<mediautils::MethodStatistics<std::string>>();
176
177 private:
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -0700178 friend struct VirtualizerEffect; // for getParameterImpl
179 friend struct VisualizerEffect; // to allow executing commands
180
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -0700181 using CommandSuccessCallback = std::function<void()>;
182 using GetConfigCallback = std::function<void(Result retval, const EffectConfig& config)>;
183 using GetCurrentConfigSuccessCallback = std::function<void(void* configData)>;
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -0700184 using GetSupportedConfigsSuccessCallback =
Kevin Rocard22505e62017-12-14 18:50:12 -0800185 std::function<void(uint32_t supportedConfigs, void* configsData)>;
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -0700186
Kevin Rocard22505e62017-12-14 18:50:12 -0800187 static const char* sContextResultOfCommand;
188 static const char* sContextCallToCommand;
189 static const char* sContextCallFunction;
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -0700190
Mikhail Naganov9036eda2020-12-10 18:47:51 -0800191 const bool mIsInput;
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -0700192 effect_handle_t mHandle;
Mikhail Naganova331de12017-01-04 16:33:55 -0800193 sp<AudioBufferWrapper> mInBuffer;
194 sp<AudioBufferWrapper> mOutBuffer;
195 std::atomic<audio_buffer_t*> mHalInBufferPtr;
196 std::atomic<audio_buffer_t*> mHalOutBufferPtr;
197 std::unique_ptr<StatusMQ> mStatusMQ;
198 EventFlag* mEfGroup;
199 std::atomic<bool> mStopProcessThread;
200 sp<Thread> mProcessThread;
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -0700201
202 virtual ~Effect();
203
Kevin Rocard22505e62017-12-14 18:50:12 -0800204 template <typename T>
205 static size_t alignedSizeIn(size_t s);
206 template <typename T>
207 std::unique_ptr<uint8_t[]> hidlVecToHal(const hidl_vec<T>& vec, uint32_t* halDataSize);
Mikhail Naganov9036eda2020-12-10 18:47:51 -0800208 void effectAuxChannelsConfigFromHal(const channel_config_t& halConfig,
209 EffectAuxChannelsConfig* config);
Kevin Rocard22505e62017-12-14 18:50:12 -0800210 static void effectAuxChannelsConfigToHal(const EffectAuxChannelsConfig& config,
211 channel_config_t* halConfig);
Kevin Rocard22505e62017-12-14 18:50:12 -0800212 static void effectOffloadParamToHal(const EffectOffloadParameter& offload,
213 effect_offload_param_t* halOffload);
Mikhail Naganov4f110342022-07-07 20:37:42 +0000214 static bool parameterToHal(uint32_t paramSize, const void* paramData, uint32_t valueSize,
215 const void** valueData, std::vector<uint8_t>* halParamBuffer);
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -0700216
Kevin Rocard22505e62017-12-14 18:50:12 -0800217 Result analyzeCommandStatus(const char* commandName, const char* context, status_t status);
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -0700218 void getConfigImpl(int commandCode, const char* commandName, GetConfigCallback cb);
Kevin Rocard22505e62017-12-14 18:50:12 -0800219 Result getCurrentConfigImpl(uint32_t featureId, uint32_t configSize,
220 GetCurrentConfigSuccessCallback onSuccess);
221 Result getSupportedConfigsImpl(uint32_t featureId, uint32_t maxConfigs, uint32_t configSize,
222 GetSupportedConfigsSuccessCallback onSuccess);
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -0700223 Result sendCommand(int commandCode, const char* commandName);
224 Result sendCommand(int commandCode, const char* commandName, uint32_t size, void* data);
Kevin Rocard22505e62017-12-14 18:50:12 -0800225 Result sendCommandReturningData(int commandCode, const char* commandName, uint32_t* replySize,
226 void* replyData);
227 Result sendCommandReturningData(int commandCode, const char* commandName, uint32_t size,
228 void* data, uint32_t* replySize, void* replyData);
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -0700229 Result sendCommandReturningStatus(int commandCode, const char* commandName);
Kevin Rocard22505e62017-12-14 18:50:12 -0800230 Result sendCommandReturningStatus(int commandCode, const char* commandName, uint32_t size,
231 void* data);
232 Result sendCommandReturningStatusAndData(int commandCode, const char* commandName,
233 uint32_t size, void* data, uint32_t* replySize,
234 void* replyData, uint32_t minReplySize,
235 CommandSuccessCallback onSuccess);
236 Result setConfigImpl(int commandCode, const char* commandName, const EffectConfig& config,
237 const sp<IEffectBufferProviderCallback>& inputBufferProvider,
238 const sp<IEffectBufferProviderCallback>& outputBufferProvider);
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -0700239};
240
241} // namespace implementation
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800242} // namespace CPP_VERSION
Mikhail Naganov7cbf2f12016-10-27 20:05:35 -0700243} // namespace effect
244} // namespace audio
245} // namespace hardware
246} // namespace android
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800247
248#endif // ANDROID_HARDWARE_AUDIO_EFFECT_EFFECT_H