Blame src/libmpg123/synth_real.c

Packit c32a2d
/*
Packit c32a2d
	synth_real.c: The functions for synthesizing real (float) samples, at the end of decoding.
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, heavily dissected and rearranged by Thomas Orgis
Packit c32a2d
*/
Packit c32a2d
Packit c32a2d
#include "mpg123lib_intern.h"
Packit c32a2d
#include "sample.h"
Packit c32a2d
#include "debug.h"
Packit c32a2d
Packit c32a2d
#ifdef REAL_IS_FIXED
Packit c32a2d
#error "Do not build this file with fixed point math!"
Packit c32a2d
#else
Packit c32a2d
/* 
Packit c32a2d
	Part 3: All synth functions that produce float output.
Packit c32a2d
	What we need is just a special WRITE_SAMPLE. For the generic and i386 functions, that is.
Packit c32a2d
	The optimized synths would need to be changed internally to support float output.
Packit c32a2d
*/
Packit c32a2d
Packit c32a2d
#define SAMPLE_T real
Packit c32a2d
#define WRITE_SAMPLE(samples,sum,clip) WRITE_REAL_SAMPLE(samples,sum,clip)
Packit c32a2d
Packit c32a2d
/* Part 3a: All straight 1to1 decoding functions */
Packit c32a2d
#define BLOCK 0x40 /* One decoding block is 64 samples. */
Packit c32a2d
Packit c32a2d
#define SYNTH_NAME synth_1to1_real
Packit c32a2d
#include "synth.h"
Packit c32a2d
#undef SYNTH_NAME
Packit c32a2d
Packit c32a2d
/* Mono-related synths; they wrap over _some_ synth_1to1_real (could be generic, could be i386). */
Packit c32a2d
#define SYNTH_NAME       fr->synths.plain[r_1to1][f_real]
Packit c32a2d
#define MONO_NAME        synth_1to1_real_mono
Packit c32a2d
#define MONO2STEREO_NAME synth_1to1_real_m2s
Packit c32a2d
#include "synth_mono.h"
Packit c32a2d
#undef SYNTH_NAME
Packit c32a2d
#undef MONO_NAME
Packit c32a2d
#undef MONO2STEREO_NAME
Packit c32a2d
Packit c32a2d
#ifdef OPT_X86
Packit c32a2d
#define NO_AUTOINCREMENT
Packit c32a2d
#define SYNTH_NAME synth_1to1_real_i386
Packit c32a2d
#include "synth.h"
Packit c32a2d
#undef SYNTH_NAME
Packit c32a2d
/* i386 uses the normal mono functions. */
Packit c32a2d
#undef NO_AUTOINCREMENT
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
#undef BLOCK
Packit c32a2d
Packit c32a2d
/* At least one optimized real decoder... */
Packit c32a2d
#ifdef OPT_X86_64
Packit c32a2d
/* Assembler routines. */
Packit c32a2d
int synth_1to1_real_x86_64_asm(real *window, real *b0, real *samples, int bo1);
Packit c32a2d
int synth_1to1_real_s_x86_64_asm(real *window, real *b0l, real *b0r, real *samples, int bo1);
Packit c32a2d
void dct64_real_x86_64(real *out0, real *out1, real *samples);
Packit c32a2d
/* Hull for C mpg123 API */
Packit c32a2d
int synth_1to1_real_x86_64(real *bandPtr,int channel, mpg123_handle *fr, int final)
Packit c32a2d
{
Packit c32a2d
	real *samples = (real *) (fr->buffer.data+fr->buffer.fill);
Packit c32a2d
Packit c32a2d
	real *b0, **buf;
Packit c32a2d
	int bo1;
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
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		samples++;
Packit c32a2d
		buf = fr->real_buffs[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_real_x86_64(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_real_x86_64(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	synth_1to1_real_x86_64_asm(fr->decwin, b0, samples, bo1);
Packit c32a2d
Packit c32a2d
	if(final) fr->buffer.fill += 256;
Packit c32a2d
Packit c32a2d
	return 0;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
int synth_1to1_real_stereo_x86_64(real *bandPtr_l, real *bandPtr_r, mpg123_handle *fr)
Packit c32a2d
{
Packit c32a2d
	real *samples = (real *) (fr->buffer.data+fr->buffer.fill);
Packit c32a2d
Packit c32a2d
	real *b0l, *b0r, **bufl, **bufr;
Packit c32a2d
	int bo1;
Packit c32a2d
#ifndef NO_EQUALIZER
Packit c32a2d
	if(fr->have_eq_settings)
Packit c32a2d
	{
Packit c32a2d
		do_equalizer(bandPtr_l,0,fr->equalizer);
Packit c32a2d
		do_equalizer(bandPtr_r,1,fr->equalizer);
Packit c32a2d
	}
Packit c32a2d
#endif
Packit c32a2d
	fr->bo--;
Packit c32a2d
	fr->bo &= 0xf;
Packit c32a2d
	bufl = fr->real_buffs[0];
Packit c32a2d
	bufr = fr->real_buffs[1];
Packit c32a2d
Packit c32a2d
	if(fr->bo & 0x1)
Packit c32a2d
	{
Packit c32a2d
		b0l = bufl[0];
Packit c32a2d
		b0r = bufr[0];
Packit c32a2d
		bo1 = fr->bo;
Packit c32a2d
		dct64_real_x86_64(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l);
Packit c32a2d
		dct64_real_x86_64(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r);
Packit c32a2d
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		b0l = bufl[1];
Packit c32a2d
		b0r = bufr[1];
Packit c32a2d
		bo1 = fr->bo+1;
Packit c32a2d
		dct64_real_x86_64(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l);
Packit c32a2d
		dct64_real_x86_64(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r);
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	synth_1to1_real_s_x86_64_asm(fr->decwin, b0l, b0r, samples, bo1);
Packit c32a2d
Packit c32a2d
	fr->buffer.fill += 256;
Packit c32a2d
Packit c32a2d
	return 0;
Packit c32a2d
}
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
#ifdef OPT_AVX
Packit c32a2d
/* Assembler routines. */
Packit c32a2d
#ifndef OPT_X86_64
Packit c32a2d
int synth_1to1_real_x86_64_asm(real *window, real *b0, real *samples, int bo1);
Packit c32a2d
#endif
Packit c32a2d
int synth_1to1_real_s_avx_asm(real *window, real *b0l, real *b0r, real *samples, int bo1);
Packit c32a2d
void dct64_real_avx(real *out0, real *out1, real *samples);
Packit c32a2d
/* Hull for C mpg123 API */
Packit c32a2d
int synth_1to1_real_avx(real *bandPtr,int channel, mpg123_handle *fr, int final)
Packit c32a2d
{
Packit c32a2d
	real *samples = (real *) (fr->buffer.data+fr->buffer.fill);
Packit c32a2d
Packit c32a2d
	real *b0, **buf;
Packit c32a2d
	int bo1;
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
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		samples++;
Packit c32a2d
		buf = fr->real_buffs[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_real_avx(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_real_avx(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	synth_1to1_real_x86_64_asm(fr->decwin, b0, samples, bo1);
Packit c32a2d
Packit c32a2d
	if(final) fr->buffer.fill += 256;
Packit c32a2d
Packit c32a2d
	return 0;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
int synth_1to1_fltst_avx(real *bandPtr_l, real *bandPtr_r, mpg123_handle *fr)
Packit c32a2d
{
Packit c32a2d
	real *samples = (real *) (fr->buffer.data+fr->buffer.fill);
Packit c32a2d
Packit c32a2d
	real *b0l, *b0r, **bufl, **bufr;
Packit c32a2d
	int bo1;
Packit c32a2d
#ifndef NO_EQUALIZER
Packit c32a2d
	if(fr->have_eq_settings)
Packit c32a2d
	{
Packit c32a2d
		do_equalizer(bandPtr_l,0,fr->equalizer);
Packit c32a2d
		do_equalizer(bandPtr_r,1,fr->equalizer);
Packit c32a2d
	}
Packit c32a2d
#endif
Packit c32a2d
	fr->bo--;
Packit c32a2d
	fr->bo &= 0xf;
Packit c32a2d
	bufl = fr->real_buffs[0];
Packit c32a2d
	bufr = fr->real_buffs[1];
Packit c32a2d
Packit c32a2d
	if(fr->bo & 0x1)
Packit c32a2d
	{
Packit c32a2d
		b0l = bufl[0];
Packit c32a2d
		b0r = bufr[0];
Packit c32a2d
		bo1 = fr->bo;
Packit c32a2d
		dct64_real_avx(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l);
Packit c32a2d
		dct64_real_avx(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r);
Packit c32a2d
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		b0l = bufl[1];
Packit c32a2d
		b0r = bufr[1];
Packit c32a2d
		bo1 = fr->bo+1;
Packit c32a2d
		dct64_real_avx(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l);
Packit c32a2d
		dct64_real_avx(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r);
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	synth_1to1_real_s_avx_asm(fr->decwin, b0l, b0r, samples, bo1);
Packit c32a2d
Packit c32a2d
	fr->buffer.fill += 256;
Packit c32a2d
Packit c32a2d
	return 0;
Packit c32a2d
}
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
#if defined(OPT_SSE) || defined(OPT_SSE_VINTAGE)
Packit c32a2d
/* Assembler routines. */
Packit c32a2d
int synth_1to1_real_sse_asm(real *window, real *b0, real *samples, int bo1);
Packit c32a2d
int synth_1to1_real_s_sse_asm(real *window, real *b0l, real *b0r, real *samples, int bo1);
Packit c32a2d
void dct64_real_sse(real *out0, real *out1, real *samples);
Packit c32a2d
/* Hull for C mpg123 API */
Packit c32a2d
int synth_1to1_real_sse(real *bandPtr,int channel, mpg123_handle *fr, int final)
Packit c32a2d
{
Packit c32a2d
	real *samples = (real *) (fr->buffer.data+fr->buffer.fill);
Packit c32a2d
Packit c32a2d
	real *b0, **buf;
Packit c32a2d
	int bo1;
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
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		samples++;
Packit c32a2d
		buf = fr->real_buffs[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_real_sse(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_real_sse(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	synth_1to1_real_sse_asm(fr->decwin, b0, samples, bo1);
Packit c32a2d
Packit c32a2d
	if(final) fr->buffer.fill += 256;
Packit c32a2d
Packit c32a2d
	return 0;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
int synth_1to1_real_stereo_sse(real *bandPtr_l, real *bandPtr_r, mpg123_handle *fr)
Packit c32a2d
{
Packit c32a2d
	real *samples = (real *) (fr->buffer.data+fr->buffer.fill);
Packit c32a2d
Packit c32a2d
	real *b0l, *b0r, **bufl, **bufr;
Packit c32a2d
	int bo1;
Packit c32a2d
#ifndef NO_EQUALIZER
Packit c32a2d
	if(fr->have_eq_settings)
Packit c32a2d
	{
Packit c32a2d
		do_equalizer(bandPtr_l,0,fr->equalizer);
Packit c32a2d
		do_equalizer(bandPtr_r,1,fr->equalizer);
Packit c32a2d
	}
Packit c32a2d
#endif
Packit c32a2d
	fr->bo--;
Packit c32a2d
	fr->bo &= 0xf;
Packit c32a2d
	bufl = fr->real_buffs[0];
Packit c32a2d
	bufr = fr->real_buffs[1];
Packit c32a2d
Packit c32a2d
	if(fr->bo & 0x1)
Packit c32a2d
	{
Packit c32a2d
		b0l = bufl[0];
Packit c32a2d
		b0r = bufr[0];
Packit c32a2d
		bo1 = fr->bo;
Packit c32a2d
		dct64_real_sse(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l);
Packit c32a2d
		dct64_real_sse(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r);
Packit c32a2d
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		b0l = bufl[1];
Packit c32a2d
		b0r = bufr[1];
Packit c32a2d
		bo1 = fr->bo+1;
Packit c32a2d
		dct64_real_sse(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l);
Packit c32a2d
		dct64_real_sse(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r);
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	synth_1to1_real_s_sse_asm(fr->decwin, b0l, b0r, samples, bo1);
Packit c32a2d
Packit c32a2d
	fr->buffer.fill += 256;
Packit c32a2d
Packit c32a2d
	return 0;
Packit c32a2d
}
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
#ifdef OPT_NEON
Packit c32a2d
/* Assembler routines. */
Packit c32a2d
int synth_1to1_real_neon_asm(real *window, real *b0, real *samples, int bo1);
Packit c32a2d
int synth_1to1_real_s_neon_asm(real *window, real *b0l, real *b0r, real *samples, int bo1);
Packit c32a2d
void dct64_real_neon(real *out0, real *out1, real *samples);
Packit c32a2d
/* Hull for C mpg123 API */
Packit c32a2d
int synth_1to1_real_neon(real *bandPtr,int channel, mpg123_handle *fr, int final)
Packit c32a2d
{
Packit c32a2d
	real *samples = (real *) (fr->buffer.data+fr->buffer.fill);
Packit c32a2d
Packit c32a2d
	real *b0, **buf;
Packit c32a2d
	int bo1;
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
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		samples++;
Packit c32a2d
		buf = fr->real_buffs[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_real_neon(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_real_neon(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	synth_1to1_real_neon_asm(fr->decwin, b0, samples, bo1);
Packit c32a2d
Packit c32a2d
	if(final) fr->buffer.fill += 256;
Packit c32a2d
Packit c32a2d
	return 0;
Packit c32a2d
}
Packit c32a2d
int synth_1to1_real_stereo_neon(real *bandPtr_l, real *bandPtr_r, mpg123_handle *fr)
Packit c32a2d
{
Packit c32a2d
	real *samples = (real *) (fr->buffer.data+fr->buffer.fill);
Packit c32a2d
Packit c32a2d
	real *b0l, *b0r, **bufl, **bufr;
Packit c32a2d
	int bo1;
Packit c32a2d
#ifndef NO_EQUALIZER
Packit c32a2d
	if(fr->have_eq_settings)
Packit c32a2d
	{
Packit c32a2d
		do_equalizer(bandPtr_l,0,fr->equalizer);
Packit c32a2d
		do_equalizer(bandPtr_r,1,fr->equalizer);
Packit c32a2d
	}
Packit c32a2d
#endif
Packit c32a2d
	fr->bo--;
Packit c32a2d
	fr->bo &= 0xf;
Packit c32a2d
	bufl = fr->real_buffs[0];
Packit c32a2d
	bufr = fr->real_buffs[1];
Packit c32a2d
Packit c32a2d
	if(fr->bo & 0x1)
Packit c32a2d
	{
Packit c32a2d
		b0l = bufl[0];
Packit c32a2d
		b0r = bufr[0];
Packit c32a2d
		bo1 = fr->bo;
Packit c32a2d
		dct64_real_neon(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l);
Packit c32a2d
		dct64_real_neon(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r);
Packit c32a2d
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		b0l = bufl[1];
Packit c32a2d
		b0r = bufr[1];
Packit c32a2d
		bo1 = fr->bo+1;
Packit c32a2d
		dct64_real_neon(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l);
Packit c32a2d
		dct64_real_neon(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r);
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	synth_1to1_real_s_neon_asm(fr->decwin, b0l, b0r, samples, bo1);
Packit c32a2d
Packit c32a2d
	fr->buffer.fill += 256;
Packit c32a2d
Packit c32a2d
	return 0;
Packit c32a2d
}
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
#ifdef OPT_NEON64
Packit c32a2d
/* Assembler routines. */
Packit c32a2d
int synth_1to1_real_neon64_asm(real *window, real *b0, real *samples, int bo1);
Packit c32a2d
int synth_1to1_real_s_neon64_asm(real *window, real *b0l, real *b0r, real *samples, int bo1);
Packit c32a2d
void dct64_real_neon64(real *out0, real *out1, real *samples);
Packit c32a2d
/* Hull for C mpg123 API */
Packit c32a2d
int synth_1to1_real_neon64(real *bandPtr,int channel, mpg123_handle *fr, int final)
Packit c32a2d
{
Packit c32a2d
	real *samples = (real *) (fr->buffer.data+fr->buffer.fill);
Packit c32a2d
Packit c32a2d
	real *b0, **buf;
Packit c32a2d
	int bo1;
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
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		samples++;
Packit c32a2d
		buf = fr->real_buffs[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_real_neon64(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_real_neon64(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	synth_1to1_real_neon64_asm(fr->decwin, b0, samples, bo1);
Packit c32a2d
Packit c32a2d
	if(final) fr->buffer.fill += 256;
Packit c32a2d
Packit c32a2d
	return 0;
Packit c32a2d
}
Packit c32a2d
int synth_1to1_fltst_neon64(real *bandPtr_l, real *bandPtr_r, mpg123_handle *fr)
Packit c32a2d
{
Packit c32a2d
	real *samples = (real *) (fr->buffer.data+fr->buffer.fill);
Packit c32a2d
Packit c32a2d
	real *b0l, *b0r, **bufl, **bufr;
Packit c32a2d
	int bo1;
Packit c32a2d
#ifndef NO_EQUALIZER
Packit c32a2d
	if(fr->have_eq_settings)
Packit c32a2d
	{
Packit c32a2d
		do_equalizer(bandPtr_l,0,fr->equalizer);
Packit c32a2d
		do_equalizer(bandPtr_r,1,fr->equalizer);
Packit c32a2d
	}
Packit c32a2d
#endif
Packit c32a2d
	fr->bo--;
Packit c32a2d
	fr->bo &= 0xf;
Packit c32a2d
	bufl = fr->real_buffs[0];
Packit c32a2d
	bufr = fr->real_buffs[1];
Packit c32a2d
Packit c32a2d
	if(fr->bo & 0x1)
Packit c32a2d
	{
Packit c32a2d
		b0l = bufl[0];
Packit c32a2d
		b0r = bufr[0];
Packit c32a2d
		bo1 = fr->bo;
Packit c32a2d
		dct64_real_neon64(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l);
Packit c32a2d
		dct64_real_neon64(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r);
Packit c32a2d
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		b0l = bufl[1];
Packit c32a2d
		b0r = bufr[1];
Packit c32a2d
		bo1 = fr->bo+1;
Packit c32a2d
		dct64_real_neon64(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l);
Packit c32a2d
		dct64_real_neon64(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r);
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	synth_1to1_real_s_neon64_asm(fr->decwin, b0l, b0r, samples, bo1);
Packit c32a2d
Packit c32a2d
	fr->buffer.fill += 256;
Packit c32a2d
Packit c32a2d
	return 0;
Packit c32a2d
}
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
#ifndef NO_DOWNSAMPLE
Packit c32a2d
Packit c32a2d
/*
Packit c32a2d
	Part 3b: 2to1 synth. Only generic and i386.
Packit c32a2d
*/
Packit c32a2d
#define BLOCK 0x20 /* One decoding block is 32 samples. */
Packit c32a2d
Packit c32a2d
#define SYNTH_NAME synth_2to1_real
Packit c32a2d
#include "synth.h"
Packit c32a2d
#undef SYNTH_NAME
Packit c32a2d
Packit c32a2d
/* Mono-related synths; they wrap over _some_ synth_2to1_real (could be generic, could be i386). */
Packit c32a2d
#define SYNTH_NAME       fr->synths.plain[r_2to1][f_real]
Packit c32a2d
#define MONO_NAME        synth_2to1_real_mono
Packit c32a2d
#define MONO2STEREO_NAME synth_2to1_real_m2s
Packit c32a2d
#include "synth_mono.h"
Packit c32a2d
#undef SYNTH_NAME
Packit c32a2d
#undef MONO_NAME
Packit c32a2d
#undef MONO2STEREO_NAME
Packit c32a2d
Packit c32a2d
#ifdef OPT_X86
Packit c32a2d
#define NO_AUTOINCREMENT
Packit c32a2d
#define SYNTH_NAME synth_2to1_real_i386
Packit c32a2d
#include "synth.h"
Packit c32a2d
#undef SYNTH_NAME
Packit c32a2d
/* i386 uses the normal mono functions. */
Packit c32a2d
#undef NO_AUTOINCREMENT
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
#undef BLOCK
Packit c32a2d
Packit c32a2d
/*
Packit c32a2d
	Part 3c: 4to1 synth. Only generic and i386.
Packit c32a2d
*/
Packit c32a2d
#define BLOCK 0x10 /* One decoding block is 16 samples. */
Packit c32a2d
Packit c32a2d
#define SYNTH_NAME synth_4to1_real
Packit c32a2d
#include "synth.h"
Packit c32a2d
#undef SYNTH_NAME
Packit c32a2d
Packit c32a2d
/* Mono-related synths; they wrap over _some_ synth_4to1_real (could be generic, could be i386). */
Packit c32a2d
#define SYNTH_NAME       fr->synths.plain[r_4to1][f_real]
Packit c32a2d
#define MONO_NAME        synth_4to1_real_mono
Packit c32a2d
#define MONO2STEREO_NAME synth_4to1_real_m2s
Packit c32a2d
#include "synth_mono.h"
Packit c32a2d
#undef SYNTH_NAME
Packit c32a2d
#undef MONO_NAME
Packit c32a2d
#undef MONO2STEREO_NAME
Packit c32a2d
Packit c32a2d
#ifdef OPT_X86
Packit c32a2d
#define NO_AUTOINCREMENT
Packit c32a2d
#define SYNTH_NAME synth_4to1_real_i386
Packit c32a2d
#include "synth.h"
Packit c32a2d
#undef SYNTH_NAME
Packit c32a2d
/* i386 uses the normal mono functions. */
Packit c32a2d
#undef NO_AUTOINCREMENT
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
#undef BLOCK
Packit c32a2d
Packit c32a2d
#endif /* NO_DOWNSAMPLE */
Packit c32a2d
Packit c32a2d
#ifndef NO_NTOM
Packit c32a2d
/*
Packit c32a2d
	Part 3d: ntom synth.
Packit c32a2d
	Same procedure as above... Just no extra play anymore, straight synth that may use an optimized dct64.
Packit c32a2d
*/
Packit c32a2d
Packit c32a2d
/* These are all in one header, there's no flexibility to gain. */
Packit c32a2d
#define SYNTH_NAME       synth_ntom_real
Packit c32a2d
#define MONO_NAME        synth_ntom_real_mono
Packit c32a2d
#define MONO2STEREO_NAME synth_ntom_real_m2s
Packit c32a2d
#include "synth_ntom.h"
Packit c32a2d
#undef SYNTH_NAME
Packit c32a2d
#undef MONO_NAME
Packit c32a2d
#undef MONO2STEREO_NAME
Packit c32a2d
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
#undef SAMPLE_T
Packit c32a2d
#undef WRITE_SAMPLE
Packit c32a2d
Packit c32a2d
#endif /* non-fixed type */