LMMS
Loading...
Searching...
No Matches
eel_mdct.h
Go to the documentation of this file.
1#ifndef _EEL_MDCT_H_
2#define _EEL_MDCT_H_
3
4
5#include "ns-eel-int.h"
6
7#ifdef _WIN32
8#include <malloc.h>
9#endif
10#include <string.h>
11#include <stdlib.h>
12#include <math.h>
13
14#define EEL_DCT_MINBITLEN 5
15#define EEL_DCT_MAXBITLEN 12
16
17
18#define PI 3.1415926535897932384626433832795
19
20typedef struct {
21 int n;
22 int log2n;
23 EEL_F *trig;
24 int *bitrev;
25 EEL_F scale;
26 EEL_F *window;
28
29static void mdct(EEL_F *in, EEL_F *out, int len)
30{
31 int k;
32 EEL_F pioverlen = PI * 0.5 / (EEL_F)len;
33 for (k = 0; k < len / 2; k ++)
34 {
35 int i;
36 EEL_F d = 0.0;
37 for (i = 0; i < len; i ++)
38 {
39 d += in[i] * cos(pioverlen * (2.0 * i + 1.0 + len * 0.5) * (2.0 * k + 1.0));
40 }
41 out[k] = (EEL_F)d;
42 }
43}
44
45static void imdct(EEL_F *in, EEL_F *out, int len)
46{
47 int k;
48 EEL_F fourovern = 4.0 / (EEL_F)len;
49 EEL_F pioverlen = PI * 0.5 / (EEL_F)len;
50 for (k = 0; k < len; k ++)
51 {
52 int i;
53 EEL_F d = 0.0;
54 for (i = 0; i < len / 2; i ++)
55 {
56 d += in[i] * cos(pioverlen * (2.0 * k + 1.0 + len * 0.5) * (2 * i + 1.0));
57 }
58 out[k] = (EEL_F)(d * fourovern);
59 }
60}
61
62
63// MDCT/iMDCT borrowed from Vorbis, thanks xiph!
64
65
66#define cPI3_8 .38268343236508977175
67#define cPI2_8 .70710678118654752441
68#define cPI1_8 .92387953251128675613
69
70#define FLOAT_CONV(x) ((EEL_F) ( x ))
71#define MULT_NORM(x) (x)
72#define HALVE(x) ((x)*.5f)
73
74
75
76/* 8 point butterfly (in place, 4 register) */
77static void mdct_butterfly_8(EEL_F *x) {
78 EEL_F r0 = x[6] + x[2];
79 EEL_F r1 = x[6] - x[2];
80 EEL_F r2 = x[4] + x[0];
81 EEL_F r3 = x[4] - x[0];
82
83 x[6] = r0 + r2;
84 x[4] = r0 - r2;
85
86 r0 = x[5] - x[1];
87 r2 = x[7] - x[3];
88 x[0] = r1 + r0;
89 x[2] = r1 - r0;
90
91 r0 = x[5] + x[1];
92 r1 = x[7] + x[3];
93 x[3] = r2 + r3;
94 x[1] = r2 - r3;
95 x[7] = r1 + r0;
96 x[5] = r1 - r0;
97
98}
99
100/* 16 point butterfly (in place, 4 register) */
101static void mdct_butterfly_16(EEL_F *x) {
102 EEL_F r0 = x[1] - x[9];
103 EEL_F r1 = x[0] - x[8];
104
105 x[8] += x[0];
106 x[9] += x[1];
107 x[0] = MULT_NORM((r0 + r1) * cPI2_8);
108 x[1] = MULT_NORM((r0 - r1) * cPI2_8);
109
110 r0 = x[3] - x[11];
111 r1 = x[10] - x[2];
112 x[10] += x[2];
113 x[11] += x[3];
114 x[2] = r0;
115 x[3] = r1;
116
117 r0 = x[12] - x[4];
118 r1 = x[13] - x[5];
119 x[12] += x[4];
120 x[13] += x[5];
121 x[4] = MULT_NORM((r0 - r1) * cPI2_8);
122 x[5] = MULT_NORM((r0 + r1) * cPI2_8);
123
124 r0 = x[14] - x[6];
125 r1 = x[15] - x[7];
126 x[14] += x[6];
127 x[15] += x[7];
128 x[6] = r0;
129 x[7] = r1;
130
132 mdct_butterfly_8(x + 8);
133}
134
135/* 32 point butterfly (in place, 4 register) */
136static void mdct_butterfly_32(EEL_F *x) {
137 EEL_F r0 = x[30] - x[14];
138 EEL_F r1 = x[31] - x[15];
139
140 x[30] += x[14];
141 x[31] += x[15];
142 x[14] = r0;
143 x[15] = r1;
144
145 r0 = x[28] - x[12];
146 r1 = x[29] - x[13];
147 x[28] += x[12];
148 x[29] += x[13];
149 x[12] = MULT_NORM( r0 * cPI1_8 - r1 * cPI3_8 );
150 x[13] = MULT_NORM( r0 * cPI3_8 + r1 * cPI1_8 );
151
152 r0 = x[26] - x[10];
153 r1 = x[27] - x[11];
154 x[26] += x[10];
155 x[27] += x[11];
156 x[10] = MULT_NORM(( r0 - r1 ) * cPI2_8);
157 x[11] = MULT_NORM(( r0 + r1 ) * cPI2_8);
158
159 r0 = x[24] - x[8];
160 r1 = x[25] - x[9];
161 x[24] += x[8];
162 x[25] += x[9];
163 x[8] = MULT_NORM( r0 * cPI3_8 - r1 * cPI1_8 );
164 x[9] = MULT_NORM( r1 * cPI3_8 + r0 * cPI1_8 );
165
166 r0 = x[22] - x[6];
167 r1 = x[7] - x[23];
168 x[22] += x[6];
169 x[23] += x[7];
170 x[6] = r1;
171 x[7] = r0;
172
173 r0 = x[4] - x[20];
174 r1 = x[5] - x[21];
175 x[20] += x[4];
176 x[21] += x[5];
177 x[4] = MULT_NORM( r1 * cPI1_8 + r0 * cPI3_8 );
178 x[5] = MULT_NORM( r1 * cPI3_8 - r0 * cPI1_8 );
179
180 r0 = x[2] - x[18];
181 r1 = x[3] - x[19];
182 x[18] += x[2];
183 x[19] += x[3];
184 x[2] = MULT_NORM(( r1 + r0 ) * cPI2_8);
185 x[3] = MULT_NORM(( r1 - r0 ) * cPI2_8);
186
187 r0 = x[0] - x[16];
188 r1 = x[1] - x[17];
189 x[16] += x[0];
190 x[17] += x[1];
191 x[0] = MULT_NORM( r1 * cPI3_8 + r0 * cPI1_8 );
192 x[1] = MULT_NORM( r1 * cPI1_8 - r0 * cPI3_8 );
193
195 mdct_butterfly_16(x + 16);
196
197}
198
199/* N point first stage butterfly (in place, 2 register) */
200static void mdct_butterfly_first(EEL_F *T,
201 EEL_F *x,
202 int points) {
203
204 EEL_F *x1 = x + points - 8;
205 EEL_F *x2 = x + (points >> 1) - 8;
206 EEL_F r0;
207 EEL_F r1;
208
209 do {
210
211 r0 = x1[6] - x2[6];
212 r1 = x1[7] - x2[7];
213 x1[6] += x2[6];
214 x1[7] += x2[7];
215 x2[6] = MULT_NORM(r1 * T[1] + r0 * T[0]);
216 x2[7] = MULT_NORM(r1 * T[0] - r0 * T[1]);
217
218 r0 = x1[4] - x2[4];
219 r1 = x1[5] - x2[5];
220 x1[4] += x2[4];
221 x1[5] += x2[5];
222 x2[4] = MULT_NORM(r1 * T[5] + r0 * T[4]);
223 x2[5] = MULT_NORM(r1 * T[4] - r0 * T[5]);
224
225 r0 = x1[2] - x2[2];
226 r1 = x1[3] - x2[3];
227 x1[2] += x2[2];
228 x1[3] += x2[3];
229 x2[2] = MULT_NORM(r1 * T[9] + r0 * T[8]);
230 x2[3] = MULT_NORM(r1 * T[8] - r0 * T[9]);
231
232 r0 = x1[0] - x2[0];
233 r1 = x1[1] - x2[1];
234 x1[0] += x2[0];
235 x1[1] += x2[1];
236 x2[0] = MULT_NORM(r1 * T[13] + r0 * T[12]);
237 x2[1] = MULT_NORM(r1 * T[12] - r0 * T[13]);
238
239 x1 -= 8;
240 x2 -= 8;
241 T += 16;
242
243 } while(x2 >= x);
244}
245
246/* N/stage point generic N stage butterfly (in place, 2 register) */
247static void mdct_butterfly_generic(EEL_F *T,
248 EEL_F *x,
249 int points,
250 int trigint) {
251
252 EEL_F *x1 = x + points - 8;
253 EEL_F *x2 = x + (points >> 1) - 8;
254 EEL_F r0;
255 EEL_F r1;
256
257 do {
258
259 r0 = x1[6] - x2[6];
260 r1 = x1[7] - x2[7];
261 x1[6] += x2[6];
262 x1[7] += x2[7];
263 x2[6] = MULT_NORM(r1 * T[1] + r0 * T[0]);
264 x2[7] = MULT_NORM(r1 * T[0] - r0 * T[1]);
265
266 T += trigint;
267
268 r0 = x1[4] - x2[4];
269 r1 = x1[5] - x2[5];
270 x1[4] += x2[4];
271 x1[5] += x2[5];
272 x2[4] = MULT_NORM(r1 * T[1] + r0 * T[0]);
273 x2[5] = MULT_NORM(r1 * T[0] - r0 * T[1]);
274
275 T += trigint;
276
277 r0 = x1[2] - x2[2];
278 r1 = x1[3] - x2[3];
279 x1[2] += x2[2];
280 x1[3] += x2[3];
281 x2[2] = MULT_NORM(r1 * T[1] + r0 * T[0]);
282 x2[3] = MULT_NORM(r1 * T[0] - r0 * T[1]);
283
284 T += trigint;
285
286 r0 = x1[0] - x2[0];
287 r1 = x1[1] - x2[1];
288 x1[0] += x2[0];
289 x1[1] += x2[1];
290 x2[0] = MULT_NORM(r1 * T[1] + r0 * T[0]);
291 x2[1] = MULT_NORM(r1 * T[0] - r0 * T[1]);
292
293 T += trigint;
294 x1 -= 8;
295 x2 -= 8;
296
297 } while(x2 >= x);
298}
299
301 EEL_F *x,
302 int points) {
303
304 EEL_F *T = init->trig;
305 int stages = init->log2n - 5;
306 int i, j;
307
308 if(--stages > 0) {
309 mdct_butterfly_first(T, x, points);
310 }
311
312 for(i = 1; --stages > 0; i++) {
313 for(j = 0; j < (1 << i); j++)
314 mdct_butterfly_generic(T, x + (points >> i)*j, points >> i, 4 << i);
315 }
316
317 for(j = 0; j < points; j += 32)
319
320}
321
323 EEL_F *x) {
324 int n = init->n;
325 int *bit = init->bitrev;
326 EEL_F *w0 = x;
327 EEL_F *w1 = x = w0 + (n >> 1);
328 EEL_F *T = init->trig + n;
329
330 do {
331 EEL_F *x0 = x + bit[0];
332 EEL_F *x1 = x + bit[1];
333
334 EEL_F r0 = x0[1] - x1[1];
335 EEL_F r1 = x0[0] + x1[0];
336 EEL_F r2 = MULT_NORM(r1 * T[0] + r0 * T[1]);
337 EEL_F r3 = MULT_NORM(r1 * T[1] - r0 * T[0]);
338
339 w1 -= 4;
340
341 r0 = HALVE(x0[1] + x1[1]);
342 r1 = HALVE(x0[0] - x1[0]);
343
344 w0[0] = r0 + r2;
345 w1[2] = r0 - r2;
346 w0[1] = r1 + r3;
347 w1[3] = r3 - r1;
348
349 x0 = x + bit[2];
350 x1 = x + bit[3];
351
352 r0 = x0[1] - x1[1];
353 r1 = x0[0] + x1[0];
354 r2 = MULT_NORM(r1 * T[2] + r0 * T[3]);
355 r3 = MULT_NORM(r1 * T[3] - r0 * T[2]);
356
357 r0 = HALVE(x0[1] + x1[1]);
358 r1 = HALVE(x0[0] - x1[0]);
359
360 w0[2] = r0 + r2;
361 w1[0] = r0 - r2;
362 w0[3] = r1 + r3;
363 w1[1] = r3 - r1;
364
365 T += 4;
366 bit += 4;
367 w0 += 4;
368
369 } while(w0 < w1);
370}
371
372static void megabuf_mdct_apply_window(void *init, EEL_F *inbuf, EEL_F *outbuf)
373{
375 EEL_F *w;
376 int cnt;
377 if (!p) return;
378
379 w = p->window;
380 if (!w) return;
381
382 cnt = p->n / 2;
383 while (cnt--) *outbuf++ = *inbuf++ * *w++;
384 cnt = p->n / 2;
385 while (cnt--) *outbuf++ = *inbuf++ * *--w;
386}
387
388
389
390static void *megabuf_mdct_init(int n) {
391 mdct_lookup *lookup = (mdct_lookup *)calloc(sizeof(mdct_lookup), 1);
392 int i;
393 EEL_F c = (PI / (EEL_F) n);
394 int *bitrev;
395 EEL_F *T;
396 int n2, log2n;
397 if (!lookup) return 0;
398
399 lookup->n = n;
400 lookup->window = (EEL_F *)calloc(sizeof(EEL_F), n / 2);
401 if (!lookup->window) return lookup;
402
403 for (i = 0; i < n / 2; i ++)
404 {
405 lookup->window[i] = sin(c * (i + 0.5));
406 }
407
408 if (n <= 32) return lookup;
409 bitrev = (int*)calloc(sizeof(int), (n / 4));
410 lookup->bitrev = bitrev;
411 if (!bitrev) return lookup;
412
413 T = (EEL_F*)calloc(sizeof(EEL_F), (n + n / 4));
414 lookup->trig = T;
415 if (!T) return lookup;
416
417 n2 = n >> 1;
418 log2n = lookup->log2n = (int)(log((double)n) / log(2.0) + 0.5);
419
420 /* trig lookups... */
421
422 for(i = 0; i < n / 4; i++) {
423 T[i * 2] = FLOAT_CONV(cos((PI / n) * (4 * i)));
424 T[i * 2 + 1] = FLOAT_CONV(-sin((PI / n) * (4 * i)));
425 T[n2 + i * 2] = FLOAT_CONV(cos((PI / (2 * n)) * (2 * i + 1)));
426 T[n2 + i * 2 + 1] = FLOAT_CONV(sin((PI / (2 * n)) * (2 * i + 1)));
427 }
428 for(i = 0; i < n / 8; i++) {
429 T[n + i * 2] = FLOAT_CONV(cos((PI / n) * (4 * i + 2)) * .5);
430 T[n + i * 2 + 1] = FLOAT_CONV(-sin((PI / n) * (4 * i + 2)) * .5);
431 }
432
433 /* bitreverse lookup... */
434
435 {
436 int mask = (1 << (log2n - 1)) - 1, j;
437 int msb = 1 << (log2n - 2);
438 for(i = 0; i < n / 8; i++) {
439 int acc = 0;
440 for(j = 0; msb >> j; j++)
441 if((msb >> j)&i)acc |= 1 << j;
442 bitrev[i * 2] = ((~acc)&mask) - 1;
443 bitrev[i * 2 + 1] = acc;
444
445 }
446 }
447 lookup->scale = FLOAT_CONV(4.f / n);
448 return lookup;
449}
450
451static void megabuf_mdct_backward(void *init, EEL_F *in, EEL_F *out) {
452 mdct_lookup *lookup = (mdct_lookup *)init;
453 int n, n2, n4;
454 EEL_F *iX, *oX, *T;
455 if (!lookup) return;
456 n = lookup->n;
457 if (n <= 32 || !lookup->bitrev || !lookup->trig)
458 {
459 imdct(in, out, n);
460 return;
461 }
462 n2 = n >> 1;
463 n4 = n >> 2;
464
465 /* rotate */
466
467 iX = in + n2 - 7;
468 oX = out + n2 + n4;
469 T = lookup->trig + n4;
470
471 do {
472 oX -= 4;
473 oX[0] = MULT_NORM(-iX[2] * T[3] - iX[0] * T[2]);
474 oX[1] = MULT_NORM (iX[0] * T[3] - iX[2] * T[2]);
475 oX[2] = MULT_NORM(-iX[6] * T[1] - iX[4] * T[0]);
476 oX[3] = MULT_NORM (iX[4] * T[1] - iX[6] * T[0]);
477 iX -= 8;
478 T += 4;
479 } while(iX >= in);
480
481 iX = in + n2 - 8;
482 oX = out + n2 + n4;
483 T = lookup->trig + n4;
484
485 do {
486 T -= 4;
487 oX[0] = MULT_NORM (iX[4] * T[3] + iX[6] * T[2]);
488 oX[1] = MULT_NORM (iX[4] * T[2] - iX[6] * T[3]);
489 oX[2] = MULT_NORM (iX[0] * T[1] + iX[2] * T[0]);
490 oX[3] = MULT_NORM (iX[0] * T[0] - iX[2] * T[1]);
491 iX -= 8;
492 oX += 4;
493 } while(iX >= in);
494
495 mdct_butterflies(lookup, out + n2, n2);
496 mdct_bitreverse(lookup, out);
497
498 /* roatate + window */
499
500 {
501 EEL_F *oX1 = out + n2 + n4;
502 EEL_F *oX2 = out + n2 + n4;
503 iX = out;
504 T = lookup->trig + n2;
505
506 do {
507 oX1 -= 4;
508
509 oX1[3] = MULT_NORM (iX[0] * T[1] - iX[1] * T[0]);
510 oX2[0] = -MULT_NORM (iX[0] * T[0] + iX[1] * T[1]);
511
512 oX1[2] = MULT_NORM (iX[2] * T[3] - iX[3] * T[2]);
513 oX2[1] = -MULT_NORM (iX[2] * T[2] + iX[3] * T[3]);
514
515 oX1[1] = MULT_NORM (iX[4] * T[5] - iX[5] * T[4]);
516 oX2[2] = -MULT_NORM (iX[4] * T[4] + iX[5] * T[5]);
517
518 oX1[0] = MULT_NORM (iX[6] * T[7] - iX[7] * T[6]);
519 oX2[3] = -MULT_NORM (iX[6] * T[6] + iX[7] * T[7]);
520
521 oX2 += 4;
522 iX += 8;
523 T += 8;
524 } while(iX < oX1);
525
526 iX = out + n2 + n4;
527 oX1 = out + n4;
528 oX2 = oX1;
529
530 do {
531 oX1 -= 4;
532 iX -= 4;
533
534 oX2[0] = -(oX1[3] = iX[3]);
535 oX2[1] = -(oX1[2] = iX[2]);
536 oX2[2] = -(oX1[1] = iX[1]);
537 oX2[3] = -(oX1[0] = iX[0]);
538
539 oX2 += 4;
540 } while(oX2 < iX);
541
542 iX = out + n2 + n4;
543 oX1 = out + n2 + n4;
544 oX2 = out + n2;
545 do {
546 oX1 -= 4;
547 oX1[0] = iX[3];
548 oX1[1] = iX[2];
549 oX1[2] = iX[1];
550 oX1[3] = iX[0];
551 iX += 4;
552 } while(oX1 > oX2);
553 }
554}
555
556
557static void megabuf_mdct_forward(void *init, EEL_F *in, EEL_F *out) {
558 mdct_lookup *lookup = (mdct_lookup *)init;
559 int n, n2, n4, n8;
560 EEL_F *w, *w2;
561 if (!lookup) return;
562
563 n = lookup->n;
564 if (n <= 32 || !lookup->bitrev || !lookup->trig)
565 {
566 mdct(in, out, n);
567 return;
568 }
569 n2 = n >> 1;
570 n4 = n >> 2;
571 n8 = n >> 3;
572 EEL_F oldw[1<<EEL_DCT_MAXBITLEN];
573 w = oldw;
574 w2 = w + n2;
575
576 /* rotate */
577
578 /* window + rotate + step 1 */
579
580 {
581 EEL_F r0;
582 EEL_F r1;
583 EEL_F *x0 = in + n2 + n4;
584 EEL_F *x1 = x0 + 1;
585 EEL_F *T = lookup->trig + n2;
586
587 int i = 0;
588
589 for(i = 0; i < n8; i += 2) {
590 x0 -= 4;
591 T -= 2;
592 r0 = x0[2] + x1[0];
593 r1 = x0[0] + x1[2];
594 w2[i] = MULT_NORM(r1 * T[1] + r0 * T[0]);
595 w2[i + 1] = MULT_NORM(r1 * T[0] - r0 * T[1]);
596 x1 += 4;
597 }
598
599 x1 = in + 1;
600
601 for(; i < n2 - n8; i += 2) {
602 T -= 2;
603 x0 -= 4;
604 r0 = x0[2] - x1[0];
605 r1 = x0[0] - x1[2];
606 w2[i] = MULT_NORM(r1 * T[1] + r0 * T[0]);
607 w2[i + 1] = MULT_NORM(r1 * T[0] - r0 * T[1]);
608 x1 += 4;
609 }
610
611 x0 = in + n;
612
613 for(; i < n2; i += 2) {
614 T -= 2;
615 x0 -= 4;
616 r0 = -x0[2] - x1[0];
617 r1 = -x0[0] - x1[2];
618 w2[i] = MULT_NORM(r1 * T[1] + r0 * T[0]);
619 w2[i + 1] = MULT_NORM(r1 * T[0] - r0 * T[1]);
620 x1 += 4;
621 }
622
623
624 mdct_butterflies(lookup, w + n2, n2);
625 mdct_bitreverse(lookup, w);
626
627 /* roatate + window */
628
629 T = lookup->trig + n2;
630 x0 = out + n2;
631
632 for(i = 0; i < n4; i++) {
633 x0--;
634 out[i] = MULT_NORM((w[0] * T[0] + w[1] * T[1]) * lookup->scale);
635 x0[0] = MULT_NORM((w[0] * T[1] - w[1] * T[0]) * lookup->scale);
636 w += 2;
637 T += 2;
638 }
639 }
640}
641
642#if 0
643
644static void dct(EEL_F *in, EEL_F *out, int len)
645{
646 int k;
647 EEL_F wk = sqrt(2.0 / len);
648 EEL_F overtwolen = 0.5 / (EEL_F)len;
649 for (k = 0; k < len; k ++)
650 {
651 int n;
652 EEL_F d = 0.0;
653 for (n = 0; n < len; n ++)
654 {
655 int an = n + 1;
656 d += in[n] * cos(PI * (2.0 * n + 1.0) * (EEL_F)k * overtwolen);
657 }
658 if (!k) d /= sqrt(len);
659 else d *= wk;
660 out[k] = (EEL_F)d;
661 }
662}
663
664
665static void idct(EEL_F *in, EEL_F *out, int len)
666{
667 int n;
668 EEL_F dd0 = 1.0 / sqrt(len);
669 EEL_F dd1 = sqrt(2.0 / len);
670 EEL_F overtwolen = 0.5 / len;
671 for (n = 0; n < len; n ++)
672 {
673 int k;
674 EEL_F d = 0.0;
675 for (k = 0; k < len; k ++)
676 {
677 EEL_F dd;
678 if (!k) dd = dd0 * in[k];
679 else dd = dd1 * in[k];
680 d += dd * cos(PI * (2.0 * n + 1.0) * k * overtwolen);
681 }
682 out[n] = (EEL_F)d;
683 }
684}
685#endif
686
687
688// 0 is megabuf blocks
689// 1 is need_free flag
690
691
692static EEL_F * NSEEL_CGEN_CALL mdct_func(int dir, EEL_F **blocks, EEL_F *start, EEL_F *length)
693{
694 int l = (int)(*length + 0.0001);
695 int offs = (int)(*start + 0.0001);
696 int bitl = 0;
697 int ilen;
698 int bidx;
699 EEL_F *ptr;
700 while (l > 1 && bitl < EEL_DCT_MAXBITLEN)
701 {
702 bitl++;
703 l >>= 1;
704 }
705 if (bitl < EEL_DCT_MINBITLEN)
706 {
707 return start;
708 }
709 ilen = 1 << bitl;
710
711 bidx = bitl - EEL_DCT_MINBITLEN;
712
713
714 // check to make sure we don't cross a boundary
715 if (offs / NSEEL_RAM_ITEMSPERBLOCK != (offs + ilen * 2 - 1) / NSEEL_RAM_ITEMSPERBLOCK)
716 {
717 return start;
718 }
719
720 ptr = __NSEEL_RAMAlloc(blocks, offs);
721 if (!ptr || ptr == &nseel_ramalloc_onfail)
722 {
723 return start;
724 }
725
726 if (ilen > 1)
727 {
728 static void *mdct_ctxs[1 + EEL_DCT_MAXBITLEN - EEL_DCT_MINBITLEN];
729
730 if (!mdct_ctxs[bidx])
731 {
733 if (!mdct_ctxs[bidx])
734 mdct_ctxs[bidx] = megabuf_mdct_init(ilen);
736 }
737
738 if (mdct_ctxs[bidx])
739 {
740 EEL_F buf[1 << EEL_DCT_MAXBITLEN];
741 if (dir < 0)
742 {
743 megabuf_mdct_backward(mdct_ctxs[bidx], ptr, buf);
744 megabuf_mdct_apply_window(mdct_ctxs[bidx], buf, ptr);
745 }
746 else
747 {
748 megabuf_mdct_apply_window(mdct_ctxs[bidx], ptr, buf);
749 megabuf_mdct_forward(mdct_ctxs[bidx], buf, ptr);
750 }
751 }
752 }
753 return start;
754}
755
756
757
758static EEL_F * NSEEL_CGEN_CALL megabuf_mdct(EEL_F **blocks, EEL_F *start, EEL_F *length)
759{
760 return mdct_func(0, blocks, start, length);
761}
762
763static EEL_F * NSEEL_CGEN_CALL megabuf_imdct(EEL_F **blocks, EEL_F *start, EEL_F *length)
764{
765 return mdct_func(-1, blocks, start, length);
766}
767
773
774#ifdef EEL_WANT_DOCUMENTATION
775static const char *eel_mdct_function_reference =
776"mdct\tbuffer,length\tPerforms a windowed modified DCT, taking length inputs and producing length/2 outputs. buffer must not cross a 65,536 item boundary, and length must be 64, 128, 256, 512, 2048 or 4096.\0"
777"imdct\tbuffer,length\tPerforms a windowed inverse modified DCT, taking length/2 inputs and producing length outputs. buffer must not cross a 65,536 item boundary, and length must be 64, 128, 256, 512, 2048 or 4096.\0"
778;
779#endif
780
781
782#endif
static const unsigned long mask[]
Definition bitwise.c:31
UINT_D64 w
Definition inflate.c:942
int * l
Definition inflate.c:1579
register unsigned k
Definition inflate.c:946
register unsigned j
Definition inflate.c:1576
unsigned d
Definition inflate.c:940
register unsigned i
Definition inflate.c:1575
unsigned x[BMAX+1]
Definition inflate.c:1586
#define NSEEL_addfunc_retptr(name, np, pproc, fptr)
Definition eel_import.h:55
void *(* NSEEL_PProc_RAM)(void *data, int data_size, struct _compileContext *ctx)
Definition eel_import.h:39
static EEL_F *NSEEL_CGEN_CALL megabuf_imdct(EEL_F **blocks, EEL_F *start, EEL_F *length)
Definition eel_mdct.h:763
static void megabuf_mdct_apply_window(void *init, EEL_F *inbuf, EEL_F *outbuf)
Definition eel_mdct.h:372
static void mdct_bitreverse(mdct_lookup *init, EEL_F *x)
Definition eel_mdct.h:322
static void mdct_butterfly_first(EEL_F *T, EEL_F *x, int points)
Definition eel_mdct.h:200
static void mdct_butterfly_32(EEL_F *x)
Definition eel_mdct.h:136
static void mdct_butterfly_generic(EEL_F *T, EEL_F *x, int points, int trigint)
Definition eel_mdct.h:247
#define PI
Definition eel_mdct.h:18
#define EEL_DCT_MAXBITLEN
Definition eel_mdct.h:15
static void megabuf_mdct_backward(void *init, EEL_F *in, EEL_F *out)
Definition eel_mdct.h:451
static void megabuf_mdct_forward(void *init, EEL_F *in, EEL_F *out)
Definition eel_mdct.h:557
#define HALVE(x)
Definition eel_mdct.h:72
static EEL_F *NSEEL_CGEN_CALL megabuf_mdct(EEL_F **blocks, EEL_F *start, EEL_F *length)
Definition eel_mdct.h:758
static void imdct(EEL_F *in, EEL_F *out, int len)
Definition eel_mdct.h:45
static EEL_F *NSEEL_CGEN_CALL mdct_func(int dir, EEL_F **blocks, EEL_F *start, EEL_F *length)
Definition eel_mdct.h:692
static void mdct_butterfly_16(EEL_F *x)
Definition eel_mdct.h:101
#define EEL_DCT_MINBITLEN
Definition eel_mdct.h:14
static void mdct(EEL_F *in, EEL_F *out, int len)
Definition eel_mdct.h:29
static void mdct_butterflies(mdct_lookup *init, EEL_F *x, int points)
Definition eel_mdct.h:300
static void * megabuf_mdct_init(int n)
Definition eel_mdct.h:390
static void mdct_butterfly_8(EEL_F *x)
Definition eel_mdct.h:77
#define FLOAT_CONV(x)
Definition eel_mdct.h:70
void EEL_mdct_register()
Definition eel_mdct.h:768
#define MULT_NORM(x)
Definition eel_mdct.h:71
static void r2(register WDL_FFT_REAL *a)
Definition fft.c:1089
virtual ASIOError start()=0
float in
Definition lilv_test.c:1460
float out
Definition lilv_test.c:1461
#define cPI1_8
Definition mdct.h:46
#define cPI3_8
Definition mdct.h:44
#define cPI2_8
Definition mdct.h:45
EEL_F *NSEEL_CGEN_CALL __NSEEL_RAMAlloc(EEL_F **blocks, unsigned int w)
Definition nseel-ram.c:139
EEL_F nseel_ramalloc_onfail
Definition nseel-ram.c:92
#define NSEEL_CGEN_CALL
Definition ns-eel.h:44
#define NSEEL_RAM_ITEMSPERBLOCK
Definition ns-eel.h:235
png_uint_32 length
Definition png.c:2247
Definition mdct.h:55
int log2n
Definition mdct.h:57
int n
Definition mdct.h:56
DATA_TYPE scale
Definition mdct.h:62
int * bitrev
Definition mdct.h:60
EEL_F * window
Definition eel_mdct.h:26
DATA_TYPE * trig
Definition mdct.h:59
int n
Definition crypt.c:458
uch * p
Definition crypt.c:594
return c
Definition crypt.c:175
ZCONST uch * init
Definition extract.c:2392
typedef int(UZ_EXP MsgFn)()
void NSEEL_HOSTSTUB_LeaveMutex()
Definition ysfx_api_eel.cpp:142
void NSEEL_HOSTSTUB_EnterMutex()
Definition ysfx_api_eel.cpp:138