annotate Input/mpg123/layer3.c @ 0:cb178e5ad177 trunk

[svn] Import audacious source.
author nenolod
date Mon, 24 Oct 2005 03:06:47 -0700
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
2 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
3 * Mpeg Layer-3 audio decoder
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
4 * --------------------------
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
5 * copyright (c) 1995-1999 by Michael Hipp.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
6 * All rights reserved. See also 'README'
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
7 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
8 * Optimize-TODO: put short bands into the band-field without the stride of 3 reals
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
9 * Length-optimze: unify long and short band code where it is possible
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
10 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
11
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
12 #include <stdlib.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
13 #include <math.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
14
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
15 #include "audacious/output.h"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
16
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
17 #include "mpg123.h"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
18 #include "huffman.h"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
19 #include "getbits.h"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
20
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
21
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
22 static real ispow[8207];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
23 static real aa_ca[8], aa_cs[8];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
24 static real COS1[12][6];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
25 static real win[4][36];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
26 static real win1[4][36];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
27 static real gainpow2[256 + 118 + 4];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
28 real COS9[9];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
29 static real COS6_1, COS6_2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
30 real tfcos36[9];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
31 static real tfcos12[3];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
32 #define NEW_DCT9
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
33 #ifdef NEW_DCT9
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
34 static real cos9[3], cos18[3];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
35 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
36
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
37 #ifdef USE_SIMD
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
38 # define DCT36 (fr->dct36)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
39 #else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
40 # define DCT36 mpg123_dct36
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
41 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
42
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
43 struct bandInfoStruct {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
44 int longIdx[23];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
45 int longDiff[22];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
46 int shortIdx[14];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
47 int shortDiff[13];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
48 };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
49
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
50 int longLimit[9][23];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
51 int shortLimit[9][14];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
52
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
53 /* Used by the getbits macros */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
54 static unsigned long rval;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
55 static unsigned char rval_uc;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
56
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
57 struct bandInfoStruct bandInfo[9] = {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
58 /* MPEG 1.0 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
59 {{0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 52, 62, 74, 90, 110, 134, 162,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
60 196, 238, 288, 342, 418, 576},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
61 {4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 10, 12, 16, 20, 24, 28, 34, 42, 50, 54,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
62 76, 158},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
63 {0, 4 * 3, 8 * 3, 12 * 3, 16 * 3, 22 * 3, 30 * 3, 40 * 3, 52 * 3,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
64 66 * 3, 84 * 3, 106 * 3, 136 * 3, 192 * 3},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
65 {4, 4, 4, 4, 6, 8, 10, 12, 14, 18, 22, 30, 56}},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
66
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
67 {{0, 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 60, 72, 88, 106, 128, 156,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
68 190, 230, 276, 330, 384, 576},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
69 {4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 10, 12, 16, 18, 22, 28, 34, 40, 46, 54,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
70 54, 192},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
71 {0, 4 * 3, 8 * 3, 12 * 3, 16 * 3, 22 * 3, 28 * 3, 38 * 3, 50 * 3,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
72 64 * 3, 80 * 3, 100 * 3, 126 * 3, 192 * 3},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
73 {4, 4, 4, 4, 6, 6, 10, 12, 14, 16, 20, 26, 66}},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
74
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
75 {{0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 54, 66, 82, 102, 126, 156, 194,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
76 240, 296, 364, 448, 550, 576},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
77 {4, 4, 4, 4, 4, 4, 6, 6, 8, 10, 12, 16, 20, 24, 30, 38, 46, 56, 68,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
78 84, 102, 26},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
79 {0, 4 * 3, 8 * 3, 12 * 3, 16 * 3, 22 * 3, 30 * 3, 42 * 3, 58 * 3,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
80 78 * 3, 104 * 3, 138 * 3, 180 * 3, 192 * 3},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
81 {4, 4, 4, 4, 6, 8, 12, 16, 20, 26, 34, 42, 12}},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
82
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
83 /* MPEG 2.0 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
84 {{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
85 238, 284, 336, 396, 464, 522, 576},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
86 {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
87 68, 58, 54},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
88 {0, 4 * 3, 8 * 3, 12 * 3, 18 * 3, 24 * 3, 32 * 3, 42 * 3, 56 * 3,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
89 74 * 3, 100 * 3, 132 * 3, 174 * 3, 192 * 3},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
90 {4, 4, 4, 6, 6, 8, 10, 14, 18, 26, 32, 42, 18}},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
91 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
92 { {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
93 {6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,52,64,70,76,36 } ,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
94 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
95 /* changed 19th value fropm 330 to 332 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
96 {{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 114, 136, 162, 194,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
97 232, 278, 332, 394, 464, 540, 576},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
98 {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 18, 22, 26, 32, 38, 46, 54, 62,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
99 70, 76, 36},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
100 {0, 4 * 3, 8 * 3, 12 * 3, 18 * 3, 26 * 3, 36 * 3, 48 * 3, 62 * 3,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
101 80 * 3, 104 * 3, 136 * 3, 180 * 3, 192 * 3},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
102 {4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 32, 44, 12}},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
103
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
104 {{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
105 238, 284, 336, 396, 464, 522, 576},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
106 {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
107 68, 58, 54},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
108 {0, 4 * 3, 8 * 3, 12 * 3, 18 * 3, 26 * 3, 36 * 3, 48 * 3, 62 * 3,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
109 80 * 3, 104 * 3, 134 * 3, 174 * 3, 192 * 3},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
110 {4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18}},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
111 /* MPEG 2.5 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
112 {{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
113 238, 284, 336, 396, 464, 522, 576},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
114 {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
115 68, 58, 54},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
116 {0, 12, 24, 36, 54, 78, 108, 144, 186, 240, 312, 402, 522, 576},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
117 {4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18}},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
118 {{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
119 238, 284, 336, 396, 464, 522, 576},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
120 {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
121 68, 58, 54},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
122 {0, 12, 24, 36, 54, 78, 108, 144, 186, 240, 312, 402, 522, 576},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
123 {4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18}},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
124 {{0, 12, 24, 36, 48, 60, 72, 88, 108, 132, 160, 192, 232, 280, 336,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
125 400, 476, 566, 568, 570, 572, 574, 576},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
126 {12, 12, 12, 12, 12, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 76, 90,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
127 2, 2, 2, 2, 2},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
128 {0, 24, 48, 72, 108, 156, 216, 288, 372, 480, 486, 492, 498, 576},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
129 {8, 8, 8, 12, 16, 20, 24, 28, 36, 2, 2, 2, 26}},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
130 };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
131
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
132 static int mapbuf0[9][152];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
133 static int mapbuf1[9][156];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
134 static int mapbuf2[9][44];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
135 static int *map[9][3];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
136 static int *mapend[9][3];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
137
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
138 static unsigned int n_slen2[512]; /* MPEG 2.0 slen for 'normal' mode */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
139 static unsigned int i_slen2[256]; /* MPEG 2.0 slen for intensity stereo */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
140
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
141 static real tan1_1[16], tan2_1[16], tan1_2[16], tan2_2[16];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
142 static real pow1_1[2][16], pow2_1[2][16], pow1_2[2][16], pow2_2[2][16];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
143
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
144 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
145 * init tables for layer-3
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
146 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
147 void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
148 mpg123_init_layer3(int down_sample_sblimit)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
149 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
150 int i, j, k, l;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
151
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
152 for (i = -256; i < 118 + 4; i++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
153 gainpow2[i + 256] = pow((double) 2.0, -0.25 * (double) (i + 210));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
154 for (i = 0; i < 8207; i++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
155 ispow[i] = pow((double) i, (double) 4.0 / 3.0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
156
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
157 for (i = 0; i < 8; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
158 static double Ci[8] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
159 { -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
160 -0.0037
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
161 };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
162 double sq = sqrt(1.0 + Ci[i] * Ci[i]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
163
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
164 aa_cs[i] = 1.0 / sq;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
165 aa_ca[i] = Ci[i] / sq;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
166 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
167
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
168 for (i = 0; i < 18; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
169 win[0][i] = win[1][i] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
170 0.5 * sin(M_PI / 72.0 * (double) (2 * (i + 0) + 1)) /
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
171 cos(M_PI * (double) (2 * (i + 0) + 19) / 72.0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
172 win[0][i + 18] = win[3][i + 18] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
173 0.5 * sin(M_PI / 72.0 * (double) (2 * (i + 18) + 1)) /
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
174 cos(M_PI * (double) (2 * (i + 18) + 19) / 72.0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
175 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
176 for (i = 0; i < 6; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
177 win[1][i + 18] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
178 0.5 / cos(M_PI * (double) (2 * (i + 18) + 19) / 72.0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
179 win[3][i + 12] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
180 0.5 / cos(M_PI * (double) (2 * (i + 12) + 19) / 72.0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
181 win[1][i + 24] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
182 0.5 * sin(M_PI / 24.0 * (double) (2 * i + 13)) / cos(M_PI *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
183 (double)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
184 (2 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
185 (i +
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
186 24) +
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
187 19) / 72.0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
188 win[1][i + 30] = win[3][i] = 0.0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
189 win[3][i + 6] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
190 0.5 * sin(M_PI / 24.0 * (double) (2 * i + 1)) / cos(M_PI *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
191 (double) (2
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
192 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
193 (i
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
194 +
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
195 6)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
196 +
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
197 19)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
198 / 72.0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
199 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
200
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
201 for (i = 0; i < 9; i++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
202 COS9[i] = cos(M_PI / 18.0 * (double) i);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
203
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
204 for (i = 0; i < 9; i++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
205 tfcos36[i] = 0.5 / cos(M_PI * (double) (i * 2 + 1) / 36.0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
206 for (i = 0; i < 3; i++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
207 tfcos12[i] = 0.5 / cos(M_PI * (double) (i * 2 + 1) / 12.0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
208
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
209 COS6_1 = cos(M_PI / 6.0 * (double) 1);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
210 COS6_2 = cos(M_PI / 6.0 * (double) 2);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
211
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
212 #ifdef NEW_DCT9
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
213 cos9[0] = cos(1.0 * M_PI / 9.0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
214 cos9[1] = cos(5.0 * M_PI / 9.0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
215 cos9[2] = cos(7.0 * M_PI / 9.0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
216 cos18[0] = cos(1.0 * M_PI / 18.0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
217 cos18[1] = cos(11.0 * M_PI / 18.0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
218 cos18[2] = cos(13.0 * M_PI / 18.0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
219 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
220
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
221 for (i = 0; i < 12; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
222 win[2][i] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
223 0.5 * sin(M_PI / 24.0 * (double) (2 * i + 1)) / cos(M_PI *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
224 (double) (2
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
225 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
226 i
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
227 + 7)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
228 / 24.0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
229 for (j = 0; j < 6; j++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
230 COS1[i][j] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
231 cos(M_PI / 24.0 * (double) ((2 * i + 7) * (2 * j + 1)));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
232 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
233
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
234 for (j = 0; j < 4; j++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
235 static int len[4] = { 36, 36, 12, 36 };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
236
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
237 for (i = 0; i < len[j]; i += 2)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
238 win1[j][i] = +win[j][i];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
239 for (i = 1; i < len[j]; i += 2)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
240 win1[j][i] = -win[j][i];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
241 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
242
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
243 for (i = 0; i < 16; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
244 double t = tan((double) i * M_PI / 12.0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
245
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
246 tan1_1[i] = t / (1.0 + t);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
247 tan2_1[i] = 1.0 / (1.0 + t);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
248 tan1_2[i] = M_SQRT2 * t / (1.0 + t);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
249 tan2_2[i] = M_SQRT2 / (1.0 + t);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
250
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
251 for (j = 0; j < 2; j++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
252 double base = pow(2.0, -0.25 * (j + 1.0));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
253 double p1 = 1.0, p2 = 1.0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
254
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
255 if (i > 0) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
256 if (i & 1)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
257 p1 = pow(base, (i + 1.0) * 0.5);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
258 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
259 p2 = pow(base, i * 0.5);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
260 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
261 pow1_1[j][i] = p1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
262 pow2_1[j][i] = p2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
263 pow1_2[j][i] = M_SQRT2 * p1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
264 pow2_2[j][i] = M_SQRT2 * p2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
265 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
266 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
267
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
268 for (j = 0; j < 9; j++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
269 struct bandInfoStruct *bi = &bandInfo[j];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
270 int *mp;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
271 int cb, lwin;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
272 int *bdf;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
273
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
274 mp = map[j][0] = mapbuf0[j];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
275 bdf = bi->longDiff;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
276 for (i = 0, cb = 0; cb < 8; cb++, i += *bdf++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
277 *mp++ = (*bdf) >> 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
278 *mp++ = i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
279 *mp++ = 3;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
280 *mp++ = cb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
281 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
282 bdf = bi->shortDiff + 3;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
283 for (cb = 3; cb < 13; cb++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
284 int l = (*bdf++) >> 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
285
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
286 for (lwin = 0; lwin < 3; lwin++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
287 *mp++ = l;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
288 *mp++ = i + lwin;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
289 *mp++ = lwin;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
290 *mp++ = cb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
291 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
292 i += 6 * l;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
293 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
294 mapend[j][0] = mp;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
295
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
296 mp = map[j][1] = mapbuf1[j];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
297 bdf = bi->shortDiff + 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
298 for (i = 0, cb = 0; cb < 13; cb++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
299 int l = (*bdf++) >> 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
300
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
301 for (lwin = 0; lwin < 3; lwin++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
302 *mp++ = l;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
303 *mp++ = i + lwin;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
304 *mp++ = lwin;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
305 *mp++ = cb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
306 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
307 i += 6 * l;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
308 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
309 mapend[j][1] = mp;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
310
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
311 mp = map[j][2] = mapbuf2[j];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
312 bdf = bi->longDiff;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
313 for (cb = 0; cb < 22; cb++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
314 *mp++ = (*bdf++) >> 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
315 *mp++ = cb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
316 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
317 mapend[j][2] = mp;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
318
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
319 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
320
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
321 for (j = 0; j < 9; j++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
322 for (i = 0; i < 23; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
323 longLimit[j][i] = (bandInfo[j].longIdx[i] - 1 + 8) / 18 + 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
324 if (longLimit[j][i] > (down_sample_sblimit))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
325 longLimit[j][i] = down_sample_sblimit;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
326 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
327 for (i = 0; i < 14; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
328 shortLimit[j][i] = (bandInfo[j].shortIdx[i] - 1) / 18 + 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
329 if (shortLimit[j][i] > (down_sample_sblimit))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
330 shortLimit[j][i] = down_sample_sblimit;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
331 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
332 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
333
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
334 for (i = 0; i < 5; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
335 for (j = 0; j < 6; j++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
336 for (k = 0; k < 6; k++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
337 int n = k + j * 6 + i * 36;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
338
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
339 i_slen2[n] = i | (j << 3) | (k << 6) | (3 << 12);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
340 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
341 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
342 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
343 for (i = 0; i < 4; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
344 for (j = 0; j < 4; j++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
345 for (k = 0; k < 4; k++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
346 int n = k + j * 4 + i * 16;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
347
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
348 i_slen2[n + 180] = i | (j << 3) | (k << 6) | (4 << 12);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
349 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
350 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
351 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
352 for (i = 0; i < 4; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
353 for (j = 0; j < 3; j++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
354 int n = j + i * 3;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
355
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
356 i_slen2[n + 244] = i | (j << 3) | (5 << 12);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
357 n_slen2[n + 500] = i | (j << 3) | (2 << 12) | (1 << 15);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
358 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
359 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
360
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
361 for (i = 0; i < 5; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
362 for (j = 0; j < 5; j++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
363 for (k = 0; k < 4; k++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
364 for (l = 0; l < 4; l++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
365 int n = l + k * 4 + j * 16 + i * 80;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
366
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
367 n_slen2[n] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
368 i | (j << 3) | (k << 6) | (l << 9) | (0 << 12);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
369 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
370 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
371 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
372 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
373 for (i = 0; i < 5; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
374 for (j = 0; j < 5; j++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
375 for (k = 0; k < 4; k++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
376 int n = k + j * 4 + i * 20;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
377
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
378 n_slen2[n + 400] = i | (j << 3) | (k << 6) | (1 << 12);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
379 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
380 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
381 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
382 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
383
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
384 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
385 * read additional side information (for MPEG 1 and MPEG 2)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
386 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
387 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
388 III_get_side_info(struct III_sideinfo *si, int stereo,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
389 int ms_stereo, long sfreq, int single, int lsf)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
390 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
391 int ch, gr;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
392 int powdiff = (single == 3) ? 4 : 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
393
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
394 static const int tabs[2][5] = { {2, 9, 5, 3, 4}, {1, 8, 1, 2, 9} };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
395 const int *tab = tabs[lsf];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
396
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
397 si->main_data_begin = mpg123_getbits(tab[1]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
398 if (stereo == 1)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
399 si->private_bits = mpg123_getbits_fast(tab[2]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
400 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
401 si->private_bits = mpg123_getbits_fast(tab[3]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
402
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
403 if (!lsf) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
404 for (ch = 0; ch < stereo; ch++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
405 si->ch[ch].gr[0].scfsi = -1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
406 si->ch[ch].gr[1].scfsi = mpg123_getbits_fast(4);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
407 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
408 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
409
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
410 for (gr = 0; gr < tab[0]; gr++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
411 for (ch = 0; ch < stereo; ch++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
412 register struct gr_info_s *gr_info = &(si->ch[ch].gr[gr]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
413
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
414 gr_info->part2_3_length = mpg123_getbits(12);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
415 gr_info->big_values = mpg123_getbits(9);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
416 if (gr_info->big_values > 288) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
417 /* fprintf(stderr, "big_values too large!\n"); */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
418 /* gr_info->big_values = 288; */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
419 return 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
420 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
421 gr_info->pow2gain =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
422 gainpow2 + 256 - mpg123_getbits_fast(8) + powdiff;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
423 if (ms_stereo)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
424 gr_info->pow2gain += 2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
425 gr_info->scalefac_compress = mpg123_getbits(tab[4]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
426
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
427 if (mpg123_get1bit()) { /* window switch flag */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
428 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
429
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
430 gr_info->block_type = mpg123_getbits_fast(2);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
431 gr_info->mixed_block_flag = mpg123_get1bit();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
432 gr_info->table_select[0] = mpg123_getbits_fast(5);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
433 gr_info->table_select[1] = mpg123_getbits_fast(5);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
434 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
435 * table_select[2] not needed, because
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
436 * there is no region2, but to satisfy
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
437 * some verifications tools we set it
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
438 * either.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
439 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
440 gr_info->table_select[2] = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
441 for (i = 0; i < 3; i++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
442 gr_info->full_gain[i] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
443 gr_info->pow2gain + (mpg123_getbits_fast(3) << 3);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
444
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
445 if (gr_info->block_type == 0) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
446 /* fprintf(stderr, "Blocktype == 0 and window-switching == 1 not allowed.\n"); */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
447 /* exit(1); */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
448 return 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
449 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
450
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
451 /* region_count/start parameters are implicit in this case. */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
452 if (!lsf || gr_info->block_type == 2)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
453 gr_info->region1start = 36 >> 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
454 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
455 /* check this again for 2.5 and sfreq=8 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
456 if (sfreq == 8)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
457 gr_info->region1start = 108 >> 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
458 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
459 gr_info->region1start = 54 >> 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
460 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
461 gr_info->region2start = 576 >> 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
462 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
463 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
464 int i, r0c, r1c;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
465
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
466 for (i = 0; i < 3; i++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
467 gr_info->table_select[i] = mpg123_getbits_fast(5);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
468 r0c = mpg123_getbits_fast(4);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
469 r1c = mpg123_getbits_fast(3);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
470 gr_info->region1start = bandInfo[sfreq].longIdx[r0c + 1] >> 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
471 if (r0c + r1c + 2 > 22)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
472 gr_info->region2start = 576 >> 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
473 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
474 gr_info->region2start =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
475 bandInfo[sfreq].longIdx[r0c + 1 + r1c + 1] >> 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
476 gr_info->block_type = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
477 gr_info->mixed_block_flag = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
478 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
479 if (!lsf)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
480 gr_info->preflag = mpg123_get1bit();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
481 gr_info->scalefac_scale = mpg123_get1bit();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
482 gr_info->count1table_select = mpg123_get1bit();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
483 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
484 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
485 return 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
486 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
487
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
488
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
489 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
490 * read scalefactors
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
491 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
492 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
493 III_get_scale_factors_1(int *scf, struct gr_info_s *gr_info)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
494 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
495 static const unsigned char slen[2][16] = {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
496 {0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
497 {0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3}
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
498 };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
499 int numbits;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
500 int num0 = slen[0][gr_info->scalefac_compress];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
501 int num1 = slen[1][gr_info->scalefac_compress];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
502
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
503 if (gr_info->block_type == 2) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
504 int i = 18;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
505
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
506 numbits = (num0 + num1) * 18;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
507
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
508 if (gr_info->mixed_block_flag) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
509 for (i = 8; i; i--)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
510 *scf++ = mpg123_getbits_fast(num0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
511 i = 9;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
512 numbits -= num0; /* num0 * 17 + num1 * 18 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
513 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
514
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
515 for (; i; i--)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
516 *scf++ = mpg123_getbits_fast(num0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
517 for (i = 18; i; i--)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
518 *scf++ = mpg123_getbits_fast(num1);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
519 *scf++ = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
520 *scf++ = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
521 *scf++ = 0; /* short[13][0..2] = 0 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
522 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
523 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
524 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
525 int scfsi = gr_info->scfsi;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
526
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
527 if (scfsi < 0) { /* scfsi < 0 => granule == 0 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
528 for (i = 11; i; i--)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
529 *scf++ = mpg123_getbits_fast(num0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
530 for (i = 10; i; i--)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
531 *scf++ = mpg123_getbits_fast(num1);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
532 numbits = (num0 + num1) * 10 + num0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
533 *scf++ = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
534 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
535 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
536 numbits = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
537 if (!(scfsi & 0x8)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
538 for (i = 0; i < 6; i++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
539 *scf++ = mpg123_getbits_fast(num0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
540 numbits += num0 * 6;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
541 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
542 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
543 scf += 6;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
544 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
545
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
546 if (!(scfsi & 0x4)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
547 for (i = 0; i < 5; i++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
548 *scf++ = mpg123_getbits_fast(num0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
549 numbits += num0 * 5;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
550 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
551 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
552 scf += 5;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
553 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
554
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
555 if (!(scfsi & 0x2)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
556 for (i = 0; i < 5; i++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
557 *scf++ = mpg123_getbits_fast(num1);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
558 numbits += num1 * 5;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
559 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
560 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
561 scf += 5;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
562 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
563
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
564 if (!(scfsi & 0x1)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
565 for (i = 0; i < 5; i++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
566 *scf++ = mpg123_getbits_fast(num1);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
567 numbits += num1 * 5;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
568 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
569 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
570 scf += 5;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
571 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
572 *scf++ = 0; /* no l[21] in original sources */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
573 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
574 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
575 return numbits;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
576 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
577
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
578 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
579 III_get_scale_factors_2(int *scf, struct gr_info_s *gr_info, int i_stereo)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
580 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
581 unsigned char *pnt;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
582 int i, j, n = 0, numbits = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
583 unsigned int slen;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
584
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
585 static unsigned char stab[3][6][4] = {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
586 {{6, 5, 5, 5}, {6, 5, 7, 3}, {11, 10, 0, 0},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
587 {7, 7, 7, 0}, {6, 6, 6, 3}, {8, 8, 5, 0}},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
588 {{9, 9, 9, 9}, {9, 9, 12, 6}, {18, 18, 0, 0},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
589 {12, 12, 12, 0}, {12, 9, 9, 6}, {15, 12, 9, 0}},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
590 {{6, 9, 9, 9}, {6, 9, 12, 6}, {15, 18, 0, 0},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
591 {6, 15, 12, 0}, {6, 12, 9, 6}, {6, 18, 9, 0}}
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
592 };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
593
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
594 if (i_stereo) /* i_stereo AND second channel -> mpg123_do_layer3() checks this */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
595 slen = i_slen2[gr_info->scalefac_compress >> 1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
596 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
597 slen = n_slen2[gr_info->scalefac_compress];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
598
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
599 gr_info->preflag = (slen >> 15) & 0x1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
600
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
601 n = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
602 if (gr_info->block_type == 2) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
603 n++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
604 if (gr_info->mixed_block_flag)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
605 n++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
606 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
607
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
608 pnt = stab[n][(slen >> 12) & 0x7];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
609
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
610 for (i = 0; i < 4; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
611 int num = slen & 0x7;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
612
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
613 slen >>= 3;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
614 if (num) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
615 for (j = 0; j < (int) (pnt[i]); j++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
616 *scf++ = mpg123_getbits_fast(num);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
617 numbits += pnt[i] * num;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
618 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
619 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
620 for (j = 0; j < (int) (pnt[i]); j++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
621 *scf++ = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
622 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
623 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
624
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
625 n = (n << 1) + 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
626 for (i = 0; i < n; i++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
627 *scf++ = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
628
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
629 return numbits;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
630 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
631
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
632 static int pretab1[22] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
633 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0 };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
634 static int pretab2[22] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
635 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
636
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
637 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
638 * Dequantize samples (includes huffman decoding)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
639 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
640 /* 24 is enough because tab13 has max. a 19 bit huffvector */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
641 #define BITSHIFT ((sizeof (long) - 1) * 8)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
642
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
643 #define REFRESH_MASK() \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
644 while(num < BITSHIFT) { \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
645 mask |= ((unsigned long)mpg123_getbyte()) << (BITSHIFT - num); \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
646 num += 8; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
647 part2remain -= 8; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
648 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
649
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
650 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
651 III_dequantize_sample(real xr[SBLIMIT][SSLIMIT], int *scf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
652 struct gr_info_s *gr_info, int sfreq, int part2bits)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
653 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
654 int shift = 1 + gr_info->scalefac_scale;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
655 real *xrpnt = (real *) xr;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
656 int l[3], l3;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
657 int part2remain = gr_info->part2_3_length - part2bits;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
658 int *me;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
659
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
660 int num = mpg123_getbitoffset();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
661 long mask;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
662 /* we must split this, because for num==0 the shift is undefined if you do it in one step */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
663 mask = ((unsigned long) mpg123_getbits(num)) << BITSHIFT;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
664 mask <<= 8 - num;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
665 part2remain -= num;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
666
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
667 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
668 int bv = gr_info->big_values;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
669 int region1 = gr_info->region1start;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
670 int region2 = gr_info->region2start;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
671
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
672 l3 = ((576 >> 1) - bv) >> 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
673 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
674 * we may lose the 'odd' bit here !!
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
675 * check this later again
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
676 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
677 if (bv <= region1) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
678 l[0] = bv;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
679 l[1] = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
680 l[2] = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
681 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
682 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
683 l[0] = region1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
684 if (bv <= region2) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
685 l[1] = bv - l[0];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
686 l[2] = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
687 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
688 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
689 l[1] = region2 - l[0];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
690 l[2] = bv - region2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
691 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
692 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
693 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
694
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
695 if (gr_info->block_type == 2) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
696 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
697 * decoding with short or mixed mode BandIndex table
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
698 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
699 int i, max[4];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
700 int step = 0, lwin = 3, cb = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
701 register real v = 0.0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
702 register int *m, mc;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
703
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
704 if (gr_info->mixed_block_flag) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
705 max[3] = -1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
706 max[0] = max[1] = max[2] = 2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
707 m = map[sfreq][0];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
708 me = mapend[sfreq][0];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
709 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
710 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
711 max[0] = max[1] = max[2] = max[3] = -1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
712 /* max[3] not really needed in this case */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
713 m = map[sfreq][1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
714 me = mapend[sfreq][1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
715 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
716
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
717 mc = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
718 for (i = 0; i < 2; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
719 int lp = l[i];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
720 struct newhuff *h = ht + gr_info->table_select[i];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
721
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
722 for (; lp; lp--, mc--) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
723 register int x, y;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
724 if ((!mc)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
725 mc = *m++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
726 xrpnt = ((real *) xr) + (*m++);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
727 lwin = *m++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
728 cb = *m++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
729 if (lwin == 3) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
730 v = gr_info->pow2gain[(*scf++) << shift];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
731 step = 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
732 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
733 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
734 v = gr_info->full_gain[lwin][(*scf++) << shift];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
735 step = 3;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
736 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
737 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
738 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
739 register short *val = h->table;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
740
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
741 REFRESH_MASK();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
742 while ((y = *val++) < 0) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
743 if (mask < 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
744 val -= y;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
745 num--;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
746 mask <<= 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
747 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
748 x = y >> 4;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
749 y &= 0xf;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
750 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
751 if (x == 15 && h->linbits) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
752 max[lwin] = cb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
753 REFRESH_MASK();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
754 x += ((unsigned long) mask) >> (BITSHIFT + 8 -
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
755 h->linbits);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
756 num -= h->linbits + 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
757 mask <<= h->linbits;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
758 if (mask < 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
759 *xrpnt = -ispow[x] * v;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
760 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
761 *xrpnt = ispow[x] * v;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
762 mask <<= 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
763 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
764 else if (x) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
765 max[lwin] = cb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
766 if (mask < 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
767 *xrpnt = -ispow[x] * v;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
768 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
769 *xrpnt = ispow[x] * v;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
770 num--;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
771 mask <<= 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
772 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
773 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
774 *xrpnt = 0.0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
775 xrpnt += step;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
776 if (y == 15 && h->linbits) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
777 max[lwin] = cb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
778 REFRESH_MASK();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
779 y += ((unsigned long) mask) >> (BITSHIFT + 8 -
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
780 h->linbits);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
781 num -= h->linbits + 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
782 mask <<= h->linbits;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
783 if (mask < 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
784 *xrpnt = -ispow[y] * v;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
785 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
786 *xrpnt = ispow[y] * v;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
787 mask <<= 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
788 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
789 else if (y) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
790 max[lwin] = cb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
791 if (mask < 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
792 *xrpnt = -ispow[y] * v;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
793 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
794 *xrpnt = ispow[y] * v;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
795 num--;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
796 mask <<= 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
797 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
798 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
799 *xrpnt = 0.0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
800 xrpnt += step;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
801 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
802 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
803
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
804 for (; l3 && (part2remain + num > 0); l3--) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
805 struct newhuff *h = htc + gr_info->count1table_select;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
806 register short *val = h->table, a;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
807
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
808 REFRESH_MASK();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
809 while ((a = *val++) < 0) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
810 if (mask < 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
811 val -= a;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
812 num--;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
813 mask <<= 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
814 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
815 if (part2remain + num <= 0) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
816 num -= part2remain + num;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
817 break;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
818 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
819
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
820 for (i = 0; i < 4; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
821 if (!(i & 1)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
822 if (!mc) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
823 mc = *m++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
824 xrpnt = ((real *) xr) + (*m++);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
825 lwin = *m++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
826 cb = *m++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
827 if (lwin == 3) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
828 v = gr_info->pow2gain[(*scf++) << shift];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
829 step = 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
830 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
831 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
832 v = gr_info->full_gain[lwin][(*scf++) << shift];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
833 step = 3;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
834 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
835 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
836 mc--;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
837 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
838 if ((a & (0x8 >> i))) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
839 max[lwin] = cb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
840 if (part2remain + num <= 0) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
841 break;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
842 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
843 if (mask < 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
844 *xrpnt = -v;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
845 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
846 *xrpnt = v;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
847 num--;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
848 mask <<= 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
849 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
850 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
851 *xrpnt = 0.0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
852 xrpnt += step;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
853 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
854 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
855
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
856 if (lwin < 3) { /* short band? */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
857 while (1) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
858 /* HACK Prevent overflowing the xr buffer */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
859 if (mc * 6 > &xr[SBLIMIT][SSLIMIT] - xrpnt)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
860 return 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
861
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
862 for (; mc > 0; mc--) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
863 *xrpnt = 0.0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
864 xrpnt += 3; /* short band -> step=3 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
865 *xrpnt = 0.0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
866 xrpnt += 3;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
867 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
868 if (m >= me)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
869 break;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
870 mc = *m++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
871 xrpnt = ((real *) xr) + *m++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
872 if (*m++ == 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
873 break; /* optimize: field will be set to zero at the end of the function */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
874 m++; /* cb */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
875 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
876 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
877
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
878 gr_info->maxband[0] = max[0] + 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
879 gr_info->maxband[1] = max[1] + 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
880 gr_info->maxband[2] = max[2] + 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
881 gr_info->maxbandl = max[3] + 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
882
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
883 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
884 int rmax = max[0] > max[1] ? max[0] : max[1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
885
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
886 rmax = (rmax > max[2] ? rmax : max[2]) + 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
887 gr_info->maxb =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
888 rmax ? shortLimit[sfreq][rmax] : longLimit[sfreq][max[3] + 1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
889 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
890
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
891 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
892 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
893 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
894 * decoding with 'long' BandIndex table (block_type != 2)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
895 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
896 int *pretab = gr_info->preflag ? pretab1 : pretab2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
897 int i, max = -1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
898 int cb = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
899 int *m = map[sfreq][2];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
900 register real v = 0.0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
901 int mc = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
902
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
903 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
904 * long hash table values
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
905 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
906 for (i = 0; i < 3; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
907 int lp = l[i];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
908 struct newhuff *h = ht + gr_info->table_select[i];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
909
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
910 for (; lp; lp--, mc--) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
911 int x, y;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
912
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
913 if (!mc) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
914 mc = *m++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
915 cb = *m++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
916 /* if (cb == 21) */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
917 /* v = 0.0; */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
918 /* else */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
919 v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
920
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
921 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
922 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
923 register short *val = h->table;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
924 REFRESH_MASK();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
925 while ((y = *val++) < 0) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
926 if (mask < 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
927 val -= y;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
928 num--;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
929 mask <<= 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
930 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
931 x = y >> 4;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
932 y &= 0xf;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
933 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
934
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
935 if (x == 15 && h->linbits) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
936 max = cb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
937 REFRESH_MASK();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
938 x += ((unsigned long) mask) >> (BITSHIFT + 8 -
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
939 h->linbits);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
940 num -= h->linbits + 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
941 mask <<= h->linbits;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
942 if (mask < 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
943 *xrpnt++ = -ispow[x] * v;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
944 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
945 *xrpnt++ = ispow[x] * v;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
946 mask <<= 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
947 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
948 else if (x) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
949 max = cb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
950 if (mask < 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
951 *xrpnt++ = -ispow[x] * v;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
952 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
953 *xrpnt++ = ispow[x] * v;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
954 num--;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
955 mask <<= 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
956 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
957 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
958 *xrpnt++ = 0.0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
959
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
960 if (y == 15 && h->linbits) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
961 max = cb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
962 REFRESH_MASK();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
963 y += ((unsigned long) mask) >> (BITSHIFT + 8 -
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
964 h->linbits);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
965 num -= h->linbits + 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
966 mask <<= h->linbits;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
967 if (mask < 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
968 *xrpnt++ = -ispow[y] * v;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
969 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
970 *xrpnt++ = ispow[y] * v;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
971 mask <<= 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
972 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
973 else if (y) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
974 max = cb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
975 if (mask < 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
976 *xrpnt++ = -ispow[y] * v;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
977 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
978 *xrpnt++ = ispow[y] * v;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
979 num--;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
980 mask <<= 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
981 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
982 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
983 *xrpnt++ = 0.0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
984 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
985 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
986
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
987 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
988 * short (count1table) values
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
989 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
990 for (; l3 && (part2remain + num > 0); l3--) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
991 struct newhuff *h = htc + gr_info->count1table_select;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
992 register short *val = h->table, a;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
993
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
994 REFRESH_MASK();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
995 while ((a = *val++) < 0) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
996 if (mask < 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
997 val -= a;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
998 num--;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
999 mask <<= 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1000 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1001 if (part2remain + num <= 0) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1002 num -= part2remain + num;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1003 break;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1004 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1005
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1006 for (i = 0; i < 4; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1007 if (!(i & 1)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1008 if (!mc) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1009 mc = *m++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1010 cb = *m++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1011 /* if (cb == 21) */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1012 /* v = 0.0; */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1013 /* else */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1014 v = gr_info->
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1015 pow2gain[((*scf++) + (*pretab++)) << shift];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1016 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1017 mc--;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1018 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1019 if ((a & (0x8 >> i))) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1020 max = cb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1021 if (part2remain + num <= 0) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1022 break;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1023 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1024 if (mask < 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1025 *xrpnt++ = -v;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1026 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1027 *xrpnt++ = v;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1028 num--;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1029 mask <<= 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1030 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1031 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1032 *xrpnt++ = 0.0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1033 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1034 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1035
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1036 gr_info->maxbandl = max + 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1037 gr_info->maxb = longLimit[sfreq][gr_info->maxbandl];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1038 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1039
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1040 part2remain += num;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1041 mpg123_backbits(num);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1042 num = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1043
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1044 while (xrpnt < &xr[SBLIMIT][0])
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1045 *xrpnt++ = 0.0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1046
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1047 while (part2remain > 16) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1048 mpg123_getbits(16); /* Dismiss stuffing Bits */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1049 part2remain -= 16;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1050 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1051 if (part2remain > 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1052 mpg123_getbits(part2remain);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1053 else if (part2remain < 0) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1054 /* fprintf(stderr, "mpg123: Can't rewind stream by %d bits!\n", */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1055 /* -part2remain); */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1056 return 1; /* -> error */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1057 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1058 return 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1059 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1060
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1061 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1062 * III_stereo: calculate real channel values for Joint-I-Stereo-mode
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1063 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1064 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1065 III_i_stereo(real xr_buf[2][SBLIMIT][SSLIMIT], int *scalefac,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1066 struct gr_info_s *gr_info, int sfreq, int ms_stereo, int lsf)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1067 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1068 real(*xr)[SBLIMIT * SSLIMIT] = (real(*)[SBLIMIT * SSLIMIT]) xr_buf;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1069 struct bandInfoStruct *bi = &bandInfo[sfreq];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1070
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1071 const real *tab1, *tab2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1072
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1073 #if 1
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1074 int tab;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1075 static const real *tabs[3][2][2] = {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1076 {{tan1_1, tan2_1}, {tan1_2, tan2_2}},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1077 {{pow1_1[0], pow2_1[0]}, {pow1_2[0], pow2_2[0]}},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1078 {{pow1_1[1], pow2_1[1]}, {pow1_2[1], pow2_2[1]}}
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1079 };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1080
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1081 tab = lsf + (gr_info->scalefac_compress & lsf);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1082 tab1 = tabs[tab][ms_stereo][0];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1083 tab2 = tabs[tab][ms_stereo][1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1084 #else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1085 if (lsf) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1086 int p = gr_info->scalefac_compress & 0x1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1087
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1088 if (ms_stereo) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1089 tab1 = pow1_2[p];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1090 tab2 = pow2_2[p];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1091 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1092 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1093 tab1 = pow1_1[p];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1094 tab2 = pow2_1[p];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1095 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1096 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1097 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1098 if (ms_stereo) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1099 tab1 = tan1_2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1100 tab2 = tan2_2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1101 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1102 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1103 tab1 = tan1_1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1104 tab2 = tan2_1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1105 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1106 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1107 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1108
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1109 if (gr_info->block_type == 2) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1110 int lwin, do_l = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1111
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1112 if (gr_info->mixed_block_flag)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1113 do_l = 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1114
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1115 for (lwin = 0; lwin < 3; lwin++) { /* process each window */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1116 /* get first band with zero values */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1117 int is_p, sb, idx, sfb = gr_info->maxband[lwin]; /* sfb is minimal 3 for mixed mode */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1118
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1119 if (sfb > 3)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1120 do_l = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1121
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1122 for (; sfb < 12; sfb++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1123 is_p = scalefac[sfb * 3 + lwin - gr_info->mixed_block_flag]; /* scale: 0-15 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1124 if (is_p != 7) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1125 real t1, t2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1126
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1127 sb = bi->shortDiff[sfb];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1128 idx = bi->shortIdx[sfb] + lwin;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1129 t1 = tab1[is_p];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1130 t2 = tab2[is_p];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1131 for (; sb > 0; sb--, idx += 3) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1132 real v = xr[0][idx];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1133
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1134 xr[0][idx] = v * t1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1135 xr[1][idx] = v * t2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1136 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1137 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1138 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1139
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1140 #if 1
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1141 /* in the original: copy 10 to 11 , here: copy 11 to 12
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1142 maybe still wrong??? (copy 12 to 13?) */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1143 is_p = scalefac[11 * 3 + lwin - gr_info->mixed_block_flag]; /* scale: 0-15 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1144 sb = bi->shortDiff[12];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1145 idx = bi->shortIdx[12] + lwin;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1146 #else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1147 is_p = scalefac[10 * 3 + lwin - gr_info->mixed_block_flag]; /* scale: 0-15 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1148 sb = bi->shortDiff[11];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1149 idx = bi->shortIdx[11] + lwin;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1150 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1151 if (is_p != 7) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1152 real t1, t2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1153 t1 = tab1[is_p];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1154 t2 = tab2[is_p];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1155 for (; sb > 0; sb--, idx += 3) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1156 real v = xr[0][idx];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1157 xr[0][idx] = v * t1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1158 xr[1][idx] = v * t2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1159 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1160 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1161 } /* end for(lwin; .. ; . ) */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1162
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1163 /* also check l-part, if ALL bands in the three windows are 'empty'
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1164 * and mode = mixed_mode
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1165 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1166 if (do_l) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1167 int sfb = gr_info->maxbandl;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1168 int idx = bi->longIdx[sfb];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1169
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1170 for (; sfb < 8; sfb++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1171 int sb = bi->longDiff[sfb];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1172 int is_p = scalefac[sfb]; /* scale: 0-15 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1173
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1174 if (is_p != 7) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1175 real t1, t2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1176
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1177 t1 = tab1[is_p];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1178 t2 = tab2[is_p];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1179 for (; sb > 0; sb--, idx++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1180 real v = xr[0][idx];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1181
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1182 xr[0][idx] = v * t1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1183 xr[1][idx] = v * t2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1184 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1185 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1186 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1187 idx += sb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1188 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1189 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1190 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1191 else { /* ((gr_info->block_type != 2)) */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1192 int sfb = gr_info->maxbandl;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1193 int is_p, idx = bi->longIdx[sfb];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1194
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1195 /* hmm ... maybe the maxbandl stuff for i-stereo is buggy? */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1196 if (sfb <= 21) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1197 for (; sfb < 21; sfb++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1198 int sb = bi->longDiff[sfb];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1199
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1200 is_p = scalefac[sfb]; /* scale: 0-15 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1201 if (is_p != 7) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1202 real t1, t2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1203 t1 = tab1[is_p];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1204 t2 = tab2[is_p];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1205 for (; sb > 0; sb--, idx++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1206 real v = xr[0][idx];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1207 xr[0][idx] = v * t1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1208 xr[1][idx] = v * t2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1209 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1210 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1211 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1212 idx += sb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1213 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1214
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1215 is_p = scalefac[20];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1216 if (is_p != 7) { /* copy l-band 20 to l-band 21 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1217 int sb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1218 real t1 = tab1[is_p], t2 = tab2[is_p];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1219
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1220 for (sb = bi->longDiff[21]; sb > 0; sb--, idx++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1221 real v = xr[0][idx];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1222
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1223 xr[0][idx] = v * t1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1224 xr[1][idx] = v * t2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1225 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1226 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1227 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1228 } /* ... */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1229 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1230
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1231 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1232 III_antialias(real xr[SBLIMIT][SSLIMIT], struct gr_info_s *gr_info)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1233 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1234 int sblim;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1235
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1236 if (gr_info->block_type == 2) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1237 if (!gr_info->mixed_block_flag)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1238 return;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1239 sblim = 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1240 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1241 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1242 sblim = gr_info->maxb - 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1243 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1244
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1245 /* 31 alias-reduction operations between each pair of sub-bands */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1246 /* with 8 butterflies between each pair */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1247
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1248 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1249 int sb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1250 real *xr1 = (real *) xr[1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1251
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1252 if (sblim < 1 || sblim > SBLIMIT)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1253 return;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1254
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1255 for (sb = sblim; sb; sb--, xr1 += 10) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1256 int ss;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1257 real *cs = aa_cs, *ca = aa_ca;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1258 real *xr2 = xr1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1259
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1260 for (ss = 7; ss >= 0; ss--) { /* upper and lower butterfly inputs */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1261 register real bu = *--xr2, bd = *xr1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1262
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1263 *xr2 = (bu * (*cs)) - (bd * (*ca));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1264 *xr1++ = (bd * (*cs++)) + (bu * (*ca++));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1265 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1266 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1267 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1268 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1269
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1270 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1271 This is an optimized DCT from Jeff Tsay's maplay 1.2+ package.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1272 Saved one multiplication by doing the 'twiddle factor' stuff
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1273 together with the window mul. (MH)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1274
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1275 This uses Byeong Gi Lee's Fast Cosine Transform algorithm, but the
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1276 9 point IDCT needs to be reduced further. Unfortunately, I don't
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1277 know how to do that, because 9 is not an even number. - Jeff.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1278
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1279 ****************************************************************
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1280
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1281 9 Point Inverse Discrete Cosine Transform
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1282
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1283 This piece of code is Copyright 1997 Mikko Tommila and is freely usable
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1284 by anybody. The algorithm itself is of course in the public domain.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1285
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1286 Again derived heuristically from the 9-point WFTA.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1287
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1288 The algorithm is optimized (?) for speed, not for small rounding errors or
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1289 good readability.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1290
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1291 36 additions, 11 multiplications
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1292
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1293 Again this is very likely sub-optimal.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1294
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1295 The code is optimized to use a minimum number of temporary variables,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1296 so it should compile quite well even on 8-register Intel x86 processors.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1297 This makes the code quite obfuscated and very difficult to understand.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1298
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1299 References:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1300 [1] S. Winograd: "On Computing the Discrete Fourier Transform",
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1301 Mathematics of Computation, Volume 32, Number 141, January 1978,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1302 Pages 175-199
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1303 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1304
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1305 /*------------------------------------------------------------------*/
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1306 /* */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1307 /* Function: Calculation of the inverse MDCT */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1308 /* */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1309 /*------------------------------------------------------------------*/
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1310
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1311 #define MACRO(v) \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1312 do { \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1313 real tmpval; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1314 \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1315 tmpval = tmp[(v)] + tmp[17-(v)]; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1316 out2[9+(v)] = tmpval * w[27+(v)]; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1317 out2[8-(v)] = tmpval * w[26-(v)]; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1318 tmpval = tmp[(v)] - tmp[17-(v)]; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1319 ts[SBLIMIT*(8-(v))] = out1[8-(v)] + tmpval * w[8-(v)]; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1320 ts[SBLIMIT*(9+(v))] = out1[9+(v)] + tmpval * w[9+(v)]; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1321 } while (0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1322
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1323 #ifndef USE_SIMD
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1324 static
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1325 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1326 void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1327 mpg123_dct36(real * inbuf, real * o1, real * o2, real * wintab, real * tsbuf)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1328 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1329 real tmp[18];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1330 register real *in = inbuf;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1331
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1332 in[17] += in[16];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1333 in[16] += in[15];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1334 in[15] += in[14];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1335 in[14] += in[13];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1336 in[13] += in[12];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1337 in[12] += in[11];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1338 in[11] += in[10];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1339 in[10] += in[9];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1340 in[9] += in[8];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1341 in[8] += in[7];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1342 in[7] += in[6];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1343 in[6] += in[5];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1344 in[5] += in[4];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1345 in[4] += in[3];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1346 in[3] += in[2];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1347 in[2] += in[1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1348 in[1] += in[0];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1349
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1350 in[17] += in[15];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1351 in[15] += in[13];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1352 in[13] += in[11];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1353 in[11] += in[9];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1354 in[9] += in[7];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1355 in[7] += in[5];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1356 in[5] += in[3];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1357 in[3] += in[1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1358
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1359
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1360 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1361 real t3;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1362 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1363 real t0, t1, t2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1364
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1365 t0 = COS6_2 * (in[8] + in[16] - in[4]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1366 t1 = COS6_2 * in[12];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1367
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1368 t3 = in[0];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1369 t2 = t3 - t1 - t1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1370 tmp[1] = tmp[7] = t2 - t0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1371 tmp[4] = t2 + t0 + t0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1372 t3 += t1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1373
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1374 t2 = COS6_1 * (in[10] + in[14] - in[2]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1375 tmp[1] -= t2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1376 tmp[7] += t2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1377 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1378 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1379 real t0, t1, t2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1380
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1381 t0 = cos9[0] * (in[4] + in[8]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1382 t1 = cos9[1] * (in[8] - in[16]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1383 t2 = cos9[2] * (in[4] + in[16]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1384
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1385 tmp[2] = tmp[6] = t3 - t0 - t2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1386 tmp[0] = tmp[8] = t3 + t0 + t1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1387 tmp[3] = tmp[5] = t3 - t1 + t2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1388 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1389 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1390 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1391 real t1, t2, t3;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1392
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1393 t1 = cos18[0] * (in[2] + in[10]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1394 t2 = cos18[1] * (in[10] - in[14]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1395 t3 = COS6_1 * in[6];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1396
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1397 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1398 real t0 = t1 + t2 + t3;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1399 tmp[0] += t0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1400 tmp[8] -= t0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1401 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1402
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1403 t2 -= t3;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1404 t1 -= t3;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1405
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1406 t3 = cos18[2] * (in[2] + in[14]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1407
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1408 t1 += t3;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1409 tmp[3] += t1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1410 tmp[5] -= t1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1411
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1412 t2 -= t3;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1413 tmp[2] += t2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1414 tmp[6] -= t2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1415 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1416
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1417 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1418 real t0, t1, t2, t3, t4, t5, t6, t7;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1419
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1420 t1 = COS6_2 * in[13];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1421 t2 = COS6_2 * (in[9] + in[17] - in[5]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1422
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1423 t3 = in[1] + t1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1424 t4 = in[1] - t1 - t1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1425 t5 = t4 - t2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1426
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1427 t0 = cos9[0] * (in[5] + in[9]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1428 t1 = cos9[1] * (in[9] - in[17]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1429
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1430 tmp[13] = (t4 + t2 + t2) * tfcos36[17 - 13];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1431 t2 = cos9[2] * (in[5] + in[17]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1432
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1433 t6 = t3 - t0 - t2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1434 t0 += t3 + t1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1435 t3 += t2 - t1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1436
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1437 t2 = cos18[0] * (in[3] + in[11]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1438 t4 = cos18[1] * (in[11] - in[15]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1439 t7 = COS6_1 * in[7];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1440
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1441 t1 = t2 + t4 + t7;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1442 tmp[17] = (t0 + t1) * tfcos36[17 - 17];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1443 tmp[9] = (t0 - t1) * tfcos36[17 - 9];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1444 t1 = cos18[2] * (in[3] + in[15]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1445 t2 += t1 - t7;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1446
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1447 tmp[14] = (t3 + t2) * tfcos36[17 - 14];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1448 t0 = COS6_1 * (in[11] + in[15] - in[3]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1449 tmp[12] = (t3 - t2) * tfcos36[17 - 12];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1450
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1451 t4 -= t1 + t7;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1452
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1453 tmp[16] = (t5 - t0) * tfcos36[17 - 16];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1454 tmp[10] = (t5 + t0) * tfcos36[17 - 10];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1455 tmp[15] = (t6 + t4) * tfcos36[17 - 15];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1456 tmp[11] = (t6 - t4) * tfcos36[17 - 11];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1457 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1458
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1459 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1460 register real *out2 = o2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1461 register real *w = wintab;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1462 register real *out1 = o1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1463 register real *ts = tsbuf;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1464
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1465 MACRO(0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1466 MACRO(1);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1467 MACRO(2);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1468 MACRO(3);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1469 MACRO(4);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1470 MACRO(5);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1471 MACRO(6);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1472 MACRO(7);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1473 MACRO(8);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1474 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1475 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1476
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1477 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1478 * new DCT12
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1479 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1480 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1481 dct12(real * in, real * rawout1, real * rawout2,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1482 register real * wi, register real * ts)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1483 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1484
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1485 #define DCT12_PART1() \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1486 do { \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1487 in5 = in[5*3]; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1488 in5 += (in4 = in[4*3]); \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1489 in4 += (in3 = in[3*3]); \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1490 in3 += (in2 = in[2*3]); \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1491 in2 += (in1 = in[1*3]); \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1492 in1 += (in0 = in[0*3]); \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1493 \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1494 in5 += in3; in3 += in1; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1495 \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1496 in2 *= COS6_1; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1497 in3 *= COS6_1; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1498 } while (0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1499
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1500 #define DCT12_PART2() \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1501 do { \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1502 in0 += in4 * COS6_2; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1503 \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1504 in4 = in0 + in2; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1505 in0 -= in2; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1506 \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1507 in1 += in5 * COS6_2; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1508 \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1509 in5 = (in1 + in3) * tfcos12[0]; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1510 in1 = (in1 - in3) * tfcos12[2]; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1511 \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1512 in3 = in4 + in5; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1513 in4 -= in5; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1514 \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1515 in2 = in0 + in1; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1516 in0 -= in1; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1517 } while (0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1518
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1519
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1520 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1521 real in0, in1, in2, in3, in4, in5;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1522 register real *out1 = rawout1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1523
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1524 ts[SBLIMIT * 0] = out1[0];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1525 ts[SBLIMIT * 1] = out1[1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1526 ts[SBLIMIT * 2] = out1[2];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1527 ts[SBLIMIT * 3] = out1[3];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1528 ts[SBLIMIT * 4] = out1[4];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1529 ts[SBLIMIT * 5] = out1[5];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1530
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1531 DCT12_PART1();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1532
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1533 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1534 real tmp0, tmp1 = (in0 - in4);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1535
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1536 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1537 real tmp2 = (in1 - in5) * tfcos12[1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1538
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1539 tmp0 = tmp1 + tmp2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1540 tmp1 -= tmp2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1541 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1542 ts[(17 - 1) * SBLIMIT] = out1[17 - 1] + tmp0 * wi[11 - 1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1543 ts[(12 + 1) * SBLIMIT] = out1[12 + 1] + tmp0 * wi[6 + 1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1544 ts[(6 + 1) * SBLIMIT] = out1[6 + 1] + tmp1 * wi[1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1545 ts[(11 - 1) * SBLIMIT] = out1[11 - 1] + tmp1 * wi[5 - 1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1546 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1547
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1548 DCT12_PART2();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1549
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1550 ts[(17 - 0) * SBLIMIT] = out1[17 - 0] + in2 * wi[11 - 0];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1551 ts[(12 + 0) * SBLIMIT] = out1[12 + 0] + in2 * wi[6 + 0];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1552 ts[(12 + 2) * SBLIMIT] = out1[12 + 2] + in3 * wi[6 + 2];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1553 ts[(17 - 2) * SBLIMIT] = out1[17 - 2] + in3 * wi[11 - 2];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1554
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1555 ts[(6 + 0) * SBLIMIT] = out1[6 + 0] + in0 * wi[0];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1556 ts[(11 - 0) * SBLIMIT] = out1[11 - 0] + in0 * wi[5 - 0];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1557 ts[(6 + 2) * SBLIMIT] = out1[6 + 2] + in4 * wi[2];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1558 ts[(11 - 2) * SBLIMIT] = out1[11 - 2] + in4 * wi[5 - 2];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1559 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1560
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1561 in++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1562
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1563 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1564 real in0, in1, in2, in3, in4, in5;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1565 register real *out2 = rawout2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1566
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1567 DCT12_PART1();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1568
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1569 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1570 real tmp0, tmp1 = (in0 - in4);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1571
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1572 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1573 real tmp2 = (in1 - in5) * tfcos12[1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1574
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1575 tmp0 = tmp1 + tmp2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1576 tmp1 -= tmp2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1577 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1578 out2[5 - 1] = tmp0 * wi[11 - 1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1579 out2[0 + 1] = tmp0 * wi[6 + 1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1580 ts[(12 + 1) * SBLIMIT] += tmp1 * wi[1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1581 ts[(17 - 1) * SBLIMIT] += tmp1 * wi[5 - 1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1582 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1583
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1584 DCT12_PART2();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1585
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1586 out2[5 - 0] = in2 * wi[11 - 0];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1587 out2[0 + 0] = in2 * wi[6 + 0];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1588 out2[0 + 2] = in3 * wi[6 + 2];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1589 out2[5 - 2] = in3 * wi[11 - 2];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1590
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1591 ts[(12 + 0) * SBLIMIT] += in0 * wi[0];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1592 ts[(17 - 0) * SBLIMIT] += in0 * wi[5 - 0];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1593 ts[(12 + 2) * SBLIMIT] += in4 * wi[2];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1594 ts[(17 - 2) * SBLIMIT] += in4 * wi[5 - 2];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1595 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1596
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1597 in++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1598
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1599 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1600 real in0, in1, in2, in3, in4, in5;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1601 register real *out2 = rawout2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1602
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1603 out2[12] = out2[13] = out2[14] = out2[15] = out2[16] = out2[17] = 0.0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1604
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1605 DCT12_PART1();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1606
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1607 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1608 real tmp0, tmp1 = (in0 - in4);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1609
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1610 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1611 real tmp2 = (in1 - in5) * tfcos12[1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1612
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1613 tmp0 = tmp1 + tmp2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1614 tmp1 -= tmp2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1615 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1616 out2[11 - 1] = tmp0 * wi[11 - 1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1617 out2[6 + 1] = tmp0 * wi[6 + 1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1618 out2[0 + 1] += tmp1 * wi[1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1619 out2[5 - 1] += tmp1 * wi[5 - 1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1620 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1621
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1622 DCT12_PART2();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1623
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1624 out2[11 - 0] = in2 * wi[11 - 0];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1625 out2[6 + 0] = in2 * wi[6 + 0];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1626 out2[6 + 2] = in3 * wi[6 + 2];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1627 out2[11 - 2] = in3 * wi[11 - 2];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1628
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1629 out2[0 + 0] += in0 * wi[0];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1630 out2[5 - 0] += in0 * wi[5 - 0];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1631 out2[0 + 2] += in4 * wi[2];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1632 out2[5 - 2] += in4 * wi[5 - 2];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1633 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1634 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1635
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1636 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1637 * III_hybrid
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1638 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1639 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1640 III_hybrid(real fsIn[SBLIMIT][SSLIMIT],
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1641 real tsOut[SSLIMIT][SBLIMIT], int ch,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1642 struct gr_info_s *gr_info, struct frame *fr)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1643 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1644 static real block[2][2][SBLIMIT * SSLIMIT] = { {{0,}} };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1645 static int blc[2] = { 0, 0 };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1646
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1647 real *tspnt = (real *) tsOut;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1648 real *rawout1, *rawout2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1649 int bt, sb = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1650
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1651 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1652 int b = blc[ch];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1653 rawout1 = block[b][ch];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1654 b = -b + 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1655 rawout2 = block[b][ch];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1656 blc[ch] = b;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1657 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1658
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1659 if (gr_info->mixed_block_flag) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1660 sb = 2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1661 DCT36(fsIn[0], rawout1, rawout2, win[0], tspnt);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1662 DCT36(fsIn[1], rawout1 + 18, rawout2 + 18, win1[0], tspnt + 1);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1663 rawout1 += 36;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1664 rawout2 += 36;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1665 tspnt += 2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1666 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1667
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1668 bt = gr_info->block_type;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1669 if (bt == 2) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1670 for (; sb < gr_info->maxb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1671 sb += 2, tspnt += 2, rawout1 += 36, rawout2 += 36) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1672 dct12(fsIn[sb], rawout1, rawout2, win[2], tspnt);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1673 dct12(fsIn[sb + 1], rawout1 + 18, rawout2 + 18, win1[2],
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1674 tspnt + 1);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1675 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1676 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1677 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1678 for (; sb < gr_info->maxb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1679 sb += 2, tspnt += 2, rawout1 += 36, rawout2 += 36) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1680 DCT36(fsIn[sb], rawout1, rawout2, win[bt], tspnt);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1681 DCT36(fsIn[sb + 1], rawout1 + 18, rawout2 + 18, win1[bt],
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1682 tspnt + 1);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1683 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1684 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1685
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1686 for (; sb < SBLIMIT; sb++, tspnt++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1687 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1688 for (i = 0; i < SSLIMIT; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1689 tspnt[i * SBLIMIT] = *rawout1++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1690 *rawout2++ = 0.0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1691 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1692 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1693 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1694
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1695 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1696 * main layer3 handler
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1697 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1698 int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1699 mpg123_do_layer3(struct frame *fr)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1700 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1701 int gr, ch, ss;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1702 int scalefacs[2][39]; /* max 39 for short[13][3] mode, mixed: 38, long: 22 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1703 struct III_sideinfo sideinfo;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1704 int stereo = fr->stereo;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1705 int single = fr->single;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1706 int ms_stereo, i_stereo;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1707 int sfreq = fr->sampling_frequency;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1708 int stereo1, granules;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1709
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1710 if (stereo == 1) { /* stream is mono */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1711 stereo1 = 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1712 single = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1713 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1714 else if (single >= 0) /* stream is stereo, but force to mono */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1715 stereo1 = 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1716 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1717 stereo1 = 2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1718
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1719 if (fr->mode == MPG_MD_JOINT_STEREO) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1720 ms_stereo = (fr->mode_ext & 0x2) >> 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1721 i_stereo = fr->mode_ext & 0x1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1722 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1723 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1724 ms_stereo = i_stereo = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1725
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1726 granules = fr->lsf ? 1 : 2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1727 if (!III_get_side_info
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1728 (&sideinfo, stereo, ms_stereo, sfreq, single, fr->lsf))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1729 return 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1730
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1731 mpg123_set_pointer(sideinfo.main_data_begin);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1732
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1733 for (gr = 0; gr < granules; gr++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1734 real hybridIn[2][SBLIMIT][SSLIMIT];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1735 real hybridOut[2][SSLIMIT][SBLIMIT];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1736
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1737 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1738 struct gr_info_s *gr_info = &(sideinfo.ch[0].gr[gr]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1739 long part2bits;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1740
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1741 if (fr->lsf)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1742 part2bits = III_get_scale_factors_2(scalefacs[0], gr_info, 0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1743 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1744 part2bits = III_get_scale_factors_1(scalefacs[0], gr_info);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1745
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1746 if (III_dequantize_sample
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1747 (hybridIn[0], scalefacs[0], gr_info, sfreq, part2bits))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1748 return 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1749 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1750
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1751 if (stereo == 2) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1752 struct gr_info_s *gr_info = &(sideinfo.ch[1].gr[gr]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1753 long part2bits;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1754
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1755 if (fr->lsf)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1756 part2bits =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1757 III_get_scale_factors_2(scalefacs[1], gr_info, i_stereo);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1758 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1759 part2bits = III_get_scale_factors_1(scalefacs[1], gr_info);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1760
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1761 if (III_dequantize_sample
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1762 (hybridIn[1], scalefacs[1], gr_info, sfreq, part2bits))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1763 return 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1764
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1765 if (ms_stereo) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1766 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1767 int maxb = sideinfo.ch[0].gr[gr].maxb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1768
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1769 if (sideinfo.ch[1].gr[gr].maxb > maxb)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1770 maxb = sideinfo.ch[1].gr[gr].maxb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1771 for (i = 0; i < SSLIMIT * maxb; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1772 real tmp0 = ((real *) hybridIn[0])[i];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1773 real tmp1 = ((real *) hybridIn[1])[i];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1774 ((real *) hybridIn[0])[i] = tmp0 + tmp1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1775 ((real *) hybridIn[1])[i] = tmp0 - tmp1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1776 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1777 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1778
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1779 if (i_stereo)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1780 III_i_stereo(hybridIn, scalefacs[1], gr_info, sfreq,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1781 ms_stereo, fr->lsf);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1782
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1783 if (ms_stereo || i_stereo || (single == 3)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1784 if (gr_info->maxb > sideinfo.ch[0].gr[gr].maxb)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1785 sideinfo.ch[0].gr[gr].maxb = gr_info->maxb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1786 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1787 gr_info->maxb = sideinfo.ch[0].gr[gr].maxb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1788 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1789
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1790 switch (single) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1791 case 3:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1792 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1793 register int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1794 register real *in0 = (real *) hybridIn[0],
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1795 *in1 = (real *) hybridIn[1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1796 for (i = 0; i < SSLIMIT * gr_info->maxb; i++, in0++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1797 *in0 = (*in0 + *in1++); /* *0.5 done by pow-scale */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1798 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1799 break;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1800 case 1:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1801 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1802 register int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1803 register real *in0 = (real *) hybridIn[0],
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1804 *in1 = (real *) hybridIn[1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1805 for (i = 0; i < SSLIMIT * gr_info->maxb; i++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1806 *in0++ = *in1++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1807 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1808 break;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1809 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1810 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1811
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1812 #ifdef XMMS_EQ
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1813 if (mpg123_info->eq_active) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1814 int i, sb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1815
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1816 if (single < 0) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1817 for (sb = 0, i = 0; sb < SBLIMIT; sb++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1818 for (ss = 0; ss < SSLIMIT; ss++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1819 hybridIn[0][sb][ss] *= mpg123_info->eq_mul[i];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1820 hybridIn[1][sb][ss] *= mpg123_info->eq_mul[i++];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1821 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1822 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1823 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1824 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1825 for (sb = 0, i = 0; sb < SBLIMIT; sb++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1826 for (ss = 0; ss < SSLIMIT; ss++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1827 hybridIn[0][sb][ss] *= mpg123_info->eq_mul[i++];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1828 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1829 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1830 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1831 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1832
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1833 #ifdef USE_SIMD
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1834 if (fr->synth_type == SYNTH_MMX && single < 0) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1835 int i, sb;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1836
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1837 for (sb = 0, i = 0; sb < SBLIMIT; sb++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1838 for (ss = 0; ss < SSLIMIT; ss++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1839 hybridIn[0][sb][ss] *= 16384.0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1840 hybridIn[1][sb][ss] *= 16384.0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1841 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1842 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1843 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1844 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1845 for (ch = 0; ch < stereo1; ch++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1846 struct gr_info_s *gr_info = &(sideinfo.ch[ch].gr[gr]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1847
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1848 III_antialias(hybridIn[ch], gr_info);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1849 if (gr_info->maxb < 1 || gr_info->maxb > SBLIMIT)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1850 return 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1851 III_hybrid(hybridIn[ch], hybridOut[ch], ch, gr_info, fr);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1852 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1853
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1854 for (ss = 0; ss < SSLIMIT; ss++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1855 if (single >= 0) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1856 (fr->synth_mono) (hybridOut[0][ss], mpg123_pcm_sample,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1857 &mpg123_pcm_point);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1858 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1859 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1860 int p1 = mpg123_pcm_point;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1861
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1862 (fr->synth) (hybridOut[0][ss], 0, mpg123_pcm_sample, &p1);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1863 (fr->synth) (hybridOut[1][ss], 1, mpg123_pcm_sample,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1864 &mpg123_pcm_point);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1865 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1866 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1867
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1868 if (mpg123_info->output_audio && mpg123_info->jump_to_time == -1) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1869 produce_audio(mpg123_ip.output->written_time(),
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1870 mpg123_cfg.resolution ==
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1871 16 ? FMT_S16_NE : FMT_U8,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1872 mpg123_cfg.channels ==
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1873 2 ? fr->stereo : 1, mpg123_pcm_point,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1874 mpg123_pcm_sample, &mpg123_info->going);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1875 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1876
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1877 mpg123_pcm_point = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1878 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1879 return 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1880 }