view mp3lib/equalizer.c @ 34338:4a507d3a039a

Add highly experimental support for OpenGL ES. It only supports EGL/X11, uses/supports only ES v1, will crash if certain features are used, compiling without desktop GL installed is not tested and possibly more caveats. However it is close enough to be able to display a video on a BeagleBoard via OpenGL. Performance could not be tested properly since I do not have a display that is compatible with the BeagleBoard output...
author reimar
date Sat, 10 Dec 2011 20:55:31 +0000
parents 0ad2da052b2e
children
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 = 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];
    }
}