Rename parse_timeval for consistency
[alure.git] / src / auxeffectslot.cpp
blob8e3a80a2d1f0cb7d53e96a01667763fdb2e6b077
2 #include "config.h"
4 #include "auxeffectslot.h"
6 #include <stdexcept>
8 #include "context.h"
9 #include "effect.h"
11 namespace alure
14 static inline bool operator<(const SourceSend &lhs, const SourceSend &rhs)
15 { return lhs.mSource < rhs.mSource || (lhs.mSource == rhs.mSource && lhs.mSend < rhs.mSend); }
16 static inline bool operator==(const SourceSend &lhs, const SourceSend &rhs)
17 { return lhs.mSource == rhs.mSource && lhs.mSend == rhs.mSend; }
18 static inline bool operator!=(const SourceSend &lhs, const SourceSend &rhs)
19 { return !(lhs == rhs); }
21 void AuxiliaryEffectSlotImpl::addSourceSend(SourceSend source_send)
23 auto iter = std::lower_bound(mSourceSends.begin(), mSourceSends.end(), source_send);
24 if(iter == mSourceSends.end() || *iter != source_send)
25 mSourceSends.insert(iter, source_send);
28 void AuxiliaryEffectSlotImpl::removeSourceSend(SourceSend source_send)
30 auto iter = std::lower_bound(mSourceSends.begin(), mSourceSends.end(), source_send);
31 if(iter != mSourceSends.end() && *iter == source_send)
32 mSourceSends.erase(iter);
36 DECL_THUNK1(void, AuxiliaryEffectSlot, setGain,, ALfloat)
37 void AuxiliaryEffectSlotImpl::setGain(ALfloat gain)
39 if(!(gain >= 0.0f && gain <= 1.0f))
40 throw std::out_of_range("Gain out of range");
41 CheckContext(mContext);
42 mContext->alAuxiliaryEffectSlotf(mId, AL_EFFECTSLOT_GAIN, gain);
45 DECL_THUNK1(void, AuxiliaryEffectSlot, setSendAuto,, bool)
46 void AuxiliaryEffectSlotImpl::setSendAuto(bool sendauto)
48 CheckContext(mContext);
49 mContext->alAuxiliaryEffectSloti(mId, AL_EFFECTSLOT_AUXILIARY_SEND_AUTO, sendauto ? AL_TRUE : AL_FALSE);
52 DECL_THUNK1(void, AuxiliaryEffectSlot, applyEffect,, Effect)
53 void AuxiliaryEffectSlotImpl::applyEffect(Effect effect)
55 const EffectImpl *eff = effect.getHandle();
56 if(eff) CheckContexts(mContext, eff->getContext());
57 CheckContext(mContext);
59 mContext->alAuxiliaryEffectSloti(mId,
60 AL_EFFECTSLOT_EFFECT, eff ? eff->getId() : AL_EFFECT_NULL
65 void AuxiliaryEffectSlot::release()
67 AuxiliaryEffectSlotImpl *i = pImpl;
68 pImpl = nullptr;
69 i->release();
71 void AuxiliaryEffectSlotImpl::release()
73 CheckContext(mContext);
75 if(!mSourceSends.empty())
77 Vector<SourceSend> source_sends;
78 source_sends.swap(mSourceSends);
80 auto batcher = mContext->getBatcher();
81 for(const SourceSend &srcsend : source_sends)
82 srcsend.mSource.getHandle()->setAuxiliarySend(nullptr, srcsend.mSend);
85 alGetError();
86 mContext->alDeleteAuxiliaryEffectSlots(1, &mId);
87 ALenum err = alGetError();
88 if(err != AL_NO_ERROR)
89 throw al_error(err, "AuxiliaryEffectSlot failed to delete");
90 mId = 0;
92 delete this;
95 DECL_THUNK0(Vector<SourceSend>, AuxiliaryEffectSlot, getSourceSends, const)
96 DECL_THUNK0(size_t, AuxiliaryEffectSlot, getUseCount, const)
98 } // namespace alure