A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd
at master 79 lines 2.0 kB view raw
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