Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wine-mirror
GitHub Repository: wine-mirror/wine
Path: blob/master/libs/mpg123/src/libmpg123/synth.c
4394 views
1
/*
2
synth.c: The functions for synthesizing samples, at the end of decoding.
3
4
copyright 1995-2008 by the mpg123 project - free software under the terms of the LGPL 2.1
5
see COPYING and AUTHORS files in distribution or http://mpg123.org
6
initially written by Michael Hipp, heavily dissected and rearranged by Thomas Orgis
7
*/
8
9
#include "mpg123lib_intern.h"
10
#ifdef OPT_GENERIC_DITHER
11
#define FORCE_ACCURATE
12
#endif
13
#include "../common/sample.h"
14
#include "../common/debug.h"
15
16
/*
17
Part 1: All synth functions that produce signed short.
18
That is:
19
- INT123_synth_1to1 with cpu-specific variants (INT123_synth_1to1_i386, INT123_synth_1to1_i586 ...)
20
- INT123_synth_1to1_mono and INT123_synth_1to1_m2s; which use fr->synths.plain[r_1to1][f_16].
21
Nearly every decoder variant has it's own INT123_synth_1to1, while the mono conversion is shared.
22
*/
23
24
#define SAMPLE_T short
25
#define WRITE_SAMPLE(samples,sum,clip) WRITE_SHORT_SAMPLE(samples,sum,clip)
26
27
/* Part 1a: All straight 1to1 decoding functions */
28
#define BLOCK 0x40 /* One decoding block is 64 samples. */
29
30
#define SYNTH_NAME INT123_synth_1to1
31
#include "synth.h"
32
#undef SYNTH_NAME
33
34
/* Mono-related synths; they wrap over _some_ INT123_synth_1to1. */
35
#define SYNTH_NAME fr->synths.plain[r_1to1][f_16]
36
#define MONO_NAME INT123_synth_1to1_mono
37
#define MONO2STEREO_NAME INT123_synth_1to1_m2s
38
#include "synth_mono.h"
39
#undef SYNTH_NAME
40
#undef MONO_NAME
41
#undef MONO2STEREO_NAME
42
43
/* Now we have possibly some special INT123_synth_1to1 ...
44
... they produce signed short; the mono functions defined above work on the special synths, too. */
45
46
#ifdef OPT_GENERIC_DITHER
47
#define SYNTH_NAME INT123_synth_1to1_dither
48
/* We need the accurate sample writing... */
49
#undef WRITE_SAMPLE
50
#define WRITE_SAMPLE(samples,sum,clip) WRITE_SHORT_SAMPLE_ACCURATE(samples,sum,clip)
51
52
#define USE_DITHER
53
#include "synth.h"
54
#undef USE_DITHER
55
#undef SYNTH_NAME
56
57
#undef WRITE_SAMPLE
58
#define WRITE_SAMPLE(samples,sum,clip) WRITE_SHORT_SAMPLE(samples,sum,clip)
59
60
#endif
61
62
#ifdef OPT_X86
63
/* The i386-specific C code, here as short variant, later 8bit and float. */
64
#define NO_AUTOINCREMENT
65
#define SYNTH_NAME INT123_synth_1to1_i386
66
#include "synth.h"
67
#undef SYNTH_NAME
68
/* i386 uses the normal mono functions. */
69
#undef NO_AUTOINCREMENT
70
#endif
71
72
#undef BLOCK /* Following functions are so special that they don't need this. */
73
74
#ifdef OPT_I586
75
/* This is defined in assembler. */
76
int INT123_synth_1to1_i586_asm(real *bandPtr, int channel, unsigned char *out, unsigned char *buffs, int *bo, real *decwin);
77
/* This is just a hull to use the mpg123 handle. */
78
int INT123_synth_1to1_i586(real *bandPtr, int channel, mpg123_handle *fr, int final)
79
{
80
int ret;
81
#ifndef NO_EQUALIZER
82
if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer);
83
#endif
84
ret = INT123_synth_1to1_i586_asm(bandPtr, channel, fr->buffer.data+fr->buffer.fill, fr->rawbuffs, &fr->bo, fr->decwin);
85
if(final) fr->buffer.fill += 128;
86
return ret;
87
}
88
#endif
89
90
#ifdef OPT_I586_DITHER
91
/* This is defined in assembler. */
92
int INT123_synth_1to1_i586_asm_dither(real *bandPtr, int channel, unsigned char *out, unsigned char *buffs, int *bo, real *decwin, float *dithernoise);
93
/* This is just a hull to use the mpg123 handle. */
94
int INT123_synth_1to1_i586_dither(real *bandPtr, int channel, mpg123_handle *fr, int final)
95
{
96
int ret;
97
int bo_dither[2]; /* Temporary workaround? Could expand the asm code. */
98
#ifndef NO_EQUALIZER
99
if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer);
100
#endif
101
/* Applying this hack, to change the asm only bit by bit (adding dithernoise pointer). */
102
bo_dither[0] = fr->bo;
103
bo_dither[1] = fr->ditherindex;
104
ret = INT123_synth_1to1_i586_asm_dither(bandPtr, channel, fr->buffer.data+fr->buffer.fill, fr->rawbuffs, bo_dither, fr->decwin, fr->dithernoise);
105
fr->bo = bo_dither[0];
106
fr->ditherindex = bo_dither[1];
107
108
if(final) fr->buffer.fill += 128;
109
return ret;
110
}
111
#endif
112
113
#if defined(OPT_3DNOW) || defined(OPT_3DNOW_VINTAGE)
114
/* Those are defined in assembler. */
115
void INT123_do_equalizer_3dnow(real *bandPtr,int channel, real equalizer[2][32]);
116
int INT123_synth_1to1_3dnow_asm(real *bandPtr, int channel, unsigned char *out, unsigned char *buffs, int *bo, real *decwin);
117
/* This is just a hull to use the mpg123 handle. */
118
int INT123_synth_1to1_3dnow(real *bandPtr, int channel, mpg123_handle *fr, int final)
119
{
120
int ret;
121
#ifndef NO_EQUALIZER
122
if(fr->have_eq_settings) INT123_do_equalizer_3dnow(bandPtr,channel,fr->equalizer);
123
#endif
124
/* this is in asm, can be dither or not */
125
/* uh, is this return from pointer correct? */
126
ret = (int) INT123_synth_1to1_3dnow_asm(bandPtr, channel, fr->buffer.data+fr->buffer.fill, fr->rawbuffs, &fr->bo, fr->decwin);
127
if(final) fr->buffer.fill += 128;
128
return ret;
129
}
130
#endif
131
132
#ifdef OPT_MMX
133
/* This is defined in assembler. */
134
int INT123_synth_1to1_MMX(real *bandPtr, int channel, short *out, short *buffs, int *bo, float *decwins);
135
/* This is just a hull to use the mpg123 handle. */
136
int INT123_synth_1to1_mmx(real *bandPtr, int channel, mpg123_handle *fr, int final)
137
{
138
#ifndef NO_EQUALIZER
139
if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer);
140
#endif
141
/* in asm */
142
INT123_synth_1to1_MMX(bandPtr, channel, (short*) (fr->buffer.data+fr->buffer.fill), (short *) fr->rawbuffs, &fr->bo, fr->decwins);
143
if(final) fr->buffer.fill += 128;
144
return 0;
145
}
146
#endif
147
148
#if defined(OPT_SSE) || defined(OPT_SSE_VINTAGE)
149
#ifdef ACCURATE_ROUNDING
150
/* This is defined in assembler. */
151
int INT123_synth_1to1_sse_accurate_asm(real *window, real *b0, short *samples, int bo1);
152
int INT123_synth_1to1_s_sse_accurate_asm(real *window, real *b0l, real *b0r, short *samples, int bo1);
153
void INT123_dct64_real_sse(real *out0, real *out1, real *samples);
154
/* This is just a hull to use the mpg123 handle. */
155
int INT123_synth_1to1_sse(real *bandPtr,int channel, mpg123_handle *fr, int final)
156
{
157
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
158
real *b0, **buf;
159
int clip;
160
int bo1;
161
#ifndef NO_EQUALIZER
162
if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer);
163
#endif
164
if(!channel)
165
{
166
fr->bo--;
167
fr->bo &= 0xf;
168
buf = fr->real_buffs[0];
169
}
170
else
171
{
172
samples++;
173
buf = fr->real_buffs[1];
174
}
175
176
if(fr->bo & 0x1)
177
{
178
b0 = buf[0];
179
bo1 = fr->bo;
180
INT123_dct64_real_sse(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr);
181
}
182
else
183
{
184
b0 = buf[1];
185
bo1 = fr->bo+1;
186
INT123_dct64_real_sse(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
187
}
188
189
clip = INT123_synth_1to1_sse_accurate_asm(fr->decwin, b0, samples, bo1);
190
191
if(final) fr->buffer.fill += 128;
192
193
return clip;
194
}
195
196
int INT123_synth_1to1_stereo_sse(real *bandPtr_l, real *bandPtr_r, mpg123_handle *fr)
197
{
198
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
199
200
real *b0l, *b0r, **bufl, **bufr;
201
int bo1;
202
int clip;
203
#ifndef NO_EQUALIZER
204
if(fr->have_eq_settings)
205
{
206
INT123_do_equalizer(bandPtr_l,0,fr->equalizer);
207
INT123_do_equalizer(bandPtr_r,1,fr->equalizer);
208
}
209
#endif
210
fr->bo--;
211
fr->bo &= 0xf;
212
bufl = fr->real_buffs[0];
213
bufr = fr->real_buffs[1];
214
215
if(fr->bo & 0x1)
216
{
217
b0l = bufl[0];
218
b0r = bufr[0];
219
bo1 = fr->bo;
220
INT123_dct64_real_sse(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l);
221
INT123_dct64_real_sse(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r);
222
}
223
else
224
{
225
b0l = bufl[1];
226
b0r = bufr[1];
227
bo1 = fr->bo+1;
228
INT123_dct64_real_sse(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l);
229
INT123_dct64_real_sse(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r);
230
}
231
232
clip = INT123_synth_1to1_s_sse_accurate_asm(fr->decwin, b0l, b0r, samples, bo1);
233
234
fr->buffer.fill += 128;
235
236
return clip;
237
}
238
#else
239
/* This is defined in assembler. */
240
void INT123_synth_1to1_sse_asm(real *bandPtr, int channel, short *samples, short *buffs, int *bo, real *decwin);
241
/* This is just a hull to use the mpg123 handle. */
242
int INT123_synth_1to1_sse(real *bandPtr, int channel, mpg123_handle *fr, int final)
243
{
244
#ifndef NO_EQUALIZER
245
if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer);
246
#endif
247
INT123_synth_1to1_sse_asm(bandPtr, channel, (short*) (fr->buffer.data+fr->buffer.fill), (short *) fr->rawbuffs, &fr->bo, fr->decwins);
248
if(final) fr->buffer.fill += 128;
249
return 0;
250
}
251
#endif
252
#endif
253
254
#if defined(OPT_3DNOWEXT) || defined(OPT_3DNOWEXT_VINTAGE)
255
/* This is defined in assembler. */
256
void INT123_synth_1to1_3dnowext_asm(real *bandPtr, int channel, short *samples, short *buffs, int *bo, real *decwin);
257
/* This is just a hull to use the mpg123 handle. */
258
int INT123_synth_1to1_3dnowext(real *bandPtr, int channel, mpg123_handle *fr, int final)
259
{
260
#ifndef NO_EQUALIZER
261
if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer);
262
#endif
263
INT123_synth_1to1_3dnowext_asm(bandPtr, channel, (short*) (fr->buffer.data+fr->buffer.fill), (short *) fr->rawbuffs, &fr->bo, fr->decwins);
264
if(final) fr->buffer.fill += 128;
265
return 0;
266
}
267
#endif
268
269
#ifdef OPT_X86_64
270
#ifdef ACCURATE_ROUNDING
271
/* Assembler routines. */
272
int INT123_synth_1to1_x86_64_accurate_asm(real *window, real *b0, short *samples, int bo1);
273
int INT123_synth_1to1_s_x86_64_accurate_asm(real *window, real *b0l, real *b0r, short *samples, int bo1);
274
void INT123_dct64_real_x86_64(real *out0, real *out1, real *samples);
275
/* Hull for C mpg123 API */
276
int INT123_synth_1to1_x86_64(real *bandPtr,int channel, mpg123_handle *fr, int final)
277
{
278
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
279
280
real *b0, **buf;
281
int bo1;
282
int clip;
283
#ifndef NO_EQUALIZER
284
if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer);
285
#endif
286
if(!channel)
287
{
288
fr->bo--;
289
fr->bo &= 0xf;
290
buf = fr->real_buffs[0];
291
}
292
else
293
{
294
samples++;
295
buf = fr->real_buffs[1];
296
}
297
298
if(fr->bo & 0x1)
299
{
300
b0 = buf[0];
301
bo1 = fr->bo;
302
INT123_dct64_real_x86_64(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr);
303
}
304
else
305
{
306
b0 = buf[1];
307
bo1 = fr->bo+1;
308
INT123_dct64_real_x86_64(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
309
}
310
311
clip = INT123_synth_1to1_x86_64_accurate_asm(fr->decwin, b0, samples, bo1);
312
313
if(final) fr->buffer.fill += 128;
314
315
return clip;
316
}
317
318
int INT123_synth_1to1_stereo_x86_64(real *bandPtr_l, real *bandPtr_r, mpg123_handle *fr)
319
{
320
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
321
322
real *b0l, *b0r, **bufl, **bufr;
323
int bo1;
324
int clip;
325
#ifndef NO_EQUALIZER
326
if(fr->have_eq_settings)
327
{
328
INT123_do_equalizer(bandPtr_l,0,fr->equalizer);
329
INT123_do_equalizer(bandPtr_r,1,fr->equalizer);
330
}
331
#endif
332
fr->bo--;
333
fr->bo &= 0xf;
334
bufl = fr->real_buffs[0];
335
bufr = fr->real_buffs[1];
336
337
if(fr->bo & 0x1)
338
{
339
b0l = bufl[0];
340
b0r = bufr[0];
341
bo1 = fr->bo;
342
INT123_dct64_real_x86_64(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l);
343
INT123_dct64_real_x86_64(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r);
344
}
345
else
346
{
347
b0l = bufl[1];
348
b0r = bufr[1];
349
bo1 = fr->bo+1;
350
INT123_dct64_real_x86_64(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l);
351
INT123_dct64_real_x86_64(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r);
352
}
353
354
clip = INT123_synth_1to1_s_x86_64_accurate_asm(fr->decwin, b0l, b0r, samples, bo1);
355
356
fr->buffer.fill += 128;
357
358
return clip;
359
}
360
#else
361
/* This is defined in assembler. */
362
int INT123_synth_1to1_x86_64_asm(short *window, short *b0, short *samples, int bo1);
363
int INT123_synth_1to1_s_x86_64_asm(short *window, short *b0l, short *b0r, short *samples, int bo1);
364
void INT123_dct64_x86_64(short *out0, short *out1, real *samples);
365
/* This is just a hull to use the mpg123 handle. */
366
int INT123_synth_1to1_x86_64(real *bandPtr,int channel, mpg123_handle *fr, int final)
367
{
368
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
369
short *b0, **buf;
370
int clip;
371
int bo1;
372
#ifndef NO_EQUALIZER
373
if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer);
374
#endif
375
if(!channel)
376
{
377
fr->bo--;
378
fr->bo &= 0xf;
379
buf = fr->short_buffs[0];
380
}
381
else
382
{
383
samples++;
384
buf = fr->short_buffs[1];
385
}
386
387
if(fr->bo & 0x1)
388
{
389
b0 = buf[0];
390
bo1 = fr->bo;
391
INT123_dct64_x86_64(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr);
392
}
393
else
394
{
395
b0 = buf[1];
396
bo1 = fr->bo+1;
397
INT123_dct64_x86_64(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
398
}
399
400
clip = INT123_synth_1to1_x86_64_asm((short *)fr->decwins, b0, samples, bo1);
401
402
if(final) fr->buffer.fill += 128;
403
404
return clip;
405
}
406
407
int INT123_synth_1to1_stereo_x86_64(real *bandPtr_l,real *bandPtr_r, mpg123_handle *fr)
408
{
409
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
410
short *b0l, *b0r, **bufl, **bufr;
411
int clip;
412
int bo1;
413
#ifndef NO_EQUALIZER
414
if(fr->have_eq_settings)
415
{
416
INT123_do_equalizer(bandPtr_l,0,fr->equalizer);
417
INT123_do_equalizer(bandPtr_r,1,fr->equalizer);
418
}
419
#endif
420
fr->bo--;
421
fr->bo &= 0xf;
422
bufl = fr->short_buffs[0];
423
bufr = fr->short_buffs[1];
424
425
if(fr->bo & 0x1)
426
{
427
b0l = bufl[0];
428
b0r = bufr[0];
429
bo1 = fr->bo;
430
INT123_dct64_x86_64(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l);
431
INT123_dct64_x86_64(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r);
432
}
433
else
434
{
435
b0l = bufl[1];
436
b0r = bufr[1];
437
bo1 = fr->bo+1;
438
INT123_dct64_x86_64(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l);
439
INT123_dct64_x86_64(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r);
440
}
441
442
clip = INT123_synth_1to1_s_x86_64_asm((short *)fr->decwins, b0l, b0r, samples, bo1);
443
444
fr->buffer.fill += 128;
445
446
return clip;
447
}
448
#endif
449
#endif
450
451
#ifdef OPT_AVX
452
#ifdef ACCURATE_ROUNDING
453
/* Assembler routines. */
454
#ifndef OPT_X86_64
455
int INT123_synth_1to1_x86_64_accurate_asm(real *window, real *b0, short *samples, int bo1);
456
#endif
457
int INT123_synth_1to1_s_avx_accurate_asm(real *window, real *b0l, real *b0r, short *samples, int bo1);
458
void INT123_dct64_real_avx(real *out0, real *out1, real *samples);
459
/* Hull for C mpg123 API */
460
int INT123_synth_1to1_avx(real *bandPtr,int channel, mpg123_handle *fr, int final)
461
{
462
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
463
464
real *b0, **buf;
465
int bo1;
466
int clip;
467
#ifndef NO_EQUALIZER
468
if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer);
469
#endif
470
if(!channel)
471
{
472
fr->bo--;
473
fr->bo &= 0xf;
474
buf = fr->real_buffs[0];
475
}
476
else
477
{
478
samples++;
479
buf = fr->real_buffs[1];
480
}
481
482
if(fr->bo & 0x1)
483
{
484
b0 = buf[0];
485
bo1 = fr->bo;
486
INT123_dct64_real_avx(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr);
487
}
488
else
489
{
490
b0 = buf[1];
491
bo1 = fr->bo+1;
492
INT123_dct64_real_avx(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
493
}
494
495
clip = INT123_synth_1to1_x86_64_accurate_asm(fr->decwin, b0, samples, bo1);
496
497
if(final) fr->buffer.fill += 128;
498
499
return clip;
500
}
501
502
int INT123_synth_1to1_stereo_avx(real *bandPtr_l, real *bandPtr_r, mpg123_handle *fr)
503
{
504
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
505
506
real *b0l, *b0r, **bufl, **bufr;
507
int bo1;
508
int clip;
509
#ifndef NO_EQUALIZER
510
if(fr->have_eq_settings)
511
{
512
INT123_do_equalizer(bandPtr_l,0,fr->equalizer);
513
INT123_do_equalizer(bandPtr_r,1,fr->equalizer);
514
}
515
#endif
516
fr->bo--;
517
fr->bo &= 0xf;
518
bufl = fr->real_buffs[0];
519
bufr = fr->real_buffs[1];
520
521
if(fr->bo & 0x1)
522
{
523
b0l = bufl[0];
524
b0r = bufr[0];
525
bo1 = fr->bo;
526
INT123_dct64_real_avx(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l);
527
INT123_dct64_real_avx(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r);
528
}
529
else
530
{
531
b0l = bufl[1];
532
b0r = bufr[1];
533
bo1 = fr->bo+1;
534
INT123_dct64_real_avx(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l);
535
INT123_dct64_real_avx(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r);
536
}
537
538
clip = INT123_synth_1to1_s_avx_accurate_asm(fr->decwin, b0l, b0r, samples, bo1);
539
540
fr->buffer.fill += 128;
541
542
return clip;
543
}
544
#else
545
/* This is defined in assembler. */
546
#ifndef OPT_X86_64
547
int INT123_synth_1to1_x86_64_asm(short *window, short *b0, short *samples, int bo1);
548
#endif
549
int INT123_synth_1to1_s_avx_asm(short *window, short *b0l, short *b0r, short *samples, int bo1);
550
void INT123_dct64_avx(short *out0, short *out1, real *samples);
551
/* This is just a hull to use the mpg123 handle. */
552
int INT123_synth_1to1_avx(real *bandPtr,int channel, mpg123_handle *fr, int final)
553
{
554
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
555
short *b0, **buf;
556
int clip;
557
int bo1;
558
#ifndef NO_EQUALIZER
559
if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer);
560
#endif
561
if(!channel)
562
{
563
fr->bo--;
564
fr->bo &= 0xf;
565
buf = fr->short_buffs[0];
566
}
567
else
568
{
569
samples++;
570
buf = fr->short_buffs[1];
571
}
572
573
if(fr->bo & 0x1)
574
{
575
b0 = buf[0];
576
bo1 = fr->bo;
577
INT123_dct64_avx(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr);
578
}
579
else
580
{
581
b0 = buf[1];
582
bo1 = fr->bo+1;
583
INT123_dct64_avx(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
584
}
585
586
clip = INT123_synth_1to1_x86_64_asm((short *)fr->decwins, b0, samples, bo1);
587
588
if(final) fr->buffer.fill += 128;
589
590
return clip;
591
}
592
593
int INT123_synth_1to1_stereo_avx(real *bandPtr_l,real *bandPtr_r, mpg123_handle *fr)
594
{
595
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
596
short *b0l, *b0r, **bufl, **bufr;
597
int clip;
598
int bo1;
599
#ifndef NO_EQUALIZER
600
if(fr->have_eq_settings)
601
{
602
INT123_do_equalizer(bandPtr_l,0,fr->equalizer);
603
INT123_do_equalizer(bandPtr_r,1,fr->equalizer);
604
}
605
#endif
606
fr->bo--;
607
fr->bo &= 0xf;
608
bufl = fr->short_buffs[0];
609
bufr = fr->short_buffs[1];
610
611
if(fr->bo & 0x1)
612
{
613
b0l = bufl[0];
614
b0r = bufr[0];
615
bo1 = fr->bo;
616
INT123_dct64_avx(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l);
617
INT123_dct64_avx(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r);
618
}
619
else
620
{
621
b0l = bufl[1];
622
b0r = bufr[1];
623
bo1 = fr->bo+1;
624
INT123_dct64_avx(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l);
625
INT123_dct64_avx(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r);
626
}
627
628
clip = INT123_synth_1to1_s_avx_asm((short *)fr->decwins, b0l, b0r, samples, bo1);
629
630
fr->buffer.fill += 128;
631
632
return clip;
633
}
634
#endif
635
#endif
636
637
#ifdef OPT_ARM
638
#ifdef ACCURATE_ROUNDING
639
/* Assembler routines. */
640
int INT123_synth_1to1_arm_accurate_asm(real *window, real *b0, short *samples, int bo1);
641
/* Hull for C mpg123 API */
642
int INT123_synth_1to1_arm(real *bandPtr,int channel, mpg123_handle *fr, int final)
643
{
644
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
645
646
real *b0, **buf;
647
int bo1;
648
int clip;
649
#ifndef NO_EQUALIZER
650
if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer);
651
#endif
652
if(!channel)
653
{
654
fr->bo--;
655
fr->bo &= 0xf;
656
buf = fr->real_buffs[0];
657
}
658
else
659
{
660
samples++;
661
buf = fr->real_buffs[1];
662
}
663
664
if(fr->bo & 0x1)
665
{
666
b0 = buf[0];
667
bo1 = fr->bo;
668
INT123_dct64(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr);
669
}
670
else
671
{
672
b0 = buf[1];
673
bo1 = fr->bo+1;
674
INT123_dct64(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
675
}
676
677
clip = INT123_synth_1to1_arm_accurate_asm(fr->decwin, b0, samples, bo1);
678
679
if(final) fr->buffer.fill += 128;
680
681
return clip;
682
}
683
#else
684
/* Assembler routines. */
685
int INT123_synth_1to1_arm_asm(real *window, real *b0, short *samples, int bo1);
686
/* Hull for C mpg123 API */
687
int INT123_synth_1to1_arm(real *bandPtr,int channel, mpg123_handle *fr, int final)
688
{
689
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
690
691
real *b0, **buf;
692
int bo1;
693
int clip;
694
#ifndef NO_EQUALIZER
695
if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer);
696
#endif
697
if(!channel)
698
{
699
fr->bo--;
700
fr->bo &= 0xf;
701
buf = fr->real_buffs[0];
702
}
703
else
704
{
705
samples++;
706
buf = fr->real_buffs[1];
707
}
708
709
if(fr->bo & 0x1)
710
{
711
b0 = buf[0];
712
bo1 = fr->bo;
713
INT123_dct64(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr);
714
}
715
else
716
{
717
b0 = buf[1];
718
bo1 = fr->bo+1;
719
INT123_dct64(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
720
}
721
722
clip = INT123_synth_1to1_arm_asm(fr->decwin, b0, samples, bo1);
723
724
if(final) fr->buffer.fill += 128;
725
726
return clip;
727
}
728
#endif
729
#endif
730
731
#ifdef OPT_NEON
732
#ifdef ACCURATE_ROUNDING
733
/* This is defined in assembler. */
734
int INT123_synth_1to1_neon_accurate_asm(real *window, real *b0, short *samples, int bo1);
735
int INT123_synth_1to1_s_neon_accurate_asm(real *window, real *b0l, real *b0r, short *samples, int bo1);
736
void INT123_dct64_real_neon(real *out0, real *out1, real *samples);
737
/* Hull for C mpg123 API */
738
int INT123_synth_1to1_neon(real *bandPtr,int channel, mpg123_handle *fr, int final)
739
{
740
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
741
742
real *b0, **buf;
743
int bo1;
744
int clip;
745
#ifndef NO_EQUALIZER
746
if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer);
747
#endif
748
if(!channel)
749
{
750
fr->bo--;
751
fr->bo &= 0xf;
752
buf = fr->real_buffs[0];
753
}
754
else
755
{
756
samples++;
757
buf = fr->real_buffs[1];
758
}
759
760
if(fr->bo & 0x1)
761
{
762
b0 = buf[0];
763
bo1 = fr->bo;
764
INT123_dct64_real_neon(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr);
765
}
766
else
767
{
768
b0 = buf[1];
769
bo1 = fr->bo+1;
770
INT123_dct64_real_neon(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
771
}
772
773
clip = INT123_synth_1to1_neon_accurate_asm(fr->decwin, b0, samples, bo1);
774
775
if(final) fr->buffer.fill += 128;
776
777
return clip;
778
}
779
780
int INT123_synth_1to1_stereo_neon(real *bandPtr_l, real *bandPtr_r, mpg123_handle *fr)
781
{
782
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
783
784
real *b0l, *b0r, **bufl, **bufr;
785
int bo1;
786
int clip;
787
#ifndef NO_EQUALIZER
788
if(fr->have_eq_settings)
789
{
790
INT123_do_equalizer(bandPtr_l,0,fr->equalizer);
791
INT123_do_equalizer(bandPtr_r,1,fr->equalizer);
792
}
793
#endif
794
fr->bo--;
795
fr->bo &= 0xf;
796
bufl = fr->real_buffs[0];
797
bufr = fr->real_buffs[1];
798
799
if(fr->bo & 0x1)
800
{
801
b0l = bufl[0];
802
b0r = bufr[0];
803
bo1 = fr->bo;
804
INT123_dct64_real_neon(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l);
805
INT123_dct64_real_neon(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r);
806
}
807
else
808
{
809
b0l = bufl[1];
810
b0r = bufr[1];
811
bo1 = fr->bo+1;
812
INT123_dct64_real_neon(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l);
813
INT123_dct64_real_neon(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r);
814
}
815
816
clip = INT123_synth_1to1_s_neon_accurate_asm(fr->decwin, b0l, b0r, samples, bo1);
817
818
fr->buffer.fill += 128;
819
820
return clip;
821
}
822
#else
823
/* This is defined in assembler. */
824
int INT123_synth_1to1_neon_asm(short *window, short *b0, short *samples, int bo1);
825
int INT123_synth_1to1_s_neon_asm(short *window, short *b0l, short *b0r, short *samples, int bo1);
826
void INT123_dct64_neon(short *out0, short *out1, real *samples);
827
/* Hull for C mpg123 API */
828
int INT123_synth_1to1_neon(real *bandPtr,int channel, mpg123_handle *fr, int final)
829
{
830
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
831
short *b0, **buf;
832
int clip;
833
int bo1;
834
#ifndef NO_EQUALIZER
835
if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer);
836
#endif
837
if(!channel)
838
{
839
fr->bo--;
840
fr->bo &= 0xf;
841
buf = fr->short_buffs[0];
842
}
843
else
844
{
845
samples++;
846
buf = fr->short_buffs[1];
847
}
848
849
if(fr->bo & 0x1)
850
{
851
b0 = buf[0];
852
bo1 = fr->bo;
853
INT123_dct64_neon(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr);
854
}
855
else
856
{
857
b0 = buf[1];
858
bo1 = fr->bo+1;
859
INT123_dct64_neon(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
860
}
861
862
clip = INT123_synth_1to1_neon_asm((short *)fr->decwins, b0, samples, bo1);
863
864
if(final) fr->buffer.fill += 128;
865
866
return clip;
867
}
868
869
int INT123_synth_1to1_stereo_neon(real *bandPtr_l,real *bandPtr_r, mpg123_handle *fr)
870
{
871
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
872
short *b0l, *b0r, **bufl, **bufr;
873
int clip;
874
int bo1;
875
#ifndef NO_EQUALIZER
876
if(fr->have_eq_settings)
877
{
878
INT123_do_equalizer(bandPtr_l,0,fr->equalizer);
879
INT123_do_equalizer(bandPtr_r,1,fr->equalizer);
880
}
881
#endif
882
fr->bo--;
883
fr->bo &= 0xf;
884
bufl = fr->short_buffs[0];
885
bufr = fr->short_buffs[1];
886
887
if(fr->bo & 0x1)
888
{
889
b0l = bufl[0];
890
b0r = bufr[0];
891
bo1 = fr->bo;
892
INT123_dct64_neon(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l);
893
INT123_dct64_neon(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r);
894
}
895
else
896
{
897
b0l = bufl[1];
898
b0r = bufr[1];
899
bo1 = fr->bo+1;
900
INT123_dct64_neon(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l);
901
INT123_dct64_neon(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r);
902
}
903
904
clip = INT123_synth_1to1_s_neon_asm((short *)fr->decwins, b0l, b0r, samples, bo1);
905
906
fr->buffer.fill += 128;
907
908
return clip;
909
}
910
#endif
911
#endif
912
913
#ifdef OPT_NEON64
914
#ifdef ACCURATE_ROUNDING
915
/* This is defined in assembler. */
916
int INT123_synth_1to1_neon64_accurate_asm(real *window, real *b0, short *samples, int bo1);
917
int INT123_synth_1to1_s_neon64_accurate_asm(real *window, real *b0l, real *b0r, short *samples, int bo1);
918
void INT123_dct64_real_neon64(real *out0, real *out1, real *samples);
919
/* Hull for C mpg123 API */
920
int INT123_synth_1to1_neon64(real *bandPtr,int channel, mpg123_handle *fr, int final)
921
{
922
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
923
924
real *b0, **buf;
925
int bo1;
926
int clip;
927
#ifndef NO_EQUALIZER
928
if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer);
929
#endif
930
if(!channel)
931
{
932
fr->bo--;
933
fr->bo &= 0xf;
934
buf = fr->real_buffs[0];
935
}
936
else
937
{
938
samples++;
939
buf = fr->real_buffs[1];
940
}
941
942
if(fr->bo & 0x1)
943
{
944
b0 = buf[0];
945
bo1 = fr->bo;
946
INT123_dct64_real_neon64(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr);
947
}
948
else
949
{
950
b0 = buf[1];
951
bo1 = fr->bo+1;
952
INT123_dct64_real_neon64(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
953
}
954
955
clip = INT123_synth_1to1_neon64_accurate_asm(fr->decwin, b0, samples, bo1);
956
957
if(final) fr->buffer.fill += 128;
958
959
return clip;
960
}
961
962
int INT123_synth_1to1_stereo_neon64(real *bandPtr_l, real *bandPtr_r, mpg123_handle *fr)
963
{
964
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
965
966
real *b0l, *b0r, **bufl, **bufr;
967
int bo1;
968
int clip;
969
#ifndef NO_EQUALIZER
970
if(fr->have_eq_settings)
971
{
972
INT123_do_equalizer(bandPtr_l,0,fr->equalizer);
973
INT123_do_equalizer(bandPtr_r,1,fr->equalizer);
974
}
975
#endif
976
fr->bo--;
977
fr->bo &= 0xf;
978
bufl = fr->real_buffs[0];
979
bufr = fr->real_buffs[1];
980
981
if(fr->bo & 0x1)
982
{
983
b0l = bufl[0];
984
b0r = bufr[0];
985
bo1 = fr->bo;
986
INT123_dct64_real_neon64(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l);
987
INT123_dct64_real_neon64(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r);
988
}
989
else
990
{
991
b0l = bufl[1];
992
b0r = bufr[1];
993
bo1 = fr->bo+1;
994
INT123_dct64_real_neon64(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l);
995
INT123_dct64_real_neon64(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r);
996
}
997
998
clip = INT123_synth_1to1_s_neon64_accurate_asm(fr->decwin, b0l, b0r, samples, bo1);
999
1000
fr->buffer.fill += 128;
1001
1002
return clip;
1003
}
1004
#else
1005
/* This is defined in assembler. */
1006
int INT123_synth_1to1_neon64_asm(short *window, short *b0, short *samples, int bo1);
1007
int INT123_synth_1to1_s_neon64_asm(short *window, short *b0l, short *b0r, short *samples, int bo1);
1008
void INT123_dct64_neon64(short *out0, short *out1, real *samples);
1009
/* Hull for C mpg123 API */
1010
int INT123_synth_1to1_neon64(real *bandPtr,int channel, mpg123_handle *fr, int final)
1011
{
1012
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
1013
short *b0, **buf;
1014
int clip;
1015
int bo1;
1016
#ifndef NO_EQUALIZER
1017
if(fr->have_eq_settings) INT123_do_equalizer(bandPtr,channel,fr->equalizer);
1018
#endif
1019
if(!channel)
1020
{
1021
fr->bo--;
1022
fr->bo &= 0xf;
1023
buf = fr->short_buffs[0];
1024
}
1025
else
1026
{
1027
samples++;
1028
buf = fr->short_buffs[1];
1029
}
1030
1031
if(fr->bo & 0x1)
1032
{
1033
b0 = buf[0];
1034
bo1 = fr->bo;
1035
INT123_dct64_neon64(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr);
1036
}
1037
else
1038
{
1039
b0 = buf[1];
1040
bo1 = fr->bo+1;
1041
INT123_dct64_neon64(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
1042
}
1043
1044
clip = INT123_synth_1to1_neon64_asm((short *)fr->decwins, b0, samples, bo1);
1045
1046
if(final) fr->buffer.fill += 128;
1047
1048
return clip;
1049
}
1050
1051
int INT123_synth_1to1_stereo_neon64(real *bandPtr_l,real *bandPtr_r, mpg123_handle *fr)
1052
{
1053
short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
1054
short *b0l, *b0r, **bufl, **bufr;
1055
int clip;
1056
int bo1;
1057
#ifndef NO_EQUALIZER
1058
if(fr->have_eq_settings)
1059
{
1060
INT123_do_equalizer(bandPtr_l,0,fr->equalizer);
1061
INT123_do_equalizer(bandPtr_r,1,fr->equalizer);
1062
}
1063
#endif
1064
fr->bo--;
1065
fr->bo &= 0xf;
1066
bufl = fr->short_buffs[0];
1067
bufr = fr->short_buffs[1];
1068
1069
if(fr->bo & 0x1)
1070
{
1071
b0l = bufl[0];
1072
b0r = bufr[0];
1073
bo1 = fr->bo;
1074
INT123_dct64_neon64(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l);
1075
INT123_dct64_neon64(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r);
1076
}
1077
else
1078
{
1079
b0l = bufl[1];
1080
b0r = bufr[1];
1081
bo1 = fr->bo+1;
1082
INT123_dct64_neon64(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l);
1083
INT123_dct64_neon64(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r);
1084
}
1085
1086
clip = INT123_synth_1to1_s_neon64_asm((short *)fr->decwins, b0l, b0r, samples, bo1);
1087
1088
fr->buffer.fill += 128;
1089
1090
return clip;
1091
}
1092
#endif
1093
#endif
1094
1095
#ifndef NO_DOWNSAMPLE
1096
1097
/*
1098
Part 1b: 2to1 synth.
1099
Only generic and i386 functions this time.
1100
*/
1101
#define BLOCK 0x20 /* One decoding block is 32 samples. */
1102
1103
#define SYNTH_NAME INT123_synth_2to1
1104
#include "synth.h"
1105
#undef SYNTH_NAME
1106
1107
#ifdef OPT_DITHER /* Used for generic_dither and as fallback for i586_dither. */
1108
#define SYNTH_NAME INT123_synth_2to1_dither
1109
#define USE_DITHER
1110
#include "synth.h"
1111
#undef USE_DITHER
1112
#undef SYNTH_NAME
1113
#endif
1114
1115
#define SYNTH_NAME fr->synths.plain[r_2to1][f_16]
1116
#define MONO_NAME INT123_synth_2to1_mono
1117
#define MONO2STEREO_NAME INT123_synth_2to1_m2s
1118
#include "synth_mono.h"
1119
#undef SYNTH_NAME
1120
#undef MONO_NAME
1121
#undef MONO2STEREO_NAME
1122
1123
#ifdef OPT_X86
1124
#define NO_AUTOINCREMENT
1125
#define SYNTH_NAME INT123_synth_2to1_i386
1126
#include "synth.h"
1127
#undef SYNTH_NAME
1128
/* i386 uses the normal mono functions. */
1129
#undef NO_AUTOINCREMENT
1130
#endif
1131
1132
#undef BLOCK
1133
1134
/*
1135
Part 1c: 4to1 synth.
1136
Same procedure as above...
1137
*/
1138
#define BLOCK 0x10 /* One decoding block is 16 samples. */
1139
1140
#define SYNTH_NAME INT123_synth_4to1
1141
#include "synth.h"
1142
#undef SYNTH_NAME
1143
1144
#ifdef OPT_DITHER
1145
#define SYNTH_NAME INT123_synth_4to1_dither
1146
#define USE_DITHER
1147
#include "synth.h"
1148
#undef USE_DITHER
1149
#undef SYNTH_NAME
1150
#endif
1151
1152
#define SYNTH_NAME fr->synths.plain[r_4to1][f_16] /* This is just for the _i386 one... gotta check if it is really useful... */
1153
#define MONO_NAME INT123_synth_4to1_mono
1154
#define MONO2STEREO_NAME INT123_synth_4to1_m2s
1155
#include "synth_mono.h"
1156
#undef SYNTH_NAME
1157
#undef MONO_NAME
1158
#undef MONO2STEREO_NAME
1159
1160
#ifdef OPT_X86
1161
#define NO_AUTOINCREMENT
1162
#define SYNTH_NAME INT123_synth_4to1_i386
1163
#include "synth.h"
1164
#undef SYNTH_NAME
1165
/* i386 uses the normal mono functions. */
1166
#undef NO_AUTOINCREMENT
1167
#endif
1168
1169
#undef BLOCK
1170
1171
#endif /* NO_DOWNSAMPLE */
1172
1173
#ifndef NO_NTOM
1174
/*
1175
Part 1d: ntom synth.
1176
Same procedure as above... Just no extra play anymore, straight synth that uses the plain INT123_dct64.
1177
*/
1178
1179
/* These are all in one header, there's no flexibility to gain. */
1180
#define SYNTH_NAME INT123_synth_ntom
1181
#define MONO_NAME INT123_synth_ntom_mono
1182
#define MONO2STEREO_NAME INT123_synth_ntom_m2s
1183
#include "synth_ntom.h"
1184
#undef SYNTH_NAME
1185
#undef MONO_NAME
1186
#undef MONO2STEREO_NAME
1187
1188
#endif
1189
1190
/* Done with short output. */
1191
#undef SAMPLE_T
1192
#undef WRITE_SAMPLE
1193
1194