|
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 |
|