Mercurial > mplayer.hg
view mp3lib/equalizer.c @ 26234:f0788169e503
Ignore if we fail to get disc key, fixes playback of one of my DVDs which
claims to be scrambled but actually is not, and always allows to
fallback to cached keys.
author | reimar |
---|---|
date | Fri, 21 Mar 2008 12:31:47 +0000 |
parents | 3b5f5d1c5041 |
children | 9fc9d1e788aa |
line wrap: on
line source
#include "mpg123.h" void init_spline(float *x, float *y, int n, float *y2) { int i, k; float p, qn, sig, un, *u; u = (float *) malloc(n * sizeof (float)); y2[0] = u[0] = 0.0; for (i = 1; i < n - 1; i++) { sig = ((float) x[i] - x[i - 1]) / ((float) x[i + 1] - x[i - 1]); p = sig * y2[i - 1] + 2.0; y2[i] = (sig - 1.0) / p; u[i] = (((float) y[i + 1] - y[i]) / (x[i + 1] - x[i])) - (((float) y[i] - y[i - 1]) / (x[i] - x[i - 1])); u[i] = (6.0 * u[i] / (x[i + 1] - x[i - 1]) - sig * u[i - 1]) / p; } qn = un = 0.0; y2[n - 1] = (un - qn * u[n - 2]) / (qn * y2[n - 2] + 1.0); for (k = n - 2; k >= 0; k--) y2[k] = y2[k] * y2[k + 1] + u[k]; free(u); } float eval_spline(float xa[], float ya[], float y2a[], int n, float x) { int klo, khi, k; float h, b, a; klo = 0; khi = n - 1; while (khi - klo > 1) { k = (khi + klo) >> 1; if (xa[k] > x) khi = k; else klo = k; } h = xa[khi] - xa[klo]; a = (xa[khi] - x) / h; b = (x - xa[klo]) / h; return (a * ya[klo] + b * ya[khi] + ((a * a * a - a) * y2a[klo] + (b * b * b - b) * y2a[khi]) * (h * h) / 6.0); } void mpg123_set_eq(int on, float preamp, float *b) { float x[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, yf[10], val, band[10]; int bands[] = {0, 4, 8, 16, 26, 78, 157, 313, 366, 418}; int i, j; mpg123_info->eq_active = on; if (mpg123_info->eq_active) { for (i = 0; i < 10; i++) { band[i] = b[i] + preamp; } init_spline(x, band, 10, yf); for (i = 0; i < 9; i++) { for (j = bands[i]; j < bands[i + 1]; j++) { val = eval_spline(x, band, yf, 10, i + ((float) (j - bands[i]) * (1.0 / (bands[i + 1] - bands[i])))); mpg123_info->eq_mul[j] = pow(2, val / 10.0); } } for (i = bands[9]; i < 576; i++) mpg123_info->eq_mul[i] = mpg123_info->eq_mul[bands[9] - 1]; } }