00001 #include "mpeg3private.h"
00002 #include "mpeg3protos.h"
00003 #include "tables.h"
00004
00005 #define WRITE_SAMPLE(samples, sum) \
00006 { \
00007 (*samples) = (sum); \
00008 }
00009
00010 int mpeg3audio_synth_stereo(mpeg3_layer_t *audio,
00011 float *bandPtr,
00012 int channel,
00013 float *out,
00014 int *pnt)
00015 {
00016 float *samples = out + *pnt;
00017 register float sum;
00018 float *b0, (*buf)[0x110];
00019 int bo1;
00020
00021 if(!channel)
00022 {
00023 audio->bo--;
00024 audio->bo &= 0xf;
00025 buf = audio->synth_stereo_buffs[0];
00026 }
00027 else
00028 {
00029 buf = audio->synth_stereo_buffs[1];
00030 }
00031
00032 if(audio->bo & 0x1)
00033 {
00034 b0 = buf[0];
00035 bo1 = audio->bo;
00036 mpeg3audio_dct64(buf[1] + ((audio->bo + 1) & 0xf), buf[0] + audio->bo, bandPtr);
00037 }
00038 else
00039 {
00040 b0 = buf[1];
00041 bo1 = audio->bo + 1;
00042 mpeg3audio_dct64(buf[0] + audio->bo, buf[1] + audio->bo + 1, bandPtr);
00043 }
00044
00045
00046
00047 {
00048 int j;
00049 float *window = mpeg3_decwin + 16 - bo1;
00050
00051 for(j = 16; j; j--, b0 += 0x10, window += 0x20, samples++)
00052 {
00053 sum = window[0x0] * b0[0x0];
00054 sum -= window[0x1] * b0[0x1];
00055 sum += window[0x2] * b0[0x2];
00056 sum -= window[0x3] * b0[0x3];
00057 sum += window[0x4] * b0[0x4];
00058 sum -= window[0x5] * b0[0x5];
00059 sum += window[0x6] * b0[0x6];
00060 sum -= window[0x7] * b0[0x7];
00061 sum += window[0x8] * b0[0x8];
00062 sum -= window[0x9] * b0[0x9];
00063 sum += window[0xA] * b0[0xA];
00064 sum -= window[0xB] * b0[0xB];
00065 sum += window[0xC] * b0[0xC];
00066 sum -= window[0xD] * b0[0xD];
00067 sum += window[0xE] * b0[0xE];
00068 sum -= window[0xF] * b0[0xF];
00069
00070 WRITE_SAMPLE(samples, sum);
00071 }
00072
00073 sum = window[0x0] * b0[0x0];
00074 sum += window[0x2] * b0[0x2];
00075 sum += window[0x4] * b0[0x4];
00076 sum += window[0x6] * b0[0x6];
00077 sum += window[0x8] * b0[0x8];
00078 sum += window[0xA] * b0[0xA];
00079 sum += window[0xC] * b0[0xC];
00080 sum += window[0xE] * b0[0xE];
00081 WRITE_SAMPLE(samples, sum);
00082 b0 -= 0x10;
00083 window -= 0x20;
00084 samples++;
00085 window += bo1 << 1;
00086
00087 for(j = 15; j; j--, b0 -= 0x10, window -= 0x20, samples++)
00088 {
00089 sum = -window[-0x1] * b0[0x0];
00090 sum -= window[-0x2] * b0[0x1];
00091 sum -= window[-0x3] * b0[0x2];
00092 sum -= window[-0x4] * b0[0x3];
00093 sum -= window[-0x5] * b0[0x4];
00094 sum -= window[-0x6] * b0[0x5];
00095 sum -= window[-0x7] * b0[0x6];
00096 sum -= window[-0x8] * b0[0x7];
00097 sum -= window[-0x9] * b0[0x8];
00098 sum -= window[-0xA] * b0[0x9];
00099 sum -= window[-0xB] * b0[0xA];
00100 sum -= window[-0xC] * b0[0xB];
00101 sum -= window[-0xD] * b0[0xC];
00102 sum -= window[-0xE] * b0[0xD];
00103 sum -= window[-0xF] * b0[0xE];
00104 sum -= window[-0x0] * b0[0xF];
00105
00106 WRITE_SAMPLE(samples, sum);
00107 }
00108 }
00109 *pnt += 32;
00110
00111 return 0;
00112 }
00113
00114
00115
00116
00117 int mpeg3audio_reset_synths(mpeg3_layer_t *audio)
00118 {
00119 int i, j, k;
00120 for(i = 0; i < 2; i++)
00121 {
00122 for(j = 0; j < 2; j++)
00123 {
00124 for(k = 0; k < 0x110; k++)
00125 {
00126 audio->synth_stereo_buffs[i][j][k] = 0;
00127 }
00128 }
00129 }
00130 for(i = 0; i < 64; i++)
00131 {
00132 audio->synth_mono_buff[i] = 0;
00133 audio->layer2_scfsi_buf[i] = 0;
00134 }
00135 for(i = 0; i < 2; i++)
00136 {
00137 for(j = 0; j < 2; j++)
00138 {
00139 for(k = 0; k < SBLIMIT * SSLIMIT; k++)
00140 {
00141 audio->mp3_block[i][j][k] = 0;
00142 }
00143 }
00144 }
00145 audio->mp3_blc[0] = 0;
00146 audio->mp3_blc[1] = 0;
00147 return 0;
00148 }