Home | History | Annotate | Download | only in src

Lines Matching refs:limiter

87    Description: Hard limiter for clipping prevention
91 #include "limiter.h"
113 /* create limiter */
122 TDLimiterPtr limiter = NULL;
131 /* alloc limiter struct */
132 limiter = (TDLimiterPtr)FDKcalloc(1, sizeof(struct TDLimiter));
133 if (!limiter) return NULL;
136 limiter->maxBuf = (FIXP_DBL*)FDKcalloc(attack + 1, sizeof(FIXP_DBL));
137 limiter->delayBuf = (FIXP_DBL*)FDKcalloc(attack * maxChannels, sizeof(FIXP_DBL));
139 if (!limiter->maxBuf || !limiter->delayBuf) {
140 destroyLimiter(limiter);
155 limiter->attackMs = maxAttackMs;
156 limiter->maxAttackMs = maxAttackMs;
157 limiter->releaseMs = releaseMs;
158 limiter->attack = attack;
159 limiter->attackConst = attackConst;
160 limiter->releaseConst = releaseConst;
161 limiter->threshold = (FIXP_PCM)threshold;
162 limiter->channels = maxChannels;
163 limiter->maxChannels = maxChannels;
164 limiter->sampleRate = maxSampleRate;
165 limiter->maxSampleRate = maxSampleRate;
167 resetLimiter(limiter);
169 return limiter;
173 /* reset limiter */
174 TDLIMITER_ERROR resetLimiter(TDLimiterPtr limiter)
176 if (limiter != NULL) {
178 limiter->maxBufIdx = 0;
179 limiter->delayBufIdx = 0;
180 limiter->max = (FIXP_DBL)0;
181 limiter->cor = FL2FXCONST_DBL(1.0f/(1<<1));
182 limiter->smoothState0 = FL2FXCONST_DBL(1.0f/(1<<1));
183 limiter->minGain = FL2FXCONST_DBL(1.0f/(1<<1));
185 limiter->additionalGainPrev = FL2FXCONST_DBL(1.0f/(1<<TDL_GAIN_SCALING));
186 limiter->additionalGainFilterState = FL2FXCONST_DBL(1.0f/(1<<TDL_GAIN_SCALING));
187 limiter->additionalGainFilterState1 = FL2FXCONST_DBL(1.0f/(1<<TDL_GAIN_SCALING));
189 FDKmemset(limiter->maxBuf, 0, (limiter->attack + 1) * sizeof(FIXP_DBL) );
190 FDKmemset(limiter->delayBuf, 0, limiter->attack * limiter->channels * sizeof(FIXP_DBL) );
200 /* destroy limiter */
201 TDLIMITER_ERROR destroyLimiter(TDLimiterPtr limiter)
203 if (limiter != NULL) {
204 FDKfree(limiter->maxBuf);
205 FDKfree(limiter->delayBuf);
207 FDKfree(limiter);
215 /* apply limiter */
216 TDLIMITER_ERROR applyLimiter(TDLimiterPtr limiter,
232 if ( limiter == NULL ) return TDLIMIT_INVALID_HANDLE;
235 unsigned int channels = limiter->channels;
236 unsigned int attack = limiter->attack;
237 FIXP_DBL attackConst = limiter->attackConst;
238 FIXP_DBL releaseConst = limiter->releaseConst;
239 FIXP_DBL threshold = FX_PCM2FX_DBL(limiter->threshold)>>TDL_GAIN_SCALING;
241 FIXP_DBL max = limiter->max;
242 FIXP_DBL* maxBuf = limiter->maxBuf;
243 unsigned int maxBufIdx = limiter->maxBufIdx;
244 FIXP_DBL cor = limiter->cor;
245 FIXP_DBL* delayBuf = limiter->delayBuf;
246 unsigned int delayBufIdx = limiter->delayBufIdx;
248 FIXP_DBL smoothState0 = limiter->smoothState0;
249 FIXP_DBL additionalGainSmoothState = limiter->additionalGainFilterState;
250 FIXP_DBL additionalGainSmoothState1 = limiter->additionalGainFilterState1;
255 additionalGainUnfiltered = limiter->additionalGainPrev;
342 for bit-identical output when limiter is not active */
368 limiter->max = max;
369 limiter->maxBufIdx = maxBufIdx;
370 limiter->cor = cor;
371 limiter->delayBufIdx = delayBufIdx;
373 limiter->smoothState0 = smoothState0;
374 limiter->additionalGainFilterState = additionalGainSmoothState;
375 limiter->additionalGainFilterState1 = additionalGainSmoothState1;
377 limiter->minGain = minGain;
379 limiter->additionalGainPrev = pGain[0];
386 unsigned int getLimiterDelay(TDLimiterPtr limiter)
388 FDK_ASSERT(limiter != NULL);
389 return limiter->attack;
393 TDLIMITER_ERROR setLimiterNChannels(TDLimiterPtr limiter, unsigned int nChannels)
395 if ( limiter == NULL ) return TDLIMIT_INVALID_HANDLE;
397 if (nChannels > limiter->maxChannels) return TDLIMIT_INVALID_PARAMETER;
399 limiter->channels = nChannels;
400 //resetLimiter(limiter);
406 TDLIMITER_ERROR setLimiterSampleRate(TDLimiterPtr limiter, unsigned int sampleRate)
412 if ( limiter == NULL ) return TDLIMIT_INVALID_HANDLE;
414 if (sampleRate > limiter->maxSampleRate) return TDLIMIT_INVALID_PARAMETER;
417 attack = (unsigned int)(limiter->attackMs * sampleRate / 1000);
418 release = (unsigned int)(limiter->releaseMs * sampleRate / 1000);
430 limiter->attack = attack;
431 limiter->attackConst = attackConst;
432 limiter->releaseConst = releaseConst;
433 limiter->sampleRate = sampleRate;
436 //resetLimiter(limiter);
442 TDLIMITER_ERROR setLimiterAttack(TDLimiterPtr limiter, unsigned int attackMs)
448 if ( limiter == NULL ) return TDLIMIT_INVALID_HANDLE;
450 if (attackMs > limiter->maxAttackMs) return TDLIMIT_INVALID_PARAMETER;
453 attack = (unsigned int)(attackMs * limiter->sampleRate / 1000);
460 limiter->attack = attack;
461 limiter->attackConst = attackConst;
462 limiter->attackMs = attackMs;
468 TDLIMITER_ERROR setLimiterRelease(TDLimiterPtr limiter, unsigned int releaseMs)
474 if ( limiter == NULL ) return TDLIMIT_INVALID_HANDLE;
477 release = (unsigned int)(releaseMs * limiter->sampleRate / 1000);
484 limiter->releaseConst = releaseConst;
485 limiter->releaseMs = releaseMs;
490 /* set limiter threshold */
491 TDLIMITER_ERROR setLimiterThreshold(TDLimiterPtr limiter, INT_PCM threshold)
493 if ( limiter == NULL ) return TDLIMIT_INVALID_HANDLE;
495 limiter->threshold = (FIXP_PCM)threshold;