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
17ff0a51f978a6307153cc752b8071144d642b54acrago#ifndef DPBASE_H_
18ff0a51f978a6307153cc752b8071144d642b54acrago#define DPBASE_H_
19ff0a51f978a6307153cc752b8071144d642b54acrago
20ff0a51f978a6307153cc752b8071144d642b54acrago
219f011fed92c4982819f78c7cfb4c07b27adf7651rago#include <stdint.h>
229f011fed92c4982819f78c7cfb4c07b27adf7651rago#include <cmath>
239f011fed92c4982819f78c7cfb4c07b27adf7651rago#include <vector>
249f011fed92c4982819f78c7cfb4c07b27adf7651rago#include <android/log.h>
259f011fed92c4982819f78c7cfb4c07b27adf7651rago
269f011fed92c4982819f78c7cfb4c07b27adf7651ragonamespace dp_fx {
279f011fed92c4982819f78c7cfb4c07b27adf7651rago
289f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_BAND_ENABLED false
299f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_BAND_CUTOFF_FREQUENCY_HZ 1000
309f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_ATTACK_TIME_MS 50
319f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_RELEASE_TIME_MS 120
329f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_RATIO 2
339f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_THRESHOLD_DB -30
349f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_KNEE_WIDTH_DB 0
359f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_NOISE_GATE_THRESHOLD_DB -90
369f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_EXPANDER_RATIO 1
379f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_GAIN_DB 0
389f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_STAGE_INUSE false
399f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_STAGE_ENABLED false
409f011fed92c4982819f78c7cfb4c07b27adf7651rago#define DP_DEFAULT_LINK_GROUP 0
419f011fed92c4982819f78c7cfb4c07b27adf7651rago
429f011fed92c4982819f78c7cfb4c07b27adf7651rago
439f011fed92c4982819f78c7cfb4c07b27adf7651rago
449f011fed92c4982819f78c7cfb4c07b27adf7651ragoclass DPStage {
459f011fed92c4982819f78c7cfb4c07b27adf7651ragopublic:
469f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPStage();
479f011fed92c4982819f78c7cfb4c07b27adf7651rago    ~DPStage() = default;
489f011fed92c4982819f78c7cfb4c07b27adf7651rago    void init(bool inUse, bool enabled);
499f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool isInUse() const {
509f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mInUse;
519f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
529f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool isEnabled() const {
539f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mEnabled;
549f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
559f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setEnabled(bool enabled) {
569f011fed92c4982819f78c7cfb4c07b27adf7651rago        mEnabled = enabled;
579f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
589f011fed92c4982819f78c7cfb4c07b27adf7651ragoprivate:
599f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mInUse;
609f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mEnabled;
619f011fed92c4982819f78c7cfb4c07b27adf7651rago};
629f011fed92c4982819f78c7cfb4c07b27adf7651rago
639f011fed92c4982819f78c7cfb4c07b27adf7651ragoclass DPBandStage : public DPStage {
649f011fed92c4982819f78c7cfb4c07b27adf7651ragopublic:
659f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPBandStage();
669f011fed92c4982819f78c7cfb4c07b27adf7651rago    ~DPBandStage() = default;
679f011fed92c4982819f78c7cfb4c07b27adf7651rago    void init(bool inUse, bool enabled, int bandCount);
689f011fed92c4982819f78c7cfb4c07b27adf7651rago    uint32_t getBandCount() const {
699f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mBandCount;
709f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
719f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setBandCount(uint32_t bandCount) {
729f011fed92c4982819f78c7cfb4c07b27adf7651rago        mBandCount = bandCount;
739f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
749f011fed92c4982819f78c7cfb4c07b27adf7651ragoprivate:
759f011fed92c4982819f78c7cfb4c07b27adf7651rago    uint32_t mBandCount;
769f011fed92c4982819f78c7cfb4c07b27adf7651rago};
779f011fed92c4982819f78c7cfb4c07b27adf7651rago
789f011fed92c4982819f78c7cfb4c07b27adf7651ragoclass DPBandBase {
799f011fed92c4982819f78c7cfb4c07b27adf7651ragopublic:
809f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPBandBase();
819f011fed92c4982819f78c7cfb4c07b27adf7651rago    ~DPBandBase() = default;
829f011fed92c4982819f78c7cfb4c07b27adf7651rago    void init(bool enabled, float cutoffFrequency);
839f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool isEnabled() const {
849f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mEnabled;
859f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
869f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setEnabled(bool enabled) {
879f011fed92c4982819f78c7cfb4c07b27adf7651rago        mEnabled = enabled;
889f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
899f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getCutoffFrequency() const {
909f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mCutoofFrequencyHz;
919f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
929f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setCutoffFrequency(float cutoffFrequency) {
939f011fed92c4982819f78c7cfb4c07b27adf7651rago        mCutoofFrequencyHz = cutoffFrequency;
949f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
959f011fed92c4982819f78c7cfb4c07b27adf7651ragoprivate:
969f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mEnabled;
979f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mCutoofFrequencyHz;
989f011fed92c4982819f78c7cfb4c07b27adf7651rago};
999f011fed92c4982819f78c7cfb4c07b27adf7651rago
1009f011fed92c4982819f78c7cfb4c07b27adf7651ragoclass DPEqBand : public DPBandBase {
1019f011fed92c4982819f78c7cfb4c07b27adf7651ragopublic:
1029f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPEqBand();
1039f011fed92c4982819f78c7cfb4c07b27adf7651rago    ~DPEqBand() = default;
1049f011fed92c4982819f78c7cfb4c07b27adf7651rago    void init(bool enabled, float cutoffFrequency, float gain);
1059f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getGain() const;
1069f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setGain(float gain);
1079f011fed92c4982819f78c7cfb4c07b27adf7651ragoprivate:
1089f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mGainDb;
1099f011fed92c4982819f78c7cfb4c07b27adf7651rago};
1109f011fed92c4982819f78c7cfb4c07b27adf7651rago
1119f011fed92c4982819f78c7cfb4c07b27adf7651ragoclass DPMbcBand : public DPBandBase {
1129f011fed92c4982819f78c7cfb4c07b27adf7651ragopublic:
1139f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPMbcBand();
1149f011fed92c4982819f78c7cfb4c07b27adf7651rago    ~DPMbcBand() = default;
1159f011fed92c4982819f78c7cfb4c07b27adf7651rago    void init(bool enabled, float cutoffFrequency, float attackTime, float releaseTime,
1169f011fed92c4982819f78c7cfb4c07b27adf7651rago            float ratio, float threshold, float kneeWidth, float noiseGateThreshold,
1179f011fed92c4982819f78c7cfb4c07b27adf7651rago            float expanderRatio, float preGain, float postGain);
1189f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getAttackTime() const {
1199f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mAttackTimeMs;
1209f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1219f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setAttackTime(float attackTime) {
1229f011fed92c4982819f78c7cfb4c07b27adf7651rago        mAttackTimeMs = attackTime;
1239f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1249f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getReleaseTime() const {
1259f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mReleaseTimeMs;
1269f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1279f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setReleaseTime(float releaseTime) {
1289f011fed92c4982819f78c7cfb4c07b27adf7651rago        mReleaseTimeMs = releaseTime;
1299f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1309f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getRatio() const {
1319f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mRatio;
1329f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1339f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setRatio(float ratio) {
1349f011fed92c4982819f78c7cfb4c07b27adf7651rago        mRatio = ratio;
1359f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1369f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getThreshold() const {
1379f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mThresholdDb;
1389f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1399f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setThreshold(float threshold) {
1409f011fed92c4982819f78c7cfb4c07b27adf7651rago        mThresholdDb = threshold;
1419f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1429f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getKneeWidth() const {
1439f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mKneeWidthDb;
1449f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1459f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setKneeWidth(float kneeWidth) {
1469f011fed92c4982819f78c7cfb4c07b27adf7651rago        mKneeWidthDb = kneeWidth;
1479f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1489f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getNoiseGateThreshold() const {
1499f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mNoiseGateThresholdDb;
1509f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1519f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setNoiseGateThreshold(float noiseGateThreshold) {
1529f011fed92c4982819f78c7cfb4c07b27adf7651rago        mNoiseGateThresholdDb = noiseGateThreshold;
1539f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1549f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getExpanderRatio() const {
1559f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mExpanderRatio;
1569f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1579f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setExpanderRatio(float expanderRatio) {
1589f011fed92c4982819f78c7cfb4c07b27adf7651rago        mExpanderRatio = expanderRatio;
1599f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1609f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getPreGain() const {
1619f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mPreGainDb;
1629f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1639f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setPreGain(float preGain) {
1649f011fed92c4982819f78c7cfb4c07b27adf7651rago        mPreGainDb = preGain;
1659f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1669f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getPostGain() const {
1679f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mPostGainDb;
1689f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1699f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setPostGain(float postGain) {
1709f011fed92c4982819f78c7cfb4c07b27adf7651rago        mPostGainDb = postGain;
1719f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
1729f011fed92c4982819f78c7cfb4c07b27adf7651ragoprivate:
1739f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mAttackTimeMs;
1749f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mReleaseTimeMs;
1759f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mRatio;
1769f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mThresholdDb;
1779f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mKneeWidthDb;
1789f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mNoiseGateThresholdDb;
1799f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mExpanderRatio;
1809f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mPreGainDb;
1819f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mPostGainDb;
1829f011fed92c4982819f78c7cfb4c07b27adf7651rago};
1839f011fed92c4982819f78c7cfb4c07b27adf7651rago
1849f011fed92c4982819f78c7cfb4c07b27adf7651ragoclass DPEq : public DPBandStage {
1859f011fed92c4982819f78c7cfb4c07b27adf7651ragopublic:
1869f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPEq();
1879f011fed92c4982819f78c7cfb4c07b27adf7651rago    ~DPEq() = default;
1889f011fed92c4982819f78c7cfb4c07b27adf7651rago    void init(bool inUse, bool enabled, uint32_t bandCount);
1899f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPEqBand * getBand(uint32_t band);
1909f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setBand(uint32_t band, DPEqBand &src);
1919f011fed92c4982819f78c7cfb4c07b27adf7651ragoprivate:
1929f011fed92c4982819f78c7cfb4c07b27adf7651rago    std::vector<DPEqBand> mBands;
1939f011fed92c4982819f78c7cfb4c07b27adf7651rago};
1949f011fed92c4982819f78c7cfb4c07b27adf7651rago
1959f011fed92c4982819f78c7cfb4c07b27adf7651ragoclass DPMbc : public DPBandStage {
1969f011fed92c4982819f78c7cfb4c07b27adf7651ragopublic:
1979f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPMbc();
1989f011fed92c4982819f78c7cfb4c07b27adf7651rago    ~DPMbc() = default;
1999f011fed92c4982819f78c7cfb4c07b27adf7651rago    void init(bool inUse, bool enabled, uint32_t bandCount);
2009f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPMbcBand * getBand(uint32_t band);
2019f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setBand(uint32_t band, DPMbcBand &src);
2029f011fed92c4982819f78c7cfb4c07b27adf7651ragoprivate:
2039f011fed92c4982819f78c7cfb4c07b27adf7651rago    std::vector<DPMbcBand> mBands;
2049f011fed92c4982819f78c7cfb4c07b27adf7651rago};
2059f011fed92c4982819f78c7cfb4c07b27adf7651rago
2069f011fed92c4982819f78c7cfb4c07b27adf7651ragoclass DPLimiter : public DPStage {
2079f011fed92c4982819f78c7cfb4c07b27adf7651ragopublic:
2089f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPLimiter();
2099f011fed92c4982819f78c7cfb4c07b27adf7651rago    ~DPLimiter() = default;
2109f011fed92c4982819f78c7cfb4c07b27adf7651rago    void init(bool inUse, bool enabled, uint32_t linkGroup, float attackTime, float releaseTime,
2119f011fed92c4982819f78c7cfb4c07b27adf7651rago            float ratio, float threshold, float postGain);
2129f011fed92c4982819f78c7cfb4c07b27adf7651rago    uint32_t getLinkGroup() const {
2139f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mLinkGroup;
2149f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2159f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setLinkGroup(uint32_t linkGroup) {
2169f011fed92c4982819f78c7cfb4c07b27adf7651rago        mLinkGroup = linkGroup;
2179f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2189f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getAttackTime() const {
2199f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mAttackTimeMs;
2209f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2219f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setAttackTime(float attackTime) {
2229f011fed92c4982819f78c7cfb4c07b27adf7651rago        mAttackTimeMs = attackTime;
2239f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2249f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getReleaseTime() const {
2259f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mReleaseTimeMs;
2269f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2279f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setReleaseTime(float releaseTime) {
2289f011fed92c4982819f78c7cfb4c07b27adf7651rago        mReleaseTimeMs = releaseTime;
2299f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2309f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getRatio() const {
2319f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mRatio;
2329f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2339f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setRatio(float ratio) {
2349f011fed92c4982819f78c7cfb4c07b27adf7651rago        mRatio = ratio;
2359f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2369f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getThreshold() const {
2379f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mThresholdDb;
2389f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2399f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setThreshold(float threshold) {
2409f011fed92c4982819f78c7cfb4c07b27adf7651rago        mThresholdDb = threshold;
2419f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2429f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getPostGain() const {
2439f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mPostGainDb;
2449f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2459f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setPostGain(float postGain) {
2469f011fed92c4982819f78c7cfb4c07b27adf7651rago        mPostGainDb = postGain;
2479f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2489f011fed92c4982819f78c7cfb4c07b27adf7651ragoprivate:
2499f011fed92c4982819f78c7cfb4c07b27adf7651rago    uint32_t mLinkGroup;
2509f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mAttackTimeMs;
2519f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mReleaseTimeMs;
2529f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mRatio;
2539f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mThresholdDb;
2549f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mPostGainDb;
2559f011fed92c4982819f78c7cfb4c07b27adf7651rago};
2569f011fed92c4982819f78c7cfb4c07b27adf7651rago
2579f011fed92c4982819f78c7cfb4c07b27adf7651ragoclass DPChannel {
2589f011fed92c4982819f78c7cfb4c07b27adf7651ragopublic:
2599f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPChannel();
2609f011fed92c4982819f78c7cfb4c07b27adf7651rago    ~DPChannel() = default;
2619f011fed92c4982819f78c7cfb4c07b27adf7651rago    void init(float inputGain, bool preEqInUse, uint32_t preEqBandCount,
2629f011fed92c4982819f78c7cfb4c07b27adf7651rago            bool mbcInUse, uint32_t mbcBandCount, bool postEqInUse, uint32_t postEqBandCount,
2639f011fed92c4982819f78c7cfb4c07b27adf7651rago            bool limiterInUse);
2649f011fed92c4982819f78c7cfb4c07b27adf7651rago
2659f011fed92c4982819f78c7cfb4c07b27adf7651rago    float getInputGain() const {
2669f011fed92c4982819f78c7cfb4c07b27adf7651rago        if (!mInitialized) {
2679f011fed92c4982819f78c7cfb4c07b27adf7651rago            return 0;
2689f011fed92c4982819f78c7cfb4c07b27adf7651rago        }
2699f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mInputGainDb;
2709f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2719f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setInputGain(float gain) {
2729f011fed92c4982819f78c7cfb4c07b27adf7651rago        mInputGainDb = gain;
2739f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
2749f011fed92c4982819f78c7cfb4c07b27adf7651rago
275d24e983ec1ff00ef82e3accc042d160f4fca6435rago    float getOutputGain() const {
276d24e983ec1ff00ef82e3accc042d160f4fca6435rago        if (!mInitialized) {
277d24e983ec1ff00ef82e3accc042d160f4fca6435rago            return 0;
278d24e983ec1ff00ef82e3accc042d160f4fca6435rago        }
279d24e983ec1ff00ef82e3accc042d160f4fca6435rago        return mOutputGainDb;
280d24e983ec1ff00ef82e3accc042d160f4fca6435rago    }
281d24e983ec1ff00ef82e3accc042d160f4fca6435rago    void setOutputGain(float gain) {
282d24e983ec1ff00ef82e3accc042d160f4fca6435rago        mOutputGainDb = gain;
283d24e983ec1ff00ef82e3accc042d160f4fca6435rago    }
284d24e983ec1ff00ef82e3accc042d160f4fca6435rago
2859f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPEq* getPreEq();
2869f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPMbc* getMbc();
2879f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPEq* getPostEq();
2889f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPLimiter *getLimiter();
2899f011fed92c4982819f78c7cfb4c07b27adf7651rago    void setLimiter(DPLimiter &limiter);
2909f011fed92c4982819f78c7cfb4c07b27adf7651rago
2919f011fed92c4982819f78c7cfb4c07b27adf7651ragoprivate:
2929f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mInitialized;
2939f011fed92c4982819f78c7cfb4c07b27adf7651rago    float mInputGainDb;
294d24e983ec1ff00ef82e3accc042d160f4fca6435rago    float mOutputGainDb;
2959f011fed92c4982819f78c7cfb4c07b27adf7651rago
2969f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPEq mPreEq;
2979f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPMbc mMbc;
2989f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPEq mPostEq;
2999f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPLimiter mLimiter;
3009f011fed92c4982819f78c7cfb4c07b27adf7651rago
3019f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mPreEqInUse;
3029f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mMbcInUse;
3039f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mPostEqInUse;
3049f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mLimiterInUse;
3059f011fed92c4982819f78c7cfb4c07b27adf7651rago};
3069f011fed92c4982819f78c7cfb4c07b27adf7651rago
3079f011fed92c4982819f78c7cfb4c07b27adf7651ragoclass DPBase {
3089f011fed92c4982819f78c7cfb4c07b27adf7651ragopublic:
3099f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPBase();
3109f011fed92c4982819f78c7cfb4c07b27adf7651rago    virtual ~DPBase() = default;
3119f011fed92c4982819f78c7cfb4c07b27adf7651rago
3129f011fed92c4982819f78c7cfb4c07b27adf7651rago    void init(uint32_t channelCount, bool preEqInUse, uint32_t preEqBandCount,
3139f011fed92c4982819f78c7cfb4c07b27adf7651rago            bool mbcInUse, uint32_t mbcBandCount, bool postEqInUse, uint32_t postEqBandCount,
3149f011fed92c4982819f78c7cfb4c07b27adf7651rago            bool limiterInUse);
315ff0a51f978a6307153cc752b8071144d642b54acrago    virtual size_t processSamples(const float *in, float *out, size_t samples) = 0;
316ff0a51f978a6307153cc752b8071144d642b54acrago    virtual void reset() = 0;
3179f011fed92c4982819f78c7cfb4c07b27adf7651rago
3189f011fed92c4982819f78c7cfb4c07b27adf7651rago    DPChannel* getChannel(uint32_t channelIndex);
3199f011fed92c4982819f78c7cfb4c07b27adf7651rago    uint32_t getChannelCount() const {
3209f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mChannelCount;
3219f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
3229f011fed92c4982819f78c7cfb4c07b27adf7651rago    uint32_t getPreEqBandCount() const {
3239f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mPreEqBandCount;
3249f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
3259f011fed92c4982819f78c7cfb4c07b27adf7651rago    uint32_t getMbcBandCount() const {
3269f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mMbcBandCount;
3279f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
3289f011fed92c4982819f78c7cfb4c07b27adf7651rago    uint32_t getPostEqBandCount() const {
3299f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mPostEqBandCount;
3309f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
3319f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool isPreEQInUse() const {
3329f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mPreEqInUse;
3339f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
3349f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool isMbcInUse() const {
3359f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mMbcInUse;
3369f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
3379f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool isPostEqInUse() const {
3389f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mPostEqInUse;
3399f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
3409f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool isLimiterInUse() const {
3419f011fed92c4982819f78c7cfb4c07b27adf7651rago        return mLimiterInUse;
3429f011fed92c4982819f78c7cfb4c07b27adf7651rago    }
3439f011fed92c4982819f78c7cfb4c07b27adf7651rago
3449f011fed92c4982819f78c7cfb4c07b27adf7651ragoprivate:
3459f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mInitialized;
3469f011fed92c4982819f78c7cfb4c07b27adf7651rago    //general
3479f011fed92c4982819f78c7cfb4c07b27adf7651rago    uint32_t mChannelCount;
3489f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mPreEqInUse;
3499f011fed92c4982819f78c7cfb4c07b27adf7651rago    uint32_t mPreEqBandCount;
3509f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mMbcInUse;
3519f011fed92c4982819f78c7cfb4c07b27adf7651rago    uint32_t mMbcBandCount;
3529f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mPostEqInUse;
3539f011fed92c4982819f78c7cfb4c07b27adf7651rago    uint32_t mPostEqBandCount;
3549f011fed92c4982819f78c7cfb4c07b27adf7651rago    bool mLimiterInUse;
3559f011fed92c4982819f78c7cfb4c07b27adf7651rago
3569f011fed92c4982819f78c7cfb4c07b27adf7651rago    std::vector<DPChannel> mChannel;
3579f011fed92c4982819f78c7cfb4c07b27adf7651rago};
3589f011fed92c4982819f78c7cfb4c07b27adf7651rago
3599f011fed92c4982819f78c7cfb4c07b27adf7651rago} //namespace dp_fx
360ff0a51f978a6307153cc752b8071144d642b54acrago
361ff0a51f978a6307153cc752b8071144d642b54acrago
362ff0a51f978a6307153cc752b8071144d642b54acrago#endif  // DPBASE_H_
363