xref: /aosp_15_r20/hardware/interfaces/audio/aidl/default/dynamicProcessing/DynamicsProcessingSw.h (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker 
17*4d7e907cSAndroid Build Coastguard Worker #pragma once
18*4d7e907cSAndroid Build Coastguard Worker 
19*4d7e907cSAndroid Build Coastguard Worker #include <cstdlib>
20*4d7e907cSAndroid Build Coastguard Worker #include <memory>
21*4d7e907cSAndroid Build Coastguard Worker #include <vector>
22*4d7e907cSAndroid Build Coastguard Worker 
23*4d7e907cSAndroid Build Coastguard Worker #include <Utils.h>
24*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/audio/effect/BnEffect.h>
25*4d7e907cSAndroid Build Coastguard Worker #include <fmq/AidlMessageQueue.h>
26*4d7e907cSAndroid Build Coastguard Worker 
27*4d7e907cSAndroid Build Coastguard Worker #include "effect-impl/EffectImpl.h"
28*4d7e907cSAndroid Build Coastguard Worker 
29*4d7e907cSAndroid Build Coastguard Worker namespace aidl::android::hardware::audio::effect {
30*4d7e907cSAndroid Build Coastguard Worker 
31*4d7e907cSAndroid Build Coastguard Worker class DynamicsProcessingSwContext final : public EffectContext {
32*4d7e907cSAndroid Build Coastguard Worker   public:
DynamicsProcessingSwContext(int statusDepth,const Parameter::Common & common)33*4d7e907cSAndroid Build Coastguard Worker     DynamicsProcessingSwContext(int statusDepth, const Parameter::Common& common)
34*4d7e907cSAndroid Build Coastguard Worker         : EffectContext(statusDepth, common),
35*4d7e907cSAndroid Build Coastguard Worker           mChannelCount(::aidl::android::hardware::audio::common::getChannelCount(
36*4d7e907cSAndroid Build Coastguard Worker                   common.input.base.channelMask)),
37*4d7e907cSAndroid Build Coastguard Worker           mPreEqChCfgs(mChannelCount, {.channel = kInvalidChannelId}),
38*4d7e907cSAndroid Build Coastguard Worker           mPostEqChCfgs(mChannelCount, {.channel = kInvalidChannelId}),
39*4d7e907cSAndroid Build Coastguard Worker           mMbcChCfgs(mChannelCount, {.channel = kInvalidChannelId}),
40*4d7e907cSAndroid Build Coastguard Worker           mLimiterCfgs(mChannelCount, {.channel = kInvalidChannelId}) {
41*4d7e907cSAndroid Build Coastguard Worker         LOG(DEBUG) << __func__;
42*4d7e907cSAndroid Build Coastguard Worker     }
43*4d7e907cSAndroid Build Coastguard Worker 
44*4d7e907cSAndroid Build Coastguard Worker     // utils
45*4d7e907cSAndroid Build Coastguard Worker     RetCode setChannelCfgs(const std::vector<DynamicsProcessing::ChannelConfig>& cfgs,
46*4d7e907cSAndroid Build Coastguard Worker                            std::vector<DynamicsProcessing::ChannelConfig>& targetCfgs,
47*4d7e907cSAndroid Build Coastguard Worker                            const DynamicsProcessing::StageEnablement& engineSetting);
48*4d7e907cSAndroid Build Coastguard Worker 
49*4d7e907cSAndroid Build Coastguard Worker     RetCode setEqBandCfgs(const std::vector<DynamicsProcessing::EqBandConfig>& cfgs,
50*4d7e907cSAndroid Build Coastguard Worker                           std::vector<DynamicsProcessing::EqBandConfig>& targetCfgs,
51*4d7e907cSAndroid Build Coastguard Worker                           const DynamicsProcessing::StageEnablement& stage,
52*4d7e907cSAndroid Build Coastguard Worker                           const std::vector<DynamicsProcessing::ChannelConfig>& channelConfig);
53*4d7e907cSAndroid Build Coastguard Worker 
54*4d7e907cSAndroid Build Coastguard Worker     // set params
55*4d7e907cSAndroid Build Coastguard Worker     RetCode setCommon(const Parameter::Common& common) override;
56*4d7e907cSAndroid Build Coastguard Worker     RetCode setEngineArchitecture(const DynamicsProcessing::EngineArchitecture& cfg);
57*4d7e907cSAndroid Build Coastguard Worker     RetCode setPreEqChannelCfgs(const std::vector<DynamicsProcessing::ChannelConfig>& cfgs);
58*4d7e907cSAndroid Build Coastguard Worker     RetCode setPostEqChannelCfgs(const std::vector<DynamicsProcessing::ChannelConfig>& cfgs);
59*4d7e907cSAndroid Build Coastguard Worker     RetCode setMbcChannelCfgs(const std::vector<DynamicsProcessing::ChannelConfig>& cfgs);
60*4d7e907cSAndroid Build Coastguard Worker     RetCode setPreEqBandCfgs(const std::vector<DynamicsProcessing::EqBandConfig>& cfgs);
61*4d7e907cSAndroid Build Coastguard Worker     RetCode setPostEqBandCfgs(const std::vector<DynamicsProcessing::EqBandConfig>& cfgs);
62*4d7e907cSAndroid Build Coastguard Worker     RetCode setMbcBandCfgs(const std::vector<DynamicsProcessing::MbcBandConfig>& cfgs);
63*4d7e907cSAndroid Build Coastguard Worker     RetCode setLimiterCfgs(const std::vector<DynamicsProcessing::LimiterConfig>& cfgs);
64*4d7e907cSAndroid Build Coastguard Worker     RetCode setInputGainCfgs(const std::vector<DynamicsProcessing::InputGain>& cfgs);
65*4d7e907cSAndroid Build Coastguard Worker 
66*4d7e907cSAndroid Build Coastguard Worker     // get params
getEngineArchitecture()67*4d7e907cSAndroid Build Coastguard Worker     DynamicsProcessing::EngineArchitecture getEngineArchitecture() { return mEngineSettings; }
getPreEqChannelCfgs()68*4d7e907cSAndroid Build Coastguard Worker     std::vector<DynamicsProcessing::ChannelConfig> getPreEqChannelCfgs() { return mPreEqChCfgs; }
getPostEqChannelCfgs()69*4d7e907cSAndroid Build Coastguard Worker     std::vector<DynamicsProcessing::ChannelConfig> getPostEqChannelCfgs() { return mPostEqChCfgs; }
getMbcChannelCfgs()70*4d7e907cSAndroid Build Coastguard Worker     std::vector<DynamicsProcessing::ChannelConfig> getMbcChannelCfgs() { return mMbcChCfgs; }
getPreEqBandCfgs()71*4d7e907cSAndroid Build Coastguard Worker     std::vector<DynamicsProcessing::EqBandConfig> getPreEqBandCfgs() { return mPreEqChBands; }
getPostEqBandCfgs()72*4d7e907cSAndroid Build Coastguard Worker     std::vector<DynamicsProcessing::EqBandConfig> getPostEqBandCfgs() { return mPostEqChBands; }
getMbcBandCfgs()73*4d7e907cSAndroid Build Coastguard Worker     std::vector<DynamicsProcessing::MbcBandConfig> getMbcBandCfgs() { return mMbcChBands; }
getLimiterCfgs()74*4d7e907cSAndroid Build Coastguard Worker     std::vector<DynamicsProcessing::LimiterConfig> getLimiterCfgs() { return mLimiterCfgs; }
75*4d7e907cSAndroid Build Coastguard Worker     std::vector<DynamicsProcessing::InputGain> getInputGainCfgs();
76*4d7e907cSAndroid Build Coastguard Worker 
77*4d7e907cSAndroid Build Coastguard Worker   private:
78*4d7e907cSAndroid Build Coastguard Worker     static constexpr int32_t kInvalidChannelId = -1;
79*4d7e907cSAndroid Build Coastguard Worker     size_t mChannelCount = 0;
80*4d7e907cSAndroid Build Coastguard Worker     DynamicsProcessing::EngineArchitecture mEngineSettings;
81*4d7e907cSAndroid Build Coastguard Worker     // Channel config vector with size of mChannelCount
82*4d7e907cSAndroid Build Coastguard Worker     std::vector<DynamicsProcessing::ChannelConfig> mPreEqChCfgs;
83*4d7e907cSAndroid Build Coastguard Worker     std::vector<DynamicsProcessing::ChannelConfig> mPostEqChCfgs;
84*4d7e907cSAndroid Build Coastguard Worker     std::vector<DynamicsProcessing::ChannelConfig> mMbcChCfgs;
85*4d7e907cSAndroid Build Coastguard Worker     std::vector<DynamicsProcessing::LimiterConfig> mLimiterCfgs;
86*4d7e907cSAndroid Build Coastguard Worker     std::vector<DynamicsProcessing::InputGain> mInputGainCfgs;
87*4d7e907cSAndroid Build Coastguard Worker     // Band config vector with size of mChannelCount * bandCount
88*4d7e907cSAndroid Build Coastguard Worker     std::vector<DynamicsProcessing::EqBandConfig> mPreEqChBands;
89*4d7e907cSAndroid Build Coastguard Worker     std::vector<DynamicsProcessing::EqBandConfig> mPostEqChBands;
90*4d7e907cSAndroid Build Coastguard Worker     std::vector<DynamicsProcessing::MbcBandConfig> mMbcChBands;
91*4d7e907cSAndroid Build Coastguard Worker     bool validateStageEnablement(const DynamicsProcessing::StageEnablement& enablement);
92*4d7e907cSAndroid Build Coastguard Worker     bool validateEngineConfig(const DynamicsProcessing::EngineArchitecture& engine);
93*4d7e907cSAndroid Build Coastguard Worker     bool validateEqBandConfig(const DynamicsProcessing::EqBandConfig& band, int maxChannel,
94*4d7e907cSAndroid Build Coastguard Worker                               int maxBand,
95*4d7e907cSAndroid Build Coastguard Worker                               const std::vector<DynamicsProcessing::ChannelConfig>& channelConfig);
96*4d7e907cSAndroid Build Coastguard Worker     bool validateMbcBandConfig(const DynamicsProcessing::MbcBandConfig& band, int maxChannel,
97*4d7e907cSAndroid Build Coastguard Worker                                int maxBand,
98*4d7e907cSAndroid Build Coastguard Worker                                const std::vector<DynamicsProcessing::ChannelConfig>& channelConfig);
99*4d7e907cSAndroid Build Coastguard Worker     bool validateLimiterConfig(const DynamicsProcessing::LimiterConfig& limiter, int maxChannel);
100*4d7e907cSAndroid Build Coastguard Worker     void resizeChannels();
101*4d7e907cSAndroid Build Coastguard Worker     void resizeBands();
102*4d7e907cSAndroid Build Coastguard Worker };  // DynamicsProcessingSwContext
103*4d7e907cSAndroid Build Coastguard Worker 
104*4d7e907cSAndroid Build Coastguard Worker class DynamicsProcessingSw final : public EffectImpl {
105*4d7e907cSAndroid Build Coastguard Worker   public:
106*4d7e907cSAndroid Build Coastguard Worker     static const std::string kEffectName;
107*4d7e907cSAndroid Build Coastguard Worker     static const Capability kCapability;
108*4d7e907cSAndroid Build Coastguard Worker     static const Descriptor kDescriptor;
DynamicsProcessingSw()109*4d7e907cSAndroid Build Coastguard Worker     DynamicsProcessingSw() { LOG(DEBUG) << __func__; }
~DynamicsProcessingSw()110*4d7e907cSAndroid Build Coastguard Worker     ~DynamicsProcessingSw() {
111*4d7e907cSAndroid Build Coastguard Worker         cleanUp();
112*4d7e907cSAndroid Build Coastguard Worker         LOG(DEBUG) << __func__;
113*4d7e907cSAndroid Build Coastguard Worker     }
114*4d7e907cSAndroid Build Coastguard Worker 
115*4d7e907cSAndroid Build Coastguard Worker     ndk::ScopedAStatus getDescriptor(Descriptor* _aidl_return) override;
116*4d7e907cSAndroid Build Coastguard Worker     ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific)
117*4d7e907cSAndroid Build Coastguard Worker             REQUIRES(mImplMutex) override;
118*4d7e907cSAndroid Build Coastguard Worker     ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id, Parameter::Specific* specific)
119*4d7e907cSAndroid Build Coastguard Worker             REQUIRES(mImplMutex) override;
120*4d7e907cSAndroid Build Coastguard Worker 
121*4d7e907cSAndroid Build Coastguard Worker     std::shared_ptr<EffectContext> createContext(const Parameter::Common& common)
122*4d7e907cSAndroid Build Coastguard Worker             REQUIRES(mImplMutex) override;
123*4d7e907cSAndroid Build Coastguard Worker     RetCode releaseContext() REQUIRES(mImplMutex) override;
124*4d7e907cSAndroid Build Coastguard Worker 
125*4d7e907cSAndroid Build Coastguard Worker     IEffect::Status effectProcessImpl(float* in, float* out, int samples)
126*4d7e907cSAndroid Build Coastguard Worker             REQUIRES(mImplMutex) override;
getEffectName()127*4d7e907cSAndroid Build Coastguard Worker     std::string getEffectName() override { return kEffectName; };
128*4d7e907cSAndroid Build Coastguard Worker 
129*4d7e907cSAndroid Build Coastguard Worker   private:
130*4d7e907cSAndroid Build Coastguard Worker     static const DynamicsProcessing::EqBandConfig kEqBandConfigMin;
131*4d7e907cSAndroid Build Coastguard Worker     static const DynamicsProcessing::EqBandConfig kEqBandConfigMax;
132*4d7e907cSAndroid Build Coastguard Worker     static const Range::DynamicsProcessingRange kPreEqBandRange;
133*4d7e907cSAndroid Build Coastguard Worker     static const Range::DynamicsProcessingRange kPostEqBandRange;
134*4d7e907cSAndroid Build Coastguard Worker     static const std::vector<Range::DynamicsProcessingRange> kRanges;
135*4d7e907cSAndroid Build Coastguard Worker     std::shared_ptr<DynamicsProcessingSwContext> mContext GUARDED_BY(mImplMutex);
136*4d7e907cSAndroid Build Coastguard Worker     ndk::ScopedAStatus getParameterDynamicsProcessing(const DynamicsProcessing::Tag& tag,
137*4d7e907cSAndroid Build Coastguard Worker                                                       Parameter::Specific* specific)
138*4d7e907cSAndroid Build Coastguard Worker             REQUIRES(mImplMutex);
139*4d7e907cSAndroid Build Coastguard Worker 
140*4d7e907cSAndroid Build Coastguard Worker };  // DynamicsProcessingSw
141*4d7e907cSAndroid Build Coastguard Worker 
142*4d7e907cSAndroid Build Coastguard Worker }  // namespace aidl::android::hardware::audio::effect
143