🛠️🐜 Antkeeper superbuild with dependencies included https://antkeeper.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

243 lines
8.8 KiB

  1. #ifndef ROUTER_ROUTER_H
  2. #define ROUTER_ROUTER_H
  3. #define WIN32_LEAN_AND_MEAN
  4. #include <windows.h>
  5. #include <winnt.h>
  6. #include <stdio.h>
  7. #include <atomic>
  8. #include <memory>
  9. #include <mutex>
  10. #include <string>
  11. #include <utility>
  12. #include <vector>
  13. #include "AL/alc.h"
  14. #include "AL/al.h"
  15. #include "AL/alext.h"
  16. #define MAKE_ALC_VER(major, minor) (((major)<<8) | (minor))
  17. struct DriverIface {
  18. std::wstring Name;
  19. HMODULE Module{nullptr};
  20. int ALCVer{0};
  21. std::once_flag InitOnceCtx{};
  22. LPALCCREATECONTEXT alcCreateContext{nullptr};
  23. LPALCMAKECONTEXTCURRENT alcMakeContextCurrent{nullptr};
  24. LPALCPROCESSCONTEXT alcProcessContext{nullptr};
  25. LPALCSUSPENDCONTEXT alcSuspendContext{nullptr};
  26. LPALCDESTROYCONTEXT alcDestroyContext{nullptr};
  27. LPALCGETCURRENTCONTEXT alcGetCurrentContext{nullptr};
  28. LPALCGETCONTEXTSDEVICE alcGetContextsDevice{nullptr};
  29. LPALCOPENDEVICE alcOpenDevice{nullptr};
  30. LPALCCLOSEDEVICE alcCloseDevice{nullptr};
  31. LPALCGETERROR alcGetError{nullptr};
  32. LPALCISEXTENSIONPRESENT alcIsExtensionPresent{nullptr};
  33. LPALCGETPROCADDRESS alcGetProcAddress{nullptr};
  34. LPALCGETENUMVALUE alcGetEnumValue{nullptr};
  35. LPALCGETSTRING alcGetString{nullptr};
  36. LPALCGETINTEGERV alcGetIntegerv{nullptr};
  37. LPALCCAPTUREOPENDEVICE alcCaptureOpenDevice{nullptr};
  38. LPALCCAPTURECLOSEDEVICE alcCaptureCloseDevice{nullptr};
  39. LPALCCAPTURESTART alcCaptureStart{nullptr};
  40. LPALCCAPTURESTOP alcCaptureStop{nullptr};
  41. LPALCCAPTURESAMPLES alcCaptureSamples{nullptr};
  42. PFNALCSETTHREADCONTEXTPROC alcSetThreadContext{nullptr};
  43. PFNALCGETTHREADCONTEXTPROC alcGetThreadContext{nullptr};
  44. LPALENABLE alEnable{nullptr};
  45. LPALDISABLE alDisable{nullptr};
  46. LPALISENABLED alIsEnabled{nullptr};
  47. LPALGETSTRING alGetString{nullptr};
  48. LPALGETBOOLEANV alGetBooleanv{nullptr};
  49. LPALGETINTEGERV alGetIntegerv{nullptr};
  50. LPALGETFLOATV alGetFloatv{nullptr};
  51. LPALGETDOUBLEV alGetDoublev{nullptr};
  52. LPALGETBOOLEAN alGetBoolean{nullptr};
  53. LPALGETINTEGER alGetInteger{nullptr};
  54. LPALGETFLOAT alGetFloat{nullptr};
  55. LPALGETDOUBLE alGetDouble{nullptr};
  56. LPALGETERROR alGetError{nullptr};
  57. LPALISEXTENSIONPRESENT alIsExtensionPresent{nullptr};
  58. LPALGETPROCADDRESS alGetProcAddress{nullptr};
  59. LPALGETENUMVALUE alGetEnumValue{nullptr};
  60. LPALLISTENERF alListenerf{nullptr};
  61. LPALLISTENER3F alListener3f{nullptr};
  62. LPALLISTENERFV alListenerfv{nullptr};
  63. LPALLISTENERI alListeneri{nullptr};
  64. LPALLISTENER3I alListener3i{nullptr};
  65. LPALLISTENERIV alListeneriv{nullptr};
  66. LPALGETLISTENERF alGetListenerf{nullptr};
  67. LPALGETLISTENER3F alGetListener3f{nullptr};
  68. LPALGETLISTENERFV alGetListenerfv{nullptr};
  69. LPALGETLISTENERI alGetListeneri{nullptr};
  70. LPALGETLISTENER3I alGetListener3i{nullptr};
  71. LPALGETLISTENERIV alGetListeneriv{nullptr};
  72. LPALGENSOURCES alGenSources{nullptr};
  73. LPALDELETESOURCES alDeleteSources{nullptr};
  74. LPALISSOURCE alIsSource{nullptr};
  75. LPALSOURCEF alSourcef{nullptr};
  76. LPALSOURCE3F alSource3f{nullptr};
  77. LPALSOURCEFV alSourcefv{nullptr};
  78. LPALSOURCEI alSourcei{nullptr};
  79. LPALSOURCE3I alSource3i{nullptr};
  80. LPALSOURCEIV alSourceiv{nullptr};
  81. LPALGETSOURCEF alGetSourcef{nullptr};
  82. LPALGETSOURCE3F alGetSource3f{nullptr};
  83. LPALGETSOURCEFV alGetSourcefv{nullptr};
  84. LPALGETSOURCEI alGetSourcei{nullptr};
  85. LPALGETSOURCE3I alGetSource3i{nullptr};
  86. LPALGETSOURCEIV alGetSourceiv{nullptr};
  87. LPALSOURCEPLAYV alSourcePlayv{nullptr};
  88. LPALSOURCESTOPV alSourceStopv{nullptr};
  89. LPALSOURCEREWINDV alSourceRewindv{nullptr};
  90. LPALSOURCEPAUSEV alSourcePausev{nullptr};
  91. LPALSOURCEPLAY alSourcePlay{nullptr};
  92. LPALSOURCESTOP alSourceStop{nullptr};
  93. LPALSOURCEREWIND alSourceRewind{nullptr};
  94. LPALSOURCEPAUSE alSourcePause{nullptr};
  95. LPALSOURCEQUEUEBUFFERS alSourceQueueBuffers{nullptr};
  96. LPALSOURCEUNQUEUEBUFFERS alSourceUnqueueBuffers{nullptr};
  97. LPALGENBUFFERS alGenBuffers{nullptr};
  98. LPALDELETEBUFFERS alDeleteBuffers{nullptr};
  99. LPALISBUFFER alIsBuffer{nullptr};
  100. LPALBUFFERF alBufferf{nullptr};
  101. LPALBUFFER3F alBuffer3f{nullptr};
  102. LPALBUFFERFV alBufferfv{nullptr};
  103. LPALBUFFERI alBufferi{nullptr};
  104. LPALBUFFER3I alBuffer3i{nullptr};
  105. LPALBUFFERIV alBufferiv{nullptr};
  106. LPALGETBUFFERF alGetBufferf{nullptr};
  107. LPALGETBUFFER3F alGetBuffer3f{nullptr};
  108. LPALGETBUFFERFV alGetBufferfv{nullptr};
  109. LPALGETBUFFERI alGetBufferi{nullptr};
  110. LPALGETBUFFER3I alGetBuffer3i{nullptr};
  111. LPALGETBUFFERIV alGetBufferiv{nullptr};
  112. LPALBUFFERDATA alBufferData{nullptr};
  113. LPALDOPPLERFACTOR alDopplerFactor{nullptr};
  114. LPALDOPPLERVELOCITY alDopplerVelocity{nullptr};
  115. LPALSPEEDOFSOUND alSpeedOfSound{nullptr};
  116. LPALDISTANCEMODEL alDistanceModel{nullptr};
  117. /* Functions to load after first context creation. */
  118. LPALGENFILTERS alGenFilters{nullptr};
  119. LPALDELETEFILTERS alDeleteFilters{nullptr};
  120. LPALISFILTER alIsFilter{nullptr};
  121. LPALFILTERF alFilterf{nullptr};
  122. LPALFILTERFV alFilterfv{nullptr};
  123. LPALFILTERI alFilteri{nullptr};
  124. LPALFILTERIV alFilteriv{nullptr};
  125. LPALGETFILTERF alGetFilterf{nullptr};
  126. LPALGETFILTERFV alGetFilterfv{nullptr};
  127. LPALGETFILTERI alGetFilteri{nullptr};
  128. LPALGETFILTERIV alGetFilteriv{nullptr};
  129. LPALGENEFFECTS alGenEffects{nullptr};
  130. LPALDELETEEFFECTS alDeleteEffects{nullptr};
  131. LPALISEFFECT alIsEffect{nullptr};
  132. LPALEFFECTF alEffectf{nullptr};
  133. LPALEFFECTFV alEffectfv{nullptr};
  134. LPALEFFECTI alEffecti{nullptr};
  135. LPALEFFECTIV alEffectiv{nullptr};
  136. LPALGETEFFECTF alGetEffectf{nullptr};
  137. LPALGETEFFECTFV alGetEffectfv{nullptr};
  138. LPALGETEFFECTI alGetEffecti{nullptr};
  139. LPALGETEFFECTIV alGetEffectiv{nullptr};
  140. LPALGENAUXILIARYEFFECTSLOTS alGenAuxiliaryEffectSlots{nullptr};
  141. LPALDELETEAUXILIARYEFFECTSLOTS alDeleteAuxiliaryEffectSlots{nullptr};
  142. LPALISAUXILIARYEFFECTSLOT alIsAuxiliaryEffectSlot{nullptr};
  143. LPALAUXILIARYEFFECTSLOTF alAuxiliaryEffectSlotf{nullptr};
  144. LPALAUXILIARYEFFECTSLOTFV alAuxiliaryEffectSlotfv{nullptr};
  145. LPALAUXILIARYEFFECTSLOTI alAuxiliaryEffectSloti{nullptr};
  146. LPALAUXILIARYEFFECTSLOTIV alAuxiliaryEffectSlotiv{nullptr};
  147. LPALGETAUXILIARYEFFECTSLOTF alGetAuxiliaryEffectSlotf{nullptr};
  148. LPALGETAUXILIARYEFFECTSLOTFV alGetAuxiliaryEffectSlotfv{nullptr};
  149. LPALGETAUXILIARYEFFECTSLOTI alGetAuxiliaryEffectSloti{nullptr};
  150. LPALGETAUXILIARYEFFECTSLOTIV alGetAuxiliaryEffectSlotiv{nullptr};
  151. template<typename T>
  152. DriverIface(T&& name, HMODULE mod)
  153. : Name(std::forward<T>(name)), Module(mod)
  154. { }
  155. ~DriverIface()
  156. {
  157. if(Module)
  158. FreeLibrary(Module);
  159. Module = nullptr;
  160. }
  161. };
  162. using DriverIfacePtr = std::unique_ptr<DriverIface>;
  163. extern std::vector<DriverIfacePtr> DriverList;
  164. extern thread_local DriverIface *ThreadCtxDriver;
  165. extern std::atomic<DriverIface*> CurrentCtxDriver;
  166. /* HACK: MinGW generates bad code when accessing an extern thread_local object.
  167. * Add a wrapper function for it that only accesses it where it's defined.
  168. */
  169. #ifdef __MINGW32__
  170. DriverIface *GetThreadDriver() noexcept;
  171. void SetThreadDriver(DriverIface *driver) noexcept;
  172. #else
  173. inline DriverIface *GetThreadDriver() noexcept { return ThreadCtxDriver; }
  174. inline void SetThreadDriver(DriverIface *driver) noexcept { ThreadCtxDriver = driver; }
  175. #endif
  176. class PtrIntMap {
  177. void **mKeys{nullptr};
  178. /* Shares memory with keys. */
  179. int *mValues{nullptr};
  180. ALsizei mSize{0};
  181. ALsizei mCapacity{0};
  182. std::mutex mLock;
  183. public:
  184. PtrIntMap() = default;
  185. ~PtrIntMap();
  186. ALenum insert(void *key, int value);
  187. int removeByKey(void *key);
  188. int lookupByKey(void *key);
  189. };
  190. enum LogLevel {
  191. LogLevel_None = 0,
  192. LogLevel_Error = 1,
  193. LogLevel_Warn = 2,
  194. LogLevel_Trace = 3,
  195. };
  196. extern enum LogLevel LogLevel;
  197. extern FILE *LogFile;
  198. #define TRACE(...) do { \
  199. if(LogLevel >= LogLevel_Trace) \
  200. { \
  201. fprintf(LogFile, "AL Router (II): " __VA_ARGS__); \
  202. fflush(LogFile); \
  203. } \
  204. } while(0)
  205. #define WARN(...) do { \
  206. if(LogLevel >= LogLevel_Warn) \
  207. { \
  208. fprintf(LogFile, "AL Router (WW): " __VA_ARGS__); \
  209. fflush(LogFile); \
  210. } \
  211. } while(0)
  212. #define ERR(...) do { \
  213. if(LogLevel >= LogLevel_Error) \
  214. { \
  215. fprintf(LogFile, "AL Router (EE): " __VA_ARGS__); \
  216. fflush(LogFile); \
  217. } \
  218. } while(0)
  219. #endif /* ROUTER_ROUTER_H */