1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  *
21  */
22 
23 #ifndef AUDIO_QDM2DATA_H
24 #define AUDIO_QDM2DATA_H
25 
26 #include "common/scummsys.h"
27 
28 namespace Audio {
29 
30 /// VLC TABLES
31 
32 // values in this table range from -1..23; adjust retrieved value by -1
33 static const uint16 vlc_tab_level_huffcodes[24] = {
34 	0x037c, 0x0004, 0x003c, 0x004c, 0x003a, 0x002c, 0x001c, 0x001a,
35 	0x0024, 0x0014, 0x0001, 0x0002, 0x0000, 0x0003, 0x0007, 0x0005,
36 	0x0006, 0x0008, 0x0009, 0x000a, 0x000c, 0x00fc, 0x007c, 0x017c
37 };
38 
39 static const byte vlc_tab_level_huffbits[24] = {
40 	10, 6, 7, 7, 6, 6, 6, 6, 6, 5, 4, 4, 4, 3, 3, 3, 3, 4, 4, 5, 7, 8, 9, 10
41 };
42 
43 // values in this table range from -1..36; adjust retrieved value by -1
44 static const uint16 vlc_tab_diff_huffcodes[37] = {
45 	0x1c57, 0x0004, 0x0000, 0x0001, 0x0003, 0x0002, 0x000f, 0x000e,
46 	0x0007, 0x0016, 0x0037, 0x0027, 0x0026, 0x0066, 0x0006, 0x0097,
47 	0x0046, 0x01c6, 0x0017, 0x0786, 0x0086, 0x0257, 0x00d7, 0x0357,
48 	0x00c6, 0x0386, 0x0186, 0x0000, 0x0157, 0x0c57, 0x0057, 0x0000,
49 	0x0b86, 0x0000, 0x1457, 0x0000, 0x0457
50 };
51 
52 static const byte vlc_tab_diff_huffbits[37] = {
53 	13, 3, 3, 2, 3, 3, 4, 4, 6, 5, 6, 6, 7, 7, 8, 8,
54 	8, 9, 8, 11, 9, 10, 8, 10, 9, 12, 10, 0, 10, 13, 11, 0,
55 	12, 0, 13, 0, 13
56 };
57 
58 // values in this table range from -1..5; adjust retrieved value by -1
59 static const byte vlc_tab_run_huffcodes[6] = {
60 	0x1f, 0x00, 0x01, 0x03, 0x07, 0x0f
61 };
62 
63 static const byte vlc_tab_run_huffbits[6] = {
64 	5, 1, 2, 3, 4, 5
65 };
66 
67 // values in this table range from -1..19; adjust retrieved value by -1
68 static const uint16 vlc_tab_tone_level_idx_hi1_huffcodes[20] = {
69 	0x5714, 0x000c, 0x0002, 0x0001, 0x0000, 0x0004, 0x0034, 0x0054,
70 	0x0094, 0x0014, 0x0114, 0x0214, 0x0314, 0x0614, 0x0e14, 0x0f14,
71 	0x2714, 0x0714, 0x1714, 0x3714
72 };
73 
74 static const byte vlc_tab_tone_level_idx_hi1_huffbits[20] = {
75 	15, 4, 2, 1, 3, 5, 6, 7, 8, 10, 10, 11, 11, 12, 12, 12, 14, 14, 15, 14
76 };
77 
78 // values in this table range from -1..23; adjust retrieved value by -1
79 static const uint16 vlc_tab_tone_level_idx_mid_huffcodes[24] = {
80 	0x0fea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
81 	0x0000, 0x0000, 0x0000, 0x0000, 0x03ea, 0x00ea, 0x002a, 0x001a,
82 	0x0006, 0x0001, 0x0000, 0x0002, 0x000a, 0x006a, 0x01ea, 0x07ea
83 };
84 
85 static const byte vlc_tab_tone_level_idx_mid_huffbits[24] = {
86 	12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 9, 7, 5, 3, 1, 2, 4, 6, 8, 10, 12
87 };
88 
89 // values in this table range from -1..23; adjust retrieved value by -1
90 static const uint16 vlc_tab_tone_level_idx_hi2_huffcodes[24] = {
91 	0x0664, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0064, 0x00e4,
92 	0x00a4, 0x0068, 0x0004, 0x0008, 0x0014, 0x0018, 0x0000, 0x0001,
93 	0x0002, 0x0003, 0x000c, 0x0028, 0x0024, 0x0164, 0x0000, 0x0264
94 };
95 
96 static const byte vlc_tab_tone_level_idx_hi2_huffbits[24] = {
97 	11, 0, 0, 0, 0, 0, 10, 8, 8, 7, 6, 6, 5, 5, 4, 2, 2, 2, 4, 7, 8, 9, 0, 11
98 };
99 
100 // values in this table range from -1..8; adjust retrieved value by -1
101 static const byte vlc_tab_type30_huffcodes[9] = {
102 	0x3c, 0x06, 0x00, 0x01, 0x03, 0x02, 0x04, 0x0c, 0x1c
103 };
104 
105 static const byte vlc_tab_type30_huffbits[9] = {
106 	6, 3, 3, 2, 2, 3, 4, 5, 6
107 };
108 
109 // values in this table range from -1..9; adjust retrieved value by -1
110 static const byte vlc_tab_type34_huffcodes[10] = {
111 	0x18, 0x00, 0x01, 0x04, 0x05, 0x07, 0x03, 0x02, 0x06, 0x08
112 };
113 
114 static const byte vlc_tab_type34_huffbits[10] = {
115 	5, 4, 3, 3, 3, 3, 3, 3, 3, 5
116 };
117 
118 // values in this table range from -1..22; adjust retrieved value by -1
119 static const uint16 vlc_tab_fft_tone_offset_0_huffcodes[23] = {
120 	0x038e, 0x0001, 0x0000, 0x0022, 0x000a, 0x0006, 0x0012, 0x0002,
121 	0x001e, 0x003e, 0x0056, 0x0016, 0x000e, 0x0032, 0x0072, 0x0042,
122 	0x008e, 0x004e, 0x00f2, 0x002e, 0x0036, 0x00c2, 0x018e
123 };
124 
125 static const byte vlc_tab_fft_tone_offset_0_huffbits[23] = {
126 	10, 1, 2, 6, 4, 5, 6, 7, 6, 6, 7, 7, 8, 7, 8, 8, 9, 7, 8, 6, 6, 8, 10
127 };
128 
129 // values in this table range from -1..27; adjust retrieved value by -1
130 static const uint16 vlc_tab_fft_tone_offset_1_huffcodes[28] = {
131 	0x07a4, 0x0001, 0x0020, 0x0012, 0x001c, 0x0008, 0x0006, 0x0010,
132 	0x0000, 0x0014, 0x0004, 0x0032, 0x0070, 0x000c, 0x0002, 0x003a,
133 	0x001a, 0x002c, 0x002a, 0x0022, 0x0024, 0x000a, 0x0064, 0x0030,
134 	0x0062, 0x00a4, 0x01a4, 0x03a4
135 };
136 
137 static const byte vlc_tab_fft_tone_offset_1_huffbits[28] = {
138 	11, 1, 6, 6, 5, 4, 3, 6, 6, 5, 6, 6, 7, 6, 6, 6,
139 	6, 6, 6, 7, 8, 6, 7, 7, 7, 9, 10, 11
140 };
141 
142 // values in this table range from -1..31; adjust retrieved value by -1
143 static const uint16 vlc_tab_fft_tone_offset_2_huffcodes[32] = {
144 	0x1760, 0x0001, 0x0000, 0x0082, 0x000c, 0x0006, 0x0003, 0x0007,
145 	0x0008, 0x0004, 0x0010, 0x0012, 0x0022, 0x001a, 0x0000, 0x0020,
146 	0x000a, 0x0040, 0x004a, 0x006a, 0x002a, 0x0042, 0x0002, 0x0060,
147 	0x00aa, 0x00e0, 0x00c2, 0x01c2, 0x0160, 0x0360, 0x0760, 0x0f60
148 };
149 
150 static const byte vlc_tab_fft_tone_offset_2_huffbits[32] = {
151 	13, 2, 0, 8, 4, 3, 3, 3, 4, 4, 5, 5, 6, 5, 7, 7,
152 	7, 7, 7, 7, 8, 8, 8, 9, 8, 8, 9, 9, 10, 11, 13, 12
153 };
154 
155 // values in this table range from -1..34; adjust retrieved value by -1
156 static const uint16 vlc_tab_fft_tone_offset_3_huffcodes[35] = {
157 	0x33ea, 0x0005, 0x0000, 0x000c, 0x0000, 0x0006, 0x0003, 0x0008,
158 	0x0002, 0x0001, 0x0004, 0x0007, 0x001a, 0x000f, 0x001c, 0x002c,
159 	0x000a, 0x001d, 0x002d, 0x002a, 0x000d, 0x004c, 0x008c, 0x006a,
160 	0x00cd, 0x004d, 0x00ea, 0x020c, 0x030c, 0x010c, 0x01ea, 0x07ea,
161 	0x0bea, 0x03ea, 0x13ea
162 };
163 
164 static const byte vlc_tab_fft_tone_offset_3_huffbits[35] = {
165 	14, 4, 0, 10, 4, 3, 3, 4, 4, 3, 4, 4, 5, 4, 5, 6,
166 	6, 5, 6, 7, 7, 7, 8, 8, 8, 8, 9, 10, 10, 10, 10, 11,
167 	12, 13, 14
168 };
169 
170 // values in this table range from -1..37; adjust retrieved value by -1
171 static const uint16 vlc_tab_fft_tone_offset_4_huffcodes[38] = {
172 	0x5282, 0x0016, 0x0000, 0x0136, 0x0004, 0x0000, 0x0007, 0x000a,
173 	0x000e, 0x0003, 0x0001, 0x000d, 0x0006, 0x0009, 0x0012, 0x0005,
174 	0x0025, 0x0022, 0x0015, 0x0002, 0x0076, 0x0035, 0x0042, 0x00c2,
175 	0x0182, 0x00b6, 0x0036, 0x03c2, 0x0482, 0x01c2, 0x0682, 0x0882,
176 	0x0a82, 0x0082, 0x0282, 0x1282, 0x3282, 0x2282
177 };
178 
179 static const byte vlc_tab_fft_tone_offset_4_huffbits[38] = {
180 	15, 6, 0, 9, 3, 3, 3, 4, 4, 3, 4, 4, 5, 4, 5, 6,
181 	6, 6, 6, 8, 7, 6, 8, 9, 9, 8, 9, 10, 11, 10, 11, 12,
182 	12, 12, 14, 15, 14, 14
183 };
184 
185 /// FFT TABLES
186 
187 // values in this table range from -1..27; adjust retrieved value by -1
188 static const uint16 fft_level_exp_alt_huffcodes[28] = {
189 	0x1ec6, 0x0006, 0x00c2, 0x0142, 0x0242, 0x0246, 0x00c6, 0x0046,
190 	0x0042, 0x0146, 0x00a2, 0x0062, 0x0026, 0x0016, 0x000e, 0x0005,
191 	0x0004, 0x0003, 0x0000, 0x0001, 0x000a, 0x0012, 0x0002, 0x0022,
192 	0x01c6, 0x02c6, 0x06c6, 0x0ec6
193 };
194 
195 static const byte fft_level_exp_alt_huffbits[28] = {
196 	13, 7, 8, 9, 10, 10, 10, 10, 10, 9, 8, 7, 6, 5, 4, 3,
197 	3, 2, 3, 3, 4, 5, 7, 8, 9, 11, 12, 13
198 };
199 
200 // values in this table range from -1..19; adjust retrieved value by -1
201 static const uint16 fft_level_exp_huffcodes[20] = {
202 	0x0f24, 0x0001, 0x0002, 0x0000, 0x0006, 0x0005, 0x0007, 0x000c,
203 	0x000b, 0x0014, 0x0013, 0x0004, 0x0003, 0x0023, 0x0064, 0x00a4,
204 	0x0024, 0x0124, 0x0324, 0x0724
205 };
206 
207 static const byte fft_level_exp_huffbits[20] = {
208 	12, 3, 3, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 8, 9, 10, 11, 12
209 };
210 
211 // values in this table range from -1..6; adjust retrieved value by -1
212 static const byte fft_stereo_exp_huffcodes[7] = {
213 	0x3e, 0x01, 0x00, 0x02, 0x06, 0x0e, 0x1e
214 };
215 
216 static const byte fft_stereo_exp_huffbits[7] = {
217 	6, 1, 2, 3, 4, 5, 6
218 };
219 
220 // values in this table range from -1..8; adjust retrieved value by -1
221 static const byte fft_stereo_phase_huffcodes[9] = {
222 	0x35, 0x02, 0x00, 0x01, 0x0d, 0x15, 0x05, 0x09, 0x03
223 };
224 
225 static const byte fft_stereo_phase_huffbits[9] = {
226 	6, 2, 2, 4, 4, 6, 5, 4, 2
227 };
228 
229 static const int fft_cutoff_index_table[4][2] = {
230 	{ 1, 2 }, {-1, 0 }, {-1,-2 }, { 0, 0 }
231 };
232 
233 static const int16 fft_level_index_table[256] = {
234 	0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
235 	2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
236 	3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
237 	3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
238 	4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
239 	4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
240 	4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
241 	4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
242 	5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
243 	5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
244 	5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
245 	5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
246 	5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
247 	5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
248 	5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
249 	5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
250 };
251 
252 static const byte last_coeff[3] = {
253 	4, 7, 10
254 };
255 
256 static const byte coeff_per_sb_for_avg[3][30] = {
257 	{ 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 },
258 	{ 0, 1, 2, 2, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 },
259 	{ 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9 }
260 };
261 
262 static const uint32 dequant_table[3][10][30] = {
263 	{ { 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
264 	  { 0, 256, 256, 205, 154, 102, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
265 	  { 0, 0, 0, 51, 102, 154, 205, 256, 238, 219, 201, 183, 165, 146, 128, 110, 91, 73, 55, 37, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
266 	  { 0, 0, 0, 0, 0, 0, 0, 0, 18, 37, 55, 73, 91, 110, 128, 146, 165, 183, 201, 219, 238, 256, 228, 199, 171, 142, 114, 85, 57, 28 },
267 	  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
268 	  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
269 	  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
270 	  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
271 	  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
272 	  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
273 	{ { 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
274 	  { 0, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
275 	  { 0, 0, 256, 171, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
276 	  { 0, 0, 0, 85, 171, 256, 171, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
277 	  { 0, 0, 0, 0, 0, 0, 85, 171, 256, 219, 183, 146, 110, 73, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
278 	  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 73, 110, 146, 183, 219, 256, 228, 199, 171, 142, 114, 85, 57, 28, 0, 0, 0, 0, 0, 0 },
279 	  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 57, 85, 114, 142, 171, 199, 228, 256, 213, 171, 128, 85, 43 },
280 	  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
281 	  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
282 	  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
283 	{ { 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
284 	  { 0, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
285 	  { 0, 0, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
286 	  { 0, 0, 0, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
287 	  { 0, 0, 0, 0, 256, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
288 	  { 0, 0, 0, 0, 0, 0, 256, 171, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
289 	  { 0, 0, 0, 0, 0, 0, 0, 85, 171, 256, 192, 128, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
290 	  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 128, 192, 256, 205, 154, 102, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
291 	  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 102, 154, 205, 256, 213, 171, 128, 85, 43, 0, 0, 0, 0, 0, 0 },
292 	  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 85, 128, 171, 213, 256, 213, 171, 128, 85, 43 } }
293 };
294 
295 static const byte coeff_per_sb_for_dequant[3][30] = {
296 	{ 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3 },
297 	{ 0, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6 },
298 	{ 0, 1, 2, 3, 4, 4, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9 }
299 };
300 
301 // first index is subband, 2nd index is 0, 1 or 3 (2 is unused)
302 static const int8 tone_level_idx_offset_table[30][4] = {
303 	{ -50, -50,  0, -50 },
304 	{ -50, -50,  0, -50 },
305 	{ -50,  -9,  0, -19 },
306 	{ -16,  -6,  0, -12 },
307 	{ -11,  -4,  0,  -8 },
308 	{  -8,  -3,  0,  -6 },
309 	{  -7,  -3,  0,  -5 },
310 	{  -6,  -2,  0,  -4 },
311 	{  -5,  -2,  0,  -3 },
312 	{  -4,  -1,  0,  -3 },
313 	{  -4,  -1,  0,  -2 },
314 	{  -3,  -1,  0,  -2 },
315 	{  -3,  -1,  0,  -2 },
316 	{  -3,  -1,  0,  -2 },
317 	{  -2,  -1,  0,  -1 },
318 	{  -2,  -1,  0,  -1 },
319 	{  -2,  -1,  0,  -1 },
320 	{  -2,   0,  0,  -1 },
321 	{  -2,   0,  0,  -1 },
322 	{  -1,   0,  0,  -1 },
323 	{  -1,   0,  0,  -1 },
324 	{  -1,   0,  0,  -1 },
325 	{  -1,   0,  0,  -1 },
326 	{  -1,   0,  0,  -1 },
327 	{  -1,   0,  0,  -1 },
328 	{  -1,   0,  0,  -1 },
329 	{  -1,   0,  0,   0 },
330 	{  -1,   0,  0,   0 },
331 	{  -1,   0,  0,   0 },
332 	{  -1,   0,  0,   0 }
333 };
334 
335 /* all my samples have 1st index 0 or 1 */
336 /* second index is subband, only indexes 0-29 seem to be used */
337 static const int8 coding_method_table[5][30] = {
338 	{ 34, 30, 24, 24, 16, 16, 16, 16, 10, 10, 10, 10, 10, 10, 10,
339 	  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
340 	},
341 	{ 34, 30, 24, 24, 16, 16, 16, 16, 10, 10, 10, 10, 10, 10, 10,
342 	  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
343 	},
344 	{ 34, 30, 30, 30, 24, 24, 16, 16, 16, 16, 16, 16, 10, 10, 10,
345 	  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
346 	},
347 	{ 34, 34, 30, 30, 24, 24, 24, 24, 16, 16, 16, 16, 16, 16, 16,
348 	  16, 16, 16, 16, 16, 16, 16, 10, 10, 10, 10, 10, 10, 10, 10
349 	},
350 	{ 34, 34, 30, 30, 30, 30, 30, 30, 24, 24, 24, 24, 24, 24, 24,
351 	  24, 24, 24, 24, 24, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16
352 	},
353 };
354 
355 static const int vlc_stage3_values[60] = {
356 	    0,     1,     2,     3,     4,     6,     8,    10,    12,    16,    20,    24,
357 	   28,    36,    44,    52,    60,    76,    92,   108,   124,   156,   188,   220,
358 	  252,   316,   380,   444,   508,   636,   764,   892,  1020,  1276,  1532,  1788,
359 	 2044,  2556,  3068,  3580,  4092,  5116,  6140,  7164,  8188, 10236, 12284, 14332,
360 	16380, 20476, 24572, 28668, 32764, 40956, 49148, 57340, 65532, 81916, 98300,114684
361 };
362 
363 static const float fft_tone_sample_table[4][16][5] = {
364 	{ { .0100000000f,-.0037037037f,-.0020000000f,-.0069444444f,-.0018416207f },
365 	  { .0416666667f, .0000000000f, .0000000000f,-.0208333333f,-.0123456791f },
366 	  { .1250000000f, .0558035709f, .0330687836f,-.0164473690f,-.0097465888f },
367 	  { .1562500000f, .0625000000f, .0370370370f,-.0062500000f,-.0037037037f },
368 	  { .1996007860f, .0781250000f, .0462962948f, .0022727272f, .0013468013f },
369 	  { .2000000000f, .0625000000f, .0370370373f, .0208333333f, .0074074073f },
370 	  { .2127659619f, .0555555556f, .0329218097f, .0208333333f, .0123456791f },
371 	  { .2173913121f, .0473484844f, .0280583613f, .0347222239f, .0205761325f },
372 	  { .2173913121f, .0347222239f, .0205761325f, .0473484844f, .0280583613f },
373 	  { .2127659619f, .0208333333f, .0123456791f, .0555555556f, .0329218097f },
374 	  { .2000000000f, .0208333333f, .0074074073f, .0625000000f, .0370370370f },
375 	  { .1996007860f, .0022727272f, .0013468013f, .0781250000f, .0462962948f },
376 	  { .1562500000f,-.0062500000f,-.0037037037f, .0625000000f, .0370370370f },
377 	  { .1250000000f,-.0164473690f,-.0097465888f, .0558035709f, .0330687836f },
378 	  { .0416666667f,-.0208333333f,-.0123456791f, .0000000000f, .0000000000f },
379 	  { .0100000000f,-.0069444444f,-.0018416207f,-.0037037037f,-.0020000000f } },
380 
381 	{ { .0050000000f,-.0200000000f, .0125000000f,-.3030303030f, .0020000000f },
382 	  { .1041666642f, .0400000000f,-.0250000000f, .0333333333f,-.0200000000f },
383 	  { .1250000000f, .0100000000f, .0142857144f,-.0500000007f,-.0200000000f },
384 	  { .1562500000f,-.0006250000f,-.00049382716f,-.000625000f,-.00049382716f },
385 	  { .1562500000f,-.0006250000f,-.00049382716f,-.000625000f,-.00049382716f },
386 	  { .1250000000f,-.0500000000f,-.0200000000f, .0100000000f, .0142857144f },
387 	  { .1041666667f, .0333333333f,-.0200000000f, .0400000000f,-.0250000000f },
388 	  { .0050000000f,-.3030303030f, .0020000001f,-.0200000000f, .0125000000f },
389 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
390 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
391 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
392 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
393 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
394 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
395 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
396 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f } },
397 
398 	{ { .1428571492f, .1250000000f,-.0285714287f,-.0357142873f, .0208333333f },
399 	  { .1818181818f, .0588235296f, .0333333333f, .0212765951f, .0100000000f },
400 	  { .1818181818f, .0212765951f, .0100000000f, .0588235296f, .0333333333f },
401 	  { .1428571492f,-.0357142873f, .0208333333f, .1250000000f,-.0285714287f },
402 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
403 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
404 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
405 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
406 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
407 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
408 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
409 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
410 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
411 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
412 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
413 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f } },
414 
415 	{ { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
416 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
417 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
418 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
419 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
420 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
421 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
422 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
423 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
424 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
425 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
426 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
427 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
428 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
429 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
430 	  { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f } }
431 };
432 
433 static const float fft_tone_level_table[2][64] = { {
434 // pow ~ (i > 46) ? 0 : (((((i & 1) ? 431 : 304) << (i >> 1))) / 1024.0);
435 	0.17677669f, 0.42677650f, 0.60355347f, 0.85355347f,
436 	1.20710683f, 1.68359375f, 2.37500000f, 3.36718750f,
437 	4.75000000f, 6.73437500f, 9.50000000f, 13.4687500f,
438 	19.0000000f, 26.9375000f, 38.0000000f, 53.8750000f,
439 	76.0000000f, 107.750000f, 152.000000f, 215.500000f,
440 	304.000000f, 431.000000f, 608.000000f, 862.000000f,
441 	1216.00000f, 1724.00000f, 2432.00000f, 3448.00000f,
442 	4864.00000f, 6896.00000f, 9728.00000f, 13792.0000f,
443 	19456.0000f, 27584.0000f, 38912.0000f, 55168.0000f,
444 	77824.0000f, 110336.000f, 155648.000f, 220672.000f,
445 	311296.000f, 441344.000f, 622592.000f, 882688.000f,
446 	1245184.00f, 1765376.00f, 2490368.00f, 0.00000000f,
447 	0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
448 	0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
449 	0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
450 	0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
451   }, {
452 // pow = (i > 45) ? 0 : ((((i & 1) ? 431 : 304) << (i >> 1)) / 512.0);
453 	0.59375000f, 0.84179688f, 1.18750000f, 1.68359375f,
454 	2.37500000f, 3.36718750f, 4.75000000f, 6.73437500f,
455 	9.50000000f, 13.4687500f, 19.0000000f, 26.9375000f,
456 	38.0000000f, 53.8750000f, 76.0000000f, 107.750000f,
457 	152.000000f, 215.500000f, 304.000000f, 431.000000f,
458 	608.000000f, 862.000000f, 1216.00000f, 1724.00000f,
459 	2432.00000f, 3448.00000f, 4864.00000f, 6896.00000f,
460 	9728.00000f, 13792.0000f, 19456.0000f, 27584.0000f,
461 	38912.0000f, 55168.0000f, 77824.0000f, 110336.000f,
462 	155648.000f, 220672.000f, 311296.000f, 441344.000f,
463 	622592.000f, 882688.000f, 1245184.00f, 1765376.00f,
464 	2490368.00f, 3530752.00f, 0.00000000f, 0.00000000f,
465 	0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
466 	0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
467 	0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
468 	0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f
469 } };
470 
471 static const float fft_tone_envelope_table[4][31] = {
472 	{ .009607375f, .038060248f, .084265202f, .146446645f, .222214907f, .308658302f,
473 	  .402454883f, .500000060f, .597545207f, .691341758f, .777785182f, .853553414f,
474 	  .915734828f, .961939812f, .990392685f, 1.00000000f, .990392625f, .961939752f,
475 	  .915734768f, .853553295f, .777785063f, .691341639f, .597545087f, .500000000f,
476 	  .402454853f, .308658272f, .222214878f, .146446615f, .084265172f, .038060218f,
477 	  .009607345f },
478 	{ .038060248f, .146446645f, .308658302f, .500000060f, .691341758f, .853553414f,
479 	  .961939812f, 1.00000000f, .961939752f, .853553295f, .691341639f, .500000000f,
480 	  .308658272f, .146446615f, .038060218f, .000000000f, .000000000f, .000000000f,
481 	  .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f,
482 	  .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f,
483 	  .000000000f },
484 	{ .146446645f, .500000060f, .853553414f, 1.00000000f, .853553295f, .500000000f,
485 	  .146446615f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f,
486 	  .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f,
487 	  .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f,
488 	  .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f,
489 	  .000000000f },
490 	{ .500000060f, 1.00000000f, .500000000f, .000000000f, .000000000f, .000000000f,
491 	  .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f,
492 	  .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f,
493 	  .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f,
494 	  .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f,
495 	  .000000000f }
496 };
497 
498 static const float sb_noise_attenuation[32] = {
499 	0.0f, 0.0f, 0.3f, 0.4f, 0.5f, 0.7f, 1.0f, 1.0f,
500 	1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
501 	1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
502 	1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
503 };
504 
505 static const byte fft_subpackets[32] = {
506 	0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0,
507 	0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0
508 };
509 
510 // first index is joined_stereo, second index is 0 or 2 (1 is unused)
511 static const float dequant_1bit[2][3] = {
512 	{-0.920000f, 0.000000f, 0.920000f },
513 	{-0.890000f, 0.000000f, 0.890000f }
514 };
515 
516 static const float type30_dequant[8] = {
517 	-1.0f,-0.625f,-0.291666656732559f,0.0f,
518 	0.25f,0.5f,0.75f,1.0f,
519 };
520 
521 static const float type34_delta[10] = { // FIXME: covers 8 entries..
522 	-1.0f,-0.60947573184967f,-0.333333343267441f,-0.138071194291115f,0.0f,
523 	0.138071194291115f,0.333333343267441f,0.60947573184967f,1.0f,0.0f,
524 };
525 
526 } // End of namespace Audio
527 
528 #endif
529