router.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  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. #define MAKE_ALC_VER(major, minor) (((major)<<8) | (minor))
  15. struct DriverIface {
  16. std::wstring Name;
  17. HMODULE Module{nullptr};
  18. int ALCVer{0};
  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. DriverIface(std::wstring name, HMODULE mod)
  115. : Name(std::move(name)), Module(mod)
  116. { }
  117. ~DriverIface()
  118. {
  119. if(Module)
  120. FreeLibrary(Module);
  121. Module = nullptr;
  122. }
  123. };
  124. extern std::vector<DriverIface> DriverList;
  125. extern thread_local DriverIface *ThreadCtxDriver;
  126. extern std::atomic<DriverIface*> CurrentCtxDriver;
  127. class PtrIntMap {
  128. void **mKeys{nullptr};
  129. /* Shares memory with keys. */
  130. int *mValues{nullptr};
  131. ALsizei mSize{0};
  132. ALsizei mCapacity{0};
  133. std::mutex mLock;
  134. public:
  135. PtrIntMap() = default;
  136. ~PtrIntMap();
  137. ALenum insert(void *key, int value);
  138. int removeByKey(void *key);
  139. int lookupByKey(void *key);
  140. };
  141. enum LogLevel {
  142. LogLevel_None = 0,
  143. LogLevel_Error = 1,
  144. LogLevel_Warn = 2,
  145. LogLevel_Trace = 3,
  146. };
  147. extern enum LogLevel LogLevel;
  148. extern FILE *LogFile;
  149. #define TRACE(...) do { \
  150. if(LogLevel >= LogLevel_Trace) \
  151. { \
  152. fprintf(LogFile, "AL Router (II): " __VA_ARGS__); \
  153. fflush(LogFile); \
  154. } \
  155. } while(0)
  156. #define WARN(...) do { \
  157. if(LogLevel >= LogLevel_Warn) \
  158. { \
  159. fprintf(LogFile, "AL Router (WW): " __VA_ARGS__); \
  160. fflush(LogFile); \
  161. } \
  162. } while(0)
  163. #define ERR(...) do { \
  164. if(LogLevel >= LogLevel_Error) \
  165. { \
  166. fprintf(LogFile, "AL Router (EE): " __VA_ARGS__); \
  167. fflush(LogFile); \
  168. } \
  169. } while(0)
  170. #endif /* ROUTER_ROUTER_H */