Add a function to get the frame size from a format
[openal-soft/android/lowlatency.git] / OpenAL32 / Include / alu.h
blob55ddbaf65ad8787d7b06b2cad03371952e9e0fda
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 8192
79 /* NOTE: The AL_FORMAT_REAR* enums aren't handled here because they're
80 * converted to AL_FORMAT_QUAD* when loaded */
81 static __inline ALuint aluBytesFromFormat(ALenum format)
83 switch(format)
85 case AL_FORMAT_MONO8:
86 case AL_FORMAT_STEREO8:
87 case AL_FORMAT_QUAD8_LOKI:
88 case AL_FORMAT_QUAD8:
89 case AL_FORMAT_51CHN8:
90 case AL_FORMAT_61CHN8:
91 case AL_FORMAT_71CHN8:
92 return 1;
94 case AL_FORMAT_MONO16:
95 case AL_FORMAT_STEREO16:
96 case AL_FORMAT_QUAD16_LOKI:
97 case AL_FORMAT_QUAD16:
98 case AL_FORMAT_51CHN16:
99 case AL_FORMAT_61CHN16:
100 case AL_FORMAT_71CHN16:
101 return 2;
103 case AL_FORMAT_MONO_FLOAT32:
104 case AL_FORMAT_STEREO_FLOAT32:
105 case AL_FORMAT_QUAD32:
106 case AL_FORMAT_51CHN32:
107 case AL_FORMAT_61CHN32:
108 case AL_FORMAT_71CHN32:
109 return 4;
111 case AL_FORMAT_MONO_DOUBLE_EXT:
112 case AL_FORMAT_STEREO_DOUBLE_EXT:
113 return 8;
115 default:
116 return 0;
119 static __inline ALuint aluChannelsFromFormat(ALenum format)
121 switch(format)
123 case AL_FORMAT_MONO8:
124 case AL_FORMAT_MONO16:
125 case AL_FORMAT_MONO_FLOAT32:
126 case AL_FORMAT_MONO_DOUBLE_EXT:
127 return 1;
129 case AL_FORMAT_STEREO8:
130 case AL_FORMAT_STEREO16:
131 case AL_FORMAT_STEREO_FLOAT32:
132 case AL_FORMAT_STEREO_DOUBLE_EXT:
133 return 2;
135 case AL_FORMAT_QUAD8_LOKI:
136 case AL_FORMAT_QUAD16_LOKI:
137 case AL_FORMAT_QUAD8:
138 case AL_FORMAT_QUAD16:
139 case AL_FORMAT_QUAD32:
140 return 4;
142 case AL_FORMAT_51CHN8:
143 case AL_FORMAT_51CHN16:
144 case AL_FORMAT_51CHN32:
145 return 6;
147 case AL_FORMAT_61CHN8:
148 case AL_FORMAT_61CHN16:
149 case AL_FORMAT_61CHN32:
150 return 7;
152 case AL_FORMAT_71CHN8:
153 case AL_FORMAT_71CHN16:
154 case AL_FORMAT_71CHN32:
155 return 8;
157 default:
158 return 0;
161 static __inline ALuint aluFrameSizeFromFormat(ALenum format)
163 return aluBytesFromFormat(format) * aluChannelsFromFormat(format);
166 static __inline ALint aluCart2LUTpos(ALfloat re, ALfloat im)
168 ALint pos = 0;
169 ALfloat denom = aluFabs(re) + aluFabs(im);
170 if(denom > 0.0f)
171 pos = (ALint)(QUADRANT_NUM*aluFabs(im) / denom + 0.5);
173 if(re < 0.0)
174 pos = 2 * QUADRANT_NUM - pos;
175 if(im < 0.0)
176 pos = LUT_NUM - pos;
177 return pos%LUT_NUM;
180 ALvoid aluInitPanning(ALCdevice *Device);
181 ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size);
182 ALvoid aluHandleDisconnect(ALCdevice *device);
184 #ifdef __cplusplus
186 #endif
188 #endif