33 #include "static_assert.h"
41 #define ALC_SOFT_HRTF 1
42 #define ALC_HRTF_SOFT 0x1992
45 #ifndef ALC_SOFT_midi_interface
46 #define ALC_SOFT_midi_interface 1
47 #define AL_MIDI_CLOCK_SOFT 0x9999
48 #define AL_MIDI_STATE_SOFT 0x9986
49 #define AL_MIDI_GAIN_SOFT 0x9998
50 #define AL_MIDI_PRESET_SOFT 0x9997
51 #define AL_MIDI_BANK_SOFT 0x9996
52 #define AL_SOUNDFONTS_SIZE_SOFT 0x9995
53 #define AL_SOUNDFONTS_SOFT 0x9994
54 #define AL_PRESETS_SIZE_SOFT 0x9993
55 #define AL_PRESETS_SOFT 0x9992
56 #define AL_FONTSOUNDS_SIZE_SOFT 0x9991
57 #define AL_FONTSOUNDS_SOFT 0x9990
59 #define AL_SOURCE0_INPUT_SOFT 0x998F
60 #define AL_SOURCE0_TYPE_SOFT 0x998E
61 #define AL_SOURCE0_FORM_SOFT 0x998D
62 #define AL_SOURCE1_INPUT_SOFT 0x998C
63 #define AL_SOURCE1_TYPE_SOFT 0x998B
64 #define AL_SOURCE1_FORM_SOFT 0x998A
65 #define AL_AMOUNT_SOFT 0x9989
66 #define AL_TRANSFORM_OP_SOFT 0x9988
67 #define AL_DESTINATION_SOFT 0x9987
70 #define AL_ONE_SOFT 0x0080
71 #define AL_NOTEON_VELOCITY_SOFT 0x0082
72 #define AL_NOTEON_KEY_SOFT 0x0083
73 /* AL_KEYPRESSURE_SOFT */
74 /* AL_CHANNELPRESSURE_SOFT */
75 /* AL_PITCHBEND_SOFT */
76 #define AL_PITCHBEND_SENSITIVITY_SOFT 0x0090
80 #define AL_UNORM_SOFT 0x0000
81 #define AL_UNORM_REV_SOFT 0x0100
82 #define AL_SNORM_SOFT 0x0200
83 #define AL_SNORM_REV_SOFT 0x0300
86 #define AL_LINEAR_SOFT 0x0000
87 #define AL_CONCAVE_SOFT 0x0400
88 #define AL_CONVEX_SOFT 0x0800
89 #define AL_SWITCH_SOFT 0x0C00
93 #define AL_ABSOLUTE_SOFT 0x0002
95 #define AL_SAMPLE_START_SOFT 0x2000
96 #define AL_SAMPLE_END_SOFT 0x2001
97 #define AL_SAMPLE_LOOP_START_SOFT 0x2002
98 #define AL_SAMPLE_LOOP_END_SOFT 0x2003
99 #define AL_SAMPLE_RATE_SOFT 0x2004
100 #define AL_BASE_KEY_SOFT 0x2005
101 #define AL_KEY_CORRECTION_SOFT 0x2006
102 #define AL_SAMPLE_TYPE_SOFT 0x2007
103 #define AL_FONTSOUND_LINK_SOFT 0x2008
104 #define AL_MOD_LFO_TO_PITCH_SOFT 0x0005
105 #define AL_VIBRATO_LFO_TO_PITCH_SOFT 0x0006
106 #define AL_MOD_ENV_TO_PITCH_SOFT 0x0007
107 #define AL_FILTER_CUTOFF_SOFT 0x0008
108 #define AL_FILTER_RESONANCE_SOFT 0x0009
109 #define AL_MOD_LFO_TO_FILTER_CUTOFF_SOFT 0x000A
110 #define AL_MOD_ENV_TO_FILTER_CUTOFF_SOFT 0x000B
111 #define AL_MOD_LFO_TO_VOLUME_SOFT 0x000D
112 #define AL_CHORUS_SEND_SOFT 0x000F
113 #define AL_REVERB_SEND_SOFT 0x0010
114 #define AL_PAN_SOFT 0x0011
115 #define AL_MOD_LFO_DELAY_SOFT 0x0015
116 #define AL_MOD_LFO_FREQUENCY_SOFT 0x0016
117 #define AL_VIBRATO_LFO_DELAY_SOFT 0x0017
118 #define AL_VIBRATO_LFO_FREQUENCY_SOFT 0x0018
119 #define AL_MOD_ENV_DELAYTIME_SOFT 0x0019
120 #define AL_MOD_ENV_ATTACKTIME_SOFT 0x001A
121 #define AL_MOD_ENV_HOLDTIME_SOFT 0x001B
122 #define AL_MOD_ENV_DECAYTIME_SOFT 0x001C
123 #define AL_MOD_ENV_SUSTAINVOLUME_SOFT 0x001D
124 #define AL_MOD_ENV_RELEASETIME_SOFT 0x002E
125 #define AL_MOD_ENV_KEY_TO_HOLDTIME_SOFT 0x001F
126 #define AL_MOD_ENV_KEY_TO_DECAYTIME_SOFT 0x0020
127 #define AL_VOLUME_ENV_DELAYTIME_SOFT 0x0021
128 #define AL_VOLUME_ENV_ATTACKTIME_SOFT 0x0022
129 #define AL_VOLUME_ENV_HOLDTIME_SOFT 0x0023
130 #define AL_VOLUME_ENV_DECAYTIME_SOFT 0x0024
131 #define AL_VOLUME_ENV_SUSTAINVOLUME_SOFT 0x0025
132 #define AL_VOLUME_ENV_RELEASETIME_SOFT 0x0026
133 #define AL_VOLUME_ENV_KEY_TO_HOLDTIME_SOFT 0x0027
134 #define AL_VOLUME_ENV_KEY_TO_DECAYTIME_SOFT 0x0028
135 #define AL_KEY_RANGE_SOFT 0x002B
136 #define AL_VELOCITY_RANGE_SOFT 0x002C
137 #define AL_ATTENUATION_SOFT 0x0030
138 #define AL_TUNING_COARSE_SOFT 0x0033
139 #define AL_TUNING_FINE_SOFT 0x0034
140 #define AL_LOOP_MODE_SOFT 0x0036
141 #define AL_TUNING_SCALE_SOFT 0x0038
142 #define AL_EXCLUSIVE_CLASS_SOFT 0x0039
143 #define AL_LOOP_CONTINUOUS_SOFT 0x0001
144 #define AL_LOOP_UNTIL_RELEASE_SOFT 0x0003
145 #define AL_RIGHT_SOFT 0x0002
146 #define AL_LEFT_SOFT 0x0004
147 #define AL_NOTEOFF_SOFT 0x0080
148 #define AL_NOTEON_SOFT 0x0090
149 #define AL_KEYPRESSURE_SOFT 0x00A0
150 #define AL_CONTROLLERCHANGE_SOFT 0x00B0
151 #define AL_PROGRAMCHANGE_SOFT 0x00C0
152 #define AL_CHANNELPRESSURE_SOFT 0x00D0
153 #define AL_PITCHBEND_SOFT 0x00E0
154 typedef void (AL_APIENTRY
*LPALGENSOUNDFONTSSOFT
)(ALsizei n
, ALuint
*ids
);
155 typedef void (AL_APIENTRY
*LPALDELETESOUNDFONTSSOFT
)(ALsizei n
, const ALuint
*ids
);
156 typedef ALboolean (AL_APIENTRY
*LPALISSOUNDFONTSOFT
)(ALuint id
);
157 typedef void (AL_APIENTRY
*LPALGETSOUNDFONTIVSOFT
)(ALuint id
, ALenum param
, ALint
*values
);
158 typedef void (AL_APIENTRY
*LPALSOUNDFONTPRESETSSOFT
)(ALuint id
, ALsizei count
, const ALuint
*pids
);
159 typedef void (AL_APIENTRY
*LPALGENPRESETSSOFT
)(ALsizei n
, ALuint
*ids
);
160 typedef void (AL_APIENTRY
*LPALDELETEPRESETSSOFT
)(ALsizei n
, const ALuint
*ids
);
161 typedef ALboolean (AL_APIENTRY
*LPALISPRESETSOFT
)(ALuint id
);
162 typedef void (AL_APIENTRY
*LPALPRESETISOFT
)(ALuint id
, ALenum param
, ALint value
);
163 typedef void (AL_APIENTRY
*LPALPRESETIVSOFT
)(ALuint id
, ALenum param
, const ALint
*values
);
164 typedef void (AL_APIENTRY
*LPALPRESETFONTSOUNDSSOFT
)(ALuint id
, ALsizei count
, const ALuint
*fsids
);
165 typedef void (AL_APIENTRY
*LPALGETPRESETIVSOFT
)(ALuint id
, ALenum param
, ALint
*values
);
166 typedef void (AL_APIENTRY
*LPALGENFONTSOUNDSSOFT
)(ALsizei n
, ALuint
*ids
);
167 typedef void (AL_APIENTRY
*LPALDELETEFONTSOUNDSSOFT
)(ALsizei n
, const ALuint
*ids
);
168 typedef ALboolean (AL_APIENTRY
*LPALISFONTSOUNDSOFT
)(ALuint id
);
169 typedef void (AL_APIENTRY
*LPALFONTSOUNDISOFT
)(ALuint id
, ALenum param
, ALint value
);
170 typedef void (AL_APIENTRY
*LPALFONTSOUND2ISOFT
)(ALuint id
, ALenum param
, ALint value1
, ALint value2
);
171 typedef void (AL_APIENTRY
*LPALFONTSOUNDIVSOFT
)(ALuint id
, ALenum param
, const ALint
*values
);
172 typedef void (AL_APIENTRY
*LPALGETFONTSOUNDIVSOFT
)(ALuint id
, ALenum param
, ALint
*values
);
173 typedef void (AL_APIENTRY
*LPALFONTSOUNDMOFULATORISOFT
)(ALuint id
, ALsizei stage
, ALenum param
, ALint value
);
174 typedef void (AL_APIENTRY
*LPALGETFONTSOUNDMODULATORIVSOFT
)(ALuint id
, ALsizei stage
, ALenum param
, ALint
*values
);
175 typedef void (AL_APIENTRY
*LPALMIDISOUNDFONTSOFT
)(ALuint id
);
176 typedef void (AL_APIENTRY
*LPALMIDISOUNDFONTVSOFT
)(ALsizei count
, const ALuint
*ids
);
177 typedef void (AL_APIENTRY
*LPALMIDIEVENTSOFT
)(ALuint64SOFT time
, ALenum event
, ALsizei channel
, ALsizei param1
, ALsizei param2
);
178 typedef void (AL_APIENTRY
*LPALMIDISYSEXSOFT
)(ALuint64SOFT time
, const ALbyte
*data
, ALsizei size
);
179 typedef void (AL_APIENTRY
*LPALMIDIPLAYSOFT
)(void);
180 typedef void (AL_APIENTRY
*LPALMIDIPAUSESOFT
)(void);
181 typedef void (AL_APIENTRY
*LPALMIDISTOPSOFT
)(void);
182 typedef void (AL_APIENTRY
*LPALMIDIRESETSOFT
)(void);
183 typedef void (AL_APIENTRY
*LPALMIDIGAINSOFT
)(ALfloat value
);
184 typedef ALint64SOFT (AL_APIENTRY
*LPALGETINTEGER64SOFT
)(ALenum pname
);
185 typedef void (AL_APIENTRY
*LPALGETINTEGER64VSOFT
)(ALenum pname
, ALint64SOFT
*values
);
186 typedef void (AL_APIENTRY
*LPALLOADSOUNDFONTSOFT
)(ALuint id
, size_t(*cb
)(ALvoid
*,size_t,ALvoid
*), ALvoid
*user
);
187 #ifdef AL_ALEXT_PROTOTYPES
188 AL_API
void AL_APIENTRY
alGenSoundfontsSOFT(ALsizei n
, ALuint
*ids
);
189 AL_API
void AL_APIENTRY
alDeleteSoundfontsSOFT(ALsizei n
, const ALuint
*ids
);
190 AL_API ALboolean AL_APIENTRY
alIsSoundfontSOFT(ALuint id
);
191 AL_API
void AL_APIENTRY
alGetSoundfontivSOFT(ALuint id
, ALenum param
, ALint
*values
);
192 AL_API
void AL_APIENTRY
alSoundfontPresetsSOFT(ALuint id
, ALsizei count
, const ALuint
*pids
);
194 AL_API
void AL_APIENTRY
alGenPresetsSOFT(ALsizei n
, ALuint
*ids
);
195 AL_API
void AL_APIENTRY
alDeletePresetsSOFT(ALsizei n
, const ALuint
*ids
);
196 AL_API ALboolean AL_APIENTRY
alIsPresetSOFT(ALuint id
);
197 AL_API
void AL_APIENTRY
alPresetiSOFT(ALuint id
, ALenum param
, ALint value
);
198 AL_API
void AL_APIENTRY
alPresetivSOFT(ALuint id
, ALenum param
, const ALint
*values
);
199 AL_API
void AL_APIENTRY
alGetPresetivSOFT(ALuint id
, ALenum param
, ALint
*values
);
200 AL_API
void AL_APIENTRY
alPresetFontsoundsSOFT(ALuint id
, ALsizei count
, const ALuint
*fsids
);
202 AL_API
void AL_APIENTRY
alGenFontsoundsSOFT(ALsizei n
, ALuint
*ids
);
203 AL_API
void AL_APIENTRY
alDeleteFontsoundsSOFT(ALsizei n
, const ALuint
*ids
);
204 AL_API ALboolean AL_APIENTRY
alIsFontsoundSOFT(ALuint id
);
205 AL_API
void AL_APIENTRY
alFontsoundiSOFT(ALuint id
, ALenum param
, ALint value
);
206 AL_API
void AL_APIENTRY
alFontsound2iSOFT(ALuint id
, ALenum param
, ALint value1
, ALint value2
);
207 AL_API
void AL_APIENTRY
alFontsoundivSOFT(ALuint id
, ALenum param
, const ALint
*values
);
208 AL_API
void AL_APIENTRY
alGetFontsoundivSOFT(ALuint id
, ALenum param
, ALint
*values
);
209 AL_API
void AL_APIENTRY
alFontsoundModulatoriSOFT(ALuint id
, ALsizei stage
, ALenum param
, ALint value
);
210 AL_API
void AL_APIENTRY
alGetFontsoundModulatorivSOFT(ALuint id
, ALsizei stage
, ALenum param
, ALint
*values
);
212 AL_API
void AL_APIENTRY
alMidiSoundfontSOFT(ALuint id
);
213 AL_API
void AL_APIENTRY
alMidiSoundfontvSOFT(ALsizei count
, const ALuint
*ids
);
214 AL_API
void AL_APIENTRY
alMidiEventSOFT(ALuint64SOFT time
, ALenum event
, ALsizei channel
, ALsizei param1
, ALsizei param2
);
215 AL_API
void AL_APIENTRY
alMidiSysExSOFT(ALuint64SOFT time
, const ALbyte
*data
, ALsizei size
);
216 AL_API
void AL_APIENTRY
alMidiPlaySOFT(void);
217 AL_API
void AL_APIENTRY
alMidiPauseSOFT(void);
218 AL_API
void AL_APIENTRY
alMidiStopSOFT(void);
219 AL_API
void AL_APIENTRY
alMidiResetSOFT(void);
220 AL_API
void AL_APIENTRY
alMidiGainSOFT(ALfloat value
);
221 AL_API ALint64SOFT AL_APIENTRY
alGetInteger64SOFT(ALenum pname
);
222 AL_API
void AL_APIENTRY
alGetInteger64vSOFT(ALenum pname
, ALint64SOFT
*values
);
223 AL_API
void AL_APIENTRY
alLoadSoundfontSOFT(ALuint id
, size_t(*cb
)(ALvoid
*,size_t,ALvoid
*), ALvoid
*user
);
227 #ifndef ALC_SOFT_pause_device
228 #define ALC_SOFT_pause_device 1
229 typedef void (ALC_APIENTRY
*LPALCDEVICEPAUSESOFT
)(ALCdevice
*device
);
230 typedef void (ALC_APIENTRY
*LPALCDEVICERESUMESOFT
)(ALCdevice
*device
);
231 #ifdef AL_ALEXT_PROTOTYPES
232 ALC_API
void ALC_APIENTRY
alcDevicePauseSOFT(ALCdevice
*device
);
233 ALC_API
void ALC_APIENTRY
alcDeviceResumeSOFT(ALCdevice
*device
);
237 #ifndef ALC_SOFT_device_clock
238 #define ALC_SOFT_device_clock 1
239 typedef int64_t ALCint64SOFT
;
240 typedef uint64_t ALCuint64SOFT
;
241 #define ALC_DEVICE_CLOCK_SOFT 0x1600
242 typedef void (ALC_APIENTRY
*LPALCGETINTEGER64VSOFT
)(ALCdevice
*device
, ALCenum pname
, ALsizei size
, ALCint64SOFT
*values
);
243 #ifdef AL_ALEXT_PROTOTYPES
244 ALC_API
void ALC_APIENTRY
alcGetInteger64vSOFT(ALCdevice
*device
, ALCenum pname
, ALsizei size
, ALCint64SOFT
*values
);
250 /* KDevelop's parser doesn't recognize the C99-standard restrict keyword, but
251 * recent versions (at least 4.5.1) do recognize GCC's __restrict. */
252 #define restrict __restrict
256 typedef ALint64SOFT ALint64
;
257 typedef ALuint64SOFT ALuint64
;
259 typedef ptrdiff_t ALintptrEXT
;
260 typedef ptrdiff_t ALsizeiptrEXT
;
263 #if defined(_MSC_VER)
264 #define U64(x) ((ALuint64)(x##ui64))
265 #elif SIZEOF_LONG == 8
266 #define U64(x) ((ALuint64)(x##ul))
267 #elif SIZEOF_LONG_LONG == 8
268 #define U64(x) ((ALuint64)(x##ull))
273 #define UINT64_MAX U64(18446744073709551615)
277 #if defined(__cplusplus)
279 #elif defined(__GNUC__)
280 #define UNUSED(x) UNUSED_##x __attribute__((unused))
281 #elif defined(__LCLINT__)
282 #define UNUSED(x) /*@unused@*/ x
289 #define DECL_CONST __attribute__((const))
290 #define DECL_FORMAT(x, y, z) __attribute__((format(x, (y), (z))))
293 #define DECL_FORMAT(x, y, z)
296 #if defined(__GNUC__) && defined(__i386__)
297 /* force_align_arg_pointer is required for proper function arguments aligning
298 * when SSE code is used. Some systems (Windows, QNX) do not guarantee our
299 * thread functions will be properly aligned on the stack, even though GCC may
300 * generate code with the assumption that it is. */
301 #define FORCE_ALIGN __attribute__((force_align_arg_pointer))
307 #define DECL_VLA(T, _name, _size) T _name[(_size)]
309 #define DECL_VLA(T, _name, _size) T *_name = alloca((_size) * sizeof(T))
314 #define PATH_MAX MAX_PATH
316 #define PATH_MAX 4096
323 ALubyte b
[sizeof(ALuint
)];
324 } EndianTest
= { 1 };
325 #define IS_LITTLE_ENDIAN (EndianTest.b[0] == 1)
327 #define COUNTOF(x) (sizeof((x))/sizeof((x)[0]))
330 #define DERIVE_FROM_TYPE(t) t t##_parent
331 #define STATIC_CAST(to, obj) (&(obj)->to##_parent)
333 #define STATIC_UPCAST(to, from, obj) __extension__({ \
334 static_assert(__builtin_types_compatible_p(from, __typeof(*(obj))), \
335 "Invalid upcast object from type"); \
336 (to*)((char*)(obj) - offsetof(to, from##_parent)); \
339 #define STATIC_UPCAST(to, from, obj) ((to*)((char*)(obj) - offsetof(to, from##_parent)))
342 #define DECLARE_FORWARD(T1, T2, rettype, func) \
343 rettype T1##_##func(T1 *obj) \
344 { return T2##_##func(STATIC_CAST(T2, obj)); }
346 #define DECLARE_FORWARD1(T1, T2, rettype, func, argtype1) \
347 rettype T1##_##func(T1 *obj, argtype1 a) \
348 { return T2##_##func(STATIC_CAST(T2, obj), a); }
350 #define DECLARE_FORWARD2(T1, T2, rettype, func, argtype1, argtype2) \
351 rettype T1##_##func(T1 *obj, argtype1 a, argtype2 b) \
352 { return T2##_##func(STATIC_CAST(T2, obj), a, b); }
354 #define DECLARE_FORWARD3(T1, T2, rettype, func, argtype1, argtype2, argtype3) \
355 rettype T1##_##func(T1 *obj, argtype1 a, argtype2 b, argtype3 c) \
356 { return T2##_##func(STATIC_CAST(T2, obj), a, b, c); }
359 #define GET_VTABLE1(T1) (&(T1##_vtable))
360 #define GET_VTABLE2(T1, T2) (&(T1##_##T2##_vtable))
362 #define SET_VTABLE1(T1, obj) ((obj)->vtbl = GET_VTABLE1(T1))
363 #define SET_VTABLE2(T1, T2, obj) (STATIC_CAST(T2, obj)->vtbl = GET_VTABLE2(T1, T2))
365 #define DECLARE_THUNK(T1, T2, rettype, func) \
366 static rettype T1##_##T2##_##func(T2 *obj) \
367 { return T1##_##func(STATIC_UPCAST(T1, T2, obj)); }
369 #define DECLARE_THUNK1(T1, T2, rettype, func, argtype1) \
370 static rettype T1##_##T2##_##func(T2 *obj, argtype1 a) \
371 { return T1##_##func(STATIC_UPCAST(T1, T2, obj), a); }
373 #define DECLARE_THUNK2(T1, T2, rettype, func, argtype1, argtype2) \
374 static rettype T1##_##T2##_##func(T2 *obj, argtype1 a, argtype2 b) \
375 { return T1##_##func(STATIC_UPCAST(T1, T2, obj), a, b); }
377 #define DECLARE_THUNK3(T1, T2, rettype, func, argtype1, argtype2, argtype3) \
378 static rettype T1##_##T2##_##func(T2 *obj, argtype1 a, argtype2 b, argtype3 c) \
379 { return T1##_##func(STATIC_UPCAST(T1, T2, obj), a, b, c); }
381 #define DECLARE_DEFAULT_ALLOCATORS(T) \
382 static void* T##_New(size_t size) { return malloc(size); } \
383 static void T##_Delete(void *ptr) { free(ptr); }
385 /* Helper to extract an argument list for VCALL. Not used directly. */
386 #define EXTRACT_VCALL_ARGS(...) __VA_ARGS__))
388 /* Call a "virtual" method on an object, with arguments. */
389 #define V(obj, func) ((obj)->vtbl->func((obj), EXTRACT_VCALL_ARGS
390 /* Call a "virtual" method on an object, with no arguments. */
391 #define V0(obj, func) ((obj)->vtbl->func((obj) EXTRACT_VCALL_ARGS
393 #define DELETE_OBJ(obj) do { \
396 V0((obj),Destruct)(); \
397 V0((obj),Delete)(); \
409 #define DEFAULT_OUTPUT_RATE (44100)
410 #define MIN_OUTPUT_RATE (8000)
413 /* Find the next power-of-2 for non-power-of-2 numbers. */
414 inline ALuint
NextPowerOf2(ALuint value
)
428 /* Fast float-to-int conversion. Assumes the FPU is already in round-to-zero
430 inline ALint
fastf2i(ALfloat f
)
434 #elif defined(_MSC_VER) && defined(_M_IX86)
444 /* Fast float-to-uint conversion. Assumes the FPU is already in round-to-zero
446 inline ALuint
fastf2u(ALfloat f
)
447 { return fastf2i(f
); }
456 ALCenum (*OpenPlayback
)(ALCdevice
*, const ALCchar
*);
457 void (*ClosePlayback
)(ALCdevice
*);
458 ALCboolean (*ResetPlayback
)(ALCdevice
*);
459 ALCboolean (*StartPlayback
)(ALCdevice
*);
460 void (*StopPlayback
)(ALCdevice
*);
462 ALCenum (*OpenCapture
)(ALCdevice
*, const ALCchar
*);
463 void (*CloseCapture
)(ALCdevice
*);
464 void (*StartCapture
)(ALCdevice
*);
465 void (*StopCapture
)(ALCdevice
*);
466 ALCenum (*CaptureSamples
)(ALCdevice
*, void*, ALCuint
);
467 ALCuint (*AvailableSamples
)(ALCdevice
*);
469 ALint64 (*GetLatency
)(ALCdevice
*);
472 ALCboolean
alc_solaris_init(BackendFuncs
*func_list
);
473 void alc_solaris_deinit(void);
474 void alc_solaris_probe(enum DevProbe type
);
475 ALCboolean
alc_sndio_init(BackendFuncs
*func_list
);
476 void alc_sndio_deinit(void);
477 void alc_sndio_probe(enum DevProbe type
);
478 ALCboolean
alcWinMMInit(BackendFuncs
*FuncList
);
479 void alcWinMMDeinit(void);
480 void alcWinMMProbe(enum DevProbe type
);
481 ALCboolean
alc_pa_init(BackendFuncs
*func_list
);
482 void alc_pa_deinit(void);
483 void alc_pa_probe(enum DevProbe type
);
484 ALCboolean
alc_wave_init(BackendFuncs
*func_list
);
485 void alc_wave_deinit(void);
486 void alc_wave_probe(enum DevProbe type
);
487 ALCboolean
alc_ca_init(BackendFuncs
*func_list
);
488 void alc_ca_deinit(void);
489 void alc_ca_probe(enum DevProbe type
);
490 ALCboolean
alc_opensl_init(BackendFuncs
*func_list
);
491 void alc_opensl_deinit(void);
492 void alc_opensl_probe(enum DevProbe type
);
493 ALCboolean
alc_qsa_init(BackendFuncs
*func_list
);
494 void alc_qsa_deinit(void);
495 void alc_qsa_probe(enum DevProbe type
);
501 InverseDistanceClamped
= AL_INVERSE_DISTANCE_CLAMPED
,
502 LinearDistanceClamped
= AL_LINEAR_DISTANCE_CLAMPED
,
503 ExponentDistanceClamped
= AL_EXPONENT_DISTANCE_CLAMPED
,
504 InverseDistance
= AL_INVERSE_DISTANCE
,
505 LinearDistance
= AL_LINEAR_DISTANCE
,
506 ExponentDistance
= AL_EXPONENT_DISTANCE
,
507 DisableDistance
= AL_NONE
,
509 DefaultDistanceModel
= InverseDistanceClamped
537 DevFmtByte
= ALC_BYTE_SOFT
,
538 DevFmtUByte
= ALC_UNSIGNED_BYTE_SOFT
,
539 DevFmtShort
= ALC_SHORT_SOFT
,
540 DevFmtUShort
= ALC_UNSIGNED_SHORT_SOFT
,
541 DevFmtInt
= ALC_INT_SOFT
,
542 DevFmtUInt
= ALC_UNSIGNED_INT_SOFT
,
543 DevFmtFloat
= ALC_FLOAT_SOFT
,
545 DevFmtTypeDefault
= DevFmtFloat
547 enum DevFmtChannels
{
548 DevFmtMono
= ALC_MONO_SOFT
,
549 DevFmtStereo
= ALC_STEREO_SOFT
,
550 DevFmtQuad
= ALC_QUAD_SOFT
,
551 DevFmtX51
= ALC_5POINT1_SOFT
,
552 DevFmtX61
= ALC_6POINT1_SOFT
,
553 DevFmtX71
= ALC_7POINT1_SOFT
,
555 /* Similar to 5.1, except using the side channels instead of back */
556 DevFmtX51Side
= 0x80000000,
558 DevFmtChannelsDefault
= DevFmtStereo
561 ALuint
BytesFromDevFmt(enum DevFmtType type
) DECL_CONST
;
562 ALuint
ChannelsFromDevFmt(enum DevFmtChannels chans
) DECL_CONST
;
563 inline ALuint
FrameSizeFromDevFmt(enum DevFmtChannels chans
, enum DevFmtType type
)
565 return ChannelsFromDevFmt(chans
) * BytesFromDevFmt(type
);
569 extern const struct EffectList
{
584 /* Size for temporary storage of buffer data, in ALfloats. Larger values need
585 * more memory, while smaller values may need more iterations. The value needs
586 * to be a sensible size, however, as it constrains the max stepping value used
587 * for mixing, as well as the maximum number of samples per mixing iteration.
589 #define BUFFERSIZE (2048u)
592 struct ALCdevice_struct
596 ALCboolean Connected
;
597 enum DeviceType Type
;
602 enum DevFmtChannels FmtChans
;
603 enum DevFmtType FmtType
;
605 al_string DeviceName
;
607 volatile ALCenum LastError
;
609 // Maximum number of sources that can be created
610 ALuint MaxNoOfSources
;
611 // Maximum number of slots that can be created
612 ALuint AuxiliaryEffectSlotMax
;
614 ALCuint NumMonoSources
;
615 ALCuint NumStereoSources
;
618 // Map of Buffers for this device
621 // Map of Effects for this device
624 // Map of Filters for this device
627 // Map of Soundfonts for this device
630 // Map of Presets for this device
633 // Map of Fontsounds for this device
634 UIntMap FontsoundMap
;
636 /* Default soundfont (accessible as ID 0) */
637 struct ALsoundfont
*DefaultSfont
;
639 /* MIDI synth engine */
640 struct MidiSynth
*Synth
;
642 /* HRTF filter tables */
643 const struct Hrtf
*Hrtf
;
645 // Stereo-to-binaural filter
652 ALuint ChannelOffsets
[MaxChannels
];
654 enum Channel Speaker2Chan
[MaxChannels
];
655 ALfloat SpeakerAngle
[MaxChannels
];
661 /* Temp storage used for each source when mixing. */
662 alignas(16) ALfloat SourceData
[BUFFERSIZE
];
663 alignas(16) ALfloat ResampledData
[BUFFERSIZE
];
664 alignas(16) ALfloat FilteredData
[BUFFERSIZE
];
666 // Dry path buffer mix
667 alignas(16) ALfloat DryBuffer
[MaxChannels
][BUFFERSIZE
];
669 /* Running count of the mixer invocations, in 31.1 fixed point. This
670 * actually increments *twice* when mixing, first at the start and then at
671 * the end, so the bottom bit indicates if the device is currently mixing
672 * and the upper bits indicates how many mixes have been done.
676 /* Default effect slot */
677 struct ALeffectslot
*DefaultSlot
;
679 // Contexts created on this device
680 ALCcontext
*volatile ContextList
;
682 struct ALCbackend
*Backend
;
684 void *ExtraData
; // For the backend's use
686 ALCdevice
*volatile next
;
688 /* Memory space used by the default slot (Playback devices only) */
689 alignas(16) ALCbyte _slot_mem
[];
692 // Frequency was requested by the app or config file
693 #define DEVICE_FREQUENCY_REQUEST (1<<1)
694 // Channel configuration was requested by the config file
695 #define DEVICE_CHANNELS_REQUEST (1<<2)
696 // Sample type was requested by the config file
697 #define DEVICE_SAMPLE_TYPE_REQUEST (1<<3)
698 // HRTF was requested by the app
699 #define DEVICE_HRTF_REQUEST (1<<4)
701 // Stereo sources cover 120-degree angles around +/-90
702 #define DEVICE_WIDE_STEREO (1<<16)
704 // Specifies if the DSP is paused at user request
705 #define DEVICE_PAUSED (1<<30)
707 // Specifies if the device is currently running
708 #define DEVICE_RUNNING (1<<31)
710 /* Invalid channel offset */
711 #define INVALID_OFFSET (~0u)
714 /* Nanosecond resolution for the device clock time. */
715 #define DEVICE_CLOCK_RES U64(1000000000)
718 /* Must be less than 15 characters (16 including terminating null) for
719 * compatibility with pthread_setname_np limitations. */
720 #define MIXER_THREAD_NAME "alsoft-mixer"
723 typedef struct ALeffectslot
*ALeffectslotPtr
;
724 DECL_VECTOR(ALeffectslotPtr
)
727 struct ALCcontext_struct
731 struct ALlistener
*Listener
;
734 UIntMap EffectSlotMap
;
736 volatile ALenum LastError
;
738 volatile ALenum UpdateSources
;
740 volatile enum DistanceModel DistanceModel
;
741 volatile ALboolean SourceDistanceModel
;
743 volatile ALfloat DopplerFactor
;
744 volatile ALfloat DopplerVelocity
;
745 volatile ALfloat SpeedOfSound
;
746 volatile ALenum DeferUpdates
;
748 struct ALactivesource
**ActiveSources
;
749 ALsizei ActiveSourceCount
;
750 ALsizei MaxActiveSources
;
752 vector_ALeffectslotPtr ActiveAuxSlots
;
755 const ALCchar
*ExtensionList
;
757 ALCcontext
*volatile next
;
759 /* Memory space used by the listener */
760 alignas(16) ALCbyte _listener_mem
[];
763 ALCcontext
*GetContextRef(void);
765 void ALCcontext_IncRef(ALCcontext
*context
);
766 void ALCcontext_DecRef(ALCcontext
*context
);
768 void AppendAllDevicesList(const ALCchar
*name
);
769 void AppendCaptureDeviceList(const ALCchar
*name
);
771 ALint64
ALCdevice_GetLatencyDefault(ALCdevice
*device
);
773 void ALCdevice_Lock(ALCdevice
*device
);
774 void ALCdevice_Unlock(ALCdevice
*device
);
775 ALint64
ALCdevice_GetLatency(ALCdevice
*device
);
777 inline void LockContext(ALCcontext
*context
)
778 { ALCdevice_Lock(context
->Device
); }
780 inline void UnlockContext(ALCcontext
*context
)
781 { ALCdevice_Unlock(context
->Device
); }
784 void *al_malloc(size_t alignment
, size_t size
);
785 void *al_calloc(size_t alignment
, size_t size
);
786 void al_free(void *ptr
);
791 DERIVE_FROM_TYPE(fenv_t
);
799 void SetMixerFPUMode(FPUCtl
*ctl
);
800 void RestoreFPUMode(const FPUCtl
*ctl
);
803 typedef struct RingBuffer RingBuffer
;
804 RingBuffer
*CreateRingBuffer(ALsizei frame_size
, ALsizei length
);
805 void DestroyRingBuffer(RingBuffer
*ring
);
806 ALsizei
RingBufferSize(RingBuffer
*ring
);
807 void WriteRingBuffer(RingBuffer
*ring
, const ALubyte
*data
, ALsizei len
);
808 void ReadRingBuffer(RingBuffer
*ring
, ALubyte
*data
, ALsizei len
);
810 void ReadALConfig(void);
811 void FreeALConfig(void);
812 int ConfigValueExists(const char *blockName
, const char *keyName
);
813 const char *GetConfigValue(const char *blockName
, const char *keyName
, const char *def
);
814 int GetConfigValueBool(const char *blockName
, const char *keyName
, int def
);
815 int ConfigValueStr(const char *blockName
, const char *keyName
, const char **ret
);
816 int ConfigValueInt(const char *blockName
, const char *keyName
, int *ret
);
817 int ConfigValueUInt(const char *blockName
, const char *keyName
, unsigned int *ret
);
818 int ConfigValueFloat(const char *blockName
, const char *keyName
, float *ret
);
820 void SetRTPriority(void);
822 void SetDefaultChannelOrder(ALCdevice
*device
);
823 void SetDefaultWFXChannelOrder(ALCdevice
*device
);
825 const ALCchar
*DevFmtTypeString(enum DevFmtType type
) DECL_CONST
;
826 const ALCchar
*DevFmtChannelsString(enum DevFmtChannels chans
) DECL_CONST
;
829 extern FILE *LogFile
;
831 #if defined(__GNUC__) && !defined(IN_IDE_PARSER)
832 #define AL_PRINT(T, MSG, ...) fprintf(LogFile, "AL lib: %s %s: "MSG, T, __FUNCTION__ , ## __VA_ARGS__)
834 void al_print(const char *type
, const char *func
, const char *fmt
, ...) DECL_FORMAT(printf
, 3,4);
835 #define AL_PRINT(T, ...) al_print((T), __FUNCTION__, __VA_ARGS__)
845 extern enum LogLevel LogLevel
;
847 #define TRACEREF(...) do { \
848 if(LogLevel >= LogRef) \
849 AL_PRINT("(--)", __VA_ARGS__); \
852 #define TRACE(...) do { \
853 if(LogLevel >= LogTrace) \
854 AL_PRINT("(II)", __VA_ARGS__); \
857 #define WARN(...) do { \
858 if(LogLevel >= LogWarning) \
859 AL_PRINT("(WW)", __VA_ARGS__); \
862 #define ERR(...) do { \
863 if(LogLevel >= LogError) \
864 AL_PRINT("(EE)", __VA_ARGS__); \
868 extern ALint RTPrioLevel
;
871 extern ALuint CPUCapFlags
;
875 CPU_CAP_SSE4_1
= 1<<2,
879 void FillCPUCaps(ALuint capfilter
);
881 FILE *OpenDataFile(const char *fname
, const char *subdir
);
883 /* Small hack to use a pointer-to-array type as a normal argument type.
884 * Shouldn't be used directly. */
885 typedef ALfloat ALfloatBUFFERSIZE
[BUFFERSIZE
];