1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #pragma once 18*ec779b8eSAndroid Build Coastguard Worker 19*ec779b8eSAndroid Build Coastguard Worker #include <memory> 20*ec779b8eSAndroid Build Coastguard Worker 21*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/audio/effect/IEffect.h> 22*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/audio/effect/IFactory.h> 23*ec779b8eSAndroid Build Coastguard Worker #include <fmq/AidlMessageQueue.h> 24*ec779b8eSAndroid Build Coastguard Worker #include <media/audiohal/EffectHalInterface.h> 25*ec779b8eSAndroid Build Coastguard Worker #include <system/audio_effect.h> 26*ec779b8eSAndroid Build Coastguard Worker #include <system/audio_effects/aidl_effects_utils.h> 27*ec779b8eSAndroid Build Coastguard Worker 28*ec779b8eSAndroid Build Coastguard Worker #include "EffectConversionHelperAidl.h" 29*ec779b8eSAndroid Build Coastguard Worker 30*ec779b8eSAndroid Build Coastguard Worker namespace android { 31*ec779b8eSAndroid Build Coastguard Worker namespace effect { 32*ec779b8eSAndroid Build Coastguard Worker 33*ec779b8eSAndroid Build Coastguard Worker class EffectHalAidl : public EffectHalInterface { 34*ec779b8eSAndroid Build Coastguard Worker public: 35*ec779b8eSAndroid Build Coastguard Worker 36*ec779b8eSAndroid Build Coastguard Worker // Set the input buffer. 37*ec779b8eSAndroid Build Coastguard Worker status_t setInBuffer(const sp<EffectBufferHalInterface>& buffer) override; 38*ec779b8eSAndroid Build Coastguard Worker 39*ec779b8eSAndroid Build Coastguard Worker // Set the output buffer. 40*ec779b8eSAndroid Build Coastguard Worker status_t setOutBuffer(const sp<EffectBufferHalInterface>& buffer) override; 41*ec779b8eSAndroid Build Coastguard Worker 42*ec779b8eSAndroid Build Coastguard Worker // Effect process function. 43*ec779b8eSAndroid Build Coastguard Worker status_t process() override; 44*ec779b8eSAndroid Build Coastguard Worker 45*ec779b8eSAndroid Build Coastguard Worker // Process reverse stream function. This function is used to pass 46*ec779b8eSAndroid Build Coastguard Worker // a reference stream to the effect engine. 47*ec779b8eSAndroid Build Coastguard Worker status_t processReverse() override; 48*ec779b8eSAndroid Build Coastguard Worker 49*ec779b8eSAndroid Build Coastguard Worker // Send a command and receive a response to/from effect engine. 50*ec779b8eSAndroid Build Coastguard Worker status_t command(uint32_t cmdCode, uint32_t cmdSize, void* pCmdData, uint32_t* replySize, 51*ec779b8eSAndroid Build Coastguard Worker void* pReplyData) override; 52*ec779b8eSAndroid Build Coastguard Worker 53*ec779b8eSAndroid Build Coastguard Worker // Returns the effect descriptor. 54*ec779b8eSAndroid Build Coastguard Worker status_t getDescriptor(effect_descriptor_t *pDescriptor) override; 55*ec779b8eSAndroid Build Coastguard Worker 56*ec779b8eSAndroid Build Coastguard Worker // Free resources on the remote side. 57*ec779b8eSAndroid Build Coastguard Worker status_t close() override; 58*ec779b8eSAndroid Build Coastguard Worker 59*ec779b8eSAndroid Build Coastguard Worker status_t dump(int fd) override; 60*ec779b8eSAndroid Build Coastguard Worker getIEffect()61*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<::aidl::android::hardware::audio::effect::IEffect> getIEffect() const { 62*ec779b8eSAndroid Build Coastguard Worker return mEffect; 63*ec779b8eSAndroid Build Coastguard Worker } 64*ec779b8eSAndroid Build Coastguard Worker 65*ec779b8eSAndroid Build Coastguard Worker // for TIME_CHECK getClassName()66*ec779b8eSAndroid Build Coastguard Worker const std::string getClassName() const { return "EffectHalAidl"; } 67*ec779b8eSAndroid Build Coastguard Worker 68*ec779b8eSAndroid Build Coastguard Worker private: 69*ec779b8eSAndroid Build Coastguard Worker friend class sp<EffectHalAidl>; 70*ec779b8eSAndroid Build Coastguard Worker 71*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<::aidl::android::hardware::audio::effect::IFactory> mFactory; 72*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<::aidl::android::hardware::audio::effect::IEffect> mEffect; 73*ec779b8eSAndroid Build Coastguard Worker const int32_t mSessionId; 74*ec779b8eSAndroid Build Coastguard Worker const int32_t mIoId; 75*ec779b8eSAndroid Build Coastguard Worker const bool mIsProxyEffect; 76*ec779b8eSAndroid Build Coastguard Worker const int32_t mHalVersion; 77*ec779b8eSAndroid Build Coastguard Worker // Audio effect HAL v2+ changes flag to kEventFlagDataMqNotEmpty to avoid conflict from using 78*ec779b8eSAndroid Build Coastguard Worker // kEventFlagNotEmpty 79*ec779b8eSAndroid Build Coastguard Worker const uint32_t mEventFlagDataMqNotEmpty; 80*ec779b8eSAndroid Build Coastguard Worker bool mIsHapticGenerator = false; 81*ec779b8eSAndroid Build Coastguard Worker std::string mEffectName; 82*ec779b8eSAndroid Build Coastguard Worker 83*ec779b8eSAndroid Build Coastguard Worker std::unique_ptr<EffectConversionHelperAidl> mConversion; 84*ec779b8eSAndroid Build Coastguard Worker 85*ec779b8eSAndroid Build Coastguard Worker sp<EffectBufferHalInterface> mInBuffer, mOutBuffer; 86*ec779b8eSAndroid Build Coastguard Worker 87*ec779b8eSAndroid Build Coastguard Worker status_t createAidlConversion( 88*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<::aidl::android::hardware::audio::effect::IEffect> effect, 89*ec779b8eSAndroid Build Coastguard Worker int32_t sessionId, int32_t ioId, 90*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::hardware::audio::effect::Descriptor& desc); 91*ec779b8eSAndroid Build Coastguard Worker // Can not be constructed directly by clients. 92*ec779b8eSAndroid Build Coastguard Worker EffectHalAidl( 93*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<::aidl::android::hardware::audio::effect::IFactory>& factory, 94*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<::aidl::android::hardware::audio::effect::IEffect>& effect, 95*ec779b8eSAndroid Build Coastguard Worker int32_t sessionId, int32_t ioId, 96*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::hardware::audio::effect::Descriptor& desc, 97*ec779b8eSAndroid Build Coastguard Worker bool isProxyEffect); 98*ec779b8eSAndroid Build Coastguard Worker bool setEffectReverse(bool reverse); 99*ec779b8eSAndroid Build Coastguard Worker bool needUpdateReturnParam(uint32_t cmdCode); 100*ec779b8eSAndroid Build Coastguard Worker 101*ec779b8eSAndroid Build Coastguard Worker status_t maybeReopen(const std::shared_ptr<android::hardware::EventFlag>& efGroup) const; 102*ec779b8eSAndroid Build Coastguard Worker void writeHapticGeneratorData(size_t totalSamples, float* const outputRawBuffer, 103*ec779b8eSAndroid Build Coastguard Worker float* const fmqOutputBuffer) const; 104*ec779b8eSAndroid Build Coastguard Worker size_t writeToHalInputFmqAndSignal( 105*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<android::hardware::EventFlag>& efGroup) const; 106*ec779b8eSAndroid Build Coastguard Worker status_t waitHalStatusFmq(size_t samplesWritten) const; 107*ec779b8eSAndroid Build Coastguard Worker status_t readFromHalOutputFmq(size_t samplesWritten) const; 108*ec779b8eSAndroid Build Coastguard Worker 109*ec779b8eSAndroid Build Coastguard Worker // The destructor automatically releases the effect. 110*ec779b8eSAndroid Build Coastguard Worker virtual ~EffectHalAidl(); 111*ec779b8eSAndroid Build Coastguard Worker }; 112*ec779b8eSAndroid Build Coastguard Worker 113*ec779b8eSAndroid Build Coastguard Worker } // namespace effect 114*ec779b8eSAndroid Build Coastguard Worker } // namespace android 115