1 /* 2 * Copyright (C) 2016 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 <common/all-versions/IncludeGuard.h> 18 19 #include <atomic> 20 #include <memory> 21 #include <vector> 22 23 #include <fmq/EventFlag.h> 24 #include <fmq/MessageQueue.h> 25 #include <hidl/MQDescriptor.h> 26 #include <hidl/Status.h> 27 #include <utils/Thread.h> 28 29 #include <hardware/audio_effect.h> 30 31 #include "VersionUtils.h" 32 33 namespace android { 34 namespace hardware { 35 namespace audio { 36 namespace effect { 37 namespace AUDIO_HAL_VERSION { 38 namespace implementation { 39 40 using ::android::hardware::audio::common::AUDIO_HAL_VERSION::AudioDevice; 41 using ::android::hardware::audio::common::AUDIO_HAL_VERSION::AudioMode; 42 using ::android::hardware::audio::common::AUDIO_HAL_VERSION::AudioSource; 43 using ::android::hardware::audio::common::AUDIO_HAL_VERSION::Uuid; 44 using ::android::hardware::audio::common::AUDIO_HAL_VERSION::implementation::AudioDeviceBitfield; 45 using ::android::hardware::audio::effect::AUDIO_HAL_VERSION::AudioBuffer; 46 using ::android::hardware::audio::effect::AUDIO_HAL_VERSION::EffectAuxChannelsConfig; 47 using ::android::hardware::audio::effect::AUDIO_HAL_VERSION::EffectConfig; 48 using ::android::hardware::audio::effect::AUDIO_HAL_VERSION::EffectDescriptor; 49 using ::android::hardware::audio::effect::AUDIO_HAL_VERSION::EffectFeature; 50 using ::android::hardware::audio::effect::AUDIO_HAL_VERSION::EffectOffloadParameter; 51 using ::android::hardware::audio::effect::AUDIO_HAL_VERSION::IEffect; 52 using ::android::hardware::audio::effect::AUDIO_HAL_VERSION::IEffectBufferProviderCallback; 53 using ::android::hardware::audio::effect::AUDIO_HAL_VERSION::Result; 54 using ::android::hardware::Return; 55 using ::android::hardware::Void; 56 using ::android::hardware::hidl_vec; 57 using ::android::hardware::hidl_string; 58 using ::android::sp; 59 60 struct Effect : public IEffect { 61 typedef MessageQueue<Result, kSynchronizedReadWrite> StatusMQ; 62 using GetParameterSuccessCallback = 63 std::function<void(uint32_t valueSize, const void* valueData)>; 64 65 explicit Effect(effect_handle_t handle); 66 67 // Methods from ::android::hardware::audio::effect::AUDIO_HAL_VERSION::IEffect follow. 68 Return<Result> init() override; 69 Return<Result> setConfig( 70 const EffectConfig& config, const sp<IEffectBufferProviderCallback>& inputBufferProvider, 71 const sp<IEffectBufferProviderCallback>& outputBufferProvider) override; 72 Return<Result> reset() override; 73 Return<Result> enable() override; 74 Return<Result> disable() override; 75 Return<Result> setDevice(AudioDeviceBitfield device) override; 76 Return<void> setAndGetVolume(const hidl_vec<uint32_t>& volumes, 77 setAndGetVolume_cb _hidl_cb) override; 78 Return<Result> volumeChangeNotification(const hidl_vec<uint32_t>& volumes) override; 79 Return<Result> setAudioMode(AudioMode mode) override; 80 Return<Result> setConfigReverse( 81 const EffectConfig& config, const sp<IEffectBufferProviderCallback>& inputBufferProvider, 82 const sp<IEffectBufferProviderCallback>& outputBufferProvider) override; 83 Return<Result> setInputDevice(AudioDeviceBitfield device) override; 84 Return<void> getConfig(getConfig_cb _hidl_cb) override; 85 Return<void> getConfigReverse(getConfigReverse_cb _hidl_cb) override; 86 Return<void> getSupportedAuxChannelsConfigs( 87 uint32_t maxConfigs, getSupportedAuxChannelsConfigs_cb _hidl_cb) override; 88 Return<void> getAuxChannelsConfig(getAuxChannelsConfig_cb _hidl_cb) override; 89 Return<Result> setAuxChannelsConfig(const EffectAuxChannelsConfig& config) override; 90 Return<Result> setAudioSource(AudioSource source) override; 91 Return<Result> offload(const EffectOffloadParameter& param) override; 92 Return<void> getDescriptor(getDescriptor_cb _hidl_cb) override; 93 Return<void> prepareForProcessing(prepareForProcessing_cb _hidl_cb) override; 94 Return<Result> setProcessBuffers(const AudioBuffer& inBuffer, 95 const AudioBuffer& outBuffer) override; 96 Return<void> command(uint32_t commandId, const hidl_vec<uint8_t>& data, uint32_t resultMaxSize, 97 command_cb _hidl_cb) override; 98 Return<Result> setParameter(const hidl_vec<uint8_t>& parameter, 99 const hidl_vec<uint8_t>& value) override; 100 Return<void> getParameter(const hidl_vec<uint8_t>& parameter, uint32_t valueMaxSize, 101 getParameter_cb _hidl_cb) override; 102 Return<void> getSupportedConfigsForFeature(uint32_t featureId, uint32_t maxConfigs, 103 uint32_t configSize, 104 getSupportedConfigsForFeature_cb _hidl_cb) override; 105 Return<void> getCurrentConfigForFeature(uint32_t featureId, uint32_t configSize, 106 getCurrentConfigForFeature_cb _hidl_cb) override; 107 Return<Result> setCurrentConfigForFeature(uint32_t featureId, 108 const hidl_vec<uint8_t>& configData) override; 109 Return<Result> close() override; 110 111 // Utility methods for extending interfaces. 112 template <typename T> 113 Return<void> getIntegerParam(uint32_t paramId, 114 std::function<void(Result retval, T paramValue)> cb) { 115 T value; 116 Result retval = getParameterImpl(sizeof(uint32_t), ¶mId, sizeof(T), 117 [&](uint32_t valueSize, const void* valueData) { 118 if (valueSize > sizeof(T)) valueSize = sizeof(T); 119 memcpy(&value, valueData, valueSize); 120 }); 121 cb(retval, value); 122 return Void(); 123 } 124 125 template <typename T> 126 Result getParam(uint32_t paramId, T& paramValue) { 127 return getParameterImpl(sizeof(uint32_t), ¶mId, sizeof(T), 128 [&](uint32_t valueSize, const void* valueData) { 129 if (valueSize > sizeof(T)) valueSize = sizeof(T); 130 memcpy(¶mValue, valueData, valueSize); 131 }); 132 } 133 134 template <typename T> 135 Result getParam(uint32_t paramId, uint32_t paramArg, T& paramValue) { 136 uint32_t params[2] = {paramId, paramArg}; 137 return getParameterImpl(sizeof(params), params, sizeof(T), 138 [&](uint32_t valueSize, const void* valueData) { 139 if (valueSize > sizeof(T)) valueSize = sizeof(T); 140 memcpy(¶mValue, valueData, valueSize); 141 }); 142 } 143 144 template <typename T> 145 Result setParam(uint32_t paramId, const T& paramValue) { 146 return setParameterImpl(sizeof(uint32_t), ¶mId, sizeof(T), ¶mValue); 147 } 148 149 template <typename T> 150 Result setParam(uint32_t paramId, uint32_t paramArg, const T& paramValue) { 151 uint32_t params[2] = {paramId, paramArg}; 152 return setParameterImpl(sizeof(params), params, sizeof(T), ¶mValue); 153 } 154 155 Result getParameterImpl(uint32_t paramSize, const void* paramData, uint32_t valueSize, 156 GetParameterSuccessCallback onSuccess) { 157 return getParameterImpl(paramSize, paramData, valueSize, valueSize, onSuccess); 158 } 159 Result getParameterImpl(uint32_t paramSize, const void* paramData, uint32_t requestValueSize, 160 uint32_t replyValueSize, GetParameterSuccessCallback onSuccess); 161 Result setParameterImpl(uint32_t paramSize, const void* paramData, uint32_t valueSize, 162 const void* valueData); 163 164 private: 165 friend struct VirtualizerEffect; // for getParameterImpl 166 friend struct VisualizerEffect; // to allow executing commands 167 168 using CommandSuccessCallback = std::function<void()>; 169 using GetConfigCallback = std::function<void(Result retval, const EffectConfig& config)>; 170 using GetCurrentConfigSuccessCallback = std::function<void(void* configData)>; 171 using GetSupportedConfigsSuccessCallback = 172 std::function<void(uint32_t supportedConfigs, void* configsData)>; 173 174 static const char* sContextResultOfCommand; 175 static const char* sContextCallToCommand; 176 static const char* sContextCallFunction; 177 178 bool mIsClosed; 179 effect_handle_t mHandle; 180 sp<AudioBufferWrapper> mInBuffer; 181 sp<AudioBufferWrapper> mOutBuffer; 182 std::atomic<audio_buffer_t*> mHalInBufferPtr; 183 std::atomic<audio_buffer_t*> mHalOutBufferPtr; 184 std::unique_ptr<StatusMQ> mStatusMQ; 185 EventFlag* mEfGroup; 186 std::atomic<bool> mStopProcessThread; 187 sp<Thread> mProcessThread; 188 189 virtual ~Effect(); 190 191 template <typename T> 192 static size_t alignedSizeIn(size_t s); 193 template <typename T> 194 std::unique_ptr<uint8_t[]> hidlVecToHal(const hidl_vec<T>& vec, uint32_t* halDataSize); 195 static void effectAuxChannelsConfigFromHal(const channel_config_t& halConfig, 196 EffectAuxChannelsConfig* config); 197 static void effectAuxChannelsConfigToHal(const EffectAuxChannelsConfig& config, 198 channel_config_t* halConfig); 199 static void effectBufferConfigFromHal(const buffer_config_t& halConfig, 200 EffectBufferConfig* config); 201 static void effectBufferConfigToHal(const EffectBufferConfig& config, 202 buffer_config_t* halConfig); 203 static void effectConfigFromHal(const effect_config_t& halConfig, EffectConfig* config); 204 static void effectConfigToHal(const EffectConfig& config, effect_config_t* halConfig); 205 static void effectOffloadParamToHal(const EffectOffloadParameter& offload, 206 effect_offload_param_t* halOffload); 207 static std::vector<uint8_t> parameterToHal(uint32_t paramSize, const void* paramData, 208 uint32_t valueSize, const void** valueData); 209 210 Result analyzeCommandStatus(const char* commandName, const char* context, status_t status); 211 Result analyzeStatus(const char* funcName, const char* subFuncName, 212 const char* contextDescription, status_t status); 213 void getConfigImpl(int commandCode, const char* commandName, GetConfigCallback cb); 214 Result getCurrentConfigImpl(uint32_t featureId, uint32_t configSize, 215 GetCurrentConfigSuccessCallback onSuccess); 216 Result getSupportedConfigsImpl(uint32_t featureId, uint32_t maxConfigs, uint32_t configSize, 217 GetSupportedConfigsSuccessCallback onSuccess); 218 Result sendCommand(int commandCode, const char* commandName); 219 Result sendCommand(int commandCode, const char* commandName, uint32_t size, void* data); 220 Result sendCommandReturningData(int commandCode, const char* commandName, uint32_t* replySize, 221 void* replyData); 222 Result sendCommandReturningData(int commandCode, const char* commandName, uint32_t size, 223 void* data, uint32_t* replySize, void* replyData); 224 Result sendCommandReturningStatus(int commandCode, const char* commandName); 225 Result sendCommandReturningStatus(int commandCode, const char* commandName, uint32_t size, 226 void* data); 227 Result sendCommandReturningStatusAndData(int commandCode, const char* commandName, 228 uint32_t size, void* data, uint32_t* replySize, 229 void* replyData, uint32_t minReplySize, 230 CommandSuccessCallback onSuccess); 231 Result setConfigImpl(int commandCode, const char* commandName, const EffectConfig& config, 232 const sp<IEffectBufferProviderCallback>& inputBufferProvider, 233 const sp<IEffectBufferProviderCallback>& outputBufferProvider); 234 }; 235 236 } // namespace implementation 237 } // namespace AUDIO_HAL_VERSION 238 } // namespace effect 239 } // namespace audio 240 } // namespace hardware 241 } // namespace android 242