| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- #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
|