1 /*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #define LOG_TAG "DPBase"
18 //#define LOG_NDEBUG 0
19
20 #include <log/log.h>
21 #include "DPBase.h"
22 #include "DPFrequency.h"
23
24 namespace dp_fx {
25
DPStage()26 DPStage::DPStage() : mInUse(DP_DEFAULT_STAGE_INUSE),
27 mEnabled(DP_DEFAULT_STAGE_ENABLED) {
28 }
29
init(bool inUse,bool enabled)30 void DPStage::init(bool inUse, bool enabled) {
31 mInUse = inUse;
32 mEnabled = enabled;
33 }
34
35 //----
DPBandStage()36 DPBandStage::DPBandStage() : mBandCount(0) {
37 }
38
init(bool inUse,bool enabled,int bandCount)39 void DPBandStage::init(bool inUse, bool enabled, int bandCount) {
40 DPStage::init(inUse, enabled);
41 mBandCount = inUse ? bandCount : 0;
42 }
43
44 //---
DPBandBase()45 DPBandBase::DPBandBase() {
46 init(DP_DEFAULT_BAND_ENABLED,
47 DP_DEFAULT_BAND_CUTOFF_FREQUENCY_HZ);
48 }
49
init(bool enabled,float cutoffFrequency)50 void DPBandBase::init(bool enabled, float cutoffFrequency){
51 mEnabled = enabled;
52 mCutoofFrequencyHz = cutoffFrequency;
53 }
54
55 //-----
DPEqBand()56 DPEqBand::DPEqBand() {
57 init(DP_DEFAULT_BAND_ENABLED,
58 DP_DEFAULT_BAND_CUTOFF_FREQUENCY_HZ,
59 DP_DEFAULT_GAIN_DB);
60 }
61
init(bool enabled,float cutoffFrequency,float gain)62 void DPEqBand::init(bool enabled, float cutoffFrequency, float gain) {
63 DPBandBase::init(enabled, cutoffFrequency);
64 setGain(gain);
65 }
66
getGain() const67 float DPEqBand::getGain() const{
68 return mGainDb;
69 }
70
setGain(float gain)71 void DPEqBand::setGain(float gain) {
72 mGainDb = gain;
73 }
74
75 //------
DPMbcBand()76 DPMbcBand::DPMbcBand() {
77 init(DP_DEFAULT_BAND_ENABLED,
78 DP_DEFAULT_BAND_CUTOFF_FREQUENCY_HZ,
79 DP_DEFAULT_ATTACK_TIME_MS,
80 DP_DEFAULT_RELEASE_TIME_MS,
81 DP_DEFAULT_RATIO,
82 DP_DEFAULT_THRESHOLD_DB,
83 DP_DEFAULT_KNEE_WIDTH_DB,
84 DP_DEFAULT_NOISE_GATE_THRESHOLD_DB,
85 DP_DEFAULT_EXPANDER_RATIO,
86 DP_DEFAULT_GAIN_DB,
87 DP_DEFAULT_GAIN_DB);
88 }
89
init(bool enabled,float cutoffFrequency,float attackTime,float releaseTime,float ratio,float threshold,float kneeWidth,float noiseGateThreshold,float expanderRatio,float preGain,float postGain)90 void DPMbcBand::init(bool enabled, float cutoffFrequency, float attackTime, float releaseTime,
91 float ratio, float threshold, float kneeWidth, float noiseGateThreshold,
92 float expanderRatio, float preGain, float postGain) {
93 DPBandBase::init(enabled, cutoffFrequency);
94 setAttackTime(attackTime);
95 setReleaseTime(releaseTime);
96 setRatio(ratio);
97 setThreshold(threshold);
98 setKneeWidth(kneeWidth);
99 setNoiseGateThreshold(noiseGateThreshold);
100 setExpanderRatio(expanderRatio);
101 setPreGain(preGain);
102 setPostGain(postGain);
103 }
104
105 //------
DPEq()106 DPEq::DPEq() {
107 }
108
init(bool inUse,bool enabled,uint32_t bandCount)109 void DPEq::init(bool inUse, bool enabled, uint32_t bandCount) {
110 DPBandStage::init(inUse, enabled, bandCount);
111 mBands.resize(getBandCount());
112 }
113
getBand(uint32_t band)114 DPEqBand * DPEq::getBand(uint32_t band) {
115 if (band < getBandCount()) {
116 return &mBands[band];
117 }
118 return NULL;
119 }
120
setBand(uint32_t band,DPEqBand & src)121 void DPEq::setBand(uint32_t band, DPEqBand &src) {
122 if (band < getBandCount()) {
123 mBands[band] = src;
124 }
125 }
126
127 //------
DPMbc()128 DPMbc::DPMbc() {
129 }
130
init(bool inUse,bool enabled,uint32_t bandCount)131 void DPMbc::init(bool inUse, bool enabled, uint32_t bandCount) {
132 DPBandStage::init(inUse, enabled, bandCount);
133 if (isInUse()) {
134 mBands.resize(bandCount);
135 } else {
136 mBands.resize(0);
137 }
138 }
139
getBand(uint32_t band)140 DPMbcBand * DPMbc::getBand(uint32_t band) {
141 if (band < getBandCount()) {
142 return &mBands[band];
143 }
144 return NULL;
145 }
146
setBand(uint32_t band,DPMbcBand & src)147 void DPMbc::setBand(uint32_t band, DPMbcBand &src) {
148 if (band < getBandCount()) {
149 mBands[band] = src;
150 }
151 }
152
153 //------
DPLimiter()154 DPLimiter::DPLimiter() {
155 init(DP_DEFAULT_STAGE_INUSE,
156 DP_DEFAULT_STAGE_ENABLED,
157 DP_DEFAULT_LINK_GROUP,
158 DP_DEFAULT_ATTACK_TIME_MS,
159 DP_DEFAULT_RELEASE_TIME_MS,
160 DP_DEFAULT_RATIO,
161 DP_DEFAULT_THRESHOLD_DB,
162 DP_DEFAULT_GAIN_DB);
163 }
164
init(bool inUse,bool enabled,uint32_t linkGroup,float attackTime,float releaseTime,float ratio,float threshold,float postGain)165 void DPLimiter::init(bool inUse, bool enabled, uint32_t linkGroup, float attackTime, float releaseTime,
166 float ratio, float threshold, float postGain) {
167 DPStage::init(inUse, enabled);
168 setLinkGroup(linkGroup);
169 setAttackTime(attackTime);
170 setReleaseTime(releaseTime);
171 setRatio(ratio);
172 setThreshold(threshold);
173 setPostGain(postGain);
174 }
175
176 //----
DPChannel()177 DPChannel::DPChannel() : mInitialized(false), mInputGainDb(0), mOutputGainDb(0),
178 mPreEqInUse(false), mMbcInUse(false), mPostEqInUse(false), mLimiterInUse(false) {
179 }
180
init(float inputGain,bool preEqInUse,uint32_t preEqBandCount,bool mbcInUse,uint32_t mbcBandCount,bool postEqInUse,uint32_t postEqBandCount,bool limiterInUse)181 void DPChannel::init(float inputGain, bool preEqInUse, uint32_t preEqBandCount,
182 bool mbcInUse, uint32_t mbcBandCount, bool postEqInUse, uint32_t postEqBandCount,
183 bool limiterInUse) {
184 setInputGain(inputGain);
185 mPreEqInUse = preEqInUse;
186 mMbcInUse = mbcInUse;
187 mPostEqInUse = postEqInUse;
188 mLimiterInUse = limiterInUse;
189
190 mPreEq.init(mPreEqInUse, false, preEqBandCount);
191 mMbc.init(mMbcInUse, false, mbcBandCount);
192 mPostEq.init(mPostEqInUse, false, postEqBandCount);
193 mLimiter.init(mLimiterInUse, false, 0, 50, 120, 2, -30, 0);
194 mInitialized = true;
195 }
196
getPreEq()197 DPEq* DPChannel::getPreEq() {
198 if (!mInitialized) {
199 return NULL;
200 }
201 return &mPreEq;
202 }
203
getMbc()204 DPMbc* DPChannel::getMbc() {
205 if (!mInitialized) {
206 return NULL;
207 }
208 return &mMbc;
209 }
210
getPostEq()211 DPEq* DPChannel::getPostEq() {
212 if (!mInitialized) {
213 return NULL;
214 }
215 return &mPostEq;
216 }
217
getLimiter()218 DPLimiter* DPChannel::getLimiter() {
219 if (!mInitialized) {
220 return NULL;
221 }
222 return &mLimiter;
223 }
224
setLimiter(DPLimiter & limiter)225 void DPChannel::setLimiter(DPLimiter &limiter) {
226 if (!mInitialized) {
227 return;
228 }
229 mLimiter = limiter;
230 }
231
232 //----
DPBase()233 DPBase::DPBase() : mInitialized(false), mChannelCount(0), mPreEqInUse(false), mPreEqBandCount(0),
234 mMbcInUse(false), mMbcBandCount(0), mPostEqInUse(false), mPostEqBandCount(0),
235 mLimiterInUse(false) {
236 }
237
init(uint32_t channelCount,bool preEqInUse,uint32_t preEqBandCount,bool mbcInUse,uint32_t mbcBandCount,bool postEqInUse,uint32_t postEqBandCount,bool limiterInUse)238 void DPBase::init(uint32_t channelCount, bool preEqInUse, uint32_t preEqBandCount,
239 bool mbcInUse, uint32_t mbcBandCount, bool postEqInUse, uint32_t postEqBandCount,
240 bool limiterInUse) {
241 ALOGV("DPBase::init");
242 mChannelCount = channelCount;
243 mPreEqInUse = preEqInUse;
244 mPreEqBandCount = preEqBandCount;
245 mMbcInUse = mbcInUse;
246 mMbcBandCount = mbcBandCount;
247 mPostEqInUse = postEqInUse;
248 mPostEqBandCount = postEqBandCount;
249 mLimiterInUse = limiterInUse;
250 mChannel.resize(mChannelCount);
251 for (size_t ch = 0; ch < mChannelCount; ch++) {
252 mChannel[ch].init(0, preEqInUse, preEqBandCount, mbcInUse, mbcBandCount,
253 postEqInUse, postEqBandCount, limiterInUse);
254 }
255 mInitialized = true;
256 }
257
getChannel(uint32_t channelIndex)258 DPChannel* DPBase::getChannel(uint32_t channelIndex) {
259 if (!mInitialized || channelIndex < 0 || channelIndex >= mChannel.size()) {
260 return NULL;
261 }
262 return & mChannel[channelIndex];
263 }
264
265 } //namespace dp_fx
266