Make a FRACTIONONE macro, and use it
[openal-soft.git] / OpenAL32 / Include / alu.h
blob05055bd17fe35a3d1aa8751162dcf4c738451164
1 #ifndef _ALU_H_
2 #define _ALU_H_
4 #include "AL/al.h"
5 #include "AL/alc.h"
6 #include "AL/alext.h"
8 #include <limits.h>
9 #include <math.h>
10 #ifdef HAVE_FLOAT_H
11 #include <float.h>
12 #endif
14 #ifndef M_PI
15 #define M_PI 3.14159265358979323846 /* pi */
16 #define M_PI_2 1.57079632679489661923 /* pi/2 */
17 #endif
19 #ifdef HAVE_POWF
20 #define aluPow(x,y) ((ALfloat)powf((float)(x),(float)(y)))
21 #else
22 #define aluPow(x,y) ((ALfloat)pow((double)(x),(double)(y)))
23 #endif
25 #ifdef HAVE_SQRTF
26 #define aluSqrt(x) ((ALfloat)sqrtf((float)(x)))
27 #else
28 #define aluSqrt(x) ((ALfloat)sqrt((double)(x)))
29 #endif
31 #ifdef HAVE_ACOSF
32 #define aluAcos(x) ((ALfloat)acosf((float)(x)))
33 #else
34 #define aluAcos(x) ((ALfloat)acos((double)(x)))
35 #endif
37 #ifdef HAVE_ATANF
38 #define aluAtan(x) ((ALfloat)atanf((float)(x)))
39 #else
40 #define aluAtan(x) ((ALfloat)atan((double)(x)))
41 #endif
43 #ifdef HAVE_FABSF
44 #define aluFabs(x) ((ALfloat)fabsf((float)(x)))
45 #else
46 #define aluFabs(x) ((ALfloat)fabs((double)(x)))
47 #endif
49 // fixes for mingw32.
50 #if defined(max) && !defined(__max)
51 #define __max max
52 #endif
53 #if defined(min) && !defined(__min)
54 #define __min min
55 #endif
57 #define QUADRANT_NUM 128
58 #define LUT_NUM (4 * QUADRANT_NUM)
60 #ifdef __cplusplus
61 extern "C" {
62 #endif
64 typedef enum {
65 FRONT_LEFT = 0,
66 FRONT_RIGHT,
67 FRONT_CENTER,
68 LFE,
69 BACK_LEFT,
70 BACK_RIGHT,
71 BACK_CENTER,
72 SIDE_LEFT,
73 SIDE_RIGHT,
75 OUTPUTCHANNELS
76 } Channel;
78 #define BUFFERSIZE 8192
80 #define FRACTIONBITS (14)
81 #define FRACTIONONE (1<<FRACTIONBITS)
82 #define FRACTIONMASK (FRACTIONONE-1)
83 #define MAX_PITCH (INT_MAX & ~FRACTIONMASK)
85 /* NOTE: The AL_FORMAT_REAR* enums aren't handled here because they're
86 * converted to AL_FORMAT_QUAD* when loaded */
87 static __inline ALuint aluBytesFromFormat(ALenum format)
89 switch(format)
91 case AL_FORMAT_MONO8:
92 case AL_FORMAT_STEREO8:
93 case AL_FORMAT_QUAD8_LOKI:
94 case AL_FORMAT_QUAD8:
95 case AL_FORMAT_51CHN8:
96 case AL_FORMAT_61CHN8:
97 case AL_FORMAT_71CHN8:
98 return 1;
100 case AL_FORMAT_MONO16:
101 case AL_FORMAT_STEREO16:
102 case AL_FORMAT_QUAD16_LOKI:
103 case AL_FORMAT_QUAD16:
104 case AL_FORMAT_51CHN16:
105 case AL_FORMAT_61CHN16:
106 case AL_FORMAT_71CHN16:
107 return 2;
109 case AL_FORMAT_MONO_FLOAT32:
110 case AL_FORMAT_STEREO_FLOAT32:
111 case AL_FORMAT_QUAD32:
112 case AL_FORMAT_51CHN32:
113 case AL_FORMAT_61CHN32:
114 case AL_FORMAT_71CHN32:
115 return 4;
117 case AL_FORMAT_MONO_DOUBLE_EXT:
118 case AL_FORMAT_STEREO_DOUBLE_EXT:
119 return 8;
121 default:
122 return 0;
125 static __inline ALuint aluChannelsFromFormat(ALenum format)
127 switch(format)
129 case AL_FORMAT_MONO8:
130 case AL_FORMAT_MONO16:
131 case AL_FORMAT_MONO_FLOAT32:
132 case AL_FORMAT_MONO_DOUBLE_EXT:
133 return 1;
135 case AL_FORMAT_STEREO8:
136 case AL_FORMAT_STEREO16:
137 case AL_FORMAT_STEREO_FLOAT32:
138 case AL_FORMAT_STEREO_DOUBLE_EXT:
139 return 2;
141 case AL_FORMAT_QUAD8_LOKI:
142 case AL_FORMAT_QUAD16_LOKI:
143 case AL_FORMAT_QUAD8:
144 case AL_FORMAT_QUAD16:
145 case AL_FORMAT_QUAD32:
146 return 4;
148 case AL_FORMAT_51CHN8:
149 case AL_FORMAT_51CHN16:
150 case AL_FORMAT_51CHN32:
151 return 6;
153 case AL_FORMAT_61CHN8:
154 case AL_FORMAT_61CHN16:
155 case AL_FORMAT_61CHN32:
156 return 7;
158 case AL_FORMAT_71CHN8:
159 case AL_FORMAT_71CHN16:
160 case AL_FORMAT_71CHN32:
161 return 8;
163 default:
164 return 0;
167 static __inline ALuint aluFrameSizeFromFormat(ALenum format)
169 return aluBytesFromFormat(format) * aluChannelsFromFormat(format);
172 static __inline ALint aluCart2LUTpos(ALfloat re, ALfloat im)
174 ALint pos = 0;
175 ALfloat denom = aluFabs(re) + aluFabs(im);
176 if(denom > 0.0f)
177 pos = (ALint)(QUADRANT_NUM*aluFabs(im) / denom + 0.5);
179 if(re < 0.0)
180 pos = 2 * QUADRANT_NUM - pos;
181 if(im < 0.0)
182 pos = LUT_NUM - pos;
183 return pos%LUT_NUM;
186 static __inline ALdouble lerp(ALdouble val1, ALdouble val2, ALdouble mu)
188 val1 += (val2-val1) * mu;
189 return val1;
191 static __inline ALdouble cubic(ALdouble val0, ALdouble val1, ALdouble val2, ALdouble val3, ALdouble mu)
193 ALdouble mu2 = mu*mu;
194 ALdouble a0 = -0.5*val0 + 1.5*val1 + -1.5*val2 + 0.5*val3;
195 ALdouble a1 = val0 + -2.5*val1 + 2.0*val2 + -0.5*val3;
196 ALdouble a2 = -0.5*val0 + 0.5*val2;
197 ALdouble a3 = val1;
199 return a0*mu*mu2 + a1*mu2 + a2*mu + a3;
202 struct ALsource;
204 ALvoid aluInitPanning(ALCdevice *Device);
206 ALvoid CalcSourceParams(struct ALsource *ALSource, const ALCcontext *ALContext);
207 ALvoid CalcNonAttnSourceParams(struct ALsource *ALSource, const ALCcontext *ALContext);
209 ALvoid MixSource(struct ALsource *Source, ALCdevice *Device, ALuint SamplesToDo);
211 ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size);
212 ALvoid aluHandleDisconnect(ALCdevice *device);
214 #ifdef __cplusplus
216 #endif
218 #endif