455f5e5038593d56abf666b5e67ac5201bd959f0
2 synth_real.c: The functions for synthesizing real (float) samples, at the end of decoding.
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
9 #include "mpg123lib_intern.h"
14 #error "Do not build this file with fixed point math!"
17 Part 3: All synth functions that produce float output.
18 What we need is just a special WRITE_SAMPLE. For the generic and i386 functions, that is.
19 The optimized synths would need to be changed internally to support float output.
23 #define WRITE_SAMPLE(samples,sum,clip) WRITE_REAL_SAMPLE(samples,sum,clip)
25 /* Part 3a: All straight 1to1 decoding functions */
26 #define BLOCK 0x40 /* One decoding block is 64 samples. */
28 #define SYNTH_NAME synth_1to1_real
32 /* Mono-related synths; they wrap over _some_ synth_1to1_real (could be generic, could be i386). */
33 #define SYNTH_NAME fr->synths.plain[r_1to1][f_real]
34 #define MONO_NAME synth_1to1_real_mono
35 #define MONO2STEREO_NAME synth_1to1_real_m2s
36 #include "synth_mono.h"
39 #undef MONO2STEREO_NAME
42 #define NO_AUTOINCREMENT
43 #define SYNTH_NAME synth_1to1_real_i386
46 /* i386 uses the normal mono functions. */
47 #undef NO_AUTOINCREMENT
52 /* At least one optimized real decoder... */
54 /* Assembler routines. */
55 int synth_1to1_real_x86_64_asm(real
*window
, real
*b0
, real
*samples
, int bo1
);
56 int synth_1to1_real_s_x86_64_asm(real
*window
, real
*b0l
, real
*b0r
, real
*samples
, int bo1
);
57 void dct64_real_x86_64(real
*out0
, real
*out1
, real
*samples
);
58 /* Hull for C mpg123 API */
59 int synth_1to1_real_x86_64(real
*bandPtr
,int channel
, mpg123_handle
*fr
, int final
)
61 real
*samples
= (real
*) (fr
->buffer
.data
+fr
->buffer
.fill
);
66 if(fr
->have_eq_settings
) do_equalizer(bandPtr
,channel
,fr
->equalizer
);
72 buf
= fr
->real_buffs
[0];
77 buf
= fr
->real_buffs
[1];
84 dct64_real_x86_64(buf
[1]+((fr
->bo
+1)&0xf),buf
[0]+fr
->bo
,bandPtr
);
90 dct64_real_x86_64(buf
[0]+fr
->bo
,buf
[1]+fr
->bo
+1,bandPtr
);
93 synth_1to1_real_x86_64_asm(fr
->decwin
, b0
, samples
, bo1
);
95 if(final
) fr
->buffer
.fill
+= 256;
100 int synth_1to1_real_stereo_x86_64(real
*bandPtr_l
, real
*bandPtr_r
, mpg123_handle
*fr
)
102 real
*samples
= (real
*) (fr
->buffer
.data
+fr
->buffer
.fill
);
104 real
*b0l
, *b0r
, **bufl
, **bufr
;
107 if(fr
->have_eq_settings
)
109 do_equalizer(bandPtr_l
,0,fr
->equalizer
);
110 do_equalizer(bandPtr_r
,1,fr
->equalizer
);
115 bufl
= fr
->real_buffs
[0];
116 bufr
= fr
->real_buffs
[1];
123 dct64_real_x86_64(bufl
[1]+((fr
->bo
+1)&0xf),bufl
[0]+fr
->bo
,bandPtr_l
);
124 dct64_real_x86_64(bufr
[1]+((fr
->bo
+1)&0xf),bufr
[0]+fr
->bo
,bandPtr_r
);
131 dct64_real_x86_64(bufl
[0]+fr
->bo
,bufl
[1]+fr
->bo
+1,bandPtr_l
);
132 dct64_real_x86_64(bufr
[0]+fr
->bo
,bufr
[1]+fr
->bo
+1,bandPtr_r
);
135 synth_1to1_real_s_x86_64_asm(fr
->decwin
, b0l
, b0r
, samples
, bo1
);
137 fr
->buffer
.fill
+= 256;
144 /* Assembler routines. */
146 int synth_1to1_real_x86_64_asm(real
*window
, real
*b0
, real
*samples
, int bo1
);
148 int synth_1to1_real_s_avx_asm(real
*window
, real
*b0l
, real
*b0r
, real
*samples
, int bo1
);
149 void dct64_real_avx(real
*out0
, real
*out1
, real
*samples
);
150 /* Hull for C mpg123 API */
151 int synth_1to1_real_avx(real
*bandPtr
,int channel
, mpg123_handle
*fr
, int final
)
153 real
*samples
= (real
*) (fr
->buffer
.data
+fr
->buffer
.fill
);
158 if(fr
->have_eq_settings
) do_equalizer(bandPtr
,channel
,fr
->equalizer
);
164 buf
= fr
->real_buffs
[0];
169 buf
= fr
->real_buffs
[1];
176 dct64_real_avx(buf
[1]+((fr
->bo
+1)&0xf),buf
[0]+fr
->bo
,bandPtr
);
182 dct64_real_avx(buf
[0]+fr
->bo
,buf
[1]+fr
->bo
+1,bandPtr
);
185 synth_1to1_real_x86_64_asm(fr
->decwin
, b0
, samples
, bo1
);
187 if(final
) fr
->buffer
.fill
+= 256;
192 int synth_1to1_real_stereo_avx(real
*bandPtr_l
, real
*bandPtr_r
, mpg123_handle
*fr
)
194 real
*samples
= (real
*) (fr
->buffer
.data
+fr
->buffer
.fill
);
196 real
*b0l
, *b0r
, **bufl
, **bufr
;
199 if(fr
->have_eq_settings
)
201 do_equalizer(bandPtr_l
,0,fr
->equalizer
);
202 do_equalizer(bandPtr_r
,1,fr
->equalizer
);
207 bufl
= fr
->real_buffs
[0];
208 bufr
= fr
->real_buffs
[1];
215 dct64_real_avx(bufl
[1]+((fr
->bo
+1)&0xf),bufl
[0]+fr
->bo
,bandPtr_l
);
216 dct64_real_avx(bufr
[1]+((fr
->bo
+1)&0xf),bufr
[0]+fr
->bo
,bandPtr_r
);
223 dct64_real_avx(bufl
[0]+fr
->bo
,bufl
[1]+fr
->bo
+1,bandPtr_l
);
224 dct64_real_avx(bufr
[0]+fr
->bo
,bufr
[1]+fr
->bo
+1,bandPtr_r
);
227 synth_1to1_real_s_avx_asm(fr
->decwin
, b0l
, b0r
, samples
, bo1
);
229 fr
->buffer
.fill
+= 256;
235 #if defined(OPT_SSE) || defined(OPT_SSE_VINTAGE)
236 /* Assembler routines. */
237 int synth_1to1_real_sse_asm(real
*window
, real
*b0
, real
*samples
, int bo1
);
238 int synth_1to1_real_s_sse_asm(real
*window
, real
*b0l
, real
*b0r
, real
*samples
, int bo1
);
239 void dct64_real_sse(real
*out0
, real
*out1
, real
*samples
);
240 /* Hull for C mpg123 API */
241 int synth_1to1_real_sse(real
*bandPtr
,int channel
, mpg123_handle
*fr
, int final
)
243 real
*samples
= (real
*) (fr
->buffer
.data
+fr
->buffer
.fill
);
248 if(fr
->have_eq_settings
) do_equalizer(bandPtr
,channel
,fr
->equalizer
);
254 buf
= fr
->real_buffs
[0];
259 buf
= fr
->real_buffs
[1];
266 dct64_real_sse(buf
[1]+((fr
->bo
+1)&0xf),buf
[0]+fr
->bo
,bandPtr
);
272 dct64_real_sse(buf
[0]+fr
->bo
,buf
[1]+fr
->bo
+1,bandPtr
);
275 synth_1to1_real_sse_asm(fr
->decwin
, b0
, samples
, bo1
);
277 if(final
) fr
->buffer
.fill
+= 256;
282 int synth_1to1_real_stereo_sse(real
*bandPtr_l
, real
*bandPtr_r
, mpg123_handle
*fr
)
284 real
*samples
= (real
*) (fr
->buffer
.data
+fr
->buffer
.fill
);
286 real
*b0l
, *b0r
, **bufl
, **bufr
;
289 if(fr
->have_eq_settings
)
291 do_equalizer(bandPtr_l
,0,fr
->equalizer
);
292 do_equalizer(bandPtr_r
,1,fr
->equalizer
);
297 bufl
= fr
->real_buffs
[0];
298 bufr
= fr
->real_buffs
[1];
305 dct64_real_sse(bufl
[1]+((fr
->bo
+1)&0xf),bufl
[0]+fr
->bo
,bandPtr_l
);
306 dct64_real_sse(bufr
[1]+((fr
->bo
+1)&0xf),bufr
[0]+fr
->bo
,bandPtr_r
);
313 dct64_real_sse(bufl
[0]+fr
->bo
,bufl
[1]+fr
->bo
+1,bandPtr_l
);
314 dct64_real_sse(bufr
[0]+fr
->bo
,bufr
[1]+fr
->bo
+1,bandPtr_r
);
317 synth_1to1_real_s_sse_asm(fr
->decwin
, b0l
, b0r
, samples
, bo1
);
319 fr
->buffer
.fill
+= 256;
326 /* Assembler routines. */
327 int synth_1to1_real_neon_asm(real
*window
, real
*b0
, real
*samples
, int bo1
);
328 int synth_1to1_real_s_neon_asm(real
*window
, real
*b0l
, real
*b0r
, real
*samples
, int bo1
);
329 void dct64_real_neon(real
*out0
, real
*out1
, real
*samples
);
330 /* Hull for C mpg123 API */
331 int synth_1to1_real_neon(real
*bandPtr
,int channel
, mpg123_handle
*fr
, int final
)
333 real
*samples
= (real
*) (fr
->buffer
.data
+fr
->buffer
.fill
);
338 if(fr
->have_eq_settings
) do_equalizer(bandPtr
,channel
,fr
->equalizer
);
344 buf
= fr
->real_buffs
[0];
349 buf
= fr
->real_buffs
[1];
356 dct64_real_neon(buf
[1]+((fr
->bo
+1)&0xf),buf
[0]+fr
->bo
,bandPtr
);
362 dct64_real_neon(buf
[0]+fr
->bo
,buf
[1]+fr
->bo
+1,bandPtr
);
365 synth_1to1_real_neon_asm(fr
->decwin
, b0
, samples
, bo1
);
367 if(final
) fr
->buffer
.fill
+= 256;
371 int synth_1to1_real_stereo_neon(real
*bandPtr_l
, real
*bandPtr_r
, mpg123_handle
*fr
)
373 real
*samples
= (real
*) (fr
->buffer
.data
+fr
->buffer
.fill
);
375 real
*b0l
, *b0r
, **bufl
, **bufr
;
378 if(fr
->have_eq_settings
)
380 do_equalizer(bandPtr_l
,0,fr
->equalizer
);
381 do_equalizer(bandPtr_r
,1,fr
->equalizer
);
386 bufl
= fr
->real_buffs
[0];
387 bufr
= fr
->real_buffs
[1];
394 dct64_real_neon(bufl
[1]+((fr
->bo
+1)&0xf),bufl
[0]+fr
->bo
,bandPtr_l
);
395 dct64_real_neon(bufr
[1]+((fr
->bo
+1)&0xf),bufr
[0]+fr
->bo
,bandPtr_r
);
402 dct64_real_neon(bufl
[0]+fr
->bo
,bufl
[1]+fr
->bo
+1,bandPtr_l
);
403 dct64_real_neon(bufr
[0]+fr
->bo
,bufr
[1]+fr
->bo
+1,bandPtr_r
);
406 synth_1to1_real_s_neon_asm(fr
->decwin
, b0l
, b0r
, samples
, bo1
);
408 fr
->buffer
.fill
+= 256;
415 /* Assembler routines. */
416 int synth_1to1_real_neon64_asm(real
*window
, real
*b0
, real
*samples
, int bo1
);
417 int synth_1to1_real_s_neon64_asm(real
*window
, real
*b0l
, real
*b0r
, real
*samples
, int bo1
);
418 void dct64_real_neon64(real
*out0
, real
*out1
, real
*samples
);
419 /* Hull for C mpg123 API */
420 int synth_1to1_real_neon64(real
*bandPtr
,int channel
, mpg123_handle
*fr
, int final
)
422 real
*samples
= (real
*) (fr
->buffer
.data
+fr
->buffer
.fill
);
427 if(fr
->have_eq_settings
) do_equalizer(bandPtr
,channel
,fr
->equalizer
);
433 buf
= fr
->real_buffs
[0];
438 buf
= fr
->real_buffs
[1];
445 dct64_real_neon64(buf
[1]+((fr
->bo
+1)&0xf),buf
[0]+fr
->bo
,bandPtr
);
451 dct64_real_neon64(buf
[0]+fr
->bo
,buf
[1]+fr
->bo
+1,bandPtr
);
454 synth_1to1_real_neon64_asm(fr
->decwin
, b0
, samples
, bo1
);
456 if(final
) fr
->buffer
.fill
+= 256;
460 int synth_1to1_real_stereo_neon64(real
*bandPtr_l
, real
*bandPtr_r
, mpg123_handle
*fr
)
462 real
*samples
= (real
*) (fr
->buffer
.data
+fr
->buffer
.fill
);
464 real
*b0l
, *b0r
, **bufl
, **bufr
;
467 if(fr
->have_eq_settings
)
469 do_equalizer(bandPtr_l
,0,fr
->equalizer
);
470 do_equalizer(bandPtr_r
,1,fr
->equalizer
);
475 bufl
= fr
->real_buffs
[0];
476 bufr
= fr
->real_buffs
[1];
483 dct64_real_neon64(bufl
[1]+((fr
->bo
+1)&0xf),bufl
[0]+fr
->bo
,bandPtr_l
);
484 dct64_real_neon64(bufr
[1]+((fr
->bo
+1)&0xf),bufr
[0]+fr
->bo
,bandPtr_r
);
491 dct64_real_neon64(bufl
[0]+fr
->bo
,bufl
[1]+fr
->bo
+1,bandPtr_l
);
492 dct64_real_neon64(bufr
[0]+fr
->bo
,bufr
[1]+fr
->bo
+1,bandPtr_r
);
495 synth_1to1_real_s_neon64_asm(fr
->decwin
, b0l
, b0r
, samples
, bo1
);
497 fr
->buffer
.fill
+= 256;
503 #ifndef NO_DOWNSAMPLE
506 Part 3b: 2to1 synth. Only generic and i386.
508 #define BLOCK 0x20 /* One decoding block is 32 samples. */
510 #define SYNTH_NAME synth_2to1_real
514 /* Mono-related synths; they wrap over _some_ synth_2to1_real (could be generic, could be i386). */
515 #define SYNTH_NAME fr->synths.plain[r_2to1][f_real]
516 #define MONO_NAME synth_2to1_real_mono
517 #define MONO2STEREO_NAME synth_2to1_real_m2s
518 #include "synth_mono.h"
521 #undef MONO2STEREO_NAME
524 #define NO_AUTOINCREMENT
525 #define SYNTH_NAME synth_2to1_real_i386
528 /* i386 uses the normal mono functions. */
529 #undef NO_AUTOINCREMENT
535 Part 3c: 4to1 synth. Only generic and i386.
537 #define BLOCK 0x10 /* One decoding block is 16 samples. */
539 #define SYNTH_NAME synth_4to1_real
543 /* Mono-related synths; they wrap over _some_ synth_4to1_real (could be generic, could be i386). */
544 #define SYNTH_NAME fr->synths.plain[r_4to1][f_real]
545 #define MONO_NAME synth_4to1_real_mono
546 #define MONO2STEREO_NAME synth_4to1_real_m2s
547 #include "synth_mono.h"
550 #undef MONO2STEREO_NAME
553 #define NO_AUTOINCREMENT
554 #define SYNTH_NAME synth_4to1_real_i386
557 /* i386 uses the normal mono functions. */
558 #undef NO_AUTOINCREMENT
563 #endif /* NO_DOWNSAMPLE */
568 Same procedure as above... Just no extra play anymore, straight synth that may use an optimized dct64.
571 /* These are all in one header, there's no flexibility to gain. */
572 #define SYNTH_NAME synth_ntom_real
573 #define MONO_NAME synth_ntom_real_mono
574 #define MONO2STEREO_NAME synth_ntom_real_m2s
575 #include "synth_ntom.h"
578 #undef MONO2STEREO_NAME
585 #endif /* non-fixed type */