Mercurial > audlegacy
annotate src/audacious/iir.c @ 3759:9e54690956a0
finalised the API, I think.
author | William Pitcock <nenolod@atheme.org> |
---|---|
date | Sun, 14 Oct 2007 21:37:31 -0500 |
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 } |