annotate src/audlegacy/equalizer_flow.c @ 4882:d3af4699043f

equalizer: Fix incorrect math in equalizer_flow_set_bands(). (Closes: #70)
author William Pitcock <nenolod@atheme.org>
date Wed, 13 May 2009 03:00:17 -0500
parents 123b35cd71ab
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4300
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
1 /* Audacious - Cross-platform multimedia player
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
2 * Copyright (C) 2005-2008 Audacious team
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
3 *
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
4 * This program is free software; you can redistribute it and/or modify
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
5 * it under the terms of the GNU General Public License as published by
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
6 * the Free Software Foundation; under version 3 of the License.
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
7 *
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
8 * This program is distributed in the hope that it will be useful,
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
11 * GNU General Public License for more details.
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
12 *
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
13 * You should have received a copy of the GNU General Public License
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
14 * along with this program. If not, see <http://www.gnu.org/licenses>.
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
15 *
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
16 * The Audacious team does not consider modular code linking to
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
17 * Audacious or using our public API to be a derived work.
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
18 */
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
19
4307
cfaecedace4e importing of winamp EQ presets library
Eugene Zagidullin <e.asphyx@gmail.com>
parents: 4300
diff changeset
20 /*#define AUD_DEBUG*/
4300
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
21
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
22 #include <glib.h>
4314
e548627b2004 EQ pregain works. nobody uses it though
Eugene Zagidullin <e.asphyx@gmail.com>
parents: 4307
diff changeset
23 #include <math.h>
4300
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
24 #include "main.h"
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
25 #include "plugin.h"
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
26 #include "flow.h"
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
27
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
28 #include "af_compat.h"
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
29 #include "equalizer_flow.h"
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
30
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
31 int equalizer_open(af_instance_t* af); /* af_equalizer.c */
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
32
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
33 static af_instance_t *eq = NULL;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
34 static gint eq_nch = 0;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
35 static gint eq_rate = 0;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
36 static gboolean bands_changed = FALSE;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
37
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
38 static void
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
39 equalizer_flow_reinit(gint rate, gint nch)
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
40 {
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
41 af_data_t data;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
42
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
43 AUDDBG("\n");
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
44 if(eq == NULL) return;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
45
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
46 data.rate = rate;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
47 data.nch = nch;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
48 data.bps = 4;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
49 data.format = AF_FORMAT_FLOAT_NE;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
50 eq->control(eq, AF_CONTROL_REINIT, &data);
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
51 }
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
52
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
53 void
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
54 equalizer_flow(FlowContext *context)
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
55 {
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
56 af_data_t data;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
57
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
58 if(!cfg.equalizer_active || eq == NULL) return;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
59
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
60 if(context->fmt != FMT_FLOAT) {
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
61 context->error = TRUE;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
62 return;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
63 }
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
64
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
65 if(eq_nch != context->channels ||
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
66 eq_rate != context->srate ||
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
67 bands_changed) {
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
68 equalizer_flow_reinit(context->srate, context->channels);
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
69 eq_nch = context->channels;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
70 eq_rate = context->srate;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
71 bands_changed = FALSE;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
72 }
4849
123b35cd71ab Heal the equalizer's clipping prevention of insanity
John Lindgren <john.lindgren@tds.net>
parents: 4811
diff changeset
73
4300
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
74 data.nch = context->channels;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
75 data.audio = context->data;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
76 data.len = context->len;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
77 eq->play(eq, &data);
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
78 }
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
79
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
80 void
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
81 equalizer_flow_set_bands(gfloat pre, gfloat *bands)
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
82 {
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
83 int i;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
84 af_control_ext_t ctl;
4849
123b35cd71ab Heal the equalizer's clipping prevention of insanity
John Lindgren <john.lindgren@tds.net>
parents: 4811
diff changeset
85 gfloat highest;
123b35cd71ab Heal the equalizer's clipping prevention of insanity
John Lindgren <john.lindgren@tds.net>
parents: 4811
diff changeset
86 gfloat adjusted [10];
123b35cd71ab Heal the equalizer's clipping prevention of insanity
John Lindgren <john.lindgren@tds.net>
parents: 4811
diff changeset
87
4300
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
88 if(eq == NULL) {
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
89 eq = g_malloc(sizeof(af_instance_t));
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
90 equalizer_open(eq);
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
91 }
4314
e548627b2004 EQ pregain works. nobody uses it though
Eugene Zagidullin <e.asphyx@gmail.com>
parents: 4307
diff changeset
92
4882
d3af4699043f equalizer: Fix incorrect math in equalizer_flow_set_bands(). (Closes: #70)
William Pitcock <nenolod@atheme.org>
parents: 4849
diff changeset
93 highest = EQUALIZER_MAX_GAIN;
4849
123b35cd71ab Heal the equalizer's clipping prevention of insanity
John Lindgren <john.lindgren@tds.net>
parents: 4811
diff changeset
94 for (i = 0; i < 10; i ++) {
4882
d3af4699043f equalizer: Fix incorrect math in equalizer_flow_set_bands(). (Closes: #70)
William Pitcock <nenolod@atheme.org>
parents: 4849
diff changeset
95 if ((pre + bands[i]) > highest)
d3af4699043f equalizer: Fix incorrect math in equalizer_flow_set_bands(). (Closes: #70)
William Pitcock <nenolod@atheme.org>
parents: 4849
diff changeset
96 bands[i] -= (pre + bands[i]) - highest;
4849
123b35cd71ab Heal the equalizer's clipping prevention of insanity
John Lindgren <john.lindgren@tds.net>
parents: 4811
diff changeset
97 }
123b35cd71ab Heal the equalizer's clipping prevention of insanity
John Lindgren <john.lindgren@tds.net>
parents: 4811
diff changeset
98 for (i = 0; i < 10; i ++)
4882
d3af4699043f equalizer: Fix incorrect math in equalizer_flow_set_bands(). (Closes: #70)
William Pitcock <nenolod@atheme.org>
parents: 4849
diff changeset
99 adjusted[i] = (bands[i] + pre);
4314
e548627b2004 EQ pregain works. nobody uses it though
Eugene Zagidullin <e.asphyx@gmail.com>
parents: 4307
diff changeset
100
4849
123b35cd71ab Heal the equalizer's clipping prevention of insanity
John Lindgren <john.lindgren@tds.net>
parents: 4811
diff changeset
101 ctl.arg = adjusted;
4882
d3af4699043f equalizer: Fix incorrect math in equalizer_flow_set_bands(). (Closes: #70)
William Pitcock <nenolod@atheme.org>
parents: 4849
diff changeset
102 for (i = 0; i < AF_NCH; i++) {
4300
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
103 ctl.ch = i;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
104 eq->control(eq, AF_CONTROL_EQUALIZER_GAIN | AF_CONTROL_SET, &ctl);
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
105 }
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
106
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
107 bands_changed = TRUE;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
108 }
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
109
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
110 void
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
111 equalizer_flow_free()
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
112 {
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
113 AUDDBG("\n");
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
114 if(eq != NULL) {
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
115 eq->uninit(eq);
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
116 g_free(eq);
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
117 eq = NULL;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
118 eq_nch = 0;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
119 eq_rate = 0;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
120 bands_changed = FALSE;
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
121 }
060c9865ea17 forgotten files
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
diff changeset
122 }