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