A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita
audio
rust
zig
deno
mpris
rockbox
mpd
1#ifndef __M_FIXED_H__
2#define __M_FIXED_H__
3
4#ifdef ROCKBOX
5#include "plugin.h"
6#endif
7
8typedef int t_sample;
9
10#define t_fixed int
11#define fix1 18 /* (18) number of bits after comma */
12
13
14#define fixfac ((float)(1<<fix1)) /* float factor (for scaling ftofix ..) */
15
16
17/* fixed point multiplication and division */
18
19#if defined(ROCKBOX) && !defined(SIMULATOR)
20#if defined(CPU_ARM)
21#define mult(A,B) \
22 ({ \
23 t_fixed lo; \
24 t_fixed hi; \
25 asm volatile ( \
26 "smull %[lo], %[hi], %[x], %[y] \n\t" /* multiply */ \
27 "mov %[lo], %[lo], lsr %[shr] \n\t" /* lo >>= fix1 */ \
28 "orr %[lo], %[lo], %[hi], lsl %[shl]" /* lo |= (hi << (32-fix1)) */ \
29 : [lo]"=&r"(lo), [hi]"=&r"(hi) \
30 : [x]"r"(A), [y]"r"(B), [shr]"r"(fix1), [shl]"r"(32-fix1)); \
31 lo; \
32 })
33#define idiv(a,b) ((((long long) (a) )<<fix1)/(long long) (b) )
34#else /* CPU_... */
35#define mult(a,b) (long long)(((long long) (a) * (long long) (b))>>fix1)
36#define idiv(a,b) ((((long long) (a) )<<fix1)/(long long) (b) )
37#endif /* CPU_... */
38#else /* ROCKBOX && !SIMULATOR */
39#define mult(a,b) (long long)(((long long) (a) * (long long) (b))>>fix1)
40#define idiv(a,b) ((((long long) (a) )<<fix1)/(long long) (b) )
41#endif /* ROCKBOX && !SIMULATOR */
42
43/* conversion macros */
44
45#define itofix(a) ((a) << fix1)
46#define ftofix(a) ((t_fixed)( (a) *(double)fixfac + 0.5))
47
48#define fixtof(a) ((double) (a) * 1./(fixfac-0.5))
49#define fixtoi(a) ((a) >>fix1)
50
51
52/* Not working !! */
53
54#define fnum(a) ( (a) >>(fix1-16))
55#define ffrac(a) (0)
56
57
58/* mapping of fft functions */
59
60#ifdef FIXEDPOINT
61#define mayer_realifft imayer_realifft
62#define mayer_realfft imayer_realfft
63#define mayer_fft imayer_fft
64#define mayer_ifft imayer_ifft
65#endif
66
67#ifdef FIXEDPOINT
68#define SCALE16(x) (x>>(fix1-15))
69#define SCALE32(x) (x<<(32-fix1))
70#define INVSCALE16(x) (x<<8)
71#else
72#define SCALE16(x) (32767.*x)
73#define SCALE32(x) (2147483648.*x)
74#define INVSCALE16(x) ((float)3.051850e-05*x)
75#endif
76
77
78#endif
79