1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2016 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 #ifndef ANDROID_HARDWARE_EFFECT_HAL_HIDL_H 18*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_HARDWARE_EFFECT_HAL_HIDL_H 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include PATH(android/hardware/audio/effect/COMMON_TYPES_FILE_VERSION/IEffect.h) 21*ec779b8eSAndroid Build Coastguard Worker #include <media/audiohal/EffectHalInterface.h> 22*ec779b8eSAndroid Build Coastguard Worker #include <fmq/EventFlag.h> 23*ec779b8eSAndroid Build Coastguard Worker #include <fmq/MessageQueue.h> 24*ec779b8eSAndroid Build Coastguard Worker #include <system/audio_effect.h> 25*ec779b8eSAndroid Build Coastguard Worker 26*ec779b8eSAndroid Build Coastguard Worker #include "EffectConversionHelperHidl.h" 27*ec779b8eSAndroid Build Coastguard Worker 28*ec779b8eSAndroid Build Coastguard Worker using ::android::hardware::EventFlag; 29*ec779b8eSAndroid Build Coastguard Worker using ::android::hardware::MessageQueue; 30*ec779b8eSAndroid Build Coastguard Worker 31*ec779b8eSAndroid Build Coastguard Worker namespace android { 32*ec779b8eSAndroid Build Coastguard Worker namespace effect { 33*ec779b8eSAndroid Build Coastguard Worker 34*ec779b8eSAndroid Build Coastguard Worker using namespace ::android::hardware::audio::effect::COMMON_TYPES_CPP_VERSION; 35*ec779b8eSAndroid Build Coastguard Worker 36*ec779b8eSAndroid Build Coastguard Worker class EffectHalHidl : public EffectHalInterface, public EffectConversionHelperHidl 37*ec779b8eSAndroid Build Coastguard Worker { 38*ec779b8eSAndroid Build Coastguard Worker public: 39*ec779b8eSAndroid Build Coastguard Worker // Set the input buffer. 40*ec779b8eSAndroid Build Coastguard Worker virtual status_t setInBuffer(const sp<EffectBufferHalInterface>& buffer); 41*ec779b8eSAndroid Build Coastguard Worker 42*ec779b8eSAndroid Build Coastguard Worker // Set the output buffer. 43*ec779b8eSAndroid Build Coastguard Worker virtual status_t setOutBuffer(const sp<EffectBufferHalInterface>& buffer); 44*ec779b8eSAndroid Build Coastguard Worker 45*ec779b8eSAndroid Build Coastguard Worker // Effect process function. 46*ec779b8eSAndroid Build Coastguard Worker virtual status_t process(); 47*ec779b8eSAndroid Build Coastguard Worker 48*ec779b8eSAndroid Build Coastguard Worker // Process reverse stream function. This function is used to pass 49*ec779b8eSAndroid Build Coastguard Worker // a reference stream to the effect engine. 50*ec779b8eSAndroid Build Coastguard Worker virtual status_t processReverse(); 51*ec779b8eSAndroid Build Coastguard Worker 52*ec779b8eSAndroid Build Coastguard Worker // Send a command and receive a response to/from effect engine. 53*ec779b8eSAndroid Build Coastguard Worker virtual status_t command(uint32_t cmdCode, uint32_t cmdSize, void *pCmdData, 54*ec779b8eSAndroid Build Coastguard Worker uint32_t *replySize, void *pReplyData); 55*ec779b8eSAndroid Build Coastguard Worker 56*ec779b8eSAndroid Build Coastguard Worker // Returns the effect descriptor. 57*ec779b8eSAndroid Build Coastguard Worker virtual status_t getDescriptor(effect_descriptor_t *pDescriptor); 58*ec779b8eSAndroid Build Coastguard Worker 59*ec779b8eSAndroid Build Coastguard Worker // Free resources on the remote side. 60*ec779b8eSAndroid Build Coastguard Worker virtual status_t close(); 61*ec779b8eSAndroid Build Coastguard Worker 62*ec779b8eSAndroid Build Coastguard Worker virtual status_t dump(int fd); 63*ec779b8eSAndroid Build Coastguard Worker effectId()64*ec779b8eSAndroid Build Coastguard Worker uint64_t effectId() const { return mEffectId; } 65*ec779b8eSAndroid Build Coastguard Worker 66*ec779b8eSAndroid Build Coastguard Worker private: 67*ec779b8eSAndroid Build Coastguard Worker friend class EffectsFactoryHalHidl; 68*ec779b8eSAndroid Build Coastguard Worker typedef MessageQueue<Result, hardware::kSynchronizedReadWrite> StatusMQ; 69*ec779b8eSAndroid Build Coastguard Worker 70*ec779b8eSAndroid Build Coastguard Worker sp<IEffect> mEffect; 71*ec779b8eSAndroid Build Coastguard Worker const uint64_t mEffectId; 72*ec779b8eSAndroid Build Coastguard Worker sp<EffectBufferHalInterface> mInBuffer; 73*ec779b8eSAndroid Build Coastguard Worker sp<EffectBufferHalInterface> mOutBuffer; 74*ec779b8eSAndroid Build Coastguard Worker bool mBuffersChanged; 75*ec779b8eSAndroid Build Coastguard Worker std::unique_ptr<StatusMQ> mStatusMQ; 76*ec779b8eSAndroid Build Coastguard Worker EventFlag* mEfGroup; 77*ec779b8eSAndroid Build Coastguard Worker bool mIsInput = false; 78*ec779b8eSAndroid Build Coastguard Worker static constexpr int32_t kRTPriorityMin = 1; 79*ec779b8eSAndroid Build Coastguard Worker static constexpr int32_t kRTPriorityMax = 3; 80*ec779b8eSAndroid Build Coastguard Worker static constexpr int kRTPriorityDisabled = 0; 81*ec779b8eSAndroid Build Coastguard Worker // Typical RealTime mHalThreadPriority ranges from 1 (low) to 3 (high). 82*ec779b8eSAndroid Build Coastguard Worker int mHalThreadPriority = kRTPriorityDisabled; 83*ec779b8eSAndroid Build Coastguard Worker 84*ec779b8eSAndroid Build Coastguard Worker // Can not be constructed directly by clients. 85*ec779b8eSAndroid Build Coastguard Worker EffectHalHidl(const sp<IEffect>& effect, uint64_t effectId); 86*ec779b8eSAndroid Build Coastguard Worker 87*ec779b8eSAndroid Build Coastguard Worker // The destructor automatically releases the effect. 88*ec779b8eSAndroid Build Coastguard Worker virtual ~EffectHalHidl(); 89*ec779b8eSAndroid Build Coastguard Worker 90*ec779b8eSAndroid Build Coastguard Worker status_t getConfigImpl(uint32_t cmdCode, uint32_t *replySize, void *pReplyData); 91*ec779b8eSAndroid Build Coastguard Worker status_t prepareForProcessing(); 92*ec779b8eSAndroid Build Coastguard Worker bool needToResetBuffers(); 93*ec779b8eSAndroid Build Coastguard Worker status_t processImpl(uint32_t mqFlag); 94*ec779b8eSAndroid Build Coastguard Worker status_t setConfigImpl( 95*ec779b8eSAndroid Build Coastguard Worker uint32_t cmdCode, uint32_t cmdSize, void *pCmdData, 96*ec779b8eSAndroid Build Coastguard Worker uint32_t *replySize, void *pReplyData); 97*ec779b8eSAndroid Build Coastguard Worker status_t setProcessBuffers(); 98*ec779b8eSAndroid Build Coastguard Worker status_t getHalPid(pid_t *pid) const; 99*ec779b8eSAndroid Build Coastguard Worker status_t getHalWorkerTid(pid_t *tid); 100*ec779b8eSAndroid Build Coastguard Worker bool requestHalThreadPriority(pid_t threadPid, pid_t threadId); 101*ec779b8eSAndroid Build Coastguard Worker status_t checkHalThreadPriority(); 102*ec779b8eSAndroid Build Coastguard Worker }; 103*ec779b8eSAndroid Build Coastguard Worker 104*ec779b8eSAndroid Build Coastguard Worker } // namespace effect 105*ec779b8eSAndroid Build Coastguard Worker } // namespace android 106*ec779b8eSAndroid Build Coastguard Worker 107*ec779b8eSAndroid Build Coastguard Worker #endif // ANDROID_HARDWARE_EFFECT_HAL_HIDL_H 108