1 /*
2 	synth_8bit.c: The functions for synthesizing 8bit samples, at the end of decoding.
3 
4 	copyright 1995-2008 by the mpg123 project - free software under the terms of the LGPL 2.1
5 	see COPYING and AUTHORS files in distribution or http://mpg123.org
6 	initially written by Michael Hipp, heavily dissected and rearranged by Thomas Orgis
7 */
8 
9 #include "mpg123lib_intern.h"
10 #include "sample.h"
11 #include "debug.h"
12 
13 /*
14 	Part 2: All synth functions that produce 8bit output.
15 	What we need is just a special WRITE_SAMPLE. For the generic and i386 functions, that is.
16 	For the rather optimized synth_1to1, we will need the postprocessing 8bit converters from synth_8bit.h .
17 */
18 
19 #define SAMPLE_T unsigned char
20 #define WRITE_SAMPLE(samples,sum,clip) WRITE_8BIT_SAMPLE(samples,sum,clip)
21 
22 /* Part 2a: All straight 1to1 decoding functions */
23 #define BLOCK 0x40 /* One decoding block is 64 samples. */
24 
25 #define SYNTH_NAME synth_1to1_8bit
26 #include "synth.h"
27 #undef SYNTH_NAME
28 
29 /* Mono-related synths; they wrap over _some_ synth_1to1_8bit (could be generic, could be i386). */
30 #define SYNTH_NAME       fr->synths.plain[r_1to1][f_8]
31 #define MONO_NAME        synth_1to1_8bit_mono
32 #define MONO2STEREO_NAME synth_1to1_8bit_m2s
33 #include "synth_mono.h"
34 #undef SYNTH_NAME
35 #undef MONO_NAME
36 #undef MONO2STEREO_NAME
37 
38 #ifdef OPT_X86
39 #define NO_AUTOINCREMENT
40 #define SYNTH_NAME synth_1to1_8bit_i386
41 #include "synth.h"
42 #undef SYNTH_NAME
43 /* i386 uses the normal mono functions. */
44 #undef NO_AUTOINCREMENT
45 #endif
46 
47 /* But now, we need functions that take the 16bit output of optimized synth_1to1 and convert it.
48    I suppose that is still faster than dropping the optimization altogether! */
49 
50 #define BASE_SYNTH_NAME  fr->synths.plain[r_1to1][f_16]
51 #define SYNTH_NAME       synth_1to1_8bit_wrap
52 #define MONO_NAME        synth_1to1_8bit_wrap_mono
53 #define MONO2STEREO_NAME synth_1to1_8bit_wrap_m2s
54 #include "synth_8bit.h"
55 #undef BASE_SYNTH_NAME
56 #undef SYNTH_NAME
57 #undef MONO_NAME
58 #undef MONO2STEREO_NAME
59 
60 #undef BLOCK
61 
62 #ifndef NO_DOWNSAMPLE
63 
64 /*
65 	Part 2b: 2to1 synth. Only generic and i386.
66 */
67 #define BLOCK 0x20 /* One decoding block is 32 samples. */
68 
69 #define SYNTH_NAME synth_2to1_8bit
70 #include "synth.h"
71 #undef SYNTH_NAME
72 
73 /* Mono-related synths; they wrap over _some_ synth_2to1_8bit (could be generic, could be i386). */
74 #define SYNTH_NAME       fr->synths.plain[r_2to1][f_8]
75 #define MONO_NAME        synth_2to1_8bit_mono
76 #define MONO2STEREO_NAME synth_2to1_8bit_m2s
77 #include "synth_mono.h"
78 #undef SYNTH_NAME
79 #undef MONO_NAME
80 #undef MONO2STEREO_NAME
81 
82 #ifdef OPT_X86
83 #define NO_AUTOINCREMENT
84 #define SYNTH_NAME synth_2to1_8bit_i386
85 #include "synth.h"
86 #undef SYNTH_NAME
87 /* i386 uses the normal mono functions. */
88 #undef NO_AUTOINCREMENT
89 #endif
90 
91 #undef BLOCK
92 
93 /*
94 	Part 2c: 4to1 synth. Only generic and i386.
95 */
96 #define BLOCK 0x10 /* One decoding block is 16 samples. */
97 
98 #define SYNTH_NAME synth_4to1_8bit
99 #include "synth.h"
100 #undef SYNTH_NAME
101 
102 /* Mono-related synths; they wrap over _some_ synth_4to1_8bit (could be generic, could be i386). */
103 #define SYNTH_NAME       fr->synths.plain[r_4to1][f_8]
104 #define MONO_NAME        synth_4to1_8bit_mono
105 #define MONO2STEREO_NAME synth_4to1_8bit_m2s
106 #include "synth_mono.h"
107 #undef SYNTH_NAME
108 #undef MONO_NAME
109 #undef MONO2STEREO_NAME
110 
111 #ifdef OPT_X86
112 #define NO_AUTOINCREMENT
113 #define SYNTH_NAME synth_4to1_8bit_i386
114 #include "synth.h"
115 #undef SYNTH_NAME
116 /* i386 uses the normal mono functions. */
117 #undef NO_AUTOINCREMENT
118 #endif
119 
120 #undef BLOCK
121 
122 #endif /* NO_DOWNSAMPLE */
123 
124 #ifndef NO_NTOM
125 /*
126 	Part 2d: ntom synth.
127 	Same procedure as above... Just no extra play anymore, straight synth that may use an optimized dct64.
128 */
129 
130 /* These are all in one header, there's no flexibility to gain. */
131 #define SYNTH_NAME       synth_ntom_8bit
132 #define MONO_NAME        synth_ntom_8bit_mono
133 #define MONO2STEREO_NAME synth_ntom_8bit_m2s
134 #include "synth_ntom.h"
135 #undef SYNTH_NAME
136 #undef MONO_NAME
137 #undef MONO2STEREO_NAME
138 
139 #endif
140 
141 #undef SAMPLE_T
142 #undef WRITE_SAMPLE
143