diff options
Diffstat (limited to 'al/source.h')
-rw-r--r-- | al/source.h | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/al/source.h b/al/source.h new file mode 100644 index 00000000..7ca889d7 --- /dev/null +++ b/al/source.h @@ -0,0 +1,129 @@ +#ifndef AL_SOURCE_H +#define AL_SOURCE_H + +#include <array> +#include <atomic> +#include <cstddef> +#include <iterator> + +#include "AL/al.h" +#include "AL/alc.h" + +#include "alcontext.h" +#include "almalloc.h" +#include "alnumeric.h" +#include "alu.h" +#include "vector.h" + +struct ALbuffer; +struct ALeffectslot; + + +#define DEFAULT_SENDS 2 + +#define INVALID_VOICE_IDX static_cast<ALuint>(-1) + +struct ALbufferlistitem { + std::atomic<ALbufferlistitem*> mNext{nullptr}; + ALuint mSampleLen{0u}; + ALbuffer *mBuffer{nullptr}; + + DEF_NEWDEL(ALbufferlistitem) +}; + + +struct ALsource { + /** Source properties. */ + ALfloat Pitch; + ALfloat Gain; + ALfloat OuterGain; + ALfloat MinGain; + ALfloat MaxGain; + ALfloat InnerAngle; + ALfloat OuterAngle; + ALfloat RefDistance; + ALfloat MaxDistance; + ALfloat RolloffFactor; + std::array<ALfloat,3> Position; + std::array<ALfloat,3> Velocity; + std::array<ALfloat,3> Direction; + std::array<ALfloat,3> OrientAt; + std::array<ALfloat,3> OrientUp; + bool HeadRelative; + bool Looping; + DistanceModel mDistanceModel; + Resampler mResampler; + bool DirectChannels; + SpatializeMode mSpatialize; + + bool DryGainHFAuto; + bool WetGainAuto; + bool WetGainHFAuto; + ALfloat OuterGainHF; + + ALfloat AirAbsorptionFactor; + ALfloat RoomRolloffFactor; + ALfloat DopplerFactor; + + /* NOTE: Stereo pan angles are specified in radians, counter-clockwise + * rather than clockwise. + */ + std::array<ALfloat,2> StereoPan; + + ALfloat Radius; + + /** Direct filter and auxiliary send info. */ + struct { + ALfloat Gain; + ALfloat GainHF; + ALfloat HFReference; + ALfloat GainLF; + ALfloat LFReference; + } Direct; + struct SendData { + ALeffectslot *Slot; + ALfloat Gain; + ALfloat GainHF; + ALfloat HFReference; + ALfloat GainLF; + ALfloat LFReference; + }; + al::vector<SendData> Send; + + /** + * Last user-specified offset, and the offset type (bytes, samples, or + * seconds). + */ + ALdouble Offset{0.0}; + ALenum OffsetType{AL_NONE}; + + /** Source type (static, streaming, or undetermined) */ + ALenum SourceType{AL_UNDETERMINED}; + + /** Source state (initial, playing, paused, or stopped) */ + ALenum state{AL_INITIAL}; + + /** Source Buffer Queue head. */ + ALbufferlistitem *queue{nullptr}; + + std::atomic_flag PropsClean; + + /* Index into the context's Voices array. Lazily updated, only checked and + * reset when looking up the voice. + */ + ALuint VoiceIdx{INVALID_VOICE_IDX}; + + /** Self ID */ + ALuint id{0}; + + + ALsource(ALuint num_sends); + ~ALsource(); + + ALsource(const ALsource&) = delete; + ALsource& operator=(const ALsource&) = delete; +}; + +void UpdateAllSourceProps(ALCcontext *context); + +#endif |