alMain.h 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853
  1. #ifndef AL_MAIN_H
  2. #define AL_MAIN_H
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include <stdarg.h>
  6. #include <assert.h>
  7. #include <math.h>
  8. #ifdef HAVE_STRINGS_H
  9. #include <strings.h>
  10. #endif
  11. #ifdef HAVE_FENV_H
  12. #include <fenv.h>
  13. #endif
  14. #include "AL/al.h"
  15. #include "AL/alc.h"
  16. #include "AL/alext.h"
  17. #include "atomic.h"
  18. #include "uintmap.h"
  19. #ifndef ALC_SOFT_HRTF
  20. #define ALC_SOFT_HRTF 1
  21. #define ALC_HRTF_SOFT 0x1992
  22. #endif
  23. #ifndef ALC_SOFT_midi_interface
  24. #define ALC_SOFT_midi_interface 1
  25. #define AL_MIDI_CLOCK_SOFT 0x9999
  26. #define AL_MIDI_STATE_SOFT 0x9986
  27. #define AL_MIDI_GAIN_SOFT 0x9998
  28. #define AL_MIDI_PRESET_SOFT 0x9997
  29. #define AL_MIDI_BANK_SOFT 0x9996
  30. #define AL_SOUNDFONTS_SIZE_SOFT 0x9995
  31. #define AL_SOUNDFONTS_SOFT 0x9994
  32. #define AL_PRESETS_SIZE_SOFT 0x9993
  33. #define AL_PRESETS_SOFT 0x9992
  34. #define AL_FONTSOUNDS_SIZE_SOFT 0x9991
  35. #define AL_FONTSOUNDS_SOFT 0x9990
  36. #define AL_SOURCE0_INPUT_SOFT 0x998F
  37. #define AL_SOURCE0_TYPE_SOFT 0x998E
  38. #define AL_SOURCE0_FORM_SOFT 0x998D
  39. #define AL_SOURCE1_INPUT_SOFT 0x998C
  40. #define AL_SOURCE1_TYPE_SOFT 0x998B
  41. #define AL_SOURCE1_FORM_SOFT 0x998A
  42. #define AL_AMOUNT_SOFT 0x9989
  43. #define AL_TRANSFORM_OP_SOFT 0x9988
  44. #define AL_DESTINATION_SOFT 0x9987
  45. /* Sounce Input */
  46. #define AL_ONE_SOFT 0x0080
  47. #define AL_NOTEON_VELOCITY_SOFT 0x0082
  48. #define AL_NOTEON_KEY_SOFT 0x0083
  49. /* AL_KEYPRESSURE_SOFT */
  50. /* AL_CHANNELPRESSURE_SOFT */
  51. /* AL_PITCHBEND_SOFT */
  52. #define AL_PITCHBEND_SENSITIVITY_SOFT 0x0090
  53. /* CC 0...127 */
  54. /* Source Type */
  55. #define AL_UNORM_SOFT 0x0000
  56. #define AL_UNORM_REV_SOFT 0x0100
  57. #define AL_SNORM_SOFT 0x0200
  58. #define AL_SNORM_REV_SOFT 0x0300
  59. /* Source Form */
  60. #define AL_LINEAR_SOFT 0x0000
  61. #define AL_CONCAVE_SOFT 0x0400
  62. #define AL_CONVEX_SOFT 0x0800
  63. #define AL_SWITCH_SOFT 0x0C00
  64. /* Transform op */
  65. /* AL_LINEAR_SOFT */
  66. #define AL_ABSOLUTE_SOFT 0x0002
  67. #define AL_SAMPLE_START_SOFT 0x2000
  68. #define AL_SAMPLE_END_SOFT 0x2001
  69. #define AL_SAMPLE_LOOP_START_SOFT 0x2002
  70. #define AL_SAMPLE_LOOP_END_SOFT 0x2003
  71. #define AL_SAMPLE_RATE_SOFT 0x2004
  72. #define AL_BASE_KEY_SOFT 0x2005
  73. #define AL_KEY_CORRECTION_SOFT 0x2006
  74. #define AL_SAMPLE_TYPE_SOFT 0x2007
  75. #define AL_FONTSOUND_LINK_SOFT 0x2008
  76. #define AL_MOD_LFO_TO_PITCH_SOFT 0x0005
  77. #define AL_VIBRATO_LFO_TO_PITCH_SOFT 0x0006
  78. #define AL_MOD_ENV_TO_PITCH_SOFT 0x0007
  79. #define AL_FILTER_CUTOFF_SOFT 0x0008
  80. #define AL_FILTER_RESONANCE_SOFT 0x0009
  81. #define AL_MOD_LFO_TO_FILTER_CUTOFF_SOFT 0x000A
  82. #define AL_MOD_ENV_TO_FILTER_CUTOFF_SOFT 0x000B
  83. #define AL_MOD_LFO_TO_VOLUME_SOFT 0x000D
  84. #define AL_CHORUS_SEND_SOFT 0x000F
  85. #define AL_REVERB_SEND_SOFT 0x0010
  86. #define AL_PAN_SOFT 0x0011
  87. #define AL_MOD_LFO_DELAY_SOFT 0x0015
  88. #define AL_MOD_LFO_FREQUENCY_SOFT 0x0016
  89. #define AL_VIBRATO_LFO_DELAY_SOFT 0x0017
  90. #define AL_VIBRATO_LFO_FREQUENCY_SOFT 0x0018
  91. #define AL_MOD_ENV_DELAYTIME_SOFT 0x0019
  92. #define AL_MOD_ENV_ATTACKTIME_SOFT 0x001A
  93. #define AL_MOD_ENV_HOLDTIME_SOFT 0x001B
  94. #define AL_MOD_ENV_DECAYTIME_SOFT 0x001C
  95. #define AL_MOD_ENV_SUSTAINVOLUME_SOFT 0x001D
  96. #define AL_MOD_ENV_RELEASETIME_SOFT 0x002E
  97. #define AL_MOD_ENV_KEY_TO_HOLDTIME_SOFT 0x001F
  98. #define AL_MOD_ENV_KEY_TO_DECAYTIME_SOFT 0x0020
  99. #define AL_VOLUME_ENV_DELAYTIME_SOFT 0x0021
  100. #define AL_VOLUME_ENV_ATTACKTIME_SOFT 0x0022
  101. #define AL_VOLUME_ENV_HOLDTIME_SOFT 0x0023
  102. #define AL_VOLUME_ENV_DECAYTIME_SOFT 0x0024
  103. #define AL_VOLUME_ENV_SUSTAINVOLUME_SOFT 0x0025
  104. #define AL_VOLUME_ENV_RELEASETIME_SOFT 0x0026
  105. #define AL_VOLUME_ENV_KEY_TO_HOLDTIME_SOFT 0x0027
  106. #define AL_VOLUME_ENV_KEY_TO_DECAYTIME_SOFT 0x0028
  107. #define AL_KEY_RANGE_SOFT 0x002B
  108. #define AL_VELOCITY_RANGE_SOFT 0x002C
  109. #define AL_ATTENUATION_SOFT 0x0030
  110. #define AL_TUNING_COARSE_SOFT 0x0033
  111. #define AL_TUNING_FINE_SOFT 0x0034
  112. #define AL_LOOP_MODE_SOFT 0x0036
  113. #define AL_TUNING_SCALE_SOFT 0x0038
  114. #define AL_EXCLUSIVE_CLASS_SOFT 0x0039
  115. #define AL_LOOP_CONTINUOUS_SOFT 0x0001
  116. #define AL_LOOP_UNTIL_RELEASE_SOFT 0x0003
  117. #define AL_RIGHT_SOFT 0x0002
  118. #define AL_LEFT_SOFT 0x0004
  119. #define AL_FORMAT_TYPE_SOFT 0x1991
  120. #define AL_NOTEOFF_SOFT 0x0080
  121. #define AL_NOTEON_SOFT 0x0090
  122. #define AL_KEYPRESSURE_SOFT 0x00A0
  123. #define AL_CONTROLLERCHANGE_SOFT 0x00B0
  124. #define AL_PROGRAMCHANGE_SOFT 0x00C0
  125. #define AL_CHANNELPRESSURE_SOFT 0x00D0
  126. #define AL_PITCHBEND_SOFT 0x00E0
  127. typedef void (AL_APIENTRY*LPALGENSOUNDFONTSSOFT)(ALsizei n, ALuint *ids);
  128. typedef void (AL_APIENTRY*LPALDELETESOUNDFONTSSOFT)(ALsizei n, const ALuint *ids);
  129. typedef ALboolean (AL_APIENTRY*LPALISSOUNDFONTSOFT)(ALuint id);
  130. typedef void (AL_APIENTRY*LPALSOUNDFONTSAMPLESSOFT)(ALuint sfid, ALenum type, ALsizei count, const ALvoid *samples);
  131. typedef void (AL_APIENTRY*LPALGETSOUNDFONTSAMPLESSOFT)(ALuint id, ALsizei offset, ALsizei count, ALenum type, ALvoid *samples);
  132. typedef ALvoid* (AL_APIENTRY*LPALSOUNDFONTMAPSAMPLESSOFT)(ALuint sfid, ALsizei offset, ALsizei length);
  133. typedef void (AL_APIENTRY*LPALSOUNDFONTUNMAPSAMPLESSOFT)(ALuint sfid);
  134. typedef void (AL_APIENTRY*LPALGETSOUNDFONTIVSOFT)(ALuint id, ALenum param, ALint *values);
  135. typedef void (AL_APIENTRY*LPALSOUNDFONTPRESETSSOFT)(ALuint id, ALsizei count, const ALuint *pids);
  136. typedef void (AL_APIENTRY*LPALGENPRESETSSOFT)(ALsizei n, ALuint *ids);
  137. typedef void (AL_APIENTRY*LPALDELETEPRESETSSOFT)(ALsizei n, const ALuint *ids);
  138. typedef ALboolean (AL_APIENTRY*LPALISPRESETSOFT)(ALuint id);
  139. typedef void (AL_APIENTRY*LPALPRESETISOFT)(ALuint id, ALenum param, ALint value);
  140. typedef void (AL_APIENTRY*LPALPRESETIVSOFT)(ALuint id, ALenum param, const ALint *values);
  141. typedef void (AL_APIENTRY*LPALPRESETFONTSOUNDSSOFT)(ALuint id, ALsizei count, const ALuint *fsids);
  142. typedef void (AL_APIENTRY*LPALGETPRESETIVSOFT)(ALuint id, ALenum param, ALint *values);
  143. typedef void (AL_APIENTRY*LPALGENFONTSOUNDSSOFT)(ALsizei n, ALuint *ids);
  144. typedef void (AL_APIENTRY*LPALDELETEFONTSOUNDSSOFT)(ALsizei n, const ALuint *ids);
  145. typedef ALboolean (AL_APIENTRY*LPALISFONTSOUNDSOFT)(ALuint id);
  146. typedef void (AL_APIENTRY*LPALFONTSOUNDISOFT)(ALuint id, ALenum param, ALint value);
  147. typedef void (AL_APIENTRY*LPALFONTSOUND2ISOFT)(ALuint id, ALenum param, ALint value1, ALint value2);
  148. typedef void (AL_APIENTRY*LPALFONTSOUNDIVSOFT)(ALuint id, ALenum param, const ALint *values);
  149. typedef void (AL_APIENTRY*LPALGETFONTSOUNDIVSOFT)(ALuint id, ALenum param, ALint *values);
  150. typedef void (AL_APIENTRY*LPALFONTSOUNDMOFULATORISOFT)(ALuint id, ALsizei stage, ALenum param, ALint value);
  151. typedef void (AL_APIENTRY*LPALGETFONTSOUNDMODULATORIVSOFT)(ALuint id, ALsizei stage, ALenum param, ALint *values);
  152. typedef void (AL_APIENTRY*LPALMIDISOUNDFONTSOFT)(ALuint id);
  153. typedef void (AL_APIENTRY*LPALMIDISOUNDFONTVSOFT)(ALsizei count, const ALuint *ids);
  154. typedef void (AL_APIENTRY*LPALMIDIEVENTSOFT)(ALuint64SOFT time, ALenum event, ALsizei channel, ALsizei param1, ALsizei param2);
  155. typedef void (AL_APIENTRY*LPALMIDISYSEXSOFT)(ALuint64SOFT time, const ALbyte *data, ALsizei size);
  156. typedef void (AL_APIENTRY*LPALMIDIPLAYSOFT)(void);
  157. typedef void (AL_APIENTRY*LPALMIDIPAUSESOFT)(void);
  158. typedef void (AL_APIENTRY*LPALMIDISTOPSOFT)(void);
  159. typedef void (AL_APIENTRY*LPALMIDIRESETSOFT)(void);
  160. typedef void (AL_APIENTRY*LPALMIDIGAINSOFT)(ALfloat value);
  161. typedef ALint64SOFT (AL_APIENTRY*LPALGETINTEGER64SOFT)(ALenum pname);
  162. typedef void (AL_APIENTRY*LPALGETINTEGER64VSOFT)(ALenum pname, ALint64SOFT *values);
  163. typedef void (AL_APIENTRY*LPALLOADSOUNDFONTSOFT)(ALuint id, size_t(*cb)(ALvoid*,size_t,ALvoid*), ALvoid *user);
  164. #ifdef AL_ALEXT_PROTOTYPES
  165. AL_API void AL_APIENTRY alGenSoundfontsSOFT(ALsizei n, ALuint *ids);
  166. AL_API void AL_APIENTRY alDeleteSoundfontsSOFT(ALsizei n, const ALuint *ids);
  167. AL_API ALboolean AL_APIENTRY alIsSoundfontSOFT(ALuint id);
  168. AL_API void AL_APIENTRY alSoundfontSamplesSOFT(ALuint sfid, ALenum type, ALsizei count, const ALvoid *samples);
  169. AL_API void AL_APIENTRY alGetSoundfontSamplesSOFT(ALuint id, ALsizei offset, ALsizei count, ALenum type, ALvoid *samples);
  170. AL_API ALvoid* AL_APIENTRY alSoundfontMapSamplesSOFT(ALuint sfid, ALsizei offset, ALsizei length);
  171. AL_API void AL_APIENTRY alSoundfontUnmapSamplesSOFT(ALuint sfid);
  172. AL_API void AL_APIENTRY alGetSoundfontivSOFT(ALuint id, ALenum param, ALint *values);
  173. AL_API void AL_APIENTRY alSoundfontPresetsSOFT(ALuint id, ALsizei count, const ALuint *pids);
  174. AL_API void AL_APIENTRY alGenPresetsSOFT(ALsizei n, ALuint *ids);
  175. AL_API void AL_APIENTRY alDeletePresetsSOFT(ALsizei n, const ALuint *ids);
  176. AL_API ALboolean AL_APIENTRY alIsPresetSOFT(ALuint id);
  177. AL_API void AL_APIENTRY alPresetiSOFT(ALuint id, ALenum param, ALint value);
  178. AL_API void AL_APIENTRY alPresetivSOFT(ALuint id, ALenum param, const ALint *values);
  179. AL_API void AL_APIENTRY alGetPresetivSOFT(ALuint id, ALenum param, ALint *values);
  180. AL_API void AL_APIENTRY alPresetFontsoundsSOFT(ALuint id, ALsizei count, const ALuint *fsids);
  181. AL_API void AL_APIENTRY alGenFontsoundsSOFT(ALsizei n, ALuint *ids);
  182. AL_API void AL_APIENTRY alDeleteFontsoundsSOFT(ALsizei n, const ALuint *ids);
  183. AL_API ALboolean AL_APIENTRY alIsFontsoundSOFT(ALuint id);
  184. AL_API void AL_APIENTRY alFontsoundiSOFT(ALuint id, ALenum param, ALint value);
  185. AL_API void AL_APIENTRY alFontsound2iSOFT(ALuint id, ALenum param, ALint value1, ALint value2);
  186. AL_API void AL_APIENTRY alFontsoundivSOFT(ALuint id, ALenum param, const ALint *values);
  187. AL_API void AL_APIENTRY alGetFontsoundivSOFT(ALuint id, ALenum param, ALint *values);
  188. AL_API void AL_APIENTRY alFontsoundModulatoriSOFT(ALuint id, ALsizei stage, ALenum param, ALint value);
  189. AL_API void AL_APIENTRY alGetFontsoundModulatorivSOFT(ALuint id, ALsizei stage, ALenum param, ALint *values);
  190. AL_API void AL_APIENTRY alMidiSoundfontSOFT(ALuint id);
  191. AL_API void AL_APIENTRY alMidiSoundfontvSOFT(ALsizei count, const ALuint *ids);
  192. AL_API void AL_APIENTRY alMidiEventSOFT(ALuint64SOFT time, ALenum event, ALsizei channel, ALsizei param1, ALsizei param2);
  193. AL_API void AL_APIENTRY alMidiSysExSOFT(ALuint64SOFT time, const ALbyte *data, ALsizei size);
  194. AL_API void AL_APIENTRY alMidiPlaySOFT(void);
  195. AL_API void AL_APIENTRY alMidiPauseSOFT(void);
  196. AL_API void AL_APIENTRY alMidiStopSOFT(void);
  197. AL_API void AL_APIENTRY alMidiResetSOFT(void);
  198. AL_API void AL_APIENTRY alMidiGainSOFT(ALfloat value);
  199. AL_API ALint64SOFT AL_APIENTRY alGetInteger64SOFT(ALenum pname);
  200. AL_API void AL_APIENTRY alGetInteger64vSOFT(ALenum pname, ALint64SOFT *values);
  201. AL_API void AL_APIENTRY alLoadSoundfontSOFT(ALuint id, size_t(*cb)(ALvoid*,size_t,ALvoid*), ALvoid *user);
  202. #endif
  203. #endif
  204. #ifndef ALC_SOFT_pause_device
  205. #define ALC_SOFT_pause_device 1
  206. typedef void (ALC_APIENTRY*LPALCDEVICEPAUSESOFT)(ALCdevice *device);
  207. typedef void (ALC_APIENTRY*LPALCDEVICERESUMESOFT)(ALCdevice *device);
  208. #ifdef AL_ALEXT_PROTOTYPES
  209. ALC_API void ALC_APIENTRY alcDevicePauseSOFT(ALCdevice *device);
  210. ALC_API void ALC_APIENTRY alcDeviceResumeSOFT(ALCdevice *device);
  211. #endif
  212. #endif
  213. #ifdef IN_IDE_PARSER
  214. /* KDevelop's parser doesn't recognize the C99-standard restrict keyword, but
  215. * recent versions (at least 4.5.1) do recognize GCC's __restrict. */
  216. #define restrict __restrict
  217. /* KDevelop won't see the ALIGN macro from config.h when viewing files that
  218. * don't include it directly (e.g. headers). */
  219. #ifndef ALIGN
  220. #define ALIGN(x)
  221. #endif
  222. #endif
  223. typedef ALint64SOFT ALint64;
  224. typedef ALuint64SOFT ALuint64;
  225. typedef ptrdiff_t ALintptrEXT;
  226. typedef ptrdiff_t ALsizeiptrEXT;
  227. #ifndef U64
  228. #if defined(_MSC_VER)
  229. #define U64(x) ((ALuint64)(x##ui64))
  230. #elif SIZEOF_LONG == 8
  231. #define U64(x) ((ALuint64)(x##ul))
  232. #elif SIZEOF_LONG_LONG == 8
  233. #define U64(x) ((ALuint64)(x##ull))
  234. #endif
  235. #endif
  236. #ifndef UINT64_MAX
  237. #define UINT64_MAX U64(18446744073709551615)
  238. #endif
  239. #ifndef UNUSED
  240. #if defined(__cplusplus)
  241. #define UNUSED(x)
  242. #elif defined(__GNUC__)
  243. #define UNUSED(x) UNUSED_##x __attribute__((unused))
  244. #elif defined(__LCLINT__)
  245. #define UNUSED(x) /*@unused@*/ x
  246. #else
  247. #define UNUSED(x) x
  248. #endif
  249. #endif
  250. #ifdef HAVE_GCC_FORMAT
  251. #define PRINTF_STYLE(x, y) __attribute__((format(printf, (x), (y))))
  252. #else
  253. #define PRINTF_STYLE(x, y)
  254. #endif
  255. #if defined(__GNUC__) && defined(__i386__)
  256. /* force_align_arg_pointer is required for proper function arguments aligning
  257. * when SSE code is used. Some systems (Windows, QNX) do not guarantee our
  258. * thread functions will be properly aligned on the stack, even though GCC may
  259. * generate code with the assumption that it is. */
  260. #define FORCE_ALIGN __attribute__((force_align_arg_pointer))
  261. #else
  262. #define FORCE_ALIGN
  263. #endif
  264. static const union {
  265. ALuint u;
  266. ALubyte b[sizeof(ALuint)];
  267. } EndianTest = { 1 };
  268. #define IS_LITTLE_ENDIAN (EndianTest.b[0] == 1)
  269. #define COUNTOF(x) (sizeof((x))/sizeof((x)[0]))
  270. #define DERIVE_FROM_TYPE(t) t t##_parent
  271. #define STATIC_CAST(to, obj) (&(obj)->to##_parent)
  272. #define STATIC_UPCAST(to, from, obj) ((to*)((char*)(obj) - offsetof(to, from##_parent)))
  273. #define DECLARE_FORWARD(T1, T2, rettype, func) \
  274. rettype T1##_##func(T1 *obj) \
  275. { return T2##_##func(STATIC_CAST(T2, obj)); }
  276. #define DECLARE_FORWARD1(T1, T2, rettype, func, argtype1) \
  277. rettype T1##_##func(T1 *obj, argtype1 a) \
  278. { return T2##_##func(STATIC_CAST(T2, obj), a); }
  279. #define DECLARE_FORWARD2(T1, T2, rettype, func, argtype1, argtype2) \
  280. rettype T1##_##func(T1 *obj, argtype1 a, argtype2 b) \
  281. { return T2##_##func(STATIC_CAST(T2, obj), a, b); }
  282. #define DECLARE_FORWARD3(T1, T2, rettype, func, argtype1, argtype2, argtype3) \
  283. rettype T1##_##func(T1 *obj, argtype1 a, argtype2 b, argtype3 c) \
  284. { return T2##_##func(STATIC_CAST(T2, obj), a, b, c); }
  285. #define GET_VTABLE1(T1) (&(T1##_vtable))
  286. #define GET_VTABLE2(T1, T2) (&(T1##_##T2##_vtable))
  287. #define SET_VTABLE1(T1, obj) ((obj)->vtbl = GET_VTABLE1(T1))
  288. #define SET_VTABLE2(T1, T2, obj) (STATIC_CAST(T2, obj)->vtbl = GET_VTABLE2(T1, T2))
  289. #define DECLARE_THUNK(T1, T2, rettype, func) \
  290. static rettype T1##_##T2##_##func(T2 *obj) \
  291. { return T1##_##func(STATIC_UPCAST(T1, T2, obj)); }
  292. #define DECLARE_THUNK1(T1, T2, rettype, func, argtype1) \
  293. static rettype T1##_##T2##_##func(T2 *obj, argtype1 a) \
  294. { return T1##_##func(STATIC_UPCAST(T1, T2, obj), a); }
  295. #define DECLARE_THUNK2(T1, T2, rettype, func, argtype1, argtype2) \
  296. static rettype T1##_##T2##_##func(T2 *obj, argtype1 a, argtype2 b) \
  297. { return T1##_##func(STATIC_UPCAST(T1, T2, obj), a, b); }
  298. #define DECLARE_THUNK3(T1, T2, rettype, func, argtype1, argtype2, argtype3) \
  299. static rettype T1##_##T2##_##func(T2 *obj, argtype1 a, argtype2 b, argtype3 c) \
  300. { return T1##_##func(STATIC_UPCAST(T1, T2, obj), a, b, c); }
  301. /* Helper to extract an argument list for VCALL. Not used directly. */
  302. #define EXTRACT_VCALL_ARGS(...) __VA_ARGS__))
  303. /* Call a "virtual" method on an object, with arguments. */
  304. #define V(obj, func) ((obj)->vtbl->func((obj), EXTRACT_VCALL_ARGS
  305. /* Call a "virtual" method on an object, with no arguments. */
  306. #define V0(obj, func) ((obj)->vtbl->func((obj) EXTRACT_VCALL_ARGS
  307. #define DELETE_OBJ(obj) do { \
  308. if((obj) != NULL) \
  309. { \
  310. V0((obj),Destruct)(); \
  311. V0((obj),Delete)(); \
  312. } \
  313. } while(0)
  314. #ifdef __cplusplus
  315. extern "C" {
  316. #endif
  317. struct Hrtf;
  318. #define DEFAULT_OUTPUT_RATE (44100)
  319. #define MIN_OUTPUT_RATE (8000)
  320. /* Find the next power-of-2 for non-power-of-2 numbers. */
  321. inline ALuint NextPowerOf2(ALuint value)
  322. {
  323. if(value > 0)
  324. {
  325. value--;
  326. value |= value>>1;
  327. value |= value>>2;
  328. value |= value>>4;
  329. value |= value>>8;
  330. value |= value>>16;
  331. }
  332. return value+1;
  333. }
  334. /* Fast float-to-int conversion. Assumes the FPU is already in round-to-zero
  335. * mode. */
  336. inline ALint fastf2i(ALfloat f)
  337. {
  338. #ifdef HAVE_LRINTF
  339. return lrintf(f);
  340. #elif defined(_MSC_VER) && defined(_M_IX86)
  341. ALint i;
  342. __asm fld f
  343. __asm fistp i
  344. return i;
  345. #else
  346. return (ALint)f;
  347. #endif
  348. }
  349. /* Fast float-to-uint conversion. Assumes the FPU is already in round-to-zero
  350. * mode. */
  351. inline ALuint fastf2u(ALfloat f)
  352. { return fastf2i(f); }
  353. enum DevProbe {
  354. ALL_DEVICE_PROBE,
  355. CAPTURE_DEVICE_PROBE
  356. };
  357. typedef struct {
  358. ALCenum (*OpenPlayback)(ALCdevice*, const ALCchar*);
  359. void (*ClosePlayback)(ALCdevice*);
  360. ALCboolean (*ResetPlayback)(ALCdevice*);
  361. ALCboolean (*StartPlayback)(ALCdevice*);
  362. void (*StopPlayback)(ALCdevice*);
  363. ALCenum (*OpenCapture)(ALCdevice*, const ALCchar*);
  364. void (*CloseCapture)(ALCdevice*);
  365. void (*StartCapture)(ALCdevice*);
  366. void (*StopCapture)(ALCdevice*);
  367. ALCenum (*CaptureSamples)(ALCdevice*, void*, ALCuint);
  368. ALCuint (*AvailableSamples)(ALCdevice*);
  369. ALint64 (*GetLatency)(ALCdevice*);
  370. } BackendFuncs;
  371. ALCboolean alc_solaris_init(BackendFuncs *func_list);
  372. void alc_solaris_deinit(void);
  373. void alc_solaris_probe(enum DevProbe type);
  374. ALCboolean alc_sndio_init(BackendFuncs *func_list);
  375. void alc_sndio_deinit(void);
  376. void alc_sndio_probe(enum DevProbe type);
  377. ALCboolean alcMMDevApiInit(BackendFuncs *func_list);
  378. void alcMMDevApiDeinit(void);
  379. void alcMMDevApiProbe(enum DevProbe type);
  380. ALCboolean alcDSoundInit(BackendFuncs *func_list);
  381. void alcDSoundDeinit(void);
  382. void alcDSoundProbe(enum DevProbe type);
  383. ALCboolean alcWinMMInit(BackendFuncs *FuncList);
  384. void alcWinMMDeinit(void);
  385. void alcWinMMProbe(enum DevProbe type);
  386. ALCboolean alc_pa_init(BackendFuncs *func_list);
  387. void alc_pa_deinit(void);
  388. void alc_pa_probe(enum DevProbe type);
  389. ALCboolean alc_wave_init(BackendFuncs *func_list);
  390. void alc_wave_deinit(void);
  391. void alc_wave_probe(enum DevProbe type);
  392. ALCboolean alc_ca_init(BackendFuncs *func_list);
  393. void alc_ca_deinit(void);
  394. void alc_ca_probe(enum DevProbe type);
  395. ALCboolean alc_opensl_init(BackendFuncs *func_list);
  396. void alc_opensl_deinit(void);
  397. void alc_opensl_probe(enum DevProbe type);
  398. ALCboolean alc_qsa_init(BackendFuncs *func_list);
  399. void alc_qsa_deinit(void);
  400. void alc_qsa_probe(enum DevProbe type);
  401. struct ALCbackend;
  402. enum DistanceModel {
  403. InverseDistanceClamped = AL_INVERSE_DISTANCE_CLAMPED,
  404. LinearDistanceClamped = AL_LINEAR_DISTANCE_CLAMPED,
  405. ExponentDistanceClamped = AL_EXPONENT_DISTANCE_CLAMPED,
  406. InverseDistance = AL_INVERSE_DISTANCE,
  407. LinearDistance = AL_LINEAR_DISTANCE,
  408. ExponentDistance = AL_EXPONENT_DISTANCE,
  409. DisableDistance = AL_NONE,
  410. DefaultDistanceModel = InverseDistanceClamped
  411. };
  412. enum Resampler {
  413. PointResampler,
  414. LinearResampler,
  415. CubicResampler,
  416. ResamplerMax,
  417. };
  418. enum Channel {
  419. FrontLeft = 0,
  420. FrontRight,
  421. FrontCenter,
  422. LFE,
  423. BackLeft,
  424. BackRight,
  425. BackCenter,
  426. SideLeft,
  427. SideRight,
  428. MaxChannels,
  429. };
  430. /* Device formats */
  431. enum DevFmtType {
  432. DevFmtByte = ALC_BYTE_SOFT,
  433. DevFmtUByte = ALC_UNSIGNED_BYTE_SOFT,
  434. DevFmtShort = ALC_SHORT_SOFT,
  435. DevFmtUShort = ALC_UNSIGNED_SHORT_SOFT,
  436. DevFmtInt = ALC_INT_SOFT,
  437. DevFmtUInt = ALC_UNSIGNED_INT_SOFT,
  438. DevFmtFloat = ALC_FLOAT_SOFT,
  439. DevFmtTypeDefault = DevFmtFloat
  440. };
  441. enum DevFmtChannels {
  442. DevFmtMono = ALC_MONO_SOFT,
  443. DevFmtStereo = ALC_STEREO_SOFT,
  444. DevFmtQuad = ALC_QUAD_SOFT,
  445. DevFmtX51 = ALC_5POINT1_SOFT,
  446. DevFmtX61 = ALC_6POINT1_SOFT,
  447. DevFmtX71 = ALC_7POINT1_SOFT,
  448. /* Similar to 5.1, except using the side channels instead of back */
  449. DevFmtX51Side = 0x80000000,
  450. DevFmtChannelsDefault = DevFmtStereo
  451. };
  452. ALuint BytesFromDevFmt(enum DevFmtType type);
  453. ALuint ChannelsFromDevFmt(enum DevFmtChannels chans);
  454. inline ALuint FrameSizeFromDevFmt(enum DevFmtChannels chans, enum DevFmtType type)
  455. {
  456. return ChannelsFromDevFmt(chans) * BytesFromDevFmt(type);
  457. }
  458. extern const struct EffectList {
  459. const char *name;
  460. int type;
  461. const char *ename;
  462. ALenum val;
  463. } EffectList[];
  464. enum DeviceType {
  465. Playback,
  466. Capture,
  467. Loopback
  468. };
  469. /* Size for temporary storage of buffer data, in ALfloats. Larger values need
  470. * more memory, while smaller values may need more iterations. The value needs
  471. * to be a sensible size, however, as it constrains the max stepping value used
  472. * for mixing, as well as the maximum number of samples per mixing iteration.
  473. */
  474. #define BUFFERSIZE (2048u)
  475. struct ALCdevice_struct
  476. {
  477. volatile RefCount ref;
  478. ALCboolean Connected;
  479. enum DeviceType Type;
  480. ALuint Frequency;
  481. ALuint UpdateSize;
  482. ALuint NumUpdates;
  483. enum DevFmtChannels FmtChans;
  484. enum DevFmtType FmtType;
  485. ALCchar *DeviceName;
  486. volatile ALCenum LastError;
  487. // Maximum number of sources that can be created
  488. ALuint MaxNoOfSources;
  489. // Maximum number of slots that can be created
  490. ALuint AuxiliaryEffectSlotMax;
  491. ALCuint NumMonoSources;
  492. ALCuint NumStereoSources;
  493. ALuint NumAuxSends;
  494. // Map of Buffers for this device
  495. UIntMap BufferMap;
  496. // Map of Effects for this device
  497. UIntMap EffectMap;
  498. // Map of Filters for this device
  499. UIntMap FilterMap;
  500. // Map of Soundfonts for this device
  501. UIntMap SfontMap;
  502. // Map of Presets for this device
  503. UIntMap PresetMap;
  504. // Map of Fontsounds for this device
  505. UIntMap FontsoundMap;
  506. /* Default soundfont (accessible as ID 0) */
  507. struct ALsoundfont *DefaultSfont;
  508. /* MIDI synth engine */
  509. struct MidiSynth *Synth;
  510. /* HRTF filter tables */
  511. const struct Hrtf *Hrtf;
  512. // Stereo-to-binaural filter
  513. struct bs2b *Bs2b;
  514. ALCint Bs2bLevel;
  515. // Device flags
  516. ALuint Flags;
  517. ALuint ChannelOffsets[MaxChannels];
  518. enum Channel Speaker2Chan[MaxChannels];
  519. ALfloat SpeakerAngle[MaxChannels];
  520. ALuint NumChan;
  521. /* Temp storage used for mixing. +1 for the predictive sample. */
  522. ALIGN(16) ALfloat SampleData1[BUFFERSIZE+1];
  523. ALIGN(16) ALfloat SampleData2[BUFFERSIZE+1];
  524. // Dry path buffer mix
  525. ALIGN(16) ALfloat DryBuffer[MaxChannels][BUFFERSIZE];
  526. ALIGN(16) ALfloat ClickRemoval[MaxChannels];
  527. ALIGN(16) ALfloat PendingClicks[MaxChannels];
  528. /* Default effect slot */
  529. struct ALeffectslot *DefaultSlot;
  530. // Contexts created on this device
  531. ALCcontext *volatile ContextList;
  532. struct ALCbackend *Backend;
  533. BackendFuncs *Funcs;
  534. void *ExtraData; // For the backend's use
  535. ALCdevice *volatile next;
  536. };
  537. // Frequency was requested by the app or config file
  538. #define DEVICE_FREQUENCY_REQUEST (1<<1)
  539. // Channel configuration was requested by the config file
  540. #define DEVICE_CHANNELS_REQUEST (1<<2)
  541. // Sample type was requested by the config file
  542. #define DEVICE_SAMPLE_TYPE_REQUEST (1<<3)
  543. // HRTF was requested by the app
  544. #define DEVICE_HRTF_REQUEST (1<<4)
  545. // Stereo sources cover 120-degree angles around +/-90
  546. #define DEVICE_WIDE_STEREO (1<<16)
  547. // Specifies if the DSP is paused at user request
  548. #define DEVICE_PAUSED (1<<30)
  549. // Specifies if the device is currently running
  550. #define DEVICE_RUNNING (1<<31)
  551. /* Invalid channel offset */
  552. #define INVALID_OFFSET (~0u)
  553. /* Must be less than 15 characters (16 including terminating null) for
  554. * compatibility with pthread_setname_np limitations. */
  555. #define MIXER_THREAD_NAME "alsoft-mixer"
  556. struct ALCcontext_struct
  557. {
  558. volatile RefCount ref;
  559. struct ALlistener *Listener;
  560. UIntMap SourceMap;
  561. UIntMap EffectSlotMap;
  562. volatile ALenum LastError;
  563. volatile ALenum UpdateSources;
  564. volatile enum DistanceModel DistanceModel;
  565. volatile ALboolean SourceDistanceModel;
  566. volatile ALfloat DopplerFactor;
  567. volatile ALfloat DopplerVelocity;
  568. volatile ALfloat SpeedOfSound;
  569. volatile ALenum DeferUpdates;
  570. struct ALsource **ActiveSources;
  571. ALsizei ActiveSourceCount;
  572. ALsizei MaxActiveSources;
  573. struct ALeffectslot **ActiveEffectSlots;
  574. ALsizei ActiveEffectSlotCount;
  575. ALsizei MaxActiveEffectSlots;
  576. ALCdevice *Device;
  577. const ALCchar *ExtensionList;
  578. ALCcontext *volatile next;
  579. };
  580. ALCcontext *GetContextRef(void);
  581. void ALCcontext_IncRef(ALCcontext *context);
  582. void ALCcontext_DecRef(ALCcontext *context);
  583. void AppendAllDevicesList(const ALCchar *name);
  584. void AppendCaptureDeviceList(const ALCchar *name);
  585. ALint64 ALCdevice_GetLatencyDefault(ALCdevice *device);
  586. void ALCdevice_Lock(ALCdevice *device);
  587. void ALCdevice_Unlock(ALCdevice *device);
  588. ALint64 ALCdevice_GetLatency(ALCdevice *device);
  589. inline void LockContext(ALCcontext *context)
  590. { ALCdevice_Lock(context->Device); }
  591. inline void UnlockContext(ALCcontext *context)
  592. { ALCdevice_Unlock(context->Device); }
  593. void *al_malloc(size_t alignment, size_t size);
  594. void *al_calloc(size_t alignment, size_t size);
  595. void al_free(void *ptr);
  596. typedef struct {
  597. #ifdef HAVE_FENV_H
  598. DERIVE_FROM_TYPE(fenv_t);
  599. #else
  600. int state;
  601. #endif
  602. #ifdef HAVE_SSE
  603. int sse_state;
  604. #endif
  605. } FPUCtl;
  606. void SetMixerFPUMode(FPUCtl *ctl);
  607. void RestoreFPUMode(const FPUCtl *ctl);
  608. typedef struct RingBuffer RingBuffer;
  609. RingBuffer *CreateRingBuffer(ALsizei frame_size, ALsizei length);
  610. void DestroyRingBuffer(RingBuffer *ring);
  611. ALsizei RingBufferSize(RingBuffer *ring);
  612. void WriteRingBuffer(RingBuffer *ring, const ALubyte *data, ALsizei len);
  613. void ReadRingBuffer(RingBuffer *ring, ALubyte *data, ALsizei len);
  614. void ReadALConfig(void);
  615. void FreeALConfig(void);
  616. int ConfigValueExists(const char *blockName, const char *keyName);
  617. const char *GetConfigValue(const char *blockName, const char *keyName, const char *def);
  618. int GetConfigValueBool(const char *blockName, const char *keyName, int def);
  619. int ConfigValueStr(const char *blockName, const char *keyName, const char **ret);
  620. int ConfigValueInt(const char *blockName, const char *keyName, int *ret);
  621. int ConfigValueUInt(const char *blockName, const char *keyName, unsigned int *ret);
  622. int ConfigValueFloat(const char *blockName, const char *keyName, float *ret);
  623. void SetRTPriority(void);
  624. void SetDefaultChannelOrder(ALCdevice *device);
  625. void SetDefaultWFXChannelOrder(ALCdevice *device);
  626. const ALCchar *DevFmtTypeString(enum DevFmtType type);
  627. const ALCchar *DevFmtChannelsString(enum DevFmtChannels chans);
  628. #define HRIR_BITS (7)
  629. #define HRIR_LENGTH (1<<HRIR_BITS)
  630. #define HRIR_MASK (HRIR_LENGTH-1)
  631. #define HRTFDELAY_BITS (20)
  632. #define HRTFDELAY_FRACONE (1<<HRTFDELAY_BITS)
  633. #define HRTFDELAY_MASK (HRTFDELAY_FRACONE-1)
  634. const struct Hrtf *GetHrtf(ALCdevice *device);
  635. void FindHrtfFormat(const ALCdevice *device, enum DevFmtChannels *chans, ALCuint *srate);
  636. void FreeHrtfs(void);
  637. ALuint GetHrtfIrSize(const struct Hrtf *Hrtf);
  638. ALfloat CalcHrtfDelta(ALfloat oldGain, ALfloat newGain, const ALfloat olddir[3], const ALfloat newdir[3]);
  639. void GetLerpedHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat azimuth, ALfloat gain, ALfloat (*coeffs)[2], ALuint *delays);
  640. ALuint GetMovingHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat azimuth, ALfloat gain, ALfloat delta, ALint counter, ALfloat (*coeffs)[2], ALuint *delays, ALfloat (*coeffStep)[2], ALint *delayStep);
  641. extern FILE *LogFile;
  642. #ifdef __GNUC__
  643. #define AL_PRINT(T, MSG, ...) fprintf(LogFile, "AL lib: %s %s: "MSG, T, __FUNCTION__ , ## __VA_ARGS__)
  644. #else
  645. void al_print(const char *type, const char *func, const char *fmt, ...) PRINTF_STYLE(3,4);
  646. #define AL_PRINT(T, MSG, ...) al_print((T), __FUNCTION__, MSG, __VA_ARGS__)
  647. #endif
  648. enum LogLevel {
  649. NoLog,
  650. LogError,
  651. LogWarning,
  652. LogTrace,
  653. LogRef
  654. };
  655. extern enum LogLevel LogLevel;
  656. #define TRACEREF(...) do { \
  657. if(LogLevel >= LogRef) \
  658. AL_PRINT("(--)", __VA_ARGS__); \
  659. } while(0)
  660. #define TRACE(...) do { \
  661. if(LogLevel >= LogTrace) \
  662. AL_PRINT("(II)", __VA_ARGS__); \
  663. } while(0)
  664. #define WARN(...) do { \
  665. if(LogLevel >= LogWarning) \
  666. AL_PRINT("(WW)", __VA_ARGS__); \
  667. } while(0)
  668. #define ERR(...) do { \
  669. if(LogLevel >= LogError) \
  670. AL_PRINT("(EE)", __VA_ARGS__); \
  671. } while(0)
  672. extern ALint RTPrioLevel;
  673. extern ALuint CPUCapFlags;
  674. enum {
  675. CPU_CAP_SSE = 1<<0,
  676. CPU_CAP_SSE2 = 1<<1,
  677. CPU_CAP_NEON = 1<<2,
  678. };
  679. void FillCPUCaps(ALuint capfilter);
  680. /* Small hack to use a pointer-to-array type as a normal argument type.
  681. * Shouldn't be used directly. */
  682. typedef ALfloat ALfloatBUFFERSIZE[BUFFERSIZE];
  683. #ifdef __cplusplus
  684. }
  685. #endif
  686. #endif