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