Lines Matching +full:v +full:- +full:bit
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2008-2009 Ariff Abdullah <ariff@FreeBSD.org>
34 * by Robert Bristow-Johnson <rbj@audioimagination.com>
35 * - http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt
53 (((FEEDEQ_GAIN_MAX - FEEDEQ_GAIN_MIN) * \
56 #define FEEDEQ_L2GAIN(v) \
57 ((int)min(((v) * FEEDEQ_LEVELS) / 100, FEEDEQ_LEVELS - 1))
61 #define FEEDEQ_PREAMP_SIGNVAL(x) ((x) < 0 ? -1 : 1)
62 #define FEEDEQ_PREAMP_SIGNMARK(x) (((x) < 0) ? '-' : '+')
64 #define FEEDEQ_PREAMP_IMIN -192
86 #define FEEDEQ_PREAMP2IDX(v) \
88 FEEDEQ_GAIN_STEP)) + (FEEDEQ_PREAMP_SIGNVAL(v) * \
89 FEEDEQ_PREAMP_IPART(v) * (FEEDEQ_GAIN_DIV / \
90 FEEDEQ_GAIN_STEP)) + (FEEDEQ_PREAMP_SIGNVAL(v) * \
91 (FEEDEQ_PREAMP_FPART(v) / FEEDEQ_GAIN_STEP))))
98 &feeder_eq_presets, 0, "compile-time eq presets");
129 #define FEEDEQ_ERR_CLIP_CHECK(t, v) do { \
130 if ((v) < PCM_S32_MIN || (v) > PCM_S32_MAX) \
132 __func__, (intmax_t)(v)); \
138 #define FEEDEQ_CLAMP(v) (((v) > PCM_S32_MAX) ? PCM_S32_MAX : \
139 (((v) < PCM_S32_MIN) ? PCM_S32_MIN : \
140 (v)))
142 #define FEEDEQ_DECLARE(SIGN, BIT, ENDIAN) \
144 feed_eq_biquad_##SIGN##BIT##ENDIAN(struct feed_eq_info *info, \
149 intpcm_t v; \
153 pmul = feed_eq_preamp[info->preamp].mul; \
154 pshift = feed_eq_preamp[info->preamp].shift; \
156 if (info->state == FEEDEQ_DISABLE) { \
157 j = count * info->channels; \
158 dst += j * PCM_##BIT##_BPS; \
160 dst -= PCM_##BIT##_BPS; \
161 v = _PCM_READ_##SIGN##BIT##_##ENDIAN(dst); \
162 v = ((intpcm64_t)pmul * v) >> pshift; \
163 _PCM_WRITE_##SIGN##BIT##_##ENDIAN(dst, v); \
164 } while (--j != 0); \
169 treble = &(info->coeff[info->treble.gain].treble); \
170 bass = &(info->coeff[info->bass.gain].bass); \
174 j = info->channels; \
176 v = _PCM_READ_##SIGN##BIT##_##ENDIAN(dst); \
177 v <<= 32 - BIT; \
178 v = ((intpcm64_t)pmul * v) >> pshift; \
180 w = (intpcm64_t)v * treble->b0; \
181 w += (intpcm64_t)info->treble.i1[i] * treble->b1; \
182 w += (intpcm64_t)info->treble.i2[i] * treble->b2; \
183 w -= (intpcm64_t)info->treble.o1[i] * treble->a1; \
184 w -= (intpcm64_t)info->treble.o2[i] * treble->a2; \
185 info->treble.i2[i] = info->treble.i1[i]; \
186 info->treble.i1[i] = v; \
187 info->treble.o2[i] = info->treble.o1[i]; \
190 v = FEEDEQ_CLAMP(w); \
191 info->treble.o1[i] = v; \
193 w = (intpcm64_t)v * bass->b0; \
194 w += (intpcm64_t)info->bass.i1[i] * bass->b1; \
195 w += (intpcm64_t)info->bass.i2[i] * bass->b2; \
196 w -= (intpcm64_t)info->bass.o1[i] * bass->a1; \
197 w -= (intpcm64_t)info->bass.o2[i] * bass->a2; \
198 info->bass.i2[i] = info->bass.i1[i]; \
199 info->bass.i1[i] = v; \
200 info->bass.o2[i] = info->bass.o1[i]; \
203 v = FEEDEQ_CLAMP(w); \
204 info->bass.o1[i] = v; \
206 v >>= 32 - BIT; \
207 _PCM_WRITE_##SIGN##BIT##_##ENDIAN(dst, v); \
208 dst += PCM_##BIT##_BPS; \
210 } while (--j != 0); \
211 } while (--count != 0); \
235 #define FEEDEQ_ENTRY(SIGN, BIT, ENDIAN) \
237 AFMT_##SIGN##BIT##_##ENDIAN, \
238 feed_eq_biquad_##SIGN##BIT##ENDIAN \
285 threshold = spd + ((i < (FEEDEQ_TAB_SIZE - 1) &&
287 ((feed_eq_tab[i + 1].rate - spd) >> 1) : 0);
311 for (i = 0; i < info->channels; i++) {
312 info->treble.i1[i] = 0;
313 info->treble.i2[i] = 0;
314 info->treble.o1[i] = 0;
315 info->treble.o2[i] = 0;
316 info->bass.i1[i] = 0;
317 info->bass.i2[i] = 0;
318 info->bass.o1[i] = 0;
319 info->bass.o2[i] = 0;
327 info->coeff = feed_eq_coeff_rate(info->rate);
328 if (info->coeff == NULL)
343 if (f->desc->in != f->desc->out)
349 if (AFMT_ENCODING(f->desc->in) == feed_eq_biquad_tab[i].format)
360 info->channels = AFMT_CHANNEL(f->desc->in);
361 info->align = info->channels * AFMT_BPS(f->desc->in);
363 info->rate = FEEDEQ_RATE_MIN;
364 info->treble.gain = FEEDEQ_L2GAIN(50);
365 info->bass.gain = FEEDEQ_L2GAIN(50);
366 info->preamp = FEEDEQ_PREAMP2IDX(FEEDEQ_PREAMP_DEFAULT);
367 info->state = FEEDEQ_UNKNOWN;
369 info->biquad = biquad_op;
371 f->data = info;
381 info = f->data;
387 info->channels = (uint32_t)value;
388 info->align = info->channels * AFMT_BPS(f->desc->in);
394 info->rate = (uint32_t)value;
395 if (info->state == FEEDEQ_UNKNOWN)
396 info->state = FEEDEQ_ENABLE;
404 info->treble.gain = FEEDEQ_L2GAIN(value);
406 info->bass.gain = FEEDEQ_L2GAIN(value);
411 info->preamp = FEEDEQ_PREAMP2IDX(value);
417 info->state = value;
433 info = f->data;
437 f->data = NULL;
450 info = f->data;
454 * FEEDEQ_BYPASS - Bypass entirely, nothing happened.
455 * FEEDEQ_ENABLE - Preamp+biquad filtering.
456 * FEEDEQ_DISABLE - Preamp only.
458 if (info->state == FEEDEQ_BYPASS)
459 return (FEEDER_FEED(f->source, c, b, count, source));
462 count = SND_FXROUND(count, info->align);
465 if (count < info->align)
468 j = SND_FXDIV(FEEDER_FEED(f->source, c, dst, count, source),
469 info->align);
473 info->biquad(info, dst, j);
475 j *= info->align;
477 count -= j;
481 return (dst - b);
525 if (len > 2 && strcasecmp(s + len - 2, "dB") == 0)
528 if (i == 0 && *s == '-')
529 *buf = '-';
537 return (((i < 0 || *buf == '-') ? -1 : 1) * FEEDEQ_IF2PREAMP(i, f));
549 d = oidp->oid_arg1;
555 if (d->flags & SD_F_EQ_BYPASSED)
557 else if (d->flags & SD_F_EQ_ENABLED)
567 if (err == 0 && req->newptr != NULL && val != oval) {
575 d->flags &= ~(SD_F_EQ_ENABLED | SD_F_EQ_BYPASSED);
578 d->flags |= SD_F_EQ_BYPASSED;
581 d->flags |= SD_F_EQ_ENABLED;
610 d = oidp->oid_arg1;
616 val = d->eqpreamp;
627 if (err == 0 && req->newptr != NULL) {
642 d->eqpreamp = val;
672 (d->eqpreamp = feed_eq_scan_preamp_arg(preamp)) !=
674 d->eqpreamp = FEEDEQ_PREAMP_DEFAULT;
676 if (d->eqpreamp < FEEDEQ_PREAMP_MIN)
677 d->eqpreamp = FEEDEQ_PREAMP_MIN;
678 else if (d->eqpreamp > FEEDEQ_PREAMP_MAX)
679 d->eqpreamp = FEEDEQ_PREAMP_MAX;
688 "(-/+ %d.0dB , %d.%ddB step)",
690 FEEDEQ_GAIN_STEP - ((FEEDEQ_GAIN_STEP / FEEDEQ_GAIN_DIV) *