xref: /aosp_15_r20/frameworks/av/media/libaudiohal/impl/EffectHalAidl.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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