1 #ifndef DISABLE_MPEG_AUDIO
2
3 /*
4 * Mpeg Layer-1,2,3 audio decoder
5 * ------------------------------
6 * copyright (c) 1995 by Michael Hipp, All rights reserved. See also 'README'
7 * version for slower machines .. decodes only every second sample
8 * sounds like 24000,22050 or 16000 kHz .. (depending on original sample freq.)
9 *
10 */
11
12 #include <stdlib.h>
13 #include <math.h>
14 #include <string.h>
15
16 #include "mpg123.h"
17
18 #define WRITE_SAMPLE(samples, sum) \
19 *samples = clamp_val(0, sum+32768, 65535);
20
synth_2to1_mono(float * bandPtr,unsigned char * samples,int * pnt,float (* buffs)[2][0x110],int * b)21 void synth_2to1_mono(float *bandPtr,unsigned char *samples,int *pnt,float (*buffs)[2][0x110],int *b)
22 {
23 short tmp1[32];
24 short *samples_tmp = tmp1;
25 int pnt_tmp = 0;
26 int i;
27
28 synth_2to1(bandPtr, 0, (unsigned char*)samples_tmp, &pnt_tmp, buffs, b);
29
30 samples += *pnt;
31 for(i=0;i<16;i++)
32 ((short*)samples)[i] = samples_tmp[i<<1];
33 *pnt += 32;
34 }
35
synth_2to1(float * bandPtr,int channel,unsigned char * out,int * pnt,float (* buffs)[2][0x110],int * b)36 void synth_2to1(float *bandPtr,int channel,unsigned char *out,int *pnt,float (*buffs)[2][0x110],int *b)
37 {
38 static const int step = 2;
39 unsigned short *samples = (unsigned short*)(out + *pnt);
40 int bo = *b;
41
42 float *b0, (*buf)[0x110], *window;
43 float sum;
44 int bo1, j;
45
46 do_equalizer(bandPtr, channel);
47
48 if(!channel)
49 {
50 bo = (bo-1) & 0xf;
51 buf = buffs[0];
52 }
53 else
54 {
55 samples++;
56 buf = buffs[1];
57 }
58
59 if(bo & 0x1)
60 {
61 b0 = buf[0];
62 bo1 = bo;
63 dct64(buf[1]+bo+1, buf[0]+bo, bandPtr);
64 }
65 else
66 {
67 b0 = buf[1];
68 bo1 = bo+1;
69 dct64(buf[0]+bo, buf[1]+bo+1, bandPtr);
70 }
71
72 window = decwin + 16 - bo1;
73 for (j=8;j;j--,b0+=0x10,window+=0x30,samples+=step)
74 {
75 sum = *window++ * *b0++;
76 sum -= *window++ * *b0++;
77 sum += *window++ * *b0++;
78 sum -= *window++ * *b0++;
79 sum += *window++ * *b0++;
80 sum -= *window++ * *b0++;
81 sum += *window++ * *b0++;
82 sum -= *window++ * *b0++;
83 sum += *window++ * *b0++;
84 sum -= *window++ * *b0++;
85 sum += *window++ * *b0++;
86 sum -= *window++ * *b0++;
87 sum += *window++ * *b0++;
88 sum -= *window++ * *b0++;
89 sum += *window++ * *b0++;
90 sum -= *window++ * *b0++;
91 WRITE_SAMPLE(samples, sum);
92 }
93
94 sum = window[0x0] * b0[0x0];
95 sum += window[0x2] * b0[0x2];
96 sum += window[0x4] * b0[0x4];
97 sum += window[0x6] * b0[0x6];
98 sum += window[0x8] * b0[0x8];
99 sum += window[0xA] * b0[0xA];
100 sum += window[0xC] * b0[0xC];
101 sum += window[0xE] * b0[0xE];
102 WRITE_SAMPLE(samples, sum);
103 b0-=0x20,window-=0x40,samples+=step;
104
105 window += bo1<<1;
106 for (j=7;j;j--,b0-=0x30,window-=0x30,samples+=step)
107 {
108 sum = -*(--window) * *b0++;
109 sum -= *(--window) * *b0++;
110 sum -= *(--window) * *b0++;
111 sum -= *(--window) * *b0++;
112 sum -= *(--window) * *b0++;
113 sum -= *(--window) * *b0++;
114 sum -= *(--window) * *b0++;
115 sum -= *(--window) * *b0++;
116 sum -= *(--window) * *b0++;
117 sum -= *(--window) * *b0++;
118 sum -= *(--window) * *b0++;
119 sum -= *(--window) * *b0++;
120 sum -= *(--window) * *b0++;
121 sum -= *(--window) * *b0++;
122 sum -= *(--window) * *b0++;
123 sum -= *(--window) * *b0++;
124 WRITE_SAMPLE(samples, sum);
125 }
126
127 *pnt += 64;
128 *b = bo;
129 }
130
131 #endif
132