DPBase.h revision 9f011fed92c4982819f78c7cfb4c07b27adf7651
19f011fed92c4982819f78c7cfb4c07b27adf7651rago/*
29f011fed92c4982819f78c7cfb4c07b27adf7651rago * Copyright (C) 2018 The Android Open Source Project
39f011fed92c4982819f78c7cfb4c07b27adf7651rago *
49f011fed92c4982819f78c7cfb4c07b27adf7651rago * Licensed under the Apache License, Version 2.0 (the "License");
59f011fed92c4982819f78c7cfb4c07b27adf7651rago * you may not use this file except in compliance with the License.
69f011fed92c4982819f78c7cfb4c07b27adf7651rago * You may obtain a copy of the License at
79f011fed92c4982819f78c7cfb4c07b27adf7651rago *
89f011fed92c4982819f78c7cfb4c07b27adf7651rago *      http://www.apache.org/licenses/LICENSE-2.0
99f011fed92c4982819f78c7cfb4c07b27adf7651rago *
109f011fed92c4982819f78c7cfb4c07b27adf7651rago * Unless required by applicable law or agreed to in writing, software
119f011fed92c4982819f78c7cfb4c07b27adf7651rago * distributed under the License is distributed on an "AS IS" BASIS,
129f011fed92c4982819f78c7cfb4c07b27adf7651rago * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139f011fed92c4982819f78c7cfb4c07b27adf7651rago * See the License for the specific language governing permissions and
149f011fed92c4982819f78c7cfb4c07b27adf7651rago * limitations under the License.
159f011fed92c4982819f78c7cfb4c07b27adf7651rago */
169f011fed92c4982819f78c7cfb4c07b27adf7651rago
179f011fed92c4982819f78c7cfb4c07b27adf7651rago#include <stdint.h>
189f011fed92c4982819f78c7cfb4c07b27adf7651rago#include <cmath>
199f011fed92c4982819f78c7cfb4c07b27adf7651rago#include <vector>
209f011fed92c4982819f78c7cfb4c07b27adf7651rago#include <android/log.h>
219f011fed92c4982819f78c7cfb4c07b27adf7651rago
229f011fed92c4982819f78c7cfb4c07b27adf7651ragonamespace dp_fx {
239f011fed92c4982819f78c7cfb4c07b27adf7651rago
249f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_BAND_ENABLED false
259f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_BAND_CUTOFF_FREQUENCY_HZ 1000
269f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_ATTACK_TIME_MS 50
279f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_RELEASE_TIME_MS 120
289f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_RATIO 2
299f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_THRESHOLD_DB -30
309f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_KNEE_WIDTH_DB 0
319f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_NOISE_GATE_THRESHOLD_DB -90
329f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_EXPANDER_RATIO 1
339f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_GAIN_DB 0
349f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_STAGE_INUSE false
359f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_STAGE_ENABLED false
369f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_LINK_GROUP 0
379f011fed92c4982819f78c7cfb4c07b27adf7651rago
389f011fed92c4982819f78c7cfb4c07b27adf7651rago
399f011fed92c4982819f78c7cfb4c07b27adf7651rago
409f011fed92c4982819f78c7cfb4c07b27adf7651ragoclass DPStage {
419f011fed92c4982819f78c7cfb4c07b27adf7651ragopublic:
429f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPStage();
439f011fed92c4982819f78c7cfb4c07b27adf7651rago    ~DPStage() = default;
449f011fed92c4982819f78c7cfb4c07b27adf7651rago    void init(bool inUse, bool enabled);
459f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool isInUse() const {
469f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mInUse;
479f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
489f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool isEnabled() const {
499f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mEnabled;
509f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
519f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setEnabled(bool enabled) {
529f011fed92c4982819f78c7cfb4c07b27adf7651rago        mEnabled = enabled;
539f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
549f011fed92c4982819f78c7cfb4c07b27adf7651ragoprivate:
559f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mInUse;
569f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mEnabled;
579f011fed92c4982819f78c7cfb4c07b27adf7651rago};
589f011fed92c4982819f78c7cfb4c07b27adf7651rago
599f011fed92c4982819f78c7cfb4c07b27adf7651ragoclass DPBandStage : public DPStage {
609f011fed92c4982819f78c7cfb4c07b27adf7651ragopublic:
619f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPBandStage();
629f011fed92c4982819f78c7cfb4c07b27adf7651rago    ~DPBandStage() = default;
639f011fed92c4982819f78c7cfb4c07b27adf7651rago    void init(bool inUse, bool enabled, int bandCount);
649f011fed92c4982819f78c7cfb4c07b27adf7651rago    uint32_t getBandCount() const {
659f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mBandCount;
669f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
679f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setBandCount(uint32_t bandCount) {
689f011fed92c4982819f78c7cfb4c07b27adf7651rago        mBandCount = bandCount;
699f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
709f011fed92c4982819f78c7cfb4c07b27adf7651ragoprivate:
719f011fed92c4982819f78c7cfb4c07b27adf7651rago    uint32_t mBandCount;
729f011fed92c4982819f78c7cfb4c07b27adf7651rago};
739f011fed92c4982819f78c7cfb4c07b27adf7651rago
749f011fed92c4982819f78c7cfb4c07b27adf7651ragoclass DPBandBase {
759f011fed92c4982819f78c7cfb4c07b27adf7651ragopublic:
769f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPBandBase();
779f011fed92c4982819f78c7cfb4c07b27adf7651rago    ~DPBandBase() = default;
789f011fed92c4982819f78c7cfb4c07b27adf7651rago    void init(bool enabled, float cutoffFrequency);
799f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool isEnabled() const {
809f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mEnabled;
819f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
829f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setEnabled(bool enabled) {
839f011fed92c4982819f78c7cfb4c07b27adf7651rago        mEnabled = enabled;
849f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
859f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getCutoffFrequency() const {
869f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mCutoofFrequencyHz;
879f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
889f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setCutoffFrequency(float cutoffFrequency) {
899f011fed92c4982819f78c7cfb4c07b27adf7651rago        mCutoofFrequencyHz = cutoffFrequency;
909f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
919f011fed92c4982819f78c7cfb4c07b27adf7651ragoprivate:
929f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mEnabled;
939f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mCutoofFrequencyHz;
949f011fed92c4982819f78c7cfb4c07b27adf7651rago};
959f011fed92c4982819f78c7cfb4c07b27adf7651rago
969f011fed92c4982819f78c7cfb4c07b27adf7651ragoclass DPEqBand : public DPBandBase {
979f011fed92c4982819f78c7cfb4c07b27adf7651ragopublic:
989f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPEqBand();
999f011fed92c4982819f78c7cfb4c07b27adf7651rago    ~DPEqBand() = default;
1009f011fed92c4982819f78c7cfb4c07b27adf7651rago    void init(bool enabled, float cutoffFrequency, float gain);
1019f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getGain() const;
1029f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setGain(float gain);
1039f011fed92c4982819f78c7cfb4c07b27adf7651ragoprivate:
1049f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mGainDb;
1059f011fed92c4982819f78c7cfb4c07b27adf7651rago};
1069f011fed92c4982819f78c7cfb4c07b27adf7651rago
1079f011fed92c4982819f78c7cfb4c07b27adf7651ragoclass DPMbcBand : public DPBandBase {
1089f011fed92c4982819f78c7cfb4c07b27adf7651ragopublic:
1099f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPMbcBand();
1109f011fed92c4982819f78c7cfb4c07b27adf7651rago    ~DPMbcBand() = default;
1119f011fed92c4982819f78c7cfb4c07b27adf7651rago    void init(bool enabled, float cutoffFrequency, float attackTime, float releaseTime,
1129f011fed92c4982819f78c7cfb4c07b27adf7651rago            float ratio, float threshold, float kneeWidth, float noiseGateThreshold,
1139f011fed92c4982819f78c7cfb4c07b27adf7651rago            float expanderRatio, float preGain, float postGain);
1149f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getAttackTime() const {
1159f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mAttackTimeMs;
1169f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1179f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setAttackTime(float attackTime) {
1189f011fed92c4982819f78c7cfb4c07b27adf7651rago        mAttackTimeMs = attackTime;
1199f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1209f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getReleaseTime() const {
1219f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mReleaseTimeMs;
1229f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1239f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setReleaseTime(float releaseTime) {
1249f011fed92c4982819f78c7cfb4c07b27adf7651rago        mReleaseTimeMs = releaseTime;
1259f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1269f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getRatio() const {
1279f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mRatio;
1289f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1299f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setRatio(float ratio) {
1309f011fed92c4982819f78c7cfb4c07b27adf7651rago        mRatio = ratio;
1319f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1329f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getThreshold() const {
1339f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mThresholdDb;
1349f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1359f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setThreshold(float threshold) {
1369f011fed92c4982819f78c7cfb4c07b27adf7651rago        mThresholdDb = threshold;
1379f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1389f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getKneeWidth() const {
1399f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mKneeWidthDb;
1409f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1419f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setKneeWidth(float kneeWidth) {
1429f011fed92c4982819f78c7cfb4c07b27adf7651rago        mKneeWidthDb = kneeWidth;
1439f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1449f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getNoiseGateThreshold() const {
1459f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mNoiseGateThresholdDb;
1469f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1479f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setNoiseGateThreshold(float noiseGateThreshold) {
1489f011fed92c4982819f78c7cfb4c07b27adf7651rago        mNoiseGateThresholdDb = noiseGateThreshold;
1499f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1509f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getExpanderRatio() const {
1519f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mExpanderRatio;
1529f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1539f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setExpanderRatio(float expanderRatio) {
1549f011fed92c4982819f78c7cfb4c07b27adf7651rago        mExpanderRatio = expanderRatio;
1559f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1569f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getPreGain() const {
1579f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mPreGainDb;
1589f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1599f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setPreGain(float preGain) {
1609f011fed92c4982819f78c7cfb4c07b27adf7651rago        mPreGainDb = preGain;
1619f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1629f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getPostGain() const {
1639f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mPostGainDb;
1649f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1659f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setPostGain(float postGain) {
1669f011fed92c4982819f78c7cfb4c07b27adf7651rago        mPostGainDb = postGain;
1679f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1689f011fed92c4982819f78c7cfb4c07b27adf7651ragoprivate:
1699f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mAttackTimeMs;
1709f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mReleaseTimeMs;
1719f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mRatio;
1729f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mThresholdDb;
1739f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mKneeWidthDb;
1749f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mNoiseGateThresholdDb;
1759f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mExpanderRatio;
1769f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mPreGainDb;
1779f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mPostGainDb;
1789f011fed92c4982819f78c7cfb4c07b27adf7651rago};
1799f011fed92c4982819f78c7cfb4c07b27adf7651rago
1809f011fed92c4982819f78c7cfb4c07b27adf7651ragoclass DPEq : public DPBandStage {
1819f011fed92c4982819f78c7cfb4c07b27adf7651ragopublic:
1829f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPEq();
1839f011fed92c4982819f78c7cfb4c07b27adf7651rago    ~DPEq() = default;
1849f011fed92c4982819f78c7cfb4c07b27adf7651rago    void init(bool inUse, bool enabled, uint32_t bandCount);
1859f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPEqBand * getBand(uint32_t band);
1869f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setBand(uint32_t band, DPEqBand &src);
1879f011fed92c4982819f78c7cfb4c07b27adf7651ragoprivate:
1889f011fed92c4982819f78c7cfb4c07b27adf7651rago    std::vector<DPEqBand> mBands;
1899f011fed92c4982819f78c7cfb4c07b27adf7651rago};
1909f011fed92c4982819f78c7cfb4c07b27adf7651rago
1919f011fed92c4982819f78c7cfb4c07b27adf7651ragoclass DPMbc : public DPBandStage {
1929f011fed92c4982819f78c7cfb4c07b27adf7651ragopublic:
1939f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPMbc();
1949f011fed92c4982819f78c7cfb4c07b27adf7651rago    ~DPMbc() = default;
1959f011fed92c4982819f78c7cfb4c07b27adf7651rago    void init(bool inUse, bool enabled, uint32_t bandCount);
1969f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPMbcBand * getBand(uint32_t band);
1979f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setBand(uint32_t band, DPMbcBand &src);
1989f011fed92c4982819f78c7cfb4c07b27adf7651ragoprivate:
1999f011fed92c4982819f78c7cfb4c07b27adf7651rago    std::vector<DPMbcBand> mBands;
2009f011fed92c4982819f78c7cfb4c07b27adf7651rago};
2019f011fed92c4982819f78c7cfb4c07b27adf7651rago
2029f011fed92c4982819f78c7cfb4c07b27adf7651ragoclass DPLimiter : public DPStage {
2039f011fed92c4982819f78c7cfb4c07b27adf7651ragopublic:
2049f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPLimiter();
2059f011fed92c4982819f78c7cfb4c07b27adf7651rago    ~DPLimiter() = default;
2069f011fed92c4982819f78c7cfb4c07b27adf7651rago    void init(bool inUse, bool enabled, uint32_t linkGroup, float attackTime, float releaseTime,
2079f011fed92c4982819f78c7cfb4c07b27adf7651rago            float ratio, float threshold, float postGain);
2089f011fed92c4982819f78c7cfb4c07b27adf7651rago    uint32_t getLinkGroup() const {
2099f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mLinkGroup;
2109f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2119f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setLinkGroup(uint32_t linkGroup) {
2129f011fed92c4982819f78c7cfb4c07b27adf7651rago        mLinkGroup = linkGroup;
2139f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2149f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getAttackTime() const {
2159f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mAttackTimeMs;
2169f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2179f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setAttackTime(float attackTime) {
2189f011fed92c4982819f78c7cfb4c07b27adf7651rago        mAttackTimeMs = attackTime;
2199f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2209f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getReleaseTime() const {
2219f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mReleaseTimeMs;
2229f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2239f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setReleaseTime(float releaseTime) {
2249f011fed92c4982819f78c7cfb4c07b27adf7651rago        mReleaseTimeMs = releaseTime;
2259f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2269f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getRatio() const {
2279f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mRatio;
2289f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2299f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setRatio(float ratio) {
2309f011fed92c4982819f78c7cfb4c07b27adf7651rago        mRatio = ratio;
2319f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2329f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getThreshold() const {
2339f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mThresholdDb;
2349f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2359f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setThreshold(float threshold) {
2369f011fed92c4982819f78c7cfb4c07b27adf7651rago        mThresholdDb = threshold;
2379f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2389f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getPostGain() const {
2399f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mPostGainDb;
2409f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2419f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setPostGain(float postGain) {
2429f011fed92c4982819f78c7cfb4c07b27adf7651rago        mPostGainDb = postGain;
2439f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2449f011fed92c4982819f78c7cfb4c07b27adf7651ragoprivate:
2459f011fed92c4982819f78c7cfb4c07b27adf7651rago    uint32_t mLinkGroup;
2469f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mAttackTimeMs;
2479f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mReleaseTimeMs;
2489f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mRatio;
2499f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mThresholdDb;
2509f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mPostGainDb;
2519f011fed92c4982819f78c7cfb4c07b27adf7651rago};
2529f011fed92c4982819f78c7cfb4c07b27adf7651rago
2539f011fed92c4982819f78c7cfb4c07b27adf7651ragoclass DPChannel {
2549f011fed92c4982819f78c7cfb4c07b27adf7651ragopublic:
2559f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPChannel();
2569f011fed92c4982819f78c7cfb4c07b27adf7651rago    ~DPChannel() = default;
2579f011fed92c4982819f78c7cfb4c07b27adf7651rago    void init(float inputGain, bool preEqInUse, uint32_t preEqBandCount,
2589f011fed92c4982819f78c7cfb4c07b27adf7651rago            bool mbcInUse, uint32_t mbcBandCount, bool postEqInUse, uint32_t postEqBandCount,
2599f011fed92c4982819f78c7cfb4c07b27adf7651rago            bool limiterInUse);
2609f011fed92c4982819f78c7cfb4c07b27adf7651rago
2619f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getInputGain() const {
2629f011fed92c4982819f78c7cfb4c07b27adf7651rago        if (!mInitialized) {
2639f011fed92c4982819f78c7cfb4c07b27adf7651rago            return 0;
2649f011fed92c4982819f78c7cfb4c07b27adf7651rago        }
2659f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mInputGainDb;
2669f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2679f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setInputGain(float gain) {
2689f011fed92c4982819f78c7cfb4c07b27adf7651rago        mInputGainDb = gain;
2699f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2709f011fed92c4982819f78c7cfb4c07b27adf7651rago
2719f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPEq* getPreEq();
2729f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPMbc* getMbc();
2739f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPEq* getPostEq();
2749f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPLimiter *getLimiter();
2759f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setLimiter(DPLimiter &limiter);
2769f011fed92c4982819f78c7cfb4c07b27adf7651rago
2779f011fed92c4982819f78c7cfb4c07b27adf7651ragoprivate:
2789f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mInitialized;
2799f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mInputGainDb;
2809f011fed92c4982819f78c7cfb4c07b27adf7651rago
2819f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPEq mPreEq;
2829f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPMbc mMbc;
2839f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPEq mPostEq;
2849f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPLimiter mLimiter;
2859f011fed92c4982819f78c7cfb4c07b27adf7651rago
2869f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mPreEqInUse;
2879f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mMbcInUse;
2889f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mPostEqInUse;
2899f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mLimiterInUse;
2909f011fed92c4982819f78c7cfb4c07b27adf7651rago};
2919f011fed92c4982819f78c7cfb4c07b27adf7651rago
2929f011fed92c4982819f78c7cfb4c07b27adf7651ragoclass DPBase {
2939f011fed92c4982819f78c7cfb4c07b27adf7651ragopublic:
2949f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPBase();
2959f011fed92c4982819f78c7cfb4c07b27adf7651rago    virtual ~DPBase() = default;
2969f011fed92c4982819f78c7cfb4c07b27adf7651rago
2979f011fed92c4982819f78c7cfb4c07b27adf7651rago    void init(uint32_t channelCount, bool preEqInUse, uint32_t preEqBandCount,
2989f011fed92c4982819f78c7cfb4c07b27adf7651rago            bool mbcInUse, uint32_t mbcBandCount, bool postEqInUse, uint32_t postEqBandCount,
2999f011fed92c4982819f78c7cfb4c07b27adf7651rago            bool limiterInUse);
3009f011fed92c4982819f78c7cfb4c07b27adf7651rago    virtual size_t processSamples(float *in, float *out, size_t samples);
3019f011fed92c4982819f78c7cfb4c07b27adf7651rago    virtual void reset();
3029f011fed92c4982819f78c7cfb4c07b27adf7651rago
3039f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPChannel* getChannel(uint32_t channelIndex);
3049f011fed92c4982819f78c7cfb4c07b27adf7651rago    uint32_t getChannelCount() const {
3059f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mChannelCount;
3069f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
3079f011fed92c4982819f78c7cfb4c07b27adf7651rago    uint32_t getPreEqBandCount() const {
3089f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mPreEqBandCount;
3099f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
3109f011fed92c4982819f78c7cfb4c07b27adf7651rago    uint32_t getMbcBandCount() const {
3119f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mMbcBandCount;
3129f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
3139f011fed92c4982819f78c7cfb4c07b27adf7651rago    uint32_t getPostEqBandCount() const {
3149f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mPostEqBandCount;
3159f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
3169f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool isPreEQInUse() const {
3179f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mPreEqInUse;
3189f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
3199f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool isMbcInUse() const {
3209f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mMbcInUse;
3219f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
3229f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool isPostEqInUse() const {
3239f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mPostEqInUse;
3249f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
3259f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool isLimiterInUse() const {
3269f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mLimiterInUse;
3279f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
3289f011fed92c4982819f78c7cfb4c07b27adf7651rago
3299f011fed92c4982819f78c7cfb4c07b27adf7651ragoprivate:
3309f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mInitialized;
3319f011fed92c4982819f78c7cfb4c07b27adf7651rago    //general
3329f011fed92c4982819f78c7cfb4c07b27adf7651rago    uint32_t mChannelCount;
3339f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mPreEqInUse;
3349f011fed92c4982819f78c7cfb4c07b27adf7651rago    uint32_t mPreEqBandCount;
3359f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mMbcInUse;
3369f011fed92c4982819f78c7cfb4c07b27adf7651rago    uint32_t mMbcBandCount;
3379f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mPostEqInUse;
3389f011fed92c4982819f78c7cfb4c07b27adf7651rago    uint32_t mPostEqBandCount;
3399f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mLimiterInUse;
3409f011fed92c4982819f78c7cfb4c07b27adf7651rago
3419f011fed92c4982819f78c7cfb4c07b27adf7651rago    std::vector<DPChannel> mChannel;
3429f011fed92c4982819f78c7cfb4c07b27adf7651rago};
3439f011fed92c4982819f78c7cfb4c07b27adf7651rago
3449f011fed92c4982819f78c7cfb4c07b27adf7651rago} //namespace dp_fx
345