Home | History | Annotate | Download | only in src

Lines Matching defs:limiter

99    Description: Hard limiter for clipping prevention
103 #include "limiter.h"
109 #define TDLIMIT_LIB_TITLE "TD Limiter Lib"
111 /* create limiter */
115 TDLimiterPtr limiter = NULL;
124 /* alloc limiter struct */
125 limiter = (TDLimiterPtr)FDKcalloc(1, sizeof(struct TDLimiter));
126 if (!limiter) return NULL;
129 limiter->maxBuf = (FIXP_DBL*)FDKcalloc(attack + 1, sizeof(FIXP_DBL));
130 limiter->delayBuf =
133 if (!limiter->maxBuf || !limiter->delayBuf) {
134 pcmLimiter_Destroy(limiter);
149 limiter->attackMs = maxAttackMs;
150 limiter->maxAttackMs = maxAttackMs;
151 limiter->releaseMs = releaseMs;
152 limiter->attack = attack;
153 limiter->attackConst = attackConst;
154 limiter->releaseConst = releaseConst;
155 limiter->threshold = threshold >> TDL_GAIN_SCALING;
156 limiter->channels = maxChannels;
157 limiter->maxChannels = maxChannels;
158 limiter->sampleRate = maxSampleRate;
159 limiter->maxSampleRate = maxSampleRate;
161 pcmLimiter_Reset(limiter);
163 return limiter;
166 /* apply limiter */
167 TDLIMITER_ERROR pcmLimiter_Apply(TDLimiterPtr limiter, PCM_LIM* samplesIn,
181 if (limiter == NULL) return TDLIMIT_INVALID_HANDLE;
184 unsigned int channels = limiter->channels;
185 unsigned int attack = limiter->attack;
186 FIXP_DBL attackConst = limiter->attackConst;
187 FIXP_DBL releaseConst = limiter->releaseConst;
188 FIXP_DBL threshold = limiter->threshold;
190 FIXP_DBL max = limiter->max;
191 FIXP_DBL* maxBuf = limiter->maxBuf;
192 unsigned int maxBufIdx = limiter->maxBufIdx;
193 FIXP_DBL cor = limiter->cor;
194 FIXP_DBL* delayBuf = limiter->delayBuf;
195 unsigned int delayBufIdx = limiter->delayBufIdx;
197 FIXP_DBL smoothState0 = limiter->smoothState0;
198 FIXP_DBL additionalGainSmoothState = limiter->additionalGainFilterState;
199 FIXP_DBL additionalGainSmoothState1 = limiter->additionalGainFilterState1;
213 additionalGainUnfiltered = limiter->additionalGainPrev;
304 for bit-identical output when limiter is not active */
351 limiter->max = max;
352 limiter->maxBufIdx = maxBufIdx;
353 limiter->cor = cor;
354 limiter->delayBufIdx = delayBufIdx;
356 limiter->smoothState0 = smoothState0;
357 limiter->additionalGainFilterState = additionalGainSmoothState;
358 limiter->additionalGainFilterState1 = additionalGainSmoothState1;
360 limiter->minGain = minGain;
362 limiter->additionalGainPrev = pGain[0];
368 /* set limiter threshold */
369 TDLIMITER_ERROR pcmLimiter_SetThreshold(TDLimiterPtr limiter,
371 if (limiter == NULL) return TDLIMIT_INVALID_HANDLE;
373 limiter->threshold = threshold >> TDL_GAIN_SCALING;
378 /* reset limiter */
379 TDLIMITER_ERROR pcmLimiter_Reset(TDLimiterPtr limiter) {
380 if (limiter != NULL) {
381 limiter->maxBufIdx = 0;
382 limiter->delayBufIdx = 0;
383 limiter->max = (FIXP_DBL)0;
384 limiter->cor = FL2FXCONST_DBL(1.0f / (1 << 1));
385 limiter->smoothState0 = FL2FXCONST_DBL(1.0f / (1 << 1));
386 limiter->minGain = FL2FXCONST_DBL(1.0f / (1 << 1));
388 limiter->additionalGainPrev =
390 limiter->additionalGainFilterState =
392 limiter->additionalGainFilterState1 =
395 FDKmemset(limiter->maxBuf, 0, (limiter->attack + 1) * sizeof(FIXP_DBL));
396 FDKmemset(limiter->delayBuf, 0,
397 limiter->attack * limiter->channels * sizeof(FIXP_DBL));
405 /* destroy limiter */
406 TDLIMITER_ERROR pcmLimiter_Destroy(TDLimiterPtr limiter) {
407 if (limiter != NULL) {
408 FDKfree(limiter->maxBuf);
409 FDKfree(limiter->delayBuf);
411 FDKfree(limiter);
419 unsigned int pcmLimiter_GetDelay(TDLimiterPtr limiter) {
420 FDK_ASSERT(limiter != NULL);
421 return limiter->attack;
425 INT pcmLimiter_GetMaxGainReduction(TDLimiterPtr limiter) {
426 /* maximum gain reduction in dB = -20 * log10(limiter->minGain)
427 = -20 * log2(limiter->minGain)/log2(10) = -6.0206*log2(limiter->minGain) */
431 FDK_ASSERT(limiter != NULL);
433 loggain = fLog2(limiter->minGain, 1, &e_ans);
441 TDLIMITER_ERROR pcmLimiter_SetNChannels(TDLimiterPtr limiter,
443 if (limiter == NULL) return TDLIMIT_INVALID_HANDLE;
445 if (nChannels > limiter->maxChannels) return TDLIMIT_INVALID_PARAMETER;
447 limiter->channels = nChannels;
448 // pcmLimiter_Reset(limiter);
454 TDLIMITER_ERROR pcmLimiter_SetSampleRate(TDLimiterPtr limiter,
460 if (limiter == NULL) return TDLIMIT_INVALID_HANDLE;
462 if (sampleRate > limiter->maxSampleRate) return TDLIMIT_INVALID_PARAMETER;
465 attack = (unsigned int)(limiter->attackMs * sampleRate / 1000);
466 release = (unsigned int)(limiter->releaseMs * sampleRate / 1000);
478 limiter->attack = attack;
479 limiter->attackConst = attackConst;
480 limiter->releaseConst = releaseConst;
481 limiter->sampleRate = sampleRate;
484 // pcmLimiter_Reset(limiter);
490 TDLIMITER_ERROR pcmLimiter_SetAttack(TDLimiterPtr limiter,
496 if (limiter == NULL) return TDLIMIT_INVALID_HANDLE;
498 if (attackMs > limiter->maxAttackMs) return TDLIMIT_INVALID_PARAMETER;
501 attack = (unsigned int)(attackMs * limiter->sampleRate / 1000);
508 limiter->attack = attack;
509 limiter->attackConst = attackConst;
510 limiter->attackMs = attackMs;
516 TDLIMITER_ERROR pcmLimiter_SetRelease(TDLimiterPtr limiter,
522 if (limiter == NULL) return TDLIMIT_INVALID_HANDLE;
525 release = (unsigned int)(releaseMs * limiter->sampleRate / 1000);
532 limiter->releaseConst = releaseConst;
533 limiter->releaseMs = releaseMs;