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