Mercurial > audlegacy
annotate src/audacious/iir.c @ 4011:c19c8d47e221
vseparator in fileinfo came back
| author | Eugene Zagidullin <e.asphyx@gmail.com> |
|---|---|
| date | Sun, 25 Nov 2007 04:44:40 +0300 |
| parents | d1cacc65f091 |
| children |
| rev | line source |
|---|---|
| 2313 | 1 /* |
| 2 * PCM time-domain equalizer | |
| 3 * | |
| 4 * Copyright (C) 2002-2005 Felipe Rivera <liebremx at users sourceforge net> | |
| 5 * | |
| 6 * This program is free software; you can redistribute it and/or modify | |
| 7 * it under the terms of the GNU General Public License as published by | |
|
3121
3b6d316f8b09
GPL3 relicensing.
William Pitcock <nenolod@atheme-project.org>
parents:
2313
diff
changeset
|
8 * the Free Software Foundation; either version 3 of the License, or |
| 2313 | 9 * (at your option) any later version. |
| 10 * | |
| 11 * This program is distributed in the hope that it will be useful, | |
| 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 * GNU General Public License for more details. | |
| 15 * | |
| 16 * You should have received a copy of the GNU General Public License | |
|
3121
3b6d316f8b09
GPL3 relicensing.
William Pitcock <nenolod@atheme-project.org>
parents:
2313
diff
changeset
|
17 * along with this program. If not, see <http://www.gnu.org/licenses>. |
| 2313 | 18 * |
| 19 * $Id: iir.c,v 1.15 2005/10/17 01:57:59 liebremx Exp $ | |
| 20 */ | |
| 21 | |
| 22 #include <math.h> | |
|
3560
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
23 |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
24 #include "main.h" |
| 2313 | 25 #include "iir.h" |
| 26 | |
| 27 /* Coefficients */ | |
| 28 sIIRCoefficients *iir_cf; | |
| 29 | |
| 30 /* Volume gain | |
| 31 * values should be between 0.0 and 1.0 | |
| 32 * Use the preamp from XMMS for now | |
| 33 * */ | |
| 34 float preamp[EQ_CHANNELS]; | |
| 35 | |
| 36 #ifdef BENCHMARK | |
| 37 #include "benchmark.h" | |
| 38 double timex = 0.0; | |
| 39 int count = 0; | |
| 40 unsigned int blength = 0; | |
| 41 #endif | |
| 42 | |
| 43 /* | |
| 44 * Global vars | |
| 45 */ | |
| 46 gint rate; | |
| 47 int band_count; | |
| 48 | |
| 49 void set_preamp(gint chn, float val) | |
| 50 { | |
| 51 preamp[chn] = val; | |
| 52 } | |
| 53 | |
| 54 /* Init the filters */ | |
| 55 void init_iir() | |
| 56 { | |
| 57 calc_coeffs(); | |
| 58 #if 0 | |
| 59 band_count = cfg.band_num; | |
| 60 #endif | |
| 61 | |
| 62 band_count = 10; | |
| 63 | |
| 64 rate = 44100; | |
| 65 | |
| 66 iir_cf = get_coeffs(&band_count, rate, TRUE); | |
| 67 clean_history(); | |
| 68 } | |
| 69 | |
| 70 #ifdef ARCH_X86 | |
| 71 /* Round function provided by Frank Klemm which saves around 100K | |
| 72 * CPU cycles in my PIII for each call to the IIR function with 4K samples | |
| 73 */ | |
| 74 __inline__ int round_trick(float floatvalue_to_round) | |
| 75 { | |
| 76 float floattmp ; | |
| 77 int rounded_value ; | |
| 78 | |
| 79 floattmp = (int) 0x00FD8000L + (floatvalue_to_round); | |
| 80 rounded_value = *(int*)(&floattmp) - (int)0x4B7D8000L; | |
| 81 | |
| 82 if ( rounded_value != (short) rounded_value ) | |
| 83 rounded_value = ( rounded_value >> 31 ) ^ 0x7FFF; | |
| 84 return rounded_value; | |
| 85 } | |
| 86 #endif | |
|
3560
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
87 |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
88 static void |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
89 byteswap(size_t size, |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
90 gint16 * buf) |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
91 { |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
92 gint16 *it; |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
93 size &= ~1; /* must be multiple of 2 */ |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
94 for (it = buf; it < buf + size / 2; ++it) |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
95 *(guint16 *) it = GUINT16_SWAP_LE_BE(*(guint16 *) it); |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
96 } |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
97 |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
98 void |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
99 iir_flow(FlowContext *context) |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
100 { |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
101 static int init = 0; |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
102 int swapped = 0; |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
103 guint myorder = G_BYTE_ORDER == G_LITTLE_ENDIAN ? FMT_S16_LE : FMT_S16_BE; |
|
3561
d1cacc65f091
use context->fmt here.
William Pitcock <nenolod@atheme.org>
parents:
3560
diff
changeset
|
104 int caneq = (context->fmt == FMT_S16_NE || context->fmt == myorder); |
|
3560
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
105 |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
106 if (!caneq && cfg.equalizer_active) { /* wrong byte order */ |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
107 byteswap(context->len, context->data); /* so convert */ |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
108 ++swapped; |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
109 ++caneq; |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
110 } /* can eq now, mark swapd */ |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
111 else if (caneq && !cfg.equalizer_active) /* right order but no eq */ |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
112 caneq = 0; /* so don't eq */ |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
113 |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
114 if (caneq) { /* if eq enab */ |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
115 if (!init) { /* if first run */ |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
116 init_iir(); /* then init eq */ |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
117 ++init; |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
118 } |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
119 |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
120 iir(&context->data, context->len, context->channels); |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
121 |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
122 if (swapped) /* if was swapped */ |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
123 byteswap(context->len, context->data); /* swap back for output */ |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
124 } |
|
154f21dcd61e
equalizer -> flow API
William Pitcock <nenolod@atheme.org>
parents:
3121
diff
changeset
|
125 } |
