r726: Implementing ability to add textural info to the labels
[cinelerra_cv/mob.git] / libmpeg3 / audio / synthesizers.c
blob407136accfd1e0efcf9aff25830edf51ab3861a5
1 #include "mpeg3private.h"
2 #include "mpeg3protos.h"
3 #include "tables.h"
5 #define WRITE_SAMPLE(samples, sum) \
6 { \
7 (*samples) = (sum); \
10 int mpeg3audio_synth_stereo(mpeg3_layer_t *audio,
11 float *bandPtr,
12 int channel,
13 float *out,
14 int *pnt)
16 float *samples = out + *pnt;
17 register float sum;
18 float *b0, (*buf)[0x110];
19 int bo1;
21 if(!channel)
23 audio->bo--;
24 audio->bo &= 0xf;
25 buf = audio->synth_stereo_buffs[0];
27 else
29 buf = audio->synth_stereo_buffs[1];
32 if(audio->bo & 0x1)
34 b0 = buf[0];
35 bo1 = audio->bo;
36 mpeg3audio_dct64(buf[1] + ((audio->bo + 1) & 0xf), buf[0] + audio->bo, bandPtr);
38 else
40 b0 = buf[1];
41 bo1 = audio->bo + 1;
42 mpeg3audio_dct64(buf[0] + audio->bo, buf[1] + audio->bo + 1, bandPtr);
45 /*printf("%f %f %f\n", buf[0][0], buf[1][0], bandPtr[0]); */
48 int j;
49 float *window = mpeg3_decwin + 16 - bo1;
51 for(j = 16; j; j--, b0 += 0x10, window += 0x20, samples++)
53 sum = window[0x0] * b0[0x0];
54 sum -= window[0x1] * b0[0x1];
55 sum += window[0x2] * b0[0x2];
56 sum -= window[0x3] * b0[0x3];
57 sum += window[0x4] * b0[0x4];
58 sum -= window[0x5] * b0[0x5];
59 sum += window[0x6] * b0[0x6];
60 sum -= window[0x7] * b0[0x7];
61 sum += window[0x8] * b0[0x8];
62 sum -= window[0x9] * b0[0x9];
63 sum += window[0xA] * b0[0xA];
64 sum -= window[0xB] * b0[0xB];
65 sum += window[0xC] * b0[0xC];
66 sum -= window[0xD] * b0[0xD];
67 sum += window[0xE] * b0[0xE];
68 sum -= window[0xF] * b0[0xF];
70 WRITE_SAMPLE(samples, sum);
73 sum = window[0x0] * b0[0x0];
74 sum += window[0x2] * b0[0x2];
75 sum += window[0x4] * b0[0x4];
76 sum += window[0x6] * b0[0x6];
77 sum += window[0x8] * b0[0x8];
78 sum += window[0xA] * b0[0xA];
79 sum += window[0xC] * b0[0xC];
80 sum += window[0xE] * b0[0xE];
81 WRITE_SAMPLE(samples, sum);
82 b0 -= 0x10;
83 window -= 0x20;
84 samples++;
85 window += bo1 << 1;
87 for(j = 15; j; j--, b0 -= 0x10, window -= 0x20, samples++)
89 sum = -window[-0x1] * b0[0x0];
90 sum -= window[-0x2] * b0[0x1];
91 sum -= window[-0x3] * b0[0x2];
92 sum -= window[-0x4] * b0[0x3];
93 sum -= window[-0x5] * b0[0x4];
94 sum -= window[-0x6] * b0[0x5];
95 sum -= window[-0x7] * b0[0x6];
96 sum -= window[-0x8] * b0[0x7];
97 sum -= window[-0x9] * b0[0x8];
98 sum -= window[-0xA] * b0[0x9];
99 sum -= window[-0xB] * b0[0xA];
100 sum -= window[-0xC] * b0[0xB];
101 sum -= window[-0xD] * b0[0xC];
102 sum -= window[-0xE] * b0[0xD];
103 sum -= window[-0xF] * b0[0xE];
104 sum -= window[-0x0] * b0[0xF];
106 WRITE_SAMPLE(samples, sum);
109 *pnt += 32;
111 return 0;
116 /* Call this after every seek to reset the buffers */
117 int mpeg3audio_reset_synths(mpeg3_layer_t *audio)
119 int i, j, k;
120 for(i = 0; i < 2; i++)
122 for(j = 0; j < 2; j++)
124 for(k = 0; k < 0x110; k++)
126 audio->synth_stereo_buffs[i][j][k] = 0;
130 for(i = 0; i < 64; i++)
132 audio->synth_mono_buff[i] = 0;
133 audio->layer2_scfsi_buf[i] = 0;
135 for(i = 0; i < 2; i++)
137 for(j = 0; j < 2; j++)
139 for(k = 0; k < SBLIMIT * SSLIMIT; k++)
141 audio->mp3_block[i][j][k] = 0;
145 audio->mp3_blc[0] = 0;
146 audio->mp3_blc[1] = 0;
147 return 0;