blob: 8b79991c67eb050e726751cba3e358e906339d85 [file] [log] [blame]
rago9f011fe2018-02-05 09:29:56 -08001/*
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
ragoff0a51f2018-03-22 09:55:50 -070017#define LOG_TAG "DPBase"
18//#define LOG_NDEBUG 0
19
20#include <log/log.h>
rago9f011fe2018-02-05 09:29:56 -080021#include "DPBase.h"
ragoff0a51f2018-03-22 09:55:50 -070022#include "DPFrequency.h"
rago9f011fe2018-02-05 09:29:56 -080023
24namespace dp_fx {
25
26DPStage::DPStage() : mInUse(DP_DEFAULT_STAGE_INUSE),
27 mEnabled(DP_DEFAULT_STAGE_ENABLED) {
28}
29
30void DPStage::init(bool inUse, bool enabled) {
31 mInUse = inUse;
32 mEnabled = enabled;
33}
34
35//----
36DPBandStage::DPBandStage() : mBandCount(0) {
37}
38
39void DPBandStage::init(bool inUse, bool enabled, int bandCount) {
40 DPStage::init(inUse, enabled);
41 mBandCount = inUse ? bandCount : 0;
42}
43
44//---
45DPBandBase::DPBandBase() {
46 init(DP_DEFAULT_BAND_ENABLED,
47 DP_DEFAULT_BAND_CUTOFF_FREQUENCY_HZ);
48}
49
50void DPBandBase::init(bool enabled, float cutoffFrequency){
51 mEnabled = enabled;
52 mCutoofFrequencyHz = cutoffFrequency;
53}
54
55//-----
56DPEqBand::DPEqBand() {
57 init(DP_DEFAULT_BAND_ENABLED,
58 DP_DEFAULT_BAND_CUTOFF_FREQUENCY_HZ,
59 DP_DEFAULT_GAIN_DB);
60}
61
62void DPEqBand::init(bool enabled, float cutoffFrequency, float gain) {
63 DPBandBase::init(enabled, cutoffFrequency);
64 setGain(gain);
65}
66
67float DPEqBand::getGain() const{
68 return mGainDb;
69}
70
71void DPEqBand::setGain(float gain) {
72 mGainDb = gain;
73}
74
75//------
76DPMbcBand::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
90void 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//------
106DPEq::DPEq() {
107}
108
109void DPEq::init(bool inUse, bool enabled, uint32_t bandCount) {
110 DPBandStage::init(inUse, enabled, bandCount);
111 mBands.resize(getBandCount());
112}
113
114DPEqBand * DPEq::getBand(uint32_t band) {
115 if (band < getBandCount()) {
116 return &mBands[band];
117 }
118 return NULL;
119}
120
121void DPEq::setBand(uint32_t band, DPEqBand &src) {
122 if (band < getBandCount()) {
123 mBands[band] = src;
124 }
125}
126
127//------
128DPMbc::DPMbc() {
129}
130
131void 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
140DPMbcBand * DPMbc::getBand(uint32_t band) {
141 if (band < getBandCount()) {
142 return &mBands[band];
143 }
144 return NULL;
145}
146
147void DPMbc::setBand(uint32_t band, DPMbcBand &src) {
148 if (band < getBandCount()) {
149 mBands[band] = src;
150 }
151}
152
153//------
154DPLimiter::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
165void 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//----
177DPChannel::DPChannel() : mInitialized(false), mInputGainDb(0), mPreEqInUse(false), mMbcInUse(false),
178 mPostEqInUse(false), mLimiterInUse(false) {
179}
180
181void 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
197DPEq* DPChannel::getPreEq() {
198 if (!mInitialized) {
199 return NULL;
200 }
201 return &mPreEq;
202}
203
204DPMbc* DPChannel::getMbc() {
205 if (!mInitialized) {
206 return NULL;
207 }
208 return &mMbc;
209}
210
211DPEq* DPChannel::getPostEq() {
212 if (!mInitialized) {
213 return NULL;
214 }
215 return &mPostEq;
216}
217
218DPLimiter* DPChannel::getLimiter() {
219 if (!mInitialized) {
220 return NULL;
221 }
222 return &mLimiter;
223}
224
225void DPChannel::setLimiter(DPLimiter &limiter) {
226 if (!mInitialized) {
227 return;
228 }
229 mLimiter = limiter;
230}
231
232//----
233DPBase::DPBase() : mInitialized(false), mChannelCount(0), mPreEqInUse(false), mPreEqBandCount(0),
234 mMbcInUse(false), mMbcBandCount(0), mPostEqInUse(false), mPostEqBandCount(0),
235 mLimiterInUse(false) {
236}
237
238void DPBase::init(uint32_t channelCount, bool preEqInUse, uint32_t preEqBandCount,
239 bool mbcInUse, uint32_t mbcBandCount, bool postEqInUse, uint32_t postEqBandCount,
240 bool limiterInUse) {
ragoff0a51f2018-03-22 09:55:50 -0700241 ALOGV("DPBase::init");
rago9f011fe2018-02-05 09:29:56 -0800242 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
rago9f011fe2018-02-05 09:29:56 -0800258DPChannel* 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