Use powf when available
[openal-soft.git] / OpenAL32 / Include / alu.h
bloba4e0930cab5d71afabcd7b932155be9bac877254
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 <math.h>
9 #ifdef HAVE_FLOAT_H
10 #include <float.h>
11 #endif
13 #ifndef M_PI
14 #define M_PI 3.14159265358979323846 /* pi */
15 #define M_PI_2 1.57079632679489661923 /* pi/2 */
16 #endif
18 #ifdef HAVE_POWF
19 #define aluPow(x,y) ((ALfloat)powf((float)(x),(float)(y)))
20 #else
21 #define aluPow(x,y) ((ALfloat)pow((double)(x),(double)(y)))
22 #endif
24 #ifdef HAVE_SQRTF
25 #define aluSqrt(x) ((ALfloat)sqrtf((float)(x)))
26 #else
27 #define aluSqrt(x) ((ALfloat)sqrt((double)(x)))
28 #endif
30 #ifdef HAVE_ACOSF
31 #define aluAcos(x) ((ALfloat)acosf((float)(x)))
32 #else
33 #define aluAcos(x) ((ALfloat)acos((double)(x)))
34 #endif
36 #ifdef HAVE_ATANF
37 #define aluAtan(x) ((ALfloat)atanf((float)(x)))
38 #else
39 #define aluAtan(x) ((ALfloat)atan((double)(x)))
40 #endif
42 #ifdef HAVE_FABSF
43 #define aluFabs(x) ((ALfloat)fabsf((float)(x)))
44 #else
45 #define aluFabs(x) ((ALfloat)fabs((double)(x)))
46 #endif
48 // fixes for mingw32.
49 #if defined(max) && !defined(__max)
50 #define __max max
51 #endif
52 #if defined(min) && !defined(__min)
53 #define __min min
54 #endif
56 #define QUADRANT_NUM 128
57 #define LUT_NUM (4 * QUADRANT_NUM)
59 #ifdef __cplusplus
60 extern "C" {
61 #endif
63 typedef enum {
64 FRONT_LEFT = 0,
65 FRONT_RIGHT,
66 FRONT_CENTER,
67 LFE,
68 BACK_LEFT,
69 BACK_RIGHT,
70 BACK_CENTER,
71 SIDE_LEFT,
72 SIDE_RIGHT,
74 OUTPUTCHANNELS
75 } Channel;
77 #define BUFFERSIZE 24000
79 extern ALboolean DuplicateStereo;
81 /* NOTE: The AL_FORMAT_REAR* enums aren't handled here be cause they're
82 * converted to AL_FORMAT_QUAD* when loaded */
83 static __inline ALuint aluBytesFromFormat(ALenum format)
85 switch(format)
87 case AL_FORMAT_MONO8:
88 case AL_FORMAT_STEREO8:
89 case AL_FORMAT_QUAD8_LOKI:
90 case AL_FORMAT_QUAD8:
91 case AL_FORMAT_51CHN8:
92 case AL_FORMAT_61CHN8:
93 case AL_FORMAT_71CHN8:
94 return 1;
96 case AL_FORMAT_MONO16:
97 case AL_FORMAT_STEREO16:
98 case AL_FORMAT_QUAD16_LOKI:
99 case AL_FORMAT_QUAD16:
100 case AL_FORMAT_51CHN16:
101 case AL_FORMAT_61CHN16:
102 case AL_FORMAT_71CHN16:
103 return 2;
105 case AL_FORMAT_MONO_FLOAT32:
106 case AL_FORMAT_STEREO_FLOAT32:
107 case AL_FORMAT_QUAD32:
108 case AL_FORMAT_51CHN32:
109 case AL_FORMAT_61CHN32:
110 case AL_FORMAT_71CHN32:
111 return 4;
113 default:
114 return 0;
117 static __inline ALuint aluChannelsFromFormat(ALenum format)
119 switch(format)
121 case AL_FORMAT_MONO8:
122 case AL_FORMAT_MONO16:
123 case AL_FORMAT_MONO_FLOAT32:
124 return 1;
126 case AL_FORMAT_STEREO8:
127 case AL_FORMAT_STEREO16:
128 case AL_FORMAT_STEREO_FLOAT32:
129 return 2;
131 case AL_FORMAT_QUAD8_LOKI:
132 case AL_FORMAT_QUAD16_LOKI:
133 case AL_FORMAT_QUAD8:
134 case AL_FORMAT_QUAD16:
135 case AL_FORMAT_QUAD32:
136 return 4;
138 case AL_FORMAT_51CHN8:
139 case AL_FORMAT_51CHN16:
140 case AL_FORMAT_51CHN32:
141 return 6;
143 case AL_FORMAT_61CHN8:
144 case AL_FORMAT_61CHN16:
145 case AL_FORMAT_61CHN32:
146 return 7;
148 case AL_FORMAT_71CHN8:
149 case AL_FORMAT_71CHN16:
150 case AL_FORMAT_71CHN32:
151 return 8;
153 default:
154 return 0;
158 static __inline ALint aluCart2LUTpos(ALfloat re, ALfloat im)
160 ALint pos = 0;
161 ALfloat denom = aluFabs(re) + aluFabs(im);
162 if(denom > 0.0f)
163 pos = (ALint)(QUADRANT_NUM*aluFabs(im) / denom + 0.5);
165 if(re < 0.0)
166 pos = 2 * QUADRANT_NUM - pos;
167 if(im < 0.0)
168 pos = LUT_NUM - pos;
169 return pos%LUT_NUM;
172 ALvoid aluInitPanning(ALCcontext *Context);
173 ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size);
174 ALvoid aluHandleDisconnect(ALCdevice *device);
176 #ifdef __cplusplus
178 #endif
180 #endif