Remove some unused context stuff
[alure.git] / src / context.h
blob787f4b965bea0e096c4dc837b649151fe94a5f0e
1 #ifndef CONTEXT_H
2 #define CONTEXT_H
4 #include "main.h"
6 #include <stdexcept>
7 #include <mutex>
8 #include <stack>
9 #include <queue>
10 #include <set>
12 #include "alc.h"
13 #include "alext.h"
15 #include "refcount.h"
16 #include "device.h"
18 namespace alure {
20 class ALDevice;
21 class ALBuffer;
22 class ALSource;
24 enum ALExtension {
25 EXT_EFX,
27 EXT_FLOAT32,
28 EXT_MCFORMATS,
29 EXT_BFORMAT,
31 EXT_MULAW,
32 EXT_MULAW_MCFORMATS,
33 EXT_MULAW_BFORMAT,
35 SOFT_source_latency,
37 AL_EXTENSION_MAX
40 class ALContext : public Context, public Listener {
41 static ALContext *sCurrentCtx;
42 static thread_local ALContext *sThreadCurrentCtx;
44 public:
45 static void MakeCurrent(ALContext *context);
46 static ALContext *GetCurrent() { return sThreadCurrentCtx ? sThreadCurrentCtx : sCurrentCtx; }
48 static void MakeThreadCurrent(ALContext *context);
49 static ALContext *GetThreadCurrent() { return sThreadCurrentCtx; }
51 private:
52 ALCcontext *mContext;
53 std::stack<ALuint> mSourceIds;
55 ALDevice *const mDevice;
56 std::queue<ALSource*> mFreeSources;
57 std::set<ALSource*> mUsedSources;
59 RefCount mRefs;
61 bool mHasExt[AL_EXTENSION_MAX];
63 std::once_flag mSetExts;
64 void setupExts();
66 public:
67 ALContext(ALCcontext *context, ALDevice *device);
68 virtual ~ALContext();
70 ALCcontext *getContext() const { return mContext; }
71 long addRef() { return ++mRefs; }
72 long decRef() { return --mRefs; }
74 bool hasExtension(ALExtension ext) const { return mHasExt[ext]; }
76 LPALGETSOURCEI64VSOFT alGetSourcei64vSOFT;
78 LPALGENEFFECTS alGenEffects;
79 LPALDELETEEFFECTS alDeleteEffects;
80 LPALISEFFECT alIsEffect;
81 LPALEFFECTI alEffecti;
82 LPALEFFECTIV alEffectiv;
83 LPALEFFECTF alEffectf;
84 LPALEFFECTFV alEffectfv;
85 LPALGETEFFECTI alGetEffecti;
86 LPALGETEFFECTIV alGetEffectiv;
87 LPALGETEFFECTF alGetEffectf;
88 LPALGETEFFECTFV alGetEffectfv;
90 LPALGENFILTERS alGenFilters;
91 LPALDELETEFILTERS alDeleteFilters;
92 LPALISFILTER alIsFilter;
93 LPALFILTERI alFilteri;
94 LPALFILTERIV alFilteriv;
95 LPALFILTERF alFilterf;
96 LPALFILTERFV alFilterfv;
97 LPALGETFILTERI alGetFilteri;
98 LPALGETFILTERIV alGetFilteriv;
99 LPALGETFILTERF alGetFilterf;
100 LPALGETFILTERFV alGetFilterfv;
102 LPALGENAUXILIARYEFFECTSLOTS alGenAuxiliaryEffectSlots;
103 LPALDELETEAUXILIARYEFFECTSLOTS alDeleteAuxiliaryEffectSlots;
104 LPALISAUXILIARYEFFECTSLOT alIsAuxiliaryEffectSlot;
105 LPALAUXILIARYEFFECTSLOTI alAuxiliaryEffectSloti;
106 LPALAUXILIARYEFFECTSLOTIV alAuxiliaryEffectSlotiv;
107 LPALAUXILIARYEFFECTSLOTF alAuxiliaryEffectSlotf;
108 LPALAUXILIARYEFFECTSLOTFV alAuxiliaryEffectSlotfv;
109 LPALGETAUXILIARYEFFECTSLOTI alGetAuxiliaryEffectSloti;
110 LPALGETAUXILIARYEFFECTSLOTIV alGetAuxiliaryEffectSlotiv;
111 LPALGETAUXILIARYEFFECTSLOTF alGetAuxiliaryEffectSlotf;
112 LPALGETAUXILIARYEFFECTSLOTFV alGetAuxiliaryEffectSlotfv;
114 ALuint getSourceId(ALuint maxprio);
115 void insertSourceId(ALuint id) { mSourceIds.push(id); }
117 void freeSource(ALSource *source);
119 virtual Device *getDevice() final;
121 virtual void destroy() final;
123 virtual void startBatch() final;
124 virtual void endBatch() final;
126 virtual Listener *getListener() final;
128 virtual std::unique_ptr<Decoder> createDecoder(const std::string &name) final;
130 virtual Buffer *getBuffer(const std::string &name) final;
131 virtual void removeBuffer(const std::string &name) final;
132 virtual void removeBuffer(Buffer *buffer) final;
134 virtual Source *getSource() final;
136 virtual AuxiliaryEffectSlot *createAuxiliaryEffectSlot() final;
138 virtual Effect *createEffect() final;
140 virtual void setDopplerFactor(ALfloat factor) final;
142 virtual void setSpeedOfSound(ALfloat speed) final;
144 virtual void setDistanceModel(DistanceModel model) final;
146 virtual void update() final;
148 // Listener methods
149 virtual void setGain(ALfloat gain) final;
151 virtual void setPosition(ALfloat x, ALfloat y, ALfloat z) final;
152 virtual void setPosition(const ALfloat *pos) final;
154 virtual void setVelocity(ALfloat x, ALfloat y, ALfloat z) final;
155 virtual void setVelocity(const ALfloat *vel) final;
157 virtual void setOrientation(ALfloat x1, ALfloat y1, ALfloat z1, ALfloat x2, ALfloat y2, ALfloat z2) final;
158 virtual void setOrientation(const ALfloat *at, const ALfloat *up) final;
159 virtual void setOrientation(const ALfloat *ori) final;
163 inline void CheckContext(ALContext *ctx)
165 if(ctx != ALContext::GetCurrent())
166 throw std::runtime_error("Called context is not current");
169 inline void CheckContextDevice(ALDevice *device)
171 ALContext *ctx = ALContext::GetCurrent();
172 if(!ctx || device != ctx->getDevice())
173 throw std::runtime_error("Called device is not current");
176 } // namespace alure
178 #endif /* CONTEXT_H */