Mercurial > audlegacy
diff Plugins/Input/mpg123/decode_2to1.c @ 61:fa848bd484d8 trunk
[svn] Move plugins to Plugins/
author | nenolod |
---|---|
date | Fri, 28 Oct 2005 22:58:11 -0700 |
parents | |
children | 05d824e30afd |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/Input/mpg123/decode_2to1.c Fri Oct 28 22:58:11 2005 -0700 @@ -0,0 +1,251 @@ + +/* + * Mpeg Layer-1,2,3 audio decoder + * ------------------------------ + * copyright (c) 1995 by Michael Hipp, All rights reserved. See also 'README' + * version for slower machines .. decodes only every second sample + * sounds like 24000,22050 or 16000 kHz .. (depending on original sample freq.) + * + */ + +#include <stdlib.h> +#include <math.h> +#include <string.h> + +#include "mpg123.h" + +#define WRITE_SAMPLE(samples,sum,clip) \ + if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \ + else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \ + else { *(samples) = sum; } + +int +mpg123_synth_2to1_8bit(real * bandPtr, int channel, + unsigned char *samples, int *pnt) +{ + short samples_tmp[32]; + short *tmp1 = samples_tmp + channel; + int i, ret; + int pnt1 = 0; + + ret = + mpg123_synth_2to1(bandPtr, channel, (unsigned char *) samples_tmp, + &pnt1); + samples += channel + *pnt; + + for (i = 0; i < 16; i++) { + *samples = (*tmp1 >> 8) ^ 128; + samples += 2; + tmp1 += 2; + } + *pnt += 32; + + return ret; +} + +int +mpg123_synth_2to1_8bit_mono(real * bandPtr, unsigned char *samples, int *pnt) +{ + short samples_tmp[32]; + short *tmp1 = samples_tmp; + int i, ret; + int pnt1 = 0; + + ret = mpg123_synth_2to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1); + samples += *pnt; + + for (i = 0; i < 16; i++) { + *samples++ = (*tmp1 >> 8) ^ 128; + tmp1 += 2; + } + *pnt += 16; + + return ret; +} + +#if 0 +int +mpg123_synth_2to1_8bit_mono2stereo(real * bandPtr, + unsigned char *samples, int *pnt) +{ + short samples_tmp[32]; + short *tmp1 = samples_tmp; + int i, ret; + int pnt1 = 0; + + ret = mpg123_synth_2to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1); + samples += *pnt; + + for (i = 0; i < 16; i++) { + *samples++ = (*tmp1 >> 8) ^ 128; + *samples++ = (*tmp1 >> 8) ^ 128; + tmp1 += 2; + } + *pnt += 32; + + return ret; +} +#endif + +int +mpg123_synth_2to1_mono(real * bandPtr, unsigned char *samples, int *pnt) +{ + short samples_tmp[32]; + short *tmp1 = samples_tmp; + int i, ret; + int pnt1 = 0; + + ret = mpg123_synth_2to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1); + samples += *pnt; + + for (i = 0; i < 16; i++) { + *((short *) samples) = *tmp1; + samples += 2; + tmp1 += 2; + } + *pnt += 32; + + return ret; +} + +#if 0 +int +mpg123_synth_2to1_mono2stereo(real * bandPtr, unsigned char *samples, + int *pnt) +{ + int i, ret; + + ret = mpg123_synth_2to1(bandPtr, 0, samples, pnt); + samples = samples + *pnt - 64; + + for (i = 0; i < 16; i++) { + ((short *) samples)[1] = ((short *) samples)[0]; + samples += 4; + } + + return ret; +} +#endif + +int +mpg123_synth_2to1(real * bandPtr, int channel, unsigned char *out, int *pnt) +{ + static real buffs[2][2][0x110]; + static const int step = 2; + static int bo = 1; + short *samples = (short *) (out + *pnt); + + real *b0, (*buf)[0x110]; + int clip = 0; + int bo1; + +/* if(param.equalizer) + do_equalizer(bandPtr,channel); */ + + if (!channel) { + bo--; + bo &= 0xf; + buf = buffs[0]; + } + else { + samples++; + buf = buffs[1]; + } + + if (bo & 0x1) { + b0 = buf[0]; + bo1 = bo; + mpg123_dct64(buf[1] + ((bo + 1) & 0xf), buf[0] + bo, bandPtr); + } + else { + b0 = buf[1]; + bo1 = bo + 1; + mpg123_dct64(buf[0] + bo, buf[1] + bo + 1, bandPtr); + } + + { + register int j; + real *window = mpg123_decwin + 16 - bo1; + + for (j = 8; j; j--, b0 += 0x10, window += 0x30) { + real sum; + + sum = *window++ * *b0++; + sum -= *window++ * *b0++; + sum += *window++ * *b0++; + sum -= *window++ * *b0++; + sum += *window++ * *b0++; + sum -= *window++ * *b0++; + sum += *window++ * *b0++; + sum -= *window++ * *b0++; + sum += *window++ * *b0++; + sum -= *window++ * *b0++; + sum += *window++ * *b0++; + sum -= *window++ * *b0++; + sum += *window++ * *b0++; + sum -= *window++ * *b0++; + sum += *window++ * *b0++; + sum -= *window++ * *b0++; + + WRITE_SAMPLE(samples, sum, clip); + samples += step; +#if 0 + WRITE_SAMPLE(samples, sum, clip); + samples += step; +#endif + } + + { + real sum; + + sum = window[0x0] * b0[0x0]; + sum += window[0x2] * b0[0x2]; + sum += window[0x4] * b0[0x4]; + sum += window[0x6] * b0[0x6]; + sum += window[0x8] * b0[0x8]; + sum += window[0xA] * b0[0xA]; + sum += window[0xC] * b0[0xC]; + sum += window[0xE] * b0[0xE]; + WRITE_SAMPLE(samples, sum, clip); + samples += step; +#if 0 + WRITE_SAMPLE(samples, sum, clip); + samples += step; +#endif + b0 -= 0x20, window -= 0x40; + } + window += bo1 << 1; + + for (j = 7; j; j--, b0 -= 0x30, window -= 0x30) { + real sum; + + sum = -*(--window) * *b0++; + sum -= *(--window) * *b0++; + sum -= *(--window) * *b0++; + sum -= *(--window) * *b0++; + sum -= *(--window) * *b0++; + sum -= *(--window) * *b0++; + sum -= *(--window) * *b0++; + sum -= *(--window) * *b0++; + sum -= *(--window) * *b0++; + sum -= *(--window) * *b0++; + sum -= *(--window) * *b0++; + sum -= *(--window) * *b0++; + sum -= *(--window) * *b0++; + sum -= *(--window) * *b0++; + sum -= *(--window) * *b0++; + sum -= *(--window) * *b0++; + + WRITE_SAMPLE(samples, sum, clip); + samples += step; +#if 0 + WRITE_SAMPLE(samples, sum, clip); + samples += step; +#endif + } + } + + *pnt += 64; + + return clip; +}