40 class ALContext
: public Context
, public Listener
{
41 static ALContext
*sCurrentCtx
;
42 static thread_local ALContext
*sThreadCurrentCtx
;
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
; }
53 std::stack
<ALuint
> mSourceIds
;
55 ALDevice
*const mDevice
;
56 std::queue
<ALSource
*> mFreeSources
;
57 std::set
<ALSource
*> mUsedSources
;
61 bool mHasExt
[AL_EXTENSION_MAX
];
63 std::once_flag mSetExts
;
67 ALContext(ALCcontext
*context
, ALDevice
*device
);
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
;
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");
178 #endif /* CONTEXT_H */