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