Blame src/libmpg123/synth_ntom.h

Packit c32a2d
/*
Packit c32a2d
	synth_ntom.h: ntom-resampling synth functions
Packit c32a2d
Packit c32a2d
	This header is used multiple times to create different variants of this function.
Packit c32a2d
	Hint: MONO_NAME, MONO2STEREO_NAME, SYNTH_NAME and SAMPLE_T as well as WRITE_SAMPLE do vary.
Packit c32a2d
Packit c32a2d
	copyright 1995-2008 by the mpg123 project - free software under the terms of the LGPL 2.1
Packit c32a2d
	see COPYING and AUTHORS files in distribution or http://mpg123.org
Packit c32a2d
	initially written by Michael Hipp, generalized by Thomas Orgis
Packit c32a2d
Packit c32a2d
	Well, this is very simple resampling... you may or may not like what you hear.
Packit c32a2d
	But it's cheap.
Packit c32a2d
	But still, we don't implement a non-autoincrement version of this one.
Packit c32a2d
*/
Packit c32a2d
Packit c32a2d
/* Note: These mono functions would also work generically,
Packit c32a2d
   it's just that they need a runtime calculation for the conversion loop...
Packit c32a2d
   The fixed XtoY functions have the chance for loop unrolling... */
Packit c32a2d
Packit c32a2d
int MONO_NAME(real *bandPtr, mpg123_handle *fr)
Packit c32a2d
{
Packit c32a2d
	SAMPLE_T samples_tmp[8*64];
Packit c32a2d
	SAMPLE_T *tmp1 = samples_tmp;
Packit c32a2d
	size_t i;
Packit c32a2d
	int ret;
Packit c32a2d
Packit c32a2d
	size_t pnt = fr->buffer.fill;
Packit c32a2d
	unsigned char *samples = fr->buffer.data;
Packit c32a2d
	fr->buffer.data = (unsigned char*) samples_tmp;
Packit c32a2d
	fr->buffer.fill = 0;
Packit c32a2d
	ret = SYNTH_NAME(bandPtr, 0, fr, 1);
Packit c32a2d
	fr->buffer.data = samples;
Packit c32a2d
Packit c32a2d
	samples += pnt;
Packit c32a2d
	for(i=0;i<(fr->buffer.fill/(2*sizeof(SAMPLE_T)));i++)
Packit c32a2d
	{
Packit c32a2d
		*( (SAMPLE_T *)samples) = *tmp1;
Packit c32a2d
		samples += sizeof(SAMPLE_T);
Packit c32a2d
		tmp1 += 2;
Packit c32a2d
	}
Packit c32a2d
	fr->buffer.fill = pnt + (fr->buffer.fill/2);
Packit c32a2d
Packit c32a2d
	return ret;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
Packit c32a2d
int MONO2STEREO_NAME(real *bandPtr, mpg123_handle *fr)
Packit c32a2d
{
Packit c32a2d
	size_t i;
Packit c32a2d
	int ret;
Packit c32a2d
	size_t pnt1 = fr->buffer.fill;
Packit c32a2d
	unsigned char *samples = fr->buffer.data + pnt1;
Packit c32a2d
Packit c32a2d
	ret = SYNTH_NAME(bandPtr, 0, fr, 1);
Packit c32a2d
Packit c32a2d
	for(i=0;i<((fr->buffer.fill-pnt1)/(2*sizeof(SAMPLE_T)));i++)
Packit c32a2d
	{
Packit c32a2d
		((SAMPLE_T *)samples)[1] = ((SAMPLE_T *)samples)[0];
Packit c32a2d
		samples+=2*sizeof(SAMPLE_T);
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	return ret;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
Packit c32a2d
int SYNTH_NAME(real *bandPtr,int channel, mpg123_handle *fr, int final)
Packit c32a2d
{
Packit c32a2d
	static const int step = 2;
Packit c32a2d
	SAMPLE_T *samples = (SAMPLE_T *) (fr->buffer.data + fr->buffer.fill);
Packit c32a2d
Packit c32a2d
	real *b0, **buf; /* (*buf)[0x110]; */
Packit c32a2d
	int clip = 0; 
Packit c32a2d
	int bo1;
Packit c32a2d
	int ntom;
Packit c32a2d
#ifndef NO_EQUALIZER
Packit c32a2d
	if(fr->have_eq_settings) do_equalizer(bandPtr,channel,fr->equalizer);
Packit c32a2d
#endif
Packit c32a2d
	if(!channel)
Packit c32a2d
	{
Packit c32a2d
		fr->bo--;
Packit c32a2d
		fr->bo &= 0xf;
Packit c32a2d
		buf = fr->real_buffs[0];
Packit c32a2d
		ntom = fr->ntom_val[1] = fr->ntom_val[0];
Packit c32a2d
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		samples++;
Packit c32a2d
		buf = fr->real_buffs[1];
Packit c32a2d
		ntom = fr->ntom_val[1];
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	if(fr->bo & 0x1)
Packit c32a2d
	{
Packit c32a2d
		b0 = buf[0];
Packit c32a2d
		bo1 = fr->bo;
Packit c32a2d
		dct64(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr);
Packit c32a2d
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		b0 = buf[1];
Packit c32a2d
		bo1 = fr->bo+1;
Packit c32a2d
		dct64(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	{
Packit c32a2d
		register int j;
Packit c32a2d
		real *window = fr->decwin + 16 - bo1;
Packit c32a2d
Packit c32a2d
		for (j=16;j;j--,window+=0x10)
Packit c32a2d
		{
Packit c32a2d
			real sum;
Packit c32a2d
Packit c32a2d
			ntom += fr->ntom_step;
Packit c32a2d
			if(ntom < NTOM_MUL)
Packit c32a2d
			{
Packit c32a2d
				window += 16;
Packit c32a2d
				b0 += 16;
Packit c32a2d
				continue;
Packit c32a2d
			}
Packit c32a2d
Packit c32a2d
			sum  = REAL_MUL_SYNTH(*window++, *b0++);
Packit c32a2d
			sum -= REAL_MUL_SYNTH(*window++, *b0++);
Packit c32a2d
			sum += REAL_MUL_SYNTH(*window++, *b0++);
Packit c32a2d
			sum -= REAL_MUL_SYNTH(*window++, *b0++);
Packit c32a2d
			sum += REAL_MUL_SYNTH(*window++, *b0++);
Packit c32a2d
			sum -= REAL_MUL_SYNTH(*window++, *b0++);
Packit c32a2d
			sum += REAL_MUL_SYNTH(*window++, *b0++);
Packit c32a2d
			sum -= REAL_MUL_SYNTH(*window++, *b0++);
Packit c32a2d
			sum += REAL_MUL_SYNTH(*window++, *b0++);
Packit c32a2d
			sum -= REAL_MUL_SYNTH(*window++, *b0++);
Packit c32a2d
			sum += REAL_MUL_SYNTH(*window++, *b0++);
Packit c32a2d
			sum -= REAL_MUL_SYNTH(*window++, *b0++);
Packit c32a2d
			sum += REAL_MUL_SYNTH(*window++, *b0++);
Packit c32a2d
			sum -= REAL_MUL_SYNTH(*window++, *b0++);
Packit c32a2d
			sum += REAL_MUL_SYNTH(*window++, *b0++);
Packit c32a2d
			sum -= REAL_MUL_SYNTH(*window++, *b0++);
Packit c32a2d
Packit c32a2d
			while(ntom >= NTOM_MUL)
Packit c32a2d
			{
Packit c32a2d
				WRITE_SAMPLE(samples,sum,clip);
Packit c32a2d
				samples += step;
Packit c32a2d
				ntom -= NTOM_MUL;
Packit c32a2d
			}
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
		ntom += fr->ntom_step;
Packit c32a2d
		if(ntom >= NTOM_MUL)
Packit c32a2d
		{
Packit c32a2d
			real sum;
Packit c32a2d
			sum  = REAL_MUL_SYNTH(window[0x0], b0[0x0]);
Packit c32a2d
			sum += REAL_MUL_SYNTH(window[0x2], b0[0x2]);
Packit c32a2d
			sum += REAL_MUL_SYNTH(window[0x4], b0[0x4]);
Packit c32a2d
			sum += REAL_MUL_SYNTH(window[0x6], b0[0x6]);
Packit c32a2d
			sum += REAL_MUL_SYNTH(window[0x8], b0[0x8]);
Packit c32a2d
			sum += REAL_MUL_SYNTH(window[0xA], b0[0xA]);
Packit c32a2d
			sum += REAL_MUL_SYNTH(window[0xC], b0[0xC]);
Packit c32a2d
			sum += REAL_MUL_SYNTH(window[0xE], b0[0xE]);
Packit c32a2d
Packit c32a2d
			while(ntom >= NTOM_MUL)
Packit c32a2d
			{
Packit c32a2d
				WRITE_SAMPLE(samples,sum,clip);
Packit c32a2d
				samples += step;
Packit c32a2d
				ntom -= NTOM_MUL;
Packit c32a2d
			}
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
		b0-=0x10,window-=0x20;
Packit c32a2d
		window += bo1<<1;
Packit c32a2d
Packit c32a2d
		for (j=15;j;j--,b0-=0x20,window-=0x10)
Packit c32a2d
		{
Packit c32a2d
			real sum;
Packit c32a2d
Packit c32a2d
			ntom += fr->ntom_step;
Packit c32a2d
			if(ntom < NTOM_MUL)
Packit c32a2d
			{
Packit c32a2d
				window -= 16;
Packit c32a2d
				b0 += 16;
Packit c32a2d
				continue;
Packit c32a2d
			}
Packit c32a2d
Packit c32a2d
			sum = REAL_MUL_SYNTH(-*(--window), *b0++);
Packit c32a2d
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
Packit c32a2d
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
Packit c32a2d
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
Packit c32a2d
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
Packit c32a2d
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
Packit c32a2d
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
Packit c32a2d
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
Packit c32a2d
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
Packit c32a2d
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
Packit c32a2d
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
Packit c32a2d
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
Packit c32a2d
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
Packit c32a2d
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
Packit c32a2d
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
Packit c32a2d
			sum -= REAL_MUL_SYNTH(*(--window), *b0++);
Packit c32a2d
Packit c32a2d
			while(ntom >= NTOM_MUL)
Packit c32a2d
			{
Packit c32a2d
				WRITE_SAMPLE(samples,sum,clip);
Packit c32a2d
				samples += step;
Packit c32a2d
				ntom -= NTOM_MUL;
Packit c32a2d
			}
Packit c32a2d
		}
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	fr->ntom_val[channel] = ntom;
Packit c32a2d
	if(final) fr->buffer.fill = ((unsigned char *) samples - fr->buffer.data - (channel ? sizeof(SAMPLE_T) : 0));
Packit c32a2d
Packit c32a2d
	return clip;
Packit c32a2d
}
Packit c32a2d