Lines Matching +full:audio +full:- +full:gain +full:- +full:db

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2008-2009 Ariff Abdullah <ariff@FreeBSD.org>
6 * Copyright (c) 2024-2025 The FreeBSD Foundation
37 * "Cookbook formulae for audio EQ biquad filter coefficients"
38 * by Robert Bristow-Johnson <rbj@audioimagination.com>
39 * - http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt
57 (((FEEDEQ_GAIN_MAX - FEEDEQ_GAIN_MIN) * \
61 ((int)min(((v) * FEEDEQ_LEVELS) / 100, FEEDEQ_LEVELS - 1))
65 #define FEEDEQ_PREAMP_SIGNVAL(x) ((x) < 0 ? -1 : 1)
66 #define FEEDEQ_PREAMP_SIGNMARK(x) (((x) < 0) ? '-' : '+')
68 #define FEEDEQ_PREAMP_IMIN -192
102 &feeder_eq_presets, 0, "compile-time eq presets");
113 int gain; member
148 pmul = feed_eq_preamp[info->preamp].mul; in feed_eq_biquad()
149 pshift = feed_eq_preamp[info->preamp].shift; in feed_eq_biquad()
151 if (info->state == FEEDEQ_DISABLE) { in feed_eq_biquad()
152 j = count * info->channels; in feed_eq_biquad()
155 dst -= AFMT_BPS(fmt); in feed_eq_biquad()
159 } while (--j != 0); in feed_eq_biquad()
164 treble = &(info->coeff[info->treble.gain].treble); in feed_eq_biquad()
165 bass = &(info->coeff[info->bass.gain].bass); in feed_eq_biquad()
169 j = info->channels; in feed_eq_biquad()
174 w = (intpcm64_t)v * treble->b0; in feed_eq_biquad()
175 w += (intpcm64_t)info->treble.i1[i] * treble->b1; in feed_eq_biquad()
176 w += (intpcm64_t)info->treble.i2[i] * treble->b2; in feed_eq_biquad()
177 w -= (intpcm64_t)info->treble.o1[i] * treble->a1; in feed_eq_biquad()
178 w -= (intpcm64_t)info->treble.o2[i] * treble->a2; in feed_eq_biquad()
179 info->treble.i2[i] = info->treble.i1[i]; in feed_eq_biquad()
180 info->treble.i1[i] = v; in feed_eq_biquad()
181 info->treble.o2[i] = info->treble.o1[i]; in feed_eq_biquad()
185 info->treble.o1[i] = v; in feed_eq_biquad()
187 w = (intpcm64_t)v * bass->b0; in feed_eq_biquad()
188 w += (intpcm64_t)info->bass.i1[i] * bass->b1; in feed_eq_biquad()
189 w += (intpcm64_t)info->bass.i2[i] * bass->b2; in feed_eq_biquad()
190 w -= (intpcm64_t)info->bass.o1[i] * bass->a1; in feed_eq_biquad()
191 w -= (intpcm64_t)info->bass.o2[i] * bass->a2; in feed_eq_biquad()
192 info->bass.i2[i] = info->bass.i1[i]; in feed_eq_biquad()
193 info->bass.i1[i] = v; in feed_eq_biquad()
194 info->bass.o2[i] = info->bass.o1[i]; in feed_eq_biquad()
198 info->bass.o1[i] = v; in feed_eq_biquad()
203 } while (--j != 0); in feed_eq_biquad()
204 } while (--count != 0); in feed_eq_biquad()
222 threshold = spd + ((i < (FEEDEQ_TAB_SIZE - 1) && in feed_eq_coeff_rate()
224 ((feed_eq_tab[i + 1].rate - spd) >> 1) : 0); in feed_eq_coeff_rate()
248 for (i = 0; i < info->channels; i++) { in feed_eq_reset()
249 info->treble.i1[i] = 0; in feed_eq_reset()
250 info->treble.i2[i] = 0; in feed_eq_reset()
251 info->treble.o1[i] = 0; in feed_eq_reset()
252 info->treble.o2[i] = 0; in feed_eq_reset()
253 info->bass.i1[i] = 0; in feed_eq_reset()
254 info->bass.i2[i] = 0; in feed_eq_reset()
255 info->bass.o1[i] = 0; in feed_eq_reset()
256 info->bass.o2[i] = 0; in feed_eq_reset()
264 info->coeff = feed_eq_coeff_rate(info->rate); in feed_eq_setup()
265 if (info->coeff == NULL) in feed_eq_setup()
278 if (f->desc->in != f->desc->out) in feed_eq_init()
285 info->fmt = AFMT_ENCODING(f->desc->in); in feed_eq_init()
286 info->channels = AFMT_CHANNEL(f->desc->in); in feed_eq_init()
287 info->align = info->channels * AFMT_BPS(f->desc->in); in feed_eq_init()
289 info->rate = FEEDEQ_RATE_MIN; in feed_eq_init()
290 info->treble.gain = FEEDEQ_L2GAIN(50); in feed_eq_init()
291 info->bass.gain = FEEDEQ_L2GAIN(50); in feed_eq_init()
292 info->preamp = FEEDEQ_PREAMP2IDX(FEEDEQ_PREAMP_DEFAULT); in feed_eq_init()
293 info->state = FEEDEQ_UNKNOWN; in feed_eq_init()
295 f->data = info; in feed_eq_init()
305 info = f->data; in feed_eq_set()
311 info->channels = (uint32_t)value; in feed_eq_set()
312 info->align = info->channels * AFMT_BPS(f->desc->in); in feed_eq_set()
318 info->rate = (uint32_t)value; in feed_eq_set()
319 if (info->state == FEEDEQ_UNKNOWN) in feed_eq_set()
320 info->state = FEEDEQ_ENABLE; in feed_eq_set()
328 info->treble.gain = FEEDEQ_L2GAIN(value); in feed_eq_set()
330 info->bass.gain = FEEDEQ_L2GAIN(value); in feed_eq_set()
335 info->preamp = FEEDEQ_PREAMP2IDX(value); in feed_eq_set()
341 info->state = value; in feed_eq_set()
357 info = f->data; in feed_eq_free()
361 f->data = NULL; in feed_eq_free()
374 info = f->data; in feed_eq_feed()
378 * FEEDEQ_BYPASS - Bypass entirely, nothing happened. in feed_eq_feed()
379 * FEEDEQ_ENABLE - Preamp+biquad filtering. in feed_eq_feed()
380 * FEEDEQ_DISABLE - Preamp only. in feed_eq_feed()
382 if (info->state == FEEDEQ_BYPASS) in feed_eq_feed()
383 return (FEEDER_FEED(f->source, c, b, count, source)); in feed_eq_feed()
386 count = SND_FXROUND(count, info->align); in feed_eq_feed()
389 if (count < info->align) in feed_eq_feed()
392 j = SND_FXDIV(FEEDER_FEED(f->source, c, dst, count, source), in feed_eq_feed()
393 info->align); in feed_eq_feed()
398 switch (info->fmt) { in feed_eq_feed()
409 feed_eq_biquad(info, dst, j, info->fmt); in feed_eq_feed()
413 j *= info->align; in feed_eq_feed()
415 count -= j; in feed_eq_feed()
419 return (dst - b); in feed_eq_feed()
463 if (len > 2 && strcasecmp(s + len - 2, "dB") == 0) in feed_eq_scan_preamp_arg()
464 strlcat(buf, "dB", sizeof(buf)); in feed_eq_scan_preamp_arg()
466 if (i == 0 && *s == '-') in feed_eq_scan_preamp_arg()
467 *buf = '-'; in feed_eq_scan_preamp_arg()
475 return (((i < 0 || *buf == '-') ? -1 : 1) * FEEDEQ_IF2PREAMP(i, f)); in feed_eq_scan_preamp_arg()
487 d = oidp->oid_arg1; in sysctl_dev_pcm_eq()
493 if (d->flags & SD_F_EQ_BYPASSED) in sysctl_dev_pcm_eq()
495 else if (d->flags & SD_F_EQ_ENABLED) in sysctl_dev_pcm_eq()
505 if (err == 0 && req->newptr != NULL && val != oval) { in sysctl_dev_pcm_eq()
513 d->flags &= ~(SD_F_EQ_ENABLED | SD_F_EQ_BYPASSED); in sysctl_dev_pcm_eq()
516 d->flags |= SD_F_EQ_BYPASSED; in sysctl_dev_pcm_eq()
519 d->flags |= SD_F_EQ_ENABLED; in sysctl_dev_pcm_eq()
548 d = oidp->oid_arg1; in sysctl_dev_pcm_eq_preamp()
554 val = d->eqpreamp; in sysctl_dev_pcm_eq_preamp()
565 if (err == 0 && req->newptr != NULL) { in sysctl_dev_pcm_eq_preamp()
580 d->eqpreamp = val; in sysctl_dev_pcm_eq_preamp()
610 (d->eqpreamp = feed_eq_scan_preamp_arg(preamp)) != in feeder_eq_initsys()
612 d->eqpreamp = FEEDEQ_PREAMP_DEFAULT; in feeder_eq_initsys()
614 if (d->eqpreamp < FEEDEQ_PREAMP_MIN) in feeder_eq_initsys()
615 d->eqpreamp = FEEDEQ_PREAMP_MIN; in feeder_eq_initsys()
616 else if (d->eqpreamp > FEEDEQ_PREAMP_MAX) in feeder_eq_initsys()
617 d->eqpreamp = FEEDEQ_PREAMP_MAX; in feeder_eq_initsys()
626 "(-/+ %d.0dB , %d.%ddB step)", in feeder_eq_initsys()
628 FEEDEQ_GAIN_STEP - ((FEEDEQ_GAIN_STEP / FEEDEQ_GAIN_DIV) * in feeder_eq_initsys()