comparison mp3lib/equalizer.c @ 30990:0ad2da052b2e

the great MPlayer tab removal: part I
author diego
date Mon, 12 Apr 2010 10:56:17 +0000
parents 9fc9d1e788aa
children
comparison
equal deleted inserted replaced
30989:686241d65b86 30990:0ad2da052b2e
1 #include "mpg123.h" 1 #include "mpg123.h"
2 2
3 void init_spline(float *x, float *y, int n, float *y2) 3 void init_spline(float *x, float *y, int n, float *y2)
4 { 4 {
5 int i, k;
6 float p, qn, sig, un, *u;
7 u = malloc(n * sizeof (float));
5 8
6 int i, k; 9 y2[0] = u[0] = 0.0;
7 float p, qn, sig, un, *u;
8 u = malloc(n * sizeof (float));
9 10
10 y2[0] = u[0] = 0.0; 11 for (i = 1; i < n - 1; i++)
12 {
13 sig = ((float) x[i] - x[i - 1]) / ((float) x[i + 1] - x[i - 1]);
14 p = sig * y2[i - 1] + 2.0;
15 y2[i] = (sig - 1.0) / p;
16 u[i] = (((float) y[i + 1] - y[i]) / (x[i + 1] - x[i])) -
17 (((float) y[i] - y[i - 1]) / (x[i] - x[i - 1]));
18 u[i] = (6.0 * u[i] / (x[i + 1] - x[i - 1]) - sig * u[i - 1]) / p;
19 }
20 qn = un = 0.0;
11 21
12 for (i = 1; i < n - 1; i++) 22 y2[n - 1] = (un - qn * u[n - 2]) / (qn * y2[n - 2] + 1.0);
13 { 23 for (k = n - 2; k >= 0; k--)
14 sig = ((float) x[i] - x[i - 1]) / ((float) x[i + 1] - x[i - 1]); 24 y2[k] = y2[k] * y2[k + 1] + u[k];
15 p = sig * y2[i - 1] + 2.0; 25 free(u);
16 y2[i] = (sig - 1.0) / p;
17 u[i] = (((float) y[i + 1] - y[i]) / (x[i + 1] - x[i])) -
18 (((float) y[i] - y[i - 1]) / (x[i] - x[i - 1]));
19 u[i] = (6.0 * u[i] / (x[i + 1] - x[i - 1]) - sig * u[i - 1]) / p;
20 }
21 qn = un = 0.0;
22
23 y2[n - 1] = (un - qn * u[n - 2]) / (qn * y2[n - 2] + 1.0);
24 for (k = n - 2; k >= 0; k--)
25 y2[k] = y2[k] * y2[k + 1] + u[k];
26 free(u);
27 } 26 }
28 27
29 float eval_spline(float xa[], float ya[], float y2a[], int n, float x) 28 float eval_spline(float xa[], float ya[], float y2a[], int n, float x)
30 { 29 {
31 int klo, khi, k; 30 int klo, khi, k;
32 float h, b, a; 31 float h, b, a;
33 32
34 klo = 0; 33 klo = 0;
35 khi = n - 1; 34 khi = n - 1;
36 while (khi - klo > 1) 35 while (khi - klo > 1)
37 { 36 {
38 k = (khi + klo) >> 1; 37 k = (khi + klo) >> 1;
39 if (xa[k] > x) 38 if (xa[k] > x)
40 khi = k; 39 khi = k;
41 else 40 else
42 klo = k; 41 klo = k;
43 } 42 }
44 h = xa[khi] - xa[klo]; 43 h = xa[khi] - xa[klo];
45 a = (xa[khi] - x) / h; 44 a = (xa[khi] - x) / h;
46 b = (x - xa[klo]) / h; 45 b = (x - xa[klo]) / h;
47 return (a * ya[klo] + b * ya[khi] + ((a * a * a - a) * y2a[klo] + (b * b * b - b) * y2a[khi]) 46 return (a * ya[klo] + b * ya[khi] + ((a * a * a - a) * y2a[klo] + (b * b * b - b) * y2a[khi])
48 * (h * h) / 6.0); 47 * (h * h) / 6.0);
49 } 48 }
50 49
51 void mpg123_set_eq(int on, float preamp, float *b) 50 void mpg123_set_eq(int on, float preamp, float *b)
52 { 51 {
53 float x[] = 52 float x[] =
54 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, yf[10], val, band[10]; 53 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, yf[10], val, band[10];
55 int bands[] = 54 int bands[] =
56 {0, 4, 8, 16, 26, 78, 157, 313, 366, 418}; 55 {0, 4, 8, 16, 26, 78, 157, 313, 366, 418};
57 int i, j; 56 int i, j;
58 57
59 mpg123_info->eq_active = on; 58 mpg123_info->eq_active = on;
60 if (mpg123_info->eq_active) 59 if (mpg123_info->eq_active)
61 { 60 {
62 for (i = 0; i < 10; i++) 61 for (i = 0; i < 10; i++)
63 { 62 {
64 band[i] = b[i] + preamp; 63 band[i] = b[i] + preamp;
65 } 64 }
66 65
67 init_spline(x, band, 10, yf); 66 init_spline(x, band, 10, yf);
68 for (i = 0; i < 9; i++) 67 for (i = 0; i < 9; i++)
69 { 68 {
70 for (j = bands[i]; j < bands[i + 1]; j++) 69 for (j = bands[i]; j < bands[i + 1]; j++)
71 { 70 {
72 val = eval_spline(x, band, yf, 10, i + ((float) (j - bands[i]) * (1.0 / (bands[i + 1] - bands[i])))); 71 val = eval_spline(x, band, yf, 10, i + ((float) (j - bands[i]) * (1.0 / (bands[i + 1] - bands[i]))));
73 mpg123_info->eq_mul[j] = pow(2, val / 10.0); 72 mpg123_info->eq_mul[j] = pow(2, val / 10.0);
74 } 73 }
75 } 74 }
76 for (i = bands[9]; i < 576; i++) 75 for (i = bands[9]; i < 576; i++)
77 mpg123_info->eq_mul[i] = mpg123_info->eq_mul[bands[9] - 1]; 76 mpg123_info->eq_mul[i] = mpg123_info->eq_mul[bands[9] - 1];
78 } 77 }
79 } 78 }