annotate Plugins/Input/mpg123/layer1.c @ 61:fa848bd484d8 trunk

[svn] Move plugins to Plugins/
author nenolod
date Fri, 28 Oct 2005 22:58:11 -0700
parents
children 05d824e30afd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
2 /*
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
3 * Mpeg Layer-1 audio decoder
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
4 * --------------------------
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
5 * copyright (c) 1995 by Michael Hipp, All rights reserved. See also 'README'
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
6 * near unoptimzed ...
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
7 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
8 * may have a few bugs after last optimization ...
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
9 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
10 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
11
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
12
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
13 #include "audacious/output.h"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
14 #include "mpg123.h"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
15 #include "getbits.h"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
16
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
17
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
18 /* Used by the getbits macros */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
19 static unsigned long rval;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
20
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
21 void
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
22 I_step_one(unsigned int balloc[],
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
23 unsigned int scale_index[2][SBLIMIT], struct frame *fr)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
24 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
25 unsigned int *ba = balloc;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
26 unsigned int *sca = (unsigned int *) scale_index;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
27
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
28 if (fr->stereo) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
29 int i;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
30 int jsbound = fr->jsbound;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
31
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
32 for (i = 0; i < jsbound; i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
33 *ba++ = mpg123_getbits(4);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
34 *ba++ = mpg123_getbits(4);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
35 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
36 for (i = jsbound; i < SBLIMIT; i++)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
37 *ba++ = mpg123_getbits(4);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
38
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
39 ba = balloc;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
40
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
41 for (i = 0; i < jsbound; i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
42 if ((*ba++))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
43 *sca++ = mpg123_getbits(6);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
44 if ((*ba++))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
45 *sca++ = mpg123_getbits(6);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
46 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
47 for (i = jsbound; i < SBLIMIT; i++)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
48 if ((*ba++)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
49 *sca++ = mpg123_getbits(6);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
50 *sca++ = mpg123_getbits(6);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
51 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
52 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
53 else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
54 int i;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
55
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
56 for (i = 0; i < SBLIMIT; i++)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
57 *ba++ = mpg123_getbits(4);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
58 ba = balloc;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
59 for (i = 0; i < SBLIMIT; i++)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
60 if ((*ba++))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
61 *sca++ = mpg123_getbits(6);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
62 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
63 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
64
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
65 void
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
66 I_step_two(real fraction[2][SBLIMIT],
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
67 unsigned int balloc[2 * SBLIMIT],
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
68 unsigned int scale_index[2][SBLIMIT], struct frame *fr)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
69 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
70 int i, n;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
71 int smpb[2 * SBLIMIT]; /* values: 0-65535 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
72 int *sample;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
73 register unsigned int *ba;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
74 register unsigned int *sca = (unsigned int *) scale_index;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
75
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
76 if (fr->stereo) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
77 int jsbound = fr->jsbound;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
78 register real *f0 = fraction[0];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
79 register real *f1 = fraction[1];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
80
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
81 ba = balloc;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
82 for (sample = smpb, i = 0; i < jsbound; i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
83 if ((n = *ba++))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
84 *sample++ = mpg123_getbits(n + 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
85 if ((n = *ba++))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
86 *sample++ = mpg123_getbits(n + 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
87 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
88 for (i = jsbound; i < SBLIMIT; i++)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
89 if ((n = *ba++))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
90 *sample++ = mpg123_getbits(n + 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
91
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
92 ba = balloc;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
93 for (sample = smpb, i = 0; i < jsbound; i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
94 if ((n = *ba++))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
95 *f0++ =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
96 (real) (((-1) << n) + (*sample++) +
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
97 1) * mpg123_muls[n + 1][*sca++];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
98 else
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
99 *f0++ = 0.0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
100 if ((n = *ba++))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
101 *f1++ =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
102 (real) (((-1) << n) + (*sample++) +
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
103 1) * mpg123_muls[n + 1][*sca++];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
104 else
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
105 *f1++ = 0.0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
106 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
107 for (i = jsbound; i < SBLIMIT; i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
108 if ((n = *ba++)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
109 real samp = (((-1) << n) + (*sample++) + 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
110
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
111 *f0++ = samp * mpg123_muls[n + 1][*sca++];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
112 *f1++ = samp * mpg123_muls[n + 1][*sca++];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
113 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
114 else
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
115 *f0++ = *f1++ = 0.0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
116 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
117 for (i = fr->down_sample_sblimit; i < 32; i++)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
118 fraction[0][i] = fraction[1][i] = 0.0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
119 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
120 else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
121 register real *f0 = fraction[0];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
122
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
123 ba = balloc;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
124 for (sample = smpb, i = 0; i < SBLIMIT; i++)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
125 if ((n = *ba++))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
126 *sample++ = mpg123_getbits(n + 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
127 ba = balloc;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
128 for (sample = smpb, i = 0; i < SBLIMIT; i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
129 if ((n = *ba++))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
130 *f0++ =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
131 (real) (((-1) << n) + (*sample++) +
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
132 1) * mpg123_muls[n + 1][*sca++];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
133 else
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
134 *f0++ = 0.0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
135 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
136 for (i = fr->down_sample_sblimit; i < 32; i++)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
137 fraction[0][i] = 0.0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
138 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
139 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
140
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
141 int
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
142 mpg123_do_layer1(struct frame *fr)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
143 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
144 int i, stereo = fr->stereo;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
145 unsigned int balloc[2 * SBLIMIT];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
146 unsigned int scale_index[2][SBLIMIT];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
147 real fraction[2][SBLIMIT];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
148 int single = fr->single;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
149
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
150 fr->jsbound =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
151 (fr->mode == MPG_MD_JOINT_STEREO) ? (fr->mode_ext << 2) + 4 : 32;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
152
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
153 if (stereo == 1 || single == 3)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
154 single = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
155
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
156 I_step_one(balloc, scale_index, fr);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
157
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
158 for (i = 0; i < SCALE_BLOCK; i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
159 I_step_two(fraction, balloc, scale_index, fr);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
160
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
161 if (single >= 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
162 (fr->synth_mono) ((real *) fraction[single], mpg123_pcm_sample,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
163 &mpg123_pcm_point);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
164 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
165 else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
166 int p1 = mpg123_pcm_point;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
167
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
168 (fr->synth) ((real *) fraction[0], 0, mpg123_pcm_sample, &p1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
169 (fr->synth) ((real *) fraction[1], 1, mpg123_pcm_sample,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
170 &mpg123_pcm_point);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
171 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
172 if (mpg123_info->output_audio && mpg123_info->jump_to_time == -1) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
173 produce_audio(mpg123_ip.output->written_time(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
174 mpg123_cfg.resolution ==
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
175 16 ? FMT_S16_NE : FMT_U8,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
176 mpg123_cfg.channels ==
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
177 2 ? fr->stereo : 1, mpg123_pcm_point,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
178 mpg123_pcm_sample, &mpg123_info->going);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
179 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
180
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
181 mpg123_pcm_point = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
182 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
183
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
184 return 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
185 }