347 #define RETERR(x) do { \
348 alSetError(Context, (x)); \
352 #define CHECKVAL(x) do { \
354 RETERR(AL_INVALID_VALUE); \
371 CHECKVAL(*values >= 0.0
f && *values <= 360.0
f);
378 CHECKVAL(*values >= 0.0
f && *values <= 360.0
f);
441 CHECKVAL(*values >= 0.0
f && *values <= 10.0
f);
448 CHECKVAL(*values >= 0.0
f && *values <= 10.0
f);
489 CHECKVAL(isfinite(values[0]) && isfinite(values[1]) && isfinite(values[2]));
500 CHECKVAL(isfinite(values[0]) && isfinite(values[1]) && isfinite(values[2]));
511 CHECKVAL(isfinite(values[0]) && isfinite(values[1]) && isfinite(values[2]));
536 ival = (
ALint)values[0];
546 ERR(
"Unexpected property: 0x%04x\n", prop);
599 IncrementRef(&buffer->
ref);
601 oldlist = ExchangePtr((
XchgPtr*)&Source->
queue, BufferListItem);
622 while(oldlist !=
NULL)
625 oldlist = temp->
next;
741 if(slot) IncrementRef(&slot->
ref);
743 if(slot) DecrementRef(&slot->
ref);
748 Source->
Send[values[1]].
Gain = 1.0f;
768 return SetSourcefv(Source, Context, (
int)prop, fvals);
776 return SetSourcefv(Source, Context, (
int)prop, fvals);
783 ERR(
"Unexpected property: 0x%04x\n", prop);
817 ivals[0] = (
ALint)*values;
818 return SetSourceiv(Source, Context, (
int)prop, ivals);
825 ivals[0] = (
ALuint)*values;
826 return SetSourceiv(Source, Context, (
int)prop, ivals);
830 CHECKVAL(values[0] <= UINT_MAX && values[0] >= 0 &&
831 values[1] <= UINT_MAX && values[1] >= 0 &&
832 values[2] <= UINT_MAX && values[2] >= 0);
834 ivals[0] = (
ALuint)values[0];
835 ivals[1] = (
ALuint)values[1];
836 ivals[2] = (
ALuint)values[2];
837 return SetSourceiv(Source, Context, (
int)prop, ivals);
848 return SetSourcefv(Source, Context, (
int)prop, fvals);
857 return SetSourcefv(Source, Context, (
int)prop, fvals);
860 ERR(
"Unexpected property: 0x%04x\n", prop);
877 *values = Source->
Gain;
881 *values = Source->
Pitch;
924 *values = offsets[0];
1001 ERR(
"Unexpected property: 0x%04x\n", prop);
1023 BufferList = Source->
queue;
1029 BufferList = BufferList->
next;
1033 *values = ((BufferList && BufferList->
buffer) ?
1039 *values = Source->
state;
1093 *values = (
ALint)dvals[0];
1100 values[0] = (
ALint)dvals[0];
1101 values[1] = (
ALint)dvals[1];
1110 values[0] = (
ALint)dvals[0];
1111 values[1] = (
ALint)dvals[1];
1112 values[2] = (
ALint)dvals[2];
1126 ERR(
"Unexpected property: 0x%04x\n", prop);
1155 *values = (ALint64)dvals[0];
1162 values[0] = (ALint64)dvals[0];
1163 values[1] = (ALint64)dvals[1];
1172 values[0] = (ALint64)dvals[0];
1173 values[1] = (ALint64)dvals[1];
1174 values[2] = (ALint64)dvals[2];
1196 *values = ((
ALuint*)ivals)[0];
1202 values[0] = ((
ALuint*)ivals)[0];
1203 values[1] = ((
ALuint*)ivals)[1];
1204 values[2] = ((
ALuint*)ivals)[2];
1209 ERR(
"Unexpected property: 0x%04x\n", prop);
1222 if(!Context)
return;
1229 for(cur = 0;cur <
n;cur++)
1248 sources[cur] = source->
id;
1267 if(!Context)
return;
1278 for(i = 0;i <
n;i++)
1284 for(i = 0;i <
n;i++)
1295 while(srclist != srclistend)
1297 if(*srclist == Source)
1300 *srclist = *(--srclistend);
1309 BufferList = Source->
queue;
1324 memset(Source, 0,
sizeof(*Source));
1356 if(!Context)
return;
1374 if(!Context)
return;
1382 ALfloat fvals[3] = { value1, value2, value3 };
1395 if(!Context)
return;
1416 if(!Context)
return;
1437 if(!Context)
return;
1459 if(!Context)
return;
1472 for(i = 0;i <
count;i++)
1487 if(!Context)
return;
1505 if(!Context)
return;
1513 ALint ivals[3] = { value1, value2, value3 };
1526 if(!Context)
return;
1547 if(!Context)
return;
1565 if(!Context)
return;
1573 ALint64SOFT i64vals[3] = { value1, value2, value3 };
1586 if(!Context)
return;
1607 if(!Context)
return;
1632 if(!Context)
return;
1636 else if(!(value1 && value2 && value3))
1662 if(!Context)
return;
1676 for(i = 0;i <
count;i++)
1691 if(!Context)
return;
1711 if(!Context)
return;
1715 else if(!(value1 && value2 && value3))
1739 if(!Context)
return;
1760 if(!Context)
return;
1781 if(!Context)
return;
1785 else if(!(value1 && value2 && value3))
1810 if(!Context)
return;
1831 if(!Context)
return;
1851 if(!Context)
return;
1855 else if(!(value1 && value2 && value3))
1864 *value1 = i64vals[0];
1865 *value2 = i64vals[1];
1866 *value3 = i64vals[2];
1879 if(!Context)
return;
1905 if(!Context)
return;
1910 for(i = 0;i <
n;i++)
1936 for(i = 0;i <
n;i++)
1960 if(!Context)
return;
1965 for(i = 0;i <
n;i++)
1972 for(i = 0;i <
n;i++)
1996 if(!Context)
return;
2001 for(i = 0;i <
n;i++)
2008 for(i = 0;i <
n;i++)
2032 if(!Context)
return;
2037 for(i = 0;i <
n;i++)
2044 for(i = 0;i <
n;i++)
2071 if(!Context)
return;
2093 BufferList = Source->
queue;
2098 BufferFmt = BufferList->
buffer;
2101 BufferList = BufferList->
next;
2104 for(i = 0;i < nb;i++)
2113 if(!BufferListStart)
2119 BufferList = BufferListStart;
2126 BufferList->
next->
prev = BufferList;
2127 BufferList = BufferList->
next;
2129 if(!buffer)
continue;
2130 IncrementRef(&buffer->
ref);
2133 if(BufferFmt ==
NULL)
2161 Source->
queue = BufferListStart;
2165 BufferList = Source->
queue;
2167 BufferList = BufferList->
next;
2169 BufferListStart->
prev = BufferList;
2170 BufferList->
next = BufferListStart;
2179 while(BufferListStart)
2181 BufferList = BufferListStart;
2182 BufferListStart = BufferList->
next;
2205 if(!Context)
return;
2223 for(i = 0;i < nb;i++)
2225 BufferList = Source->
queue;
2256 Source->
Pitch = 1.0f;
2270 Source->
Gain = 1.0f;
2321 BufferList = Source->
queue;
2326 BufferList = BufferList->
next;
2334 Source->
Hrtf.History[j][k] = 0.0f;
2337 Source->
Hrtf.Values[
j][
k][0] = 0.0f;
2338 Source->
Hrtf.Values[
j][
k][1] = 0.0f;
2354 if(Source->
Offset >= 0.0)
2425 readPos = (ALuint64)Source->
position << 32;
2427 BufferList = Source->
queue;
2432 BufferList = BufferList->
next;
2435 return (ALint64)
minu64(readPos,
MAKEU64(0x7fffffff,0xffffffff));
2450 BufferList = Source->
queue;
2455 Buffer = BufferList->
buffer;
2458 BufferList = BufferList->
next;
2468 BufferList = Source->
queue;
2473 BufferList = BufferList->
next;
2489 ALuint readPos, writePos;
2494 BufferList = Source->
queue;
2499 Buffer = BufferList->
buffer;
2502 BufferList = BufferList->
next;
2512 if(updateLen > 0.0 && updateLen < 0.015)
2519 BufferList = Source->
queue;
2520 for(i = 0;BufferList;i++)
2524 if(i < Source->BuffersPlayed)
2528 BufferList = BufferList->
next;
2537 readPos %= totalBufferLen;
2538 writePos %= totalBufferLen;
2543 if(readPos >= totalBufferLen)
2545 if(writePos >= totalBufferLen)
2567 ALuint FrameBlockSize = 65;
2570 offset[0] = (
ALdouble)(readPos / FrameBlockSize * BlockSize);
2572 offset[1] = offset[0];
2576 offset[1] = (
ALdouble)((writePos+FrameBlockSize-1) /
2577 FrameBlockSize * BlockSize);
2583 offset[0] = (
ALdouble)(readPos * FrameSize);
2584 offset[1] = (
ALdouble)(writePos * FrameSize);
2600 ALint bufferLen, totalBufferLen;
2601 ALint buffersPlayed;
2612 BufferList = Source->
queue;
2615 Buffer = BufferList->
buffer;
2616 bufferLen = Buffer ? Buffer->
SampleLen : 0;
2618 if(bufferLen <= offset-totalBufferLen)
2623 else if(totalBufferLen <= offset)
2628 Source->
position = offset - totalBufferLen;
2633 totalBufferLen += bufferLen;
2635 BufferList = BufferList->
next;
2656 BufferList = Source->
queue;
2661 Buffer = BufferList->
buffer;
2664 BufferList = BufferList->
next;
2732 memset(temp, 0,
sizeof(*temp));
AL_API void AL_APIENTRY alSourcePlay(ALuint source)
#define AL_CONE_OUTER_GAINHF
struct ALeffectslot * Slot
#define LookupFilter(m, k)
#define RemoveSource(m, k)
volatile ALboolean WetGainHFAuto
AL_API void AL_APIENTRY alSource3i(ALuint source, ALenum param, ALint value1, ALint value2, ALint value3)
void FreeThunkEntry(ALuint index)
#define AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO
#define AL_INVERSE_DISTANCE_CLAMPED
static ALvoid InitSourceParams(ALsource *Source)
#define CHECK_VALUE(ctx, cond)
#define AL_BYTE_RW_OFFSETS_SOFT
enum FmtChannels FmtChannels
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
volatile ALfloat DopplerFactor
struct ALsource ** ActiveSources
struct UIntMap::@59 * array
#define SRC_HISTORY_LENGTH
#define ALCdevice_GetLatency(a)
#define al_throwerr(ctx, err)
const ALsizei ResamplerPadding[ResamplerMax]
ALuint BytesFromFmt(enum FmtType type)
ALvoid(* Update)(struct ALsource *self, const ALCcontext *context)
void ReadLock(RWLock *lock)
GLuint GLsizei const GLuint const GLintptr * offsets
AL_API void AL_APIENTRY alGetSourcei(ALuint source, ALenum param, ALint *value)
enum UserFmtChannels OriginalChannels
static ALvoid GetSourceOffsets(const ALsource *Source, ALenum name, ALdouble *offsets, ALdouble updateLen)
LPALGETSOURCEI64SOFT alGetSourcei64SOFT
EGLImageKHR EGLint * name
volatile ALfloat Position[3]
static ALint DoubleValsByProp(ALenum prop)
volatile ALenum NeedsUpdate
static ALint64 GetSourceOffset(const ALsource *Source)
volatile ALfloat OuterGainHF
LPALGETSOURCEDVSOFT alGetSourcedvSOFT
LPALGETSOURCE3DSOFT alGetSource3dSOFT
ALCcontext * GetContextRef(void)
AL_API void AL_APIENTRY alGetSource3f(ALuint source, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3)
ALsizei ActiveSourceCount
static ALenum GetSourcedv(const ALsource *Source, ALCcontext *Context, SrcFloatProp prop, ALdouble *values)
#define AL_DIRECT_FILTER_GAINHF_AUTO
AL_API void AL_APIENTRY alSourceiv(ALuint source, ALenum param, const ALint *values)
AL_API void AL_APIENTRY alGenSources(ALsizei n, ALuint *sources)
#define AL_EXPONENT_DISTANCE
#define AL_SEC_OFFSET_LATENCY_SOFT
#define LookupBuffer(m, k)
LPALSOURCE3DSOFT alSource3dSOFT
enum Resampler DefaultResampler
void * al_calloc(size_t alignment, size_t size)
LPALGETSOURCEDSOFT alGetSourcedSOFT
#define AL_DIRECT_CHANNELS_SOFT
volatile ALfloat RoomRolloffFactor
EGLContext EGLenum EGLClientBuffer buffer
LPALSOURCE3I64SOFT alSource3i64SOFT
#define AL_AUXILIARY_SEND_FILTER_GAIN_AUTO
#define AL_EXPONENT_DISTANCE_CLAMPED
AL_API void AL_APIENTRY alSourceStop(ALuint source)
volatile ALfloat AirAbsorptionFactor
volatile ALfloat Velocity[3]
static ALint IntValsByProp(ALenum prop)
ALvoid CalcSourceParams(ALsource *ALSource, const ALCcontext *ALContext)
volatile ALfloat RefDistance
#define AL_ROLLOFF_FACTOR
volatile ALboolean HeadRelative
volatile ALfloat OuterAngle
enum UserFmtType OriginalType
volatile ALfloat MaxDistance
AL_API void AL_APIENTRY alGetSourcefv(ALuint source, ALenum param, ALfloat *values)
#define AL_DISTANCE_MODEL
#define AL_INVERSE_DISTANCE
static ALenum SetSourcefv(ALsource *Source, ALCcontext *Context, SrcFloatProp prop, const ALfloat *values)
AL_API void AL_APIENTRY alSourcePlayv(ALsizei n, const ALuint *sources)
void ReadUnlock(RWLock *lock)
LPALSOURCEDSOFT alSourcedSOFT
static __inline ALuint FrameSizeFromUserFmt(enum UserFmtChannels chans, enum UserFmtType type)
static ALenum SetSourceiv(ALsource *Source, ALCcontext *Context, SrcIntProp prop, const ALint *values)
AL_API void AL_APIENTRY alSourceRewind(ALuint source)
const ALsizei ResamplerPrePadding[ResamplerMax]
LPALSOURCEI64VSOFT alSourcei64vSOFT
volatile ALboolean DryGainHFAuto
#define AL_AIR_ABSORPTION_FACTOR
volatile ALboolean SourceDistanceModel
AL_API void AL_APIENTRY alSource3f(ALuint source, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3)
#define AL_BUFFERS_PROCESSED
volatile ALenum DeferUpdates
ALenum NewThunkEntry(ALuint *index)
ALvoid ReleaseALSources(ALCcontext *Context)
#define LookupEffectSlot(m, k)
#define LookupSource(m, k)
AL_API void AL_APIENTRY alGetSourcef(ALuint source, ALenum param, ALfloat *value)
static __inline ALuint64 minu64(ALuint64 a, ALuint64 b)
volatile ALfloat OuterGain
#define AL_SAMPLE_RW_OFFSETS_SOFT
AL_API void AL_APIENTRY alSourcef(ALuint source, ALenum param, ALfloat value)
LPALGETSOURCE3I64SOFT alGetSource3i64SOFT
LPALSOURCEI64SOFT alSourcei64SOFT
#define AL_SOURCE_RELATIVE
static ALint GetSampleOffset(ALsource *Source)
#define AL_LINEAR_DISTANCE_CLAMPED
volatile ALboolean WetGainAuto
#define AL_CONE_OUTER_ANGLE
static ALint Int64ValsByProp(ALenum prop)
static ALenum GetSourcei64v(const ALsource *Source, ALCcontext *Context, SrcIntProp prop, ALint64 *values)
void ALCcontext_DecRef(ALCcontext *context)
volatile ALboolean Looping
EGLSurface EGLint void ** value
AL_API void AL_APIENTRY alSourcePausev(ALsizei n, const ALuint *sources)
#define AL_SAMPLE_OFFSET_LATENCY_SOFT
volatile ALboolean DirectChannels
LPALSOURCEDVSOFT alSourcedvSOFT
static ALdouble GetSourceSecOffset(const ALsource *Source)
#define AL_REFERENCE_DISTANCE
AL_API void AL_APIENTRY alSourceQueueBuffers(ALuint source, ALsizei nb, const ALuint *buffers)
#define AL_CONE_OUTER_GAIN
struct ALbufferlistitem * next
static ALenum GetSourceiv(const ALsource *Source, ALCcontext *Context, SrcIntProp prop, ALint *values)
LPALGETSOURCEI64VSOFT alGetSourcei64vSOFT
ALvoid CalcNonAttnSourceParams(ALsource *ALSource, const ALCcontext *ALContext)
#define AL_ROOM_ROLLOFF_FACTOR
volatile ALfloat RollOffFactor
#define AL_DOPPLER_FACTOR
AL_API void AL_APIENTRY alSourceUnqueueBuffers(ALuint source, ALsizei nb, ALuint *buffers)
static __inline void LockContext(ALCcontext *context)
AL_API void AL_APIENTRY alSourceRewindv(ALsizei n, const ALuint *sources)
struct ALbufferlistitem * prev
static ALint FloatValsByProp(ALenum prop)
AL_API void AL_APIENTRY alGetSource3i(ALuint source, ALenum param, ALint *value1, ALint *value2, ALint *value3)
ALvoid alSetError(ALCcontext *Context, ALenum errorCode)
AL_API void AL_APIENTRY alSourcefv(ALuint source, ALenum param, const ALfloat *values)
volatile ALint SourceType
struct ALsource::@61 Send[MAX_SENDS]
ALenum InsertUIntMapEntry(UIntMap *map, ALuint key, ALvoid *value)
AL_API void AL_APIENTRY alSourcei(ALuint source, ALenum param, ALint value)
static __inline void UnlockContext(ALCcontext *context)
enum DistanceModel DistanceModel
ALuint ChannelsFromUserFmt(enum UserFmtChannels chans)
GLsizei GLsizei GLchar * source
volatile ALfloat InnerAngle
ALvoid SetSourceState(ALsource *Source, ALCcontext *Context, ALenum state)
AL_API void AL_APIENTRY alGetSourceiv(ALuint source, ALenum param, ALint *values)
AL_API ALboolean AL_APIENTRY alIsSource(ALuint source)
#define AL_BUFFERS_QUEUED
AL_API void AL_APIENTRY alSourcePause(ALuint source)
ALboolean ApplyOffset(ALsource *Source)
ALuint ChannelsFromFmt(enum FmtChannels chans)
volatile ALfloat Orientation[3]
#define AL_CONE_INNER_ANGLE
#define AL_INVALID_OPERATION
GLint GLsizei const GLuint64 * values
#define AL_AUXILIARY_SEND_FILTER
#define AL_LINEAR_DISTANCE
AL_API void AL_APIENTRY alSourceStopv(ALsizei n, const ALuint *sources)
AL_API void AL_APIENTRY alDeleteSources(ALsizei n, const ALuint *sources)
static ALenum SetSourcei64v(ALsource *Source, ALCcontext *Context, SrcIntProp prop, const ALint64SOFT *values)