router.h 8.6 KB

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