al.cpp 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include "config.h"
  2. #include <cstddef>
  3. #include "AL/al.h"
  4. #include "router.h"
  5. #define DECL_THUNK1(R,n,T1) \
  6. AL_API auto AL_APIENTRY n(T1 a) noexcept -> R \
  7. { \
  8. DriverIface *iface = GetThreadDriver(); \
  9. if(!iface) iface = CurrentCtxDriver.load(std::memory_order_acquire); \
  10. return iface->n(a); \
  11. }
  12. #define DECL_THUNK2(R,n,T1,T2) \
  13. AL_API auto AL_APIENTRY n(T1 a, T2 b) noexcept -> R \
  14. { \
  15. DriverIface *iface = GetThreadDriver(); \
  16. if(!iface) iface = CurrentCtxDriver.load(std::memory_order_acquire); \
  17. return iface->n(a, b); \
  18. }
  19. #define DECL_THUNK3(R,n,T1,T2,T3) \
  20. AL_API auto AL_APIENTRY n(T1 a, T2 b, T3 c) noexcept -> R \
  21. { \
  22. DriverIface *iface = GetThreadDriver(); \
  23. if(!iface) iface = CurrentCtxDriver.load(std::memory_order_acquire); \
  24. return iface->n(a, b, c); \
  25. }
  26. #define DECL_THUNK4(R,n,T1,T2,T3,T4) \
  27. AL_API auto AL_APIENTRY n(T1 a, T2 b, T3 c, T4 d) noexcept -> R \
  28. { \
  29. DriverIface *iface = GetThreadDriver(); \
  30. if(!iface) iface = CurrentCtxDriver.load(std::memory_order_acquire); \
  31. return iface->n(a, b, c, d); \
  32. }
  33. #define DECL_THUNK5(R,n,T1,T2,T3,T4,T5) \
  34. AL_API auto AL_APIENTRY n(T1 a, T2 b, T3 c, T4 d, T5 e) noexcept -> R \
  35. { \
  36. DriverIface *iface = GetThreadDriver(); \
  37. if(!iface) iface = CurrentCtxDriver.load(std::memory_order_acquire); \
  38. return iface->n(a, b, c, d, e); \
  39. }
  40. /* Ugly hack for some apps calling alGetError without a current context, and
  41. * expecting it to be AL_NO_ERROR.
  42. */
  43. AL_API auto AL_APIENTRY alGetError() noexcept -> ALenum
  44. {
  45. DriverIface *iface = GetThreadDriver();
  46. if(!iface) iface = CurrentCtxDriver.load(std::memory_order_acquire);
  47. return iface ? iface->alGetError() : AL_NO_ERROR;
  48. }
  49. DECL_THUNK1(void, alDopplerFactor, ALfloat)
  50. DECL_THUNK1(void, alDopplerVelocity, ALfloat)
  51. DECL_THUNK1(void, alSpeedOfSound, ALfloat)
  52. DECL_THUNK1(void, alDistanceModel, ALenum)
  53. DECL_THUNK1(void, alEnable, ALenum)
  54. DECL_THUNK1(void, alDisable, ALenum)
  55. DECL_THUNK1(ALboolean, alIsEnabled, ALenum)
  56. DECL_THUNK1(const ALchar*, alGetString, ALenum)
  57. DECL_THUNK2(void, alGetBooleanv, ALenum, ALboolean*)
  58. DECL_THUNK2(void, alGetIntegerv, ALenum, ALint*)
  59. DECL_THUNK2(void, alGetFloatv, ALenum, ALfloat*)
  60. DECL_THUNK2(void, alGetDoublev, ALenum, ALdouble*)
  61. DECL_THUNK1(ALboolean, alGetBoolean, ALenum)
  62. DECL_THUNK1(ALint, alGetInteger, ALenum)
  63. DECL_THUNK1(ALfloat, alGetFloat, ALenum)
  64. DECL_THUNK1(ALdouble, alGetDouble, ALenum)
  65. DECL_THUNK1(ALboolean, alIsExtensionPresent, const ALchar*)
  66. DECL_THUNK1(void*, alGetProcAddress, const ALchar*)
  67. DECL_THUNK1(ALenum, alGetEnumValue, const ALchar*)
  68. DECL_THUNK2(void, alListenerf, ALenum, ALfloat)
  69. DECL_THUNK4(void, alListener3f, ALenum, ALfloat, ALfloat, ALfloat)
  70. DECL_THUNK2(void, alListenerfv, ALenum, const ALfloat*)
  71. DECL_THUNK2(void, alListeneri, ALenum, ALint)
  72. DECL_THUNK4(void, alListener3i, ALenum, ALint, ALint, ALint)
  73. DECL_THUNK2(void, alListeneriv, ALenum, const ALint*)
  74. DECL_THUNK2(void, alGetListenerf, ALenum, ALfloat*)
  75. DECL_THUNK4(void, alGetListener3f, ALenum, ALfloat*, ALfloat*, ALfloat*)
  76. DECL_THUNK2(void, alGetListenerfv, ALenum, ALfloat*)
  77. DECL_THUNK2(void, alGetListeneri, ALenum, ALint*)
  78. DECL_THUNK4(void, alGetListener3i, ALenum, ALint*, ALint*, ALint*)
  79. DECL_THUNK2(void, alGetListeneriv, ALenum, ALint*)
  80. DECL_THUNK2(void, alGenSources, ALsizei, ALuint*)
  81. DECL_THUNK2(void, alDeleteSources, ALsizei, const ALuint*)
  82. DECL_THUNK1(ALboolean, alIsSource, ALuint)
  83. DECL_THUNK3(void, alSourcef, ALuint, ALenum, ALfloat)
  84. DECL_THUNK5(void, alSource3f, ALuint, ALenum, ALfloat, ALfloat, ALfloat)
  85. DECL_THUNK3(void, alSourcefv, ALuint, ALenum, const ALfloat*)
  86. DECL_THUNK3(void, alSourcei, ALuint, ALenum, ALint)
  87. DECL_THUNK5(void, alSource3i, ALuint, ALenum, ALint, ALint, ALint)
  88. DECL_THUNK3(void, alSourceiv, ALuint, ALenum, const ALint*)
  89. DECL_THUNK3(void, alGetSourcef, ALuint, ALenum, ALfloat*)
  90. DECL_THUNK5(void, alGetSource3f, ALuint, ALenum, ALfloat*, ALfloat*, ALfloat*)
  91. DECL_THUNK3(void, alGetSourcefv, ALuint, ALenum, ALfloat*)
  92. DECL_THUNK3(void, alGetSourcei, ALuint, ALenum, ALint*)
  93. DECL_THUNK5(void, alGetSource3i, ALuint, ALenum, ALint*, ALint*, ALint*)
  94. DECL_THUNK3(void, alGetSourceiv, ALuint, ALenum, ALint*)
  95. DECL_THUNK2(void, alSourcePlayv, ALsizei, const ALuint*)
  96. DECL_THUNK2(void, alSourceStopv, ALsizei, const ALuint*)
  97. DECL_THUNK2(void, alSourceRewindv, ALsizei, const ALuint*)
  98. DECL_THUNK2(void, alSourcePausev, ALsizei, const ALuint*)
  99. DECL_THUNK1(void, alSourcePlay, ALuint)
  100. DECL_THUNK1(void, alSourceStop, ALuint)
  101. DECL_THUNK1(void, alSourceRewind, ALuint)
  102. DECL_THUNK1(void, alSourcePause, ALuint)
  103. DECL_THUNK3(void, alSourceQueueBuffers, ALuint, ALsizei, const ALuint*)
  104. DECL_THUNK3(void, alSourceUnqueueBuffers, ALuint, ALsizei, ALuint*)
  105. DECL_THUNK2(void, alGenBuffers, ALsizei, ALuint*)
  106. DECL_THUNK2(void, alDeleteBuffers, ALsizei, const ALuint*)
  107. DECL_THUNK1(ALboolean, alIsBuffer, ALuint)
  108. DECL_THUNK3(void, alBufferf, ALuint, ALenum, ALfloat)
  109. DECL_THUNK5(void, alBuffer3f, ALuint, ALenum, ALfloat, ALfloat, ALfloat)
  110. DECL_THUNK3(void, alBufferfv, ALuint, ALenum, const ALfloat*)
  111. DECL_THUNK3(void, alBufferi, ALuint, ALenum, ALint)
  112. DECL_THUNK5(void, alBuffer3i, ALuint, ALenum, ALint, ALint, ALint)
  113. DECL_THUNK3(void, alBufferiv, ALuint, ALenum, const ALint*)
  114. DECL_THUNK3(void, alGetBufferf, ALuint, ALenum, ALfloat*)
  115. DECL_THUNK5(void, alGetBuffer3f, ALuint, ALenum, ALfloat*, ALfloat*, ALfloat*)
  116. DECL_THUNK3(void, alGetBufferfv, ALuint, ALenum, ALfloat*)
  117. DECL_THUNK3(void, alGetBufferi, ALuint, ALenum, ALint*)
  118. DECL_THUNK5(void, alGetBuffer3i, ALuint, ALenum, ALint*, ALint*, ALint*)
  119. DECL_THUNK3(void, alGetBufferiv, ALuint, ALenum, ALint*)
  120. DECL_THUNK5(void, alBufferData, ALuint, ALenum, const ALvoid*, ALsizei, ALsizei)
  121. /* EFX 1.0. Required here to be exported from libOpenAL32.dll.a/OpenAL32.lib
  122. * with the router enabled.
  123. */
  124. DECL_THUNK2(void, alGenFilters, ALsizei, ALuint*)
  125. DECL_THUNK2(void, alDeleteFilters, ALsizei, const ALuint*)
  126. DECL_THUNK1(ALboolean, alIsFilter, ALuint)
  127. DECL_THUNK3(void, alFilterf, ALuint, ALenum, ALfloat)
  128. DECL_THUNK3(void, alFilterfv, ALuint, ALenum, const ALfloat*)
  129. DECL_THUNK3(void, alFilteri, ALuint, ALenum, ALint)
  130. DECL_THUNK3(void, alFilteriv, ALuint, ALenum, const ALint*)
  131. DECL_THUNK3(void, alGetFilterf, ALuint, ALenum, ALfloat*)
  132. DECL_THUNK3(void, alGetFilterfv, ALuint, ALenum, ALfloat*)
  133. DECL_THUNK3(void, alGetFilteri, ALuint, ALenum, ALint*)
  134. DECL_THUNK3(void, alGetFilteriv, ALuint, ALenum, ALint*)
  135. DECL_THUNK2(void, alGenEffects, ALsizei, ALuint*)
  136. DECL_THUNK2(void, alDeleteEffects, ALsizei, const ALuint*)
  137. DECL_THUNK1(ALboolean, alIsEffect, ALuint)
  138. DECL_THUNK3(void, alEffectf, ALuint, ALenum, ALfloat)
  139. DECL_THUNK3(void, alEffectfv, ALuint, ALenum, const ALfloat*)
  140. DECL_THUNK3(void, alEffecti, ALuint, ALenum, ALint)
  141. DECL_THUNK3(void, alEffectiv, ALuint, ALenum, const ALint*)
  142. DECL_THUNK3(void, alGetEffectf, ALuint, ALenum, ALfloat*)
  143. DECL_THUNK3(void, alGetEffectfv, ALuint, ALenum, ALfloat*)
  144. DECL_THUNK3(void, alGetEffecti, ALuint, ALenum, ALint*)
  145. DECL_THUNK3(void, alGetEffectiv, ALuint, ALenum, ALint*)
  146. DECL_THUNK2(void, alGenAuxiliaryEffectSlots, ALsizei, ALuint*)
  147. DECL_THUNK2(void, alDeleteAuxiliaryEffectSlots, ALsizei, const ALuint*)
  148. DECL_THUNK1(ALboolean, alIsAuxiliaryEffectSlot, ALuint)
  149. DECL_THUNK3(void, alAuxiliaryEffectSlotf, ALuint, ALenum, ALfloat)
  150. DECL_THUNK3(void, alAuxiliaryEffectSlotfv, ALuint, ALenum, const ALfloat*)
  151. DECL_THUNK3(void, alAuxiliaryEffectSloti, ALuint, ALenum, ALint)
  152. DECL_THUNK3(void, alAuxiliaryEffectSlotiv, ALuint, ALenum, const ALint*)
  153. DECL_THUNK3(void, alGetAuxiliaryEffectSlotf, ALuint, ALenum, ALfloat*)
  154. DECL_THUNK3(void, alGetAuxiliaryEffectSlotfv, ALuint, ALenum, ALfloat*)
  155. DECL_THUNK3(void, alGetAuxiliaryEffectSloti, ALuint, ALenum, ALint*)
  156. DECL_THUNK3(void, alGetAuxiliaryEffectSlotiv, ALuint, ALenum, ALint*)