Remove some unnecessary volatile keywords
[openal-soft.git] / OpenAL32 / Include / alSource.h
blob49bda7e41425a97e26c08384dec4e3c1ab70c930
1 #ifndef _AL_SOURCE_H_
2 #define _AL_SOURCE_H_
4 #define MAX_SENDS 4
6 #include "alMain.h"
7 #include "alu.h"
8 #include "hrtf.h"
10 #ifdef __cplusplus
11 extern "C" {
12 #endif
14 struct ALbuffer;
15 struct ALsource;
16 struct ALsourceProps;
19 typedef struct ALbufferlistitem {
20 struct ALbuffer *buffer;
21 struct ALbufferlistitem *volatile next;
22 } ALbufferlistitem;
25 typedef struct ALvoice {
26 struct ALsource *volatile Source;
28 /** Current target parameters used for mixing. */
29 ALint Step;
31 ALboolean Looping;
33 /* If not 'moving', gain/coefficients are set directly without fading. */
34 ALboolean Moving;
36 ALboolean IsHrtf;
38 ALuint Offset; /* Number of output samples mixed since starting. */
40 alignas(16) ALfloat PrevSamples[MAX_INPUT_CHANNELS][MAX_PRE_SAMPLES];
42 BsincState SincState;
44 DirectParams Direct;
45 SendParams Send[MAX_SENDS];
46 } ALvoice;
49 struct ALsourceProps {
50 ATOMIC(ALfloat) Pitch;
51 ATOMIC(ALfloat) Gain;
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. */
83 struct {
84 ATOMIC(ALfloat) Gain;
85 ATOMIC(ALfloat) GainHF;
86 ATOMIC(ALfloat) HFReference;
87 ATOMIC(ALfloat) GainLF;
88 ATOMIC(ALfloat) LFReference;
89 } Direct;
90 struct {
91 ATOMIC(struct ALeffectslot*) Slot;
92 ATOMIC(ALfloat) Gain;
93 ATOMIC(ALfloat) GainHF;
94 ATOMIC(ALfloat) HFReference;
95 ATOMIC(ALfloat) GainLF;
96 ATOMIC(ALfloat) LFReference;
97 } Send[MAX_SENDS];
99 ATOMIC(struct ALsourceProps*) next;
102 typedef struct ALsource {
103 /** Source properties. */
104 ALfloat Pitch;
105 ALfloat Gain;
106 ALfloat OuterGain;
107 ALfloat MinGain;
108 ALfloat MaxGain;
109 ALfloat InnerAngle;
110 ALfloat OuterAngle;
111 ALfloat RefDistance;
112 ALfloat MaxDistance;
113 ALfloat RollOffFactor;
114 ALfloat Position[3];
115 ALfloat Velocity[3];
116 ALfloat Direction[3];
117 ALfloat Orientation[2][3];
118 ALboolean HeadRelative;
119 ALboolean Looping;
120 enum DistanceModel DistanceModel;
121 ALboolean DirectChannels;
123 ALboolean DryGainHFAuto;
124 ALboolean WetGainAuto;
125 ALboolean WetGainHFAuto;
126 ALfloat OuterGainHF;
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];
137 ALfloat Radius;
139 /** Direct filter and auxiliary send info. */
140 struct {
141 ALfloat Gain;
142 ALfloat GainHF;
143 ALfloat HFReference;
144 ALfloat GainLF;
145 ALfloat LFReference;
146 } Direct;
147 struct {
148 struct ALeffectslot *Slot;
149 ALfloat Gain;
150 ALfloat GainHF;
151 ALfloat HFReference;
152 ALfloat GainLF;
153 ALfloat LFReference;
154 } Send[MAX_SENDS];
157 * Last user-specified offset, and the offset type (bytes, samples, or
158 * seconds).
160 ALdouble Offset;
161 ALenum OffsetType;
163 /** Source type (static, streaming, or undetermined) */
164 ALint SourceType;
166 /** Source state (initial, playing, paused, or stopped) */
167 ALenum state;
168 ALenum new_state;
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
173 * sample.
175 ATOMIC(ALuint) position;
176 ATOMIC(ALuint) position_fraction;
178 /** Source Buffer Queue info. */
179 ATOMIC(ALbufferlistitem*) queue;
180 ATOMIC(ALbufferlistitem*) current_buffer;
181 RWLock queue_lock;
183 /** Current buffer sample info. */
184 ALuint NumChannels;
185 ALuint SampleSize;
187 ATOMIC(struct ALsourceProps*) Update;
188 ATOMIC(struct ALsourceProps*) FreeList;
190 /** Self ID */
191 ALuint id;
192 } ALsource;
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);
214 #ifdef __cplusplus
216 #endif
218 #endif