view mp3lib/equalizer.c @ 29792:c2dde95d9850

PPC: make inline asm xform address test work with Apple tools original from mru, ffmpeg commit r20466 adapted to mplayer by Emanuele Giaquinta (exg)
author attila
date Fri, 06 Nov 2009 14:06:58 +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];
	}
}