3 void init_spline(float *x
, float *y
, int n
, float *y2
)
7 float p
, qn
, sig
, un
, *u
;
8 u
= malloc(n
* sizeof (float));
12 for (i
= 1; i
< n
- 1; i
++)
14 sig
= ((float) x
[i
] - x
[i
- 1]) / ((float) x
[i
+ 1] - x
[i
- 1]);
15 p
= sig
* y2
[i
- 1] + 2.0;
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
;
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
];
29 float eval_spline(float xa
[], float ya
[], float y2a
[], int n
, float x
)
44 h
= xa
[khi
] - xa
[klo
];
45 a
= (xa
[khi
] - x
) / h
;
46 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
])
51 void mpg123_set_eq(int on
, float preamp
, float *b
)
54 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, yf
[10], val
, band
[10];
56 {0, 4, 8, 16, 26, 78, 157, 313, 366, 418};
59 mpg123_info
->eq_active
= on
;
60 if (mpg123_info
->eq_active
)
62 for (i
= 0; i
< 10; i
++)
64 band
[i
] = b
[i
] + preamp
;
67 init_spline(x
, band
, 10, yf
);
68 for (i
= 0; i
< 9; i
++)
70 for (j
= bands
[i
]; j
< bands
[i
+ 1]; j
++)
72 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);
76 for (i
= bands
[9]; i
< 576; i
++)
77 mpg123_info
->eq_mul
[i
] = mpg123_info
->eq_mul
[bands
[9] - 1];