19 typedef struct ALbufferlistitem
{
20 struct ALbuffer
*buffer
;
21 struct ALbufferlistitem
*volatile next
;
25 typedef struct ALvoice
{
26 struct ALsource
*volatile Source
;
28 /** Current target parameters used for mixing. */
33 /* If not 'moving', gain/coefficients are set directly without fading. */
38 ALuint Offset
; /* Number of output samples mixed since starting. */
40 alignas(16) ALfloat PrevSamples
[MAX_INPUT_CHANNELS
][MAX_PRE_SAMPLES
];
45 SendParams Send
[MAX_SENDS
];
49 struct ALsourceProps
{
50 ATOMIC(ALfloat
) Pitch
;
52 ATOMIC(ALfloat
) OuterGain
;
53 ATOMIC(ALfloat
) MinGain
;
54 ATOMIC(ALfloat
) MaxGain
;
55 ATOMIC(ALfloat
) InnerAngle
;
56 ATOMIC(ALfloat
) OuterAngle
;
57 ATOMIC(ALfloat
) RefDistance
;
58 ATOMIC(ALfloat
) MaxDistance
;
59 ATOMIC(ALfloat
) RollOffFactor
;
60 ATOMIC(ALfloat
) Position
[3];
61 ATOMIC(ALfloat
) Velocity
[3];
62 ATOMIC(ALfloat
) Direction
[3];
63 ATOMIC(ALfloat
) Orientation
[2][3];
64 ATOMIC(ALboolean
) HeadRelative
;
65 ATOMIC(ALboolean
) Looping
;
66 ATOMIC(enum DistanceModel
) DistanceModel
;
67 ATOMIC(ALboolean
) DirectChannels
;
69 ATOMIC(ALboolean
) DryGainHFAuto
;
70 ATOMIC(ALboolean
) WetGainAuto
;
71 ATOMIC(ALboolean
) WetGainHFAuto
;
72 ATOMIC(ALfloat
) OuterGainHF
;
74 ATOMIC(ALfloat
) AirAbsorptionFactor
;
75 ATOMIC(ALfloat
) RoomRolloffFactor
;
76 ATOMIC(ALfloat
) DopplerFactor
;
78 ATOMIC(ALfloat
) StereoPan
[2];
80 ATOMIC(ALfloat
) Radius
;
82 /** Direct filter and auxiliary send info. */
85 ATOMIC(ALfloat
) GainHF
;
86 ATOMIC(ALfloat
) HFReference
;
87 ATOMIC(ALfloat
) GainLF
;
88 ATOMIC(ALfloat
) LFReference
;
91 ATOMIC(struct ALeffectslot
*) Slot
;
93 ATOMIC(ALfloat
) GainHF
;
94 ATOMIC(ALfloat
) HFReference
;
95 ATOMIC(ALfloat
) GainLF
;
96 ATOMIC(ALfloat
) LFReference
;
99 ATOMIC(struct ALsourceProps
*) next
;
102 typedef struct ALsource
{
103 /** Source properties. */
113 ALfloat RollOffFactor
;
116 ALfloat Direction
[3];
117 ALfloat Orientation
[2][3];
118 ALboolean HeadRelative
;
120 enum DistanceModel DistanceModel
;
121 ALboolean DirectChannels
;
123 ALboolean DryGainHFAuto
;
124 ALboolean WetGainAuto
;
125 ALboolean WetGainHFAuto
;
128 ALfloat AirAbsorptionFactor
;
129 ALfloat RoomRolloffFactor
;
130 ALfloat DopplerFactor
;
132 /* NOTE: Stereo pan angles are specified in radians, counter-clockwise
133 * rather than clockwise.
135 ALfloat StereoPan
[2];
139 /** Direct filter and auxiliary send info. */
148 struct ALeffectslot
*Slot
;
157 * Last user-specified offset, and the offset type (bytes, samples, or
163 /** Source type (static, streaming, or undetermined) */
166 /** Source state (initial, playing, paused, or stopped) */
171 * Source offset in samples, relative to the currently playing buffer, NOT
172 * the whole queue, and the fractional (fixed-point) offset to the next
175 ATOMIC(ALuint
) position
;
176 ATOMIC(ALuint
) position_fraction
;
178 /** Source Buffer Queue info. */
179 ATOMIC(ALbufferlistitem
*) queue
;
180 ATOMIC(ALbufferlistitem
*) current_buffer
;
183 /** Current buffer sample info. */
187 ATOMIC(struct ALsourceProps
*) Update
;
188 ATOMIC(struct ALsourceProps
*) FreeList
;
194 inline void LockSourcesRead(ALCcontext
*context
)
195 { LockUIntMapRead(&context
->SourceMap
); }
196 inline void UnlockSourcesRead(ALCcontext
*context
)
197 { UnlockUIntMapRead(&context
->SourceMap
); }
198 inline void LockSourcesWrite(ALCcontext
*context
)
199 { LockUIntMapWrite(&context
->SourceMap
); }
200 inline void UnlockSourcesWrite(ALCcontext
*context
)
201 { UnlockUIntMapWrite(&context
->SourceMap
); }
203 inline struct ALsource
*LookupSource(ALCcontext
*context
, ALuint id
)
204 { return (struct ALsource
*)LookupUIntMapKeyNoLock(&context
->SourceMap
, id
); }
205 inline struct ALsource
*RemoveSource(ALCcontext
*context
, ALuint id
)
206 { return (struct ALsource
*)RemoveUIntMapKeyNoLock(&context
->SourceMap
, id
); }
208 void UpdateAllSourceProps(ALCcontext
*context
);
209 ALvoid
SetSourceState(ALsource
*Source
, ALCcontext
*Context
, ALenum state
);
210 ALboolean
ApplyOffset(ALsource
*Source
);
212 ALvoid
ReleaseALSources(ALCcontext
*Context
);