🛠️🐜 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.

204 lines
6.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 <vector>
  8. #include <string>
  9. #include <atomic>
  10. #include <mutex>
  11. #include "AL/alc.h"
  12. #include "AL/al.h"
  13. #include "AL/alext.h"
  14. #ifndef UNUSED
  15. #if defined(__cplusplus)
  16. #define UNUSED(x)
  17. #elif defined(__GNUC__)
  18. #define UNUSED(x) UNUSED_##x __attribute__((unused))
  19. #elif defined(__LCLINT__)
  20. #define UNUSED(x) /*@unused@*/ x
  21. #else
  22. #define UNUSED(x) x
  23. #endif
  24. #endif
  25. #define MAKE_ALC_VER(major, minor) (((major)<<8) | (minor))
  26. struct DriverIface {
  27. std::wstring Name;
  28. HMODULE Module{nullptr};
  29. int ALCVer{0};
  30. LPALCCREATECONTEXT alcCreateContext{nullptr};
  31. LPALCMAKECONTEXTCURRENT alcMakeContextCurrent{nullptr};
  32. LPALCPROCESSCONTEXT alcProcessContext{nullptr};
  33. LPALCSUSPENDCONTEXT alcSuspendContext{nullptr};
  34. LPALCDESTROYCONTEXT alcDestroyContext{nullptr};
  35. LPALCGETCURRENTCONTEXT alcGetCurrentContext{nullptr};
  36. LPALCGETCONTEXTSDEVICE alcGetContextsDevice{nullptr};
  37. LPALCOPENDEVICE alcOpenDevice{nullptr};
  38. LPALCCLOSEDEVICE alcCloseDevice{nullptr};
  39. LPALCGETERROR alcGetError{nullptr};
  40. LPALCISEXTENSIONPRESENT alcIsExtensionPresent{nullptr};
  41. LPALCGETPROCADDRESS alcGetProcAddress{nullptr};
  42. LPALCGETENUMVALUE alcGetEnumValue{nullptr};
  43. LPALCGETSTRING alcGetString{nullptr};
  44. LPALCGETINTEGERV alcGetIntegerv{nullptr};
  45. LPALCCAPTUREOPENDEVICE alcCaptureOpenDevice{nullptr};
  46. LPALCCAPTURECLOSEDEVICE alcCaptureCloseDevice{nullptr};
  47. LPALCCAPTURESTART alcCaptureStart{nullptr};
  48. LPALCCAPTURESTOP alcCaptureStop{nullptr};
  49. LPALCCAPTURESAMPLES alcCaptureSamples{nullptr};
  50. PFNALCSETTHREADCONTEXTPROC alcSetThreadContext{nullptr};
  51. PFNALCGETTHREADCONTEXTPROC alcGetThreadContext{nullptr};
  52. LPALENABLE alEnable{nullptr};
  53. LPALDISABLE alDisable{nullptr};
  54. LPALISENABLED alIsEnabled{nullptr};
  55. LPALGETSTRING alGetString{nullptr};
  56. LPALGETBOOLEANV alGetBooleanv{nullptr};
  57. LPALGETINTEGERV alGetIntegerv{nullptr};
  58. LPALGETFLOATV alGetFloatv{nullptr};
  59. LPALGETDOUBLEV alGetDoublev{nullptr};
  60. LPALGETBOOLEAN alGetBoolean{nullptr};
  61. LPALGETINTEGER alGetInteger{nullptr};
  62. LPALGETFLOAT alGetFloat{nullptr};
  63. LPALGETDOUBLE alGetDouble{nullptr};
  64. LPALGETERROR alGetError{nullptr};
  65. LPALISEXTENSIONPRESENT alIsExtensionPresent{nullptr};
  66. LPALGETPROCADDRESS alGetProcAddress{nullptr};
  67. LPALGETENUMVALUE alGetEnumValue{nullptr};
  68. LPALLISTENERF alListenerf{nullptr};
  69. LPALLISTENER3F alListener3f{nullptr};
  70. LPALLISTENERFV alListenerfv{nullptr};
  71. LPALLISTENERI alListeneri{nullptr};
  72. LPALLISTENER3I alListener3i{nullptr};
  73. LPALLISTENERIV alListeneriv{nullptr};
  74. LPALGETLISTENERF alGetListenerf{nullptr};
  75. LPALGETLISTENER3F alGetListener3f{nullptr};
  76. LPALGETLISTENERFV alGetListenerfv{nullptr};
  77. LPALGETLISTENERI alGetListeneri{nullptr};
  78. LPALGETLISTENER3I alGetListener3i{nullptr};
  79. LPALGETLISTENERIV alGetListeneriv{nullptr};
  80. LPALGENSOURCES alGenSources{nullptr};
  81. LPALDELETESOURCES alDeleteSources{nullptr};
  82. LPALISSOURCE alIsSource{nullptr};
  83. LPALSOURCEF alSourcef{nullptr};
  84. LPALSOURCE3F alSource3f{nullptr};
  85. LPALSOURCEFV alSourcefv{nullptr};
  86. LPALSOURCEI alSourcei{nullptr};
  87. LPALSOURCE3I alSource3i{nullptr};
  88. LPALSOURCEIV alSourceiv{nullptr};
  89. LPALGETSOURCEF alGetSourcef{nullptr};
  90. LPALGETSOURCE3F alGetSource3f{nullptr};
  91. LPALGETSOURCEFV alGetSourcefv{nullptr};
  92. LPALGETSOURCEI alGetSourcei{nullptr};
  93. LPALGETSOURCE3I alGetSource3i{nullptr};
  94. LPALGETSOURCEIV alGetSourceiv{nullptr};
  95. LPALSOURCEPLAYV alSourcePlayv{nullptr};
  96. LPALSOURCESTOPV alSourceStopv{nullptr};
  97. LPALSOURCEREWINDV alSourceRewindv{nullptr};
  98. LPALSOURCEPAUSEV alSourcePausev{nullptr};
  99. LPALSOURCEPLAY alSourcePlay{nullptr};
  100. LPALSOURCESTOP alSourceStop{nullptr};
  101. LPALSOURCEREWIND alSourceRewind{nullptr};
  102. LPALSOURCEPAUSE alSourcePause{nullptr};
  103. LPALSOURCEQUEUEBUFFERS alSourceQueueBuffers{nullptr};
  104. LPALSOURCEUNQUEUEBUFFERS alSourceUnqueueBuffers{nullptr};
  105. LPALGENBUFFERS alGenBuffers{nullptr};
  106. LPALDELETEBUFFERS alDeleteBuffers{nullptr};
  107. LPALISBUFFER alIsBuffer{nullptr};
  108. LPALBUFFERF alBufferf{nullptr};
  109. LPALBUFFER3F alBuffer3f{nullptr};
  110. LPALBUFFERFV alBufferfv{nullptr};
  111. LPALBUFFERI alBufferi{nullptr};
  112. LPALBUFFER3I alBuffer3i{nullptr};
  113. LPALBUFFERIV alBufferiv{nullptr};
  114. LPALGETBUFFERF alGetBufferf{nullptr};
  115. LPALGETBUFFER3F alGetBuffer3f{nullptr};
  116. LPALGETBUFFERFV alGetBufferfv{nullptr};
  117. LPALGETBUFFERI alGetBufferi{nullptr};
  118. LPALGETBUFFER3I alGetBuffer3i{nullptr};
  119. LPALGETBUFFERIV alGetBufferiv{nullptr};
  120. LPALBUFFERDATA alBufferData{nullptr};
  121. LPALDOPPLERFACTOR alDopplerFactor{nullptr};
  122. LPALDOPPLERVELOCITY alDopplerVelocity{nullptr};
  123. LPALSPEEDOFSOUND alSpeedOfSound{nullptr};
  124. LPALDISTANCEMODEL alDistanceModel{nullptr};
  125. DriverIface(std::wstring name, HMODULE mod)
  126. : Name(std::move(name)), Module(mod)
  127. { }
  128. ~DriverIface()
  129. {
  130. if(Module)
  131. FreeLibrary(Module);
  132. Module = nullptr;
  133. }
  134. };
  135. extern std::vector<DriverIface> DriverList;
  136. extern thread_local DriverIface *ThreadCtxDriver;
  137. extern std::atomic<DriverIface*> CurrentCtxDriver;
  138. class PtrIntMap {
  139. ALvoid **mKeys{nullptr};
  140. /* Shares memory with keys. */
  141. ALint *mValues{nullptr};
  142. ALsizei mSize{0};
  143. ALsizei mCapacity{0};
  144. std::mutex mLock;
  145. public:
  146. PtrIntMap() = default;
  147. ~PtrIntMap();
  148. ALenum insert(ALvoid *key, ALint value);
  149. ALint removeByKey(ALvoid *key);
  150. ALint lookupByKey(ALvoid *key);
  151. };
  152. enum LogLevel {
  153. LogLevel_None = 0,
  154. LogLevel_Error = 1,
  155. LogLevel_Warn = 2,
  156. LogLevel_Trace = 3,
  157. };
  158. extern enum LogLevel LogLevel;
  159. extern FILE *LogFile;
  160. #define TRACE(...) do { \
  161. if(LogLevel >= LogLevel_Trace) \
  162. { \
  163. fprintf(LogFile, "AL Router (II): " __VA_ARGS__); \
  164. fflush(LogFile); \
  165. } \
  166. } while(0)
  167. #define WARN(...) do { \
  168. if(LogLevel >= LogLevel_Warn) \
  169. { \
  170. fprintf(LogFile, "AL Router (WW): " __VA_ARGS__); \
  171. fflush(LogFile); \
  172. } \
  173. } while(0)
  174. #define ERR(...) do { \
  175. if(LogLevel >= LogLevel_Error) \
  176. { \
  177. fprintf(LogFile, "AL Router (EE): " __VA_ARGS__); \
  178. fflush(LogFile); \
  179. } \
  180. } while(0)
  181. #endif /* ROUTER_ROUTER_H */