router.h 8.5 KB

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