Improve handling of source state reads
[openal-soft.git] / OpenAL32 / Include / alSource.h
blob6282939e22ab2359d6e0b5fe82d86978aa7cc359
1 #ifndef _AL_SOURCE_H_
2 #define _AL_SOURCE_H_
4 #define MAX_SENDS 16
5 #define DEFAULT_SENDS 2
7 #include "alMain.h"
8 #include "alu.h"
9 #include "hrtf.h"
11 #ifdef __cplusplus
12 extern "C" {
13 #endif
15 struct ALbuffer;
16 struct ALsource;
17 struct ALsourceProps;
20 typedef struct ALbufferlistitem {
21 struct ALbuffer *buffer;
22 struct ALbufferlistitem *volatile next;
23 } ALbufferlistitem;
26 struct ALsourceProps {
27 ATOMIC(struct ALsourceProps*) next;
29 ATOMIC(ALfloat) Pitch;
30 ATOMIC(ALfloat) Gain;
31 ATOMIC(ALfloat) OuterGain;
32 ATOMIC(ALfloat) MinGain;
33 ATOMIC(ALfloat) MaxGain;
34 ATOMIC(ALfloat) InnerAngle;
35 ATOMIC(ALfloat) OuterAngle;
36 ATOMIC(ALfloat) RefDistance;
37 ATOMIC(ALfloat) MaxDistance;
38 ATOMIC(ALfloat) RollOffFactor;
39 ATOMIC(ALfloat) Position[3];
40 ATOMIC(ALfloat) Velocity[3];
41 ATOMIC(ALfloat) Direction[3];
42 ATOMIC(ALfloat) Orientation[2][3];
43 ATOMIC(ALboolean) HeadRelative;
44 ATOMIC(enum DistanceModel) DistanceModel;
45 ATOMIC(ALboolean) DirectChannels;
47 ATOMIC(ALboolean) DryGainHFAuto;
48 ATOMIC(ALboolean) WetGainAuto;
49 ATOMIC(ALboolean) WetGainHFAuto;
50 ATOMIC(ALfloat) OuterGainHF;
52 ATOMIC(ALfloat) AirAbsorptionFactor;
53 ATOMIC(ALfloat) RoomRolloffFactor;
54 ATOMIC(ALfloat) DopplerFactor;
56 ATOMIC(ALfloat) StereoPan[2];
58 ATOMIC(ALfloat) Radius;
60 /** Direct filter and auxiliary send info. */
61 struct {
62 ATOMIC(ALfloat) Gain;
63 ATOMIC(ALfloat) GainHF;
64 ATOMIC(ALfloat) HFReference;
65 ATOMIC(ALfloat) GainLF;
66 ATOMIC(ALfloat) LFReference;
67 } Direct;
68 struct {
69 ATOMIC(struct ALeffectslot*) Slot;
70 ATOMIC(ALfloat) Gain;
71 ATOMIC(ALfloat) GainHF;
72 ATOMIC(ALfloat) HFReference;
73 ATOMIC(ALfloat) GainLF;
74 ATOMIC(ALfloat) LFReference;
75 } Send[];
79 typedef struct ALvoice {
80 struct ALsourceProps *Props;
82 struct ALsource *Source;
84 /** Current target parameters used for mixing. */
85 ALint Step;
87 /* If not 'moving', gain/coefficients are set directly without fading. */
88 ALboolean Moving;
90 ALboolean IsHrtf;
92 ALuint Offset; /* Number of output samples mixed since starting. */
94 alignas(16) ALfloat PrevSamples[MAX_INPUT_CHANNELS][MAX_PRE_SAMPLES];
96 InterpState ResampleState;
98 struct {
99 DirectParams Params[MAX_INPUT_CHANNELS];
101 ALfloat (*Buffer)[BUFFERSIZE];
102 ALsizei Channels;
103 } Direct;
105 struct {
106 SendParams Params[MAX_INPUT_CHANNELS];
108 ALfloat (*Buffer)[BUFFERSIZE];
109 ALsizei Channels;
110 } Send[];
111 } ALvoice;
114 typedef struct ALsource {
115 /** Source properties. */
116 ALfloat Pitch;
117 ALfloat Gain;
118 ALfloat OuterGain;
119 ALfloat MinGain;
120 ALfloat MaxGain;
121 ALfloat InnerAngle;
122 ALfloat OuterAngle;
123 ALfloat RefDistance;
124 ALfloat MaxDistance;
125 ALfloat RollOffFactor;
126 ALfloat Position[3];
127 ALfloat Velocity[3];
128 ALfloat Direction[3];
129 ALfloat Orientation[2][3];
130 ALboolean HeadRelative;
131 enum DistanceModel DistanceModel;
132 ALboolean DirectChannels;
134 ALboolean DryGainHFAuto;
135 ALboolean WetGainAuto;
136 ALboolean WetGainHFAuto;
137 ALfloat OuterGainHF;
139 ALfloat AirAbsorptionFactor;
140 ALfloat RoomRolloffFactor;
141 ALfloat DopplerFactor;
143 /* NOTE: Stereo pan angles are specified in radians, counter-clockwise
144 * rather than clockwise.
146 ALfloat StereoPan[2];
148 ALfloat Radius;
150 /** Direct filter and auxiliary send info. */
151 struct {
152 ALfloat Gain;
153 ALfloat GainHF;
154 ALfloat HFReference;
155 ALfloat GainLF;
156 ALfloat LFReference;
157 } Direct;
158 struct {
159 struct ALeffectslot *Slot;
160 ALfloat Gain;
161 ALfloat GainHF;
162 ALfloat HFReference;
163 ALfloat GainLF;
164 ALfloat LFReference;
165 } *Send;
168 * Last user-specified offset, and the offset type (bytes, samples, or
169 * seconds).
171 ALdouble Offset;
172 ALenum OffsetType;
174 /** Source type (static, streaming, or undetermined) */
175 ALint SourceType;
177 /** Source state (initial, playing, paused, or stopped) */
178 ATOMIC(ALenum) state;
179 ALenum new_state;
181 /** Source Buffer Queue info. */
182 RWLock queue_lock;
183 ATOMIC(ALbufferlistitem*) queue;
184 ATOMIC(ALbufferlistitem*) current_buffer;
187 * Source offset in samples, relative to the currently playing buffer, NOT
188 * the whole queue, and the fractional (fixed-point) offset to the next
189 * sample.
191 ATOMIC(ALuint) position;
192 ATOMIC(ALuint) position_fraction;
194 ATOMIC(ALboolean) looping;
196 /** Current buffer sample info. */
197 ALsizei NumChannels;
198 ALsizei SampleSize;
200 ALenum NeedsUpdate;
202 ATOMIC(struct ALsourceProps*) Update;
203 ATOMIC(struct ALsourceProps*) FreeList;
205 /** Self ID */
206 ALuint id;
207 } ALsource;
209 inline void LockSourcesRead(ALCcontext *context)
210 { LockUIntMapRead(&context->SourceMap); }
211 inline void UnlockSourcesRead(ALCcontext *context)
212 { UnlockUIntMapRead(&context->SourceMap); }
213 inline void LockSourcesWrite(ALCcontext *context)
214 { LockUIntMapWrite(&context->SourceMap); }
215 inline void UnlockSourcesWrite(ALCcontext *context)
216 { UnlockUIntMapWrite(&context->SourceMap); }
218 inline struct ALsource *LookupSource(ALCcontext *context, ALuint id)
219 { return (struct ALsource*)LookupUIntMapKeyNoLock(&context->SourceMap, id); }
220 inline struct ALsource *RemoveSource(ALCcontext *context, ALuint id)
221 { return (struct ALsource*)RemoveUIntMapKeyNoLock(&context->SourceMap, id); }
223 void UpdateAllSourceProps(ALCcontext *context);
224 ALvoid SetSourceState(ALsource *Source, ALCcontext *Context, ALenum state);
225 ALboolean ApplyOffset(ALsource *Source);
227 inline ALboolean IsPlayingOrPaused(const ALsource *source)
229 ALenum state = ATOMIC_LOAD(&source->state, almemory_order_relaxed);
230 return state == AL_PLAYING || state == AL_PAUSED;
234 ALvoid ReleaseALSources(ALCcontext *Context);
236 #ifdef __cplusplus
238 #endif
240 #endif