45 #define EmptyFuncs { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
47 #ifdef HAVE_PULSEAUDIO
109 #define DECL(x) { #x, (ALCvoid*)(x) }
274 #define DECL(x) { #x, (x) }
615 "AL_EXT_ALAW AL_EXT_DOUBLE AL_EXT_EXPONENT_DISTANCE AL_EXT_FLOAT32 "
616 "AL_EXT_IMA4 AL_EXT_LINEAR_DISTANCE AL_EXT_MCFORMATS AL_EXT_MULAW "
617 "AL_EXT_MULAW_MCFORMATS AL_EXT_OFFSET AL_EXT_source_distance_model "
618 "AL_LOKI_quadriphonic AL_SOFT_buffer_samples AL_SOFT_buffer_sub_data "
619 "AL_SOFTX_deferred_updates AL_SOFT_direct_channels AL_SOFT_loop_points "
620 "AL_SOFT_source_latency";
653 "ALC_ENUMERATE_ALL_EXT ALC_ENUMERATION_EXT ALC_EXT_CAPTURE "
654 "ALC_EXT_thread_local_context ALC_SOFT_loopback";
656 "ALC_ENUMERATE_ALL_EXT ALC_ENUMERATION_EXT ALC_EXT_CAPTURE "
657 "ALC_EXT_DEDICATED ALC_EXT_disconnect ALC_EXT_EFX "
658 "ALC_EXT_thread_local_context ALC_SOFT_loopback";
692 #ifndef AL_LIBTYPE_STATIC
698 switch(ul_reason_for_call)
700 case DLL_PROCESS_ATTACH:
702 GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_PIN | GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
703 (WCHAR*)hModule, &hModule);
708 case DLL_THREAD_DETACH:
710 for(i = 0;i < TlsDestructor.
size;i++)
712 void *ptr = pthread_getspecific(TlsDestructor.
array[i].
key);
713 void (*callback)(
void*) = (
void(*)(
void*))TlsDestructor.
array[
i].
value;
720 case DLL_PROCESS_DETACH:
730 #elif defined(_MSC_VER)
731 #pragma section(".CRT$XCU",read)
732 static void alc_constructor(
void);
733 static void alc_destructor(
void);
734 __declspec(allocate(
".CRT$XCU"))
void (__cdecl* alc_constructor_)(
void) = alc_constructor;
736 static
void alc_constructor(
void)
738 atexit(alc_destructor);
742 static void alc_destructor(
void)
746 #elif defined(HAVE_GCC_DESTRUCTOR)
750 #error "No static initialization available on this platform!"
753 #elif defined(HAVE_GCC_DESTRUCTOR)
759 #error "No global initialization available on this platform!"
769 str = getenv(
"__ALSOFT_HALF_ANGLE_CONES");
770 if(str && (strcasecmp(str,
"true") == 0 || strtol(str,
NULL, 0) == 1))
773 str = getenv(
"__ALSOFT_REVERSE_Z");
774 if(str && (strcasecmp(str,
"true") == 0 || strtol(str,
NULL, 0) == 1))
784 const char *devs, *
str;
789 str = getenv(
"ALSOFT_LOGLEVEL");
792 long lvl = strtol(str,
NULL, 0);
797 str = getenv(
"ALSOFT_LOGFILE");
800 FILE *logfile = fopen(str,
"wat");
801 if(logfile) LogFile = logfile;
802 else ERR(
"Failed to open log file '%s'\n", str);
807 int len = snprintf(buf,
sizeof(buf),
"%s", BackendList[0].
name);
808 for(i = 1;BackendList[
i].
name;i++)
809 len += snprintf(buf+len,
sizeof(buf)-len,
", %s", BackendList[i].name);
810 TRACE(
"Supported backends: %s\n", buf);
823 if(strcasecmp(str,
"all") == 0)
828 const char *next =
str;
833 next = strchr(str,
',');
835 while(isspace(str[0]))
837 if(!str[0] || str[0] ==
',')
840 len = (next ? ((
size_t)(next-str)) : strlen(str));
841 if(strncasecmp(str,
"sse", len) == 0)
843 else if(strncasecmp(str,
"neon", len) == 0)
846 WARN(
"Invalid CPU extension \"%s\"\n", str);
861 if(strcasecmp(str,
"point") == 0 || strcasecmp(str,
"none") == 0)
863 else if(strcasecmp(str,
"linear") == 0)
865 else if(strcasecmp(str,
"cubic") == 0)
871 n = strtol(str, &end, 0);
875 WARN(
"Invalid resampler: %s\n", str);
879 str = getenv(
"ALSOFT_TRAP_ERROR");
880 if(str && (strcasecmp(str,
"true") == 0 || strtol(str,
NULL, 0) == 1))
887 str = getenv(
"ALSOFT_TRAP_AL_ERROR");
888 if(str && (strcasecmp(str,
"true") == 0 || strtol(str,
NULL, 0) == 1))
892 str = getenv(
"ALSOFT_TRAP_ALC_ERROR");
893 if(str && (strcasecmp(str,
"true") == 0 || strtol(str,
NULL, 0) == 1))
903 if(((devs=getenv(
"ALSOFT_DRIVERS")) && devs[0]) ||
908 const char *next = devs;
909 int endlist, delitem;
914 next = strchr(devs,
',');
916 delitem = (devs[0] ==
'-');
917 if(devs[0] ==
'-') devs++;
919 if(!devs[0] || devs[0] ==
',')
926 len = (next ? ((
size_t)(next-devs)) : strlen(devs));
927 for(n = i;BackendList[
n].
Init;n++)
929 if(len == strlen(BackendList[n].
name) &&
930 strncmp(BackendList[n].name, devs, len) == 0)
935 BackendList[
n] = BackendList[n+1];
937 }
while(BackendList[n].Init);
944 BackendList[
n] = BackendList[n-1];
947 BackendList[
n] = Bkp;
967 if(!BackendList[i].
Init(&BackendList[i].
Funcs))
969 WARN(
"Failed to initialize backend \"%s\"\n", BackendList[i].
name);
973 TRACE(
"Initialized backend \"%s\"\n", BackendList[i].
name);
985 BackendLoopback.
Init(&BackendLoopback.
Funcs);
990 const char *next =
str;
994 next = strchr(str,
',');
996 if(!str[0] || next == str)
999 len = (next ? ((
size_t)(next-str)) : strlen(str));
1010 str = getenv(
"ALSOFT_DEFAULT_REVERB");
1014 #define DO_INITCONFIG() pthread_once(&alc_config_once, alc_initconfig)
1024 free(alcAllDevicesList); alcAllDevicesList =
NULL;
1025 alcAllDevicesListSize = 0;
1026 free(alcCaptureDeviceList); alcCaptureDeviceList =
NULL;
1027 alcCaptureDeviceListSize = 0;
1029 free(alcDefaultAllDevicesSpecifier);
1030 alcDefaultAllDevicesSpecifier =
NULL;
1031 free(alcCaptureDefaultDeviceSpecifier);
1032 alcCaptureDefaultDeviceSpecifier =
NULL;
1040 ERR(
"%u device%s not closed\n", num, (num>1)?
"s":
"");
1053 pthread_key_delete(LocalContext);
1055 if(LogFile != stderr)
1069 for(i = 0;BackendList[
i].
Deinit;i++)
1071 BackendLoopback.
Deinit();
1104 size_t len = strlen(name);
1110 temp =
realloc(*List, (*ListSize) + len + 2);
1113 ERR(
"Realloc failed to add %s!\n", name);
1118 memcpy((*List)+(*ListSize), name, len+1);
1120 (*List)[*ListSize] = 0;
1123 #define DECL_APPEND_LIST_FUNC(type) \
1124 void Append##type##List(const ALCchar *name) \
1125 { AppendList(name, &alc##type##List, &alc##type##ListSize); }
1130 #undef DECL_APPEND_LIST_FUNC
1148 return "(unknown type)";
1162 return "(unknown channels)";
1197 static const struct {
1228 for(i = 0;i <
COUNTOF(list);i++)
1230 if(list[i].format == format)
1232 *chans = list[
i].channels;
1233 *type = list[
i].type;
1400 if(IsDebuggerPresent())
1402 #elif defined(SIGTRAP)
1410 LastNullDeviceError = errorCode;
1435 GotAll = GotFreq|GotChans|GotType
1437 ALCuint freq, numMono, numStereo, numSends;
1445 WARN(
"Missing attributes for loopback device\n");
1456 while(attrList[attrIdx])
1478 freq = attrList[attrIdx + 1];
1486 numStereo = attrList[attrIdx + 1];
1494 numSends = attrList[attrIdx + 1];
1499 if(gotFmt != GotAll)
1501 WARN(
"Missing format for loopback device\n");
1519 else if(attrList && attrList[0])
1521 ALCuint freq, numMono, numStereo, numSends;
1535 while(attrList[attrIdx])
1539 freq = attrList[attrIdx + 1];
1545 numStereo = attrList[attrIdx + 1];
1553 numSends = attrList[attrIdx + 1];
1583 TRACE(
"Pre-reset: %s%s, %s%s, %s%uhz, %u update size x%d\n",
1609 ERR(
"Failed to set %uhz, got %uhz instead\n", oldFreq, device->
Frequency);
1613 TRACE(
"Post-reset: %s, %s, %uhz, %u update size x%d\n",
1622 device->ClickRemoval[
i] = 0.0f;
1623 device->PendingClicks[
i] = 0.0f;
1629 TRACE(
"HRTF %s\n", device->
Hrtf?
"enabled":
"disabled");
1646 TRACE(
"BS2B disabled\n");
1656 WARN(
"SSE performs best with multiple of 4 update sizes (%u)\n", device->
UpdateSize);
1703 context = context->
next;
1735 TRACE(
"%p\n", device);
1784 ref = IncrementRef(&device->
ref);
1785 TRACEREF(
"%p increasing refcount to %u\n", device, ref);
1791 ref = DecrementRef(&device->
ref);
1792 TRACEREF(
"%p decreasing refcount to %u\n", device, ref);
1809 while(tmpDevice && tmpDevice != device)
1810 tmpDevice = tmpDevice->
next;
1842 for(i = 0;i < 4;i++)
1844 for(j = 0;j < 4;j++)
1847 for(i = 0;i < 3;i++)
1876 TRACE(
"%p\n", context);
1919 if(pthread_getspecific(LocalContext) == context)
1921 WARN(
"%p released while current on thread\n", context);
1922 pthread_setspecific(LocalContext,
NULL);
1926 if(CompExchangePtr((
XchgPtr*)&GlobalContext, context,
NULL))
1933 if(CompExchangePtr((
XchgPtr*)tmp_ctx, context, context->
next))
1935 tmp_ctx = &(*tmp_ctx)->
next;
1945 ref = IncrementRef(&context->
ref);
1946 TRACEREF(
"%p increasing refcount to %u\n", context, ref);
1952 ref = DecrementRef(&context->
ref);
1953 TRACEREF(
"%p decreasing refcount to %u\n", context, ref);
1959 WARN(
"%p current for thread being destroyed\n", ptr);
1978 if(tmp_ctx == context)
1984 tmp_ctx = tmp_ctx->
next;
2003 context = pthread_getspecific(LocalContext);
2037 errorCode = ExchangeInt(&LastNullDeviceError,
ALC_NO_ERROR);
2132 if(!alcAllDevicesList)
2137 free(alcDefaultAllDevicesSpecifier);
2138 alcDefaultAllDevicesSpecifier =
strdup(alcAllDevicesList ?
2139 alcAllDevicesList :
"");
2140 if(!alcDefaultAllDevicesSpecifier)
2148 if(!alcCaptureDeviceList)
2153 free(alcCaptureDefaultDeviceSpecifier);
2154 alcCaptureDefaultDeviceSpecifier =
strdup(alcCaptureDeviceList ?
2155 alcCaptureDeviceList :
"");
2156 if(!alcCaptureDefaultDeviceSpecifier)
2192 if(size == 0 || data ==
NULL)
2383 size_t len = strlen(extName);
2387 if(strncasecmp(ptr, extName, len) == 0 &&
2388 (ptr[
len] ==
'\0' || isspace(ptr[len])))
2393 if((ptr=strchr(ptr,
' ')) !=
NULL)
2397 }
while(isspace(*ptr));
2424 while(alcFunctions[i].funcName && strcmp(alcFunctions[i].funcName, funcName) != 0)
2426 ptr = alcFunctions[
i].address;
2450 while(enumeration[i].enumName && strcmp(enumeration[i].enumName, enumName) != 0)
2452 val = enumeration[
i].value;
2520 ALContext->
Device = device;
2531 TRACE(
"Created context %p\n", ALContext);
2567 Context = pthread_getspecific(LocalContext);
2580 Context = pthread_getspecific(LocalContext);
2599 context = ExchangePtr((
XchgPtr*)&GlobalContext, context);
2602 if((context=pthread_getspecific(LocalContext)) !=
NULL)
2604 pthread_setspecific(LocalContext,
NULL);
2626 old = pthread_getspecific(LocalContext);
2627 pthread_setspecific(LocalContext, context);
2647 Device = Context->
Device;
2672 if(deviceName && (!deviceName[0] || strcasecmp(deviceName, alcDefaultName) == 0 || strcasecmp(deviceName,
"openal-soft") == 0))
2714 static const struct {
2715 const char name[16];
2727 for(i = 0;i <
COUNTOF(chanlist);i++)
2729 if(strcasecmp(chanlist[i].
name, fmt) == 0)
2737 ERR(
"Unsupported channels: %s\n", fmt);
2741 static const struct {
2742 const char name[16];
2755 for(i = 0;i <
COUNTOF(typelist);i++)
2757 if(strcasecmp(typelist[i].
name, fmt) == 0)
2759 device->
FmtType = typelist[
i].type;
2765 ERR(
"Unsupported sample-type: %s\n", fmt);
2767 #define DEVICE_FORMAT_REQUEST (DEVICE_CHANNELS_REQUEST|DEVICE_SAMPLE_TYPE_REQUEST)
2771 static const struct {
2772 const char name[32];
2799 ERR(
"Option 'format' is deprecated, please use 'channels' and 'sample-type'\n");
2813 ERR(
"Unsupported format: %s\n", fmt);
2815 #undef DEVICE_FORMAT_REQUEST
2862 ERR(
"Failed to initialize the default effect slot\n");
2868 ERR(
"Failed to initialize the default effect\n");
2874 }
while(!CompExchangePtr((
XchgPtr*)&DeviceList, device->
next, device));
2891 while(*list && *list != Device)
2892 list = &(*list)->
next;
2901 *list = (*list)->
next;
2906 WARN(
"Releasing context %p\n", ctx);
2941 if(deviceName && (!deviceName[0] || strcasecmp(deviceName, alcDefaultName) == 0 || strcasecmp(deviceName,
"openal-soft") == 0))
2989 }
while(!CompExchangePtr((
XchgPtr*)&DeviceList, device->
next, device));
3001 while(*list && *list != Device)
3002 list = &(*list)->
next;
3011 *list = (*list)->
next;
3089 if(deviceName && strcmp(deviceName, alcDefaultName) != 0)
3149 }
while(!CompExchangePtr((
XchgPtr*)&DeviceList, device->
next, device));
3151 TRACE(
"Created device %p\n", device);
3188 else if(samples < 0 || (samples > 0 && buffer ==
NULL))
#define ALC_CAPTURE_DEVICE_SPECIFIER
AL_API void AL_APIENTRY alSourcePlay(ALuint source)
#define AL_CONE_OUTER_GAINHF
ALC_API void ALC_APIENTRY alcRenderSamplesSOFT(ALCdevice *device, ALCvoid *buffer, ALCsizei samples)
enum DistanceModel DistanceModel
#define AL_EAXREVERB_LATE_REVERB_DELAY
int ConfigValueStr(const char *blockName, const char *keyName, const char **ret)
static void ProbeCaptureDeviceList(void)
struct ALeffectslot * Slot
AL_API void AL_APIENTRY alGetBufferiv(ALuint buffer, ALenum param, ALint *values)
AL_API void AL_APIENTRY alGetListeneriv(ALenum param, ALint *values)
static void alc_deinit(void)
#define ALC_MINOR_VERSION
volatile ALenum UpdateSources
#define ALC_EFX_MINOR_VERSION
#define AL_EAXREVERB_LATE_REVERB_GAIN
#define AL_6POINT1_32F_SOFT
static void alc_initconfig(void)
volatile ALfloat DopplerFactor
static const ALCenums enumeration[]
static void alc_deinit_safe(void)
struct ALlistener * Listener
AL_API void AL_APIENTRY alSource3i(ALuint source, ALenum param, ALint value1, ALint value2, ALint value3)
#define ALCdevice_ResetPlayback(a)
ALCboolean alc_pulse_init(BackendFuncs *func_list)
LPALBUFFERSAMPLESSOFT alBufferSamplesSOFT
GLuint const GLfloat * val
#define AL_METERS_PER_UNIT
AL_API ALboolean AL_APIENTRY alIsFilter(ALuint filter)
#define AL_FORMAT_REAR_MULAW
AL_API ALvoid AL_APIENTRY alFilteri(ALuint filter, ALenum param, ALint value)
#define AL_5POINT1_8_SOFT
static const ALCfunction alcFunctions[]
static const ALCint alcMajorVersion
#define AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO
static __inline ALuint clampu(ALuint val, ALuint min, ALuint max)
AL_API void *AL_APIENTRY alGetProcAddress(const ALchar *fname)
#define AL_INVERSE_DISTANCE_CLAMPED
#define DEVICE_FREQUENCY_REQUEST
LPALGETAUXILIARYEFFECTSLOTF alGetAuxiliaryEffectSlotf
#define AL_FORMAT_51CHN32
#define AL_6POINT1_16_SOFT
#define AL_REVERB_REFLECTIONS_GAIN
#define DECL_APPEND_LIST_FUNC(type)
AL_API void AL_APIENTRY alGetBufferSamplesSOFT(ALuint buffer, ALsizei offset, ALsizei samples, ALenum channels, ALenum type, ALvoid *data)
#define AL_EAXREVERB_DIFFUSION
ALC_API ALCvoid ALC_APIENTRY alcGetIntegerv(ALCdevice *device, ALCenum param, ALsizei size, ALCint *data)
#define ALC_UNSIGNED_SHORT_SOFT
AL_API void AL_APIENTRY alGetDoublev(ALenum param, ALdouble *values)
AL_API ALvoid AL_APIENTRY alGetFilteriv(ALuint filter, ALenum param, ALint *values)
GLint GLenum GLsizei GLsizei GLsizei GLint GLenum GLenum type
#define AL_FORMAT_61CHN16
GLvoid **typedef void(GLAPIENTRY *PFNGLGETVERTEXATTRIBDVPROC)(GLuint
#define AL_FORMAT_STEREO_IMA4
AL_API void AL_APIENTRY alBufferData(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei freq)
#define ALeffectState_Update(a, b, c)
ALC_API ALCboolean ALC_APIENTRY alcCaptureCloseDevice(ALCdevice *Device)
#define AL_BYTE_RW_OFFSETS_SOFT
ALeffectState * EffectState
ALC_API ALCvoid ALC_APIENTRY alcSuspendContext(ALCcontext *Context)
#define AL_6POINT1_8_SOFT
#define AL_FILTER_LOWPASS
LPALDELETEAUXILIARYEFFECTSLOTS alDeleteAuxiliaryEffectSlots
static ALCvoid FreeContext(ALCcontext *context)
static const ALCchar alcErrInvalidContext[]
AL_API void AL_APIENTRY alBuffer3f(ALuint buffer, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3)
#define AL_REVERB_LATE_REVERB_DELAY
char * strdup(const char *inStr)
struct ALeffectslot * DefaultSlot
static void LockLists(void)
#define SPEEDOFSOUNDMETRESPERSEC
#define AL_FORMAT_STEREO_MULAW
int ConfigValueInt(const char *blockName, const char *keyName, int *ret)
ALsizei ActiveEffectSlotCount
struct ALsource ** ActiveSources
#define ALC_FORMAT_CHANNELS_SOFT
volatile ALfloat MetersPerUnit
#define ALsource_Update(s, a)
static void UnlockLists(void)
struct UIntMap::@59 * array
static SDL_PixelFormat * formats
#define AL_EAXREVERB_ECHO_TIME
#define AL_FORMAT_MONO_MULAW
void alc_pulse_probe(enum DevProbe type)
ALC_API ALCboolean ALC_APIENTRY alcMakeContextCurrent(ALCcontext *context)
static ALCcontext * VerifyContext(ALCcontext *context)
const ALCchar * DevFmtChannelsString(enum DevFmtChannels chans)
#define AL_BYTE_LENGTH_SOFT
#define AL_EAXREVERB_REFLECTIONS_DELAY
int ConfigValueUInt(const char *blockName, const char *keyName, unsigned int *ret)
AL_API void AL_APIENTRY alGetListeneri(ALenum param, ALint *value)
static size_t alcAllDevicesListSize
ALCboolean alc_loopback_init(BackendFuncs *func_list)
volatile ALfloat SpeedOfSound
ALC_API ALCboolean ALC_APIENTRY alcCloseDevice(ALCdevice *Device)
#define AL_EFFECT_VOCAL_MORPHER
ALCboolean(* Init)(BackendFuncs *)
#define AL_FILTER_BANDPASS
ALC_API const ALCchar *ALC_APIENTRY alcGetString(ALCdevice *Device, ALCenum param)
AL_API ALenum AL_APIENTRY alGetError(void)
const ALCchar * ExtensionList
LPALAUXILIARYEFFECTSLOTF alAuxiliaryEffectSlotf
#define AL_EAXREVERB_DECAY_HFRATIO
void alc_solaris_probe(enum DevProbe type)
AL_API ALvoid AL_APIENTRY alGetFilteri(ALuint filter, ALenum param, ALint *value)
void alc_oss_probe(enum DevProbe type)
void alcMMDevApiDeinit(void)
ALCboolean alc_null_init(BackendFuncs *func_list)
#define AL_REVERB_DECAY_HFRATIO
AL_API void AL_APIENTRY alGetSourcei(ALuint source, ALenum param, ALint *value)
#define ALCdevice_StartPlayback(a)
ALC_API ALCcontext *ALC_APIENTRY alcGetThreadContext(void)
static pthread_key_t LocalContext
ALC_API ALCvoid ALC_APIENTRY alcDestroyContext(ALCcontext *context)
ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size)
static pthread_once_t alc_config_once
#define AL_EAXREVERB_HFREFERENCE
#define ALC_STEREO_SOURCES
#define AL_EAXREVERB_MODULATION_DEPTH
#define ALC_CAPTURE_SAMPLES
#define AL_FORMAT_MONO_IMA4
LPALGETAUXILIARYEFFECTSLOTIV alGetAuxiliaryEffectSlotiv
ALC_API ALCvoid *ALC_APIENTRY alcGetProcAddress(ALCdevice *device, const ALCchar *funcName)
LPALGETSOURCEI64SOFT alGetSourcei64SOFT
#define AL_STEREO32F_SOFT
LPALGETAUXILIARYEFFECTSLOTI alGetAuxiliaryEffectSloti
ALint64 ALCdevice_GetLatencyDefault(ALCdevice *device)
EGLImageKHR EGLint * name
#define ALeffectState_DeviceUpdate(a, b)
AL_API ALboolean AL_APIENTRY alIsEnabled(ALenum capability)
static const ALCchar alcNoDeviceExtList[]
#define AL_REVERB_DECAY_TIME
volatile ALenum NeedsUpdate
static struct BackendInfo CaptureBackend
void alc_ca_probe(enum DevProbe type)
LPALGETEFFECTI alGetEffecti
static const ALchar alExtList[]
#define AL_UNSIGNED_INT_SOFT
AL_API void AL_APIENTRY alDopplerFactor(ALfloat value)
LPALGETSOURCEDVSOFT alGetSourcedvSOFT
#define DEVICE_SAMPLE_TYPE_REQUEST
ALC_API ALCenum ALC_APIENTRY alcGetEnumValue(ALCdevice *device, const ALCchar *enumName)
#define AL_EFFECT_FLANGER
volatile ALenum NeedsUpdate
static struct BackendInfo BackendLoopback
void RestoreFPUMode(const FPUCtl *ctl)
LPALGETSOURCE3DSOFT alGetSource3dSOFT
AL_API void AL_APIENTRY alGetBooleanv(ALenum param, ALboolean *values)
void SetDefaultChannelOrder(ALCdevice *device)
static CRITICAL_SECTION ListLock
void SetMixerFPUMode(FPUCtl *ctl)
ALCcontext * GetContextRef(void)
void bs2b_clear(struct bs2b *bs2b)
void alc_loopback_probe(enum DevProbe type)
AL_API void AL_APIENTRY alGetSource3f(ALuint source, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3)
AL_API void AL_APIENTRY alListeneri(ALenum param, ALint value)
AL_API ALdouble AL_APIENTRY alGetDouble(ALenum param)
ALC_API void ALC_APIENTRY alcCaptureSamples(ALCdevice *device, ALCvoid *buffer, ALCsizei samples)
void ALCdevice_IncRef(ALCdevice *device)
LPALGETEFFECTF alGetEffectf
ALsizei ActiveSourceCount
AL_API ALboolean AL_APIENTRY alGetBoolean(ALenum param)
AL_API void AL_APIENTRY alListener3i(ALenum param, ALint value1, ALint value2, ALint value3)
static ALCchar * alcCaptureDeviceList
static const ALCchar alcNoError[]
AL_API void AL_APIENTRY alGetListener3i(ALenum param, ALint *value1, ALint *value2, ALint *value3)
static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
#define AL_EAXREVERB_LATE_REVERB_PAN
#define AL_DIRECT_FILTER_GAINHF_AUTO
void alc_alsa_probe(enum DevProbe type)
AL_API void AL_APIENTRY alSourceiv(ALuint source, ALenum param, const ALint *values)
static ALCboolean IsValidALCChannels(ALCenum channels)
AL_API void AL_APIENTRY alGenSources(ALsizei n, ALuint *sources)
ALvoid aluHandleDisconnect(ALCdevice *device)
#define ALC_INVALID_CONTEXT
#define AL_7POINT1_8_SOFT
#define AL_EXPONENT_DISTANCE
static ALCboolean TrapALCError
#define AL_REVERB_AIR_ABSORPTION_GAINHF
volatile ALfloat Position[3]
#define AL_EFFECT_EQUALIZER
AL_API void AL_APIENTRY alBufferSubSamplesSOFT(ALuint buffer, ALsizei offset, ALsizei samples, ALenum channels, ALenum type, const ALvoid *data)
#define AL_FORMAT_MONO_MULAW_EXT
static const ALCchar alcErrInvalidDevice[]
AL_API ALenum AL_APIENTRY alGetEnumValue(const ALchar *ename)
#define AL_REVERB_DECAY_HFLIMIT
static struct BackendInfo BackendList[]
static void alc_cleanup(void)
#define ALCdevice_StopPlayback(a)
LPALSOURCE3DSOFT alSource3dSOFT
#define AL_EAXREVERB_REFLECTIONS_GAIN
#define AL_FORMAT_51CHN16
AL_API void AL_APIENTRY alListenerf(ALenum param, ALfloat value)
#define AL_FORMAT_QUAD16_LOKI
#define ALC_FORMAT_TYPE_SOFT
AL_API ALvoid AL_APIENTRY alFilterfv(ALuint filter, ALenum param, const ALfloat *values)
AL_API ALvoid AL_APIENTRY alBufferSubDataSOFT(ALuint buffer, ALenum format, const ALvoid *data, ALsizei offset, ALsizei length)
#define ALeffectState_Destroy(a)
enum Resampler DefaultResampler
void * al_calloc(size_t alignment, size_t size)
struct ALCfunction ALCfunction
#define ALCdevice_Unlock(a)
ALC_API ALCcontext *ALC_APIENTRY alcGetCurrentContext(void)
void ResetUIntMap(UIntMap *map)
LPALGETSOURCEDSOFT alGetSourcedSOFT
ALvoid ReleaseALEffects(ALCdevice *device)
#define ALC_UNSIGNED_BYTE_SOFT
static const ALCint alcMinorVersion
void InitializeCriticalSection(CRITICAL_SECTION *cs)
static void ReleaseThreadCtx(void *ptr)
#define AL_DIRECT_CHANNELS_SOFT
#define ALC_DEFAULT_DEVICE_SPECIFIER
AL_API void AL_APIENTRY alGetBufferfv(ALuint buffer, ALenum param, ALfloat *values)
AL_API void AL_APIENTRY alDopplerVelocity(ALfloat value)
void alc_loopback_deinit(void)
#define AL_FORMAT_STEREO_ALAW_EXT
void InitUIntMap(UIntMap *map, ALsizei limit)
void alc_alsa_deinit(void)
void alcMMDevApiProbe(enum DevProbe type)
EGLContext EGLenum EGLClientBuffer buffer
LPALSOURCE3I64SOFT alSource3i64SOFT
#define AL_AUXILIARY_SEND_FILTER_GAIN_AUTO
void bs2b_set_srate(struct bs2b *bs2b, int srate)
#define AL_EFFECT_COMPRESSOR
#define AL_EXPONENT_DISTANCE_CLAMPED
AL_API void AL_APIENTRY alSourceStop(ALuint source)
ALenum InitEffectSlot(ALeffectslot *slot)
AL_API ALvoid AL_APIENTRY alDeleteFilters(ALsizei n, const ALuint *filters)
#define AL_REVERB_DIFFUSION
ALCboolean alc_pa_init(BackendFuncs *func_list)
AL_API ALvoid AL_APIENTRY alGetFilterf(ALuint filter, ALenum param, ALfloat *value)
static ALCcontext *volatile GlobalContext
#define ALCdevice_CloseCapture(a)
ALuint AuxiliaryEffectSlotMax
ALCboolean alcWinMMInit(BackendFuncs *FuncList)
#define AL_FILTER_HIGHPASS
ALsizei MaxActiveEffectSlots
int GetConfigValueBool(const char *blockName, const char *keyName, int def)
#define DEFAULT_OUTPUT_RATE
AL_API ALvoid AL_APIENTRY alDeferUpdatesSOFT(void)
#define AL_EFFECT_DISTORTION
ALC_API ALCdevice *ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *deviceName, ALCuint frequency, ALCenum format, ALCsizei samples)
#define AL_REVERB_REFLECTIONS_DELAY
#define AL_UNSIGNED_BYTE_SOFT
void alc_wave_deinit(void)
ALuint ChannelOffsets[MaxChannels]
void alc_opensl_deinit(void)
#define AL_DOPPLER_VELOCITY
struct ALlistener::@56 Params
AL_API ALvoid AL_APIENTRY alFilteriv(ALuint filter, ALenum param, const ALint *values)
#define AL_ROLLOFF_FACTOR
void SetDefaultWFXChannelOrder(ALCdevice *device)
#define AL_SAMPLE_LENGTH_SOFT
#define AL_FORMAT_MONO_DOUBLE_EXT
AL_API void AL_APIENTRY alGetFloatv(ALenum param, ALfloat *values)
#define ALCdevice_ClosePlayback(a)
ALCboolean alc_ca_init(BackendFuncs *func_list)
#define AL_SPEED_OF_SOUND
#define AL_FORMAT_STEREO_FLOAT32
ALC_API ALCvoid ALC_APIENTRY alcProcessContext(ALCcontext *Context)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
AL_API void AL_APIENTRY alGetSourcefv(ALuint source, ALenum param, ALfloat *values)
static const ALCint alcEFXMajorVersion
#define AL_DEFERRED_UPDATES_SOFT
#define AL_DISTANCE_MODEL
ALCboolean alc_wave_init(BackendFuncs *func_list)
#define AL_INVERSE_DISTANCE
AL_API void AL_APIENTRY alSourcePlayv(ALsizei n, const ALuint *sources)
LPALSOURCEDSOFT alSourcedSOFT
ALCboolean alc_opensl_init(BackendFuncs *func_list)
#define AL_EAXREVERB_MODULATION_TIME
#define ALC_ATTRIBUTES_SIZE
#define AL_LOWPASS_GAINHF
#define AL_EFFECT_DEDICATED_DIALOGUE
static const ALCchar alcExtensionList[]
AL_API void AL_APIENTRY alSourceRewind(ALuint source)
void alc_sndio_probe(enum DevProbe type)
LPALSOURCEI64VSOFT alSourcei64vSOFT
ALenum InitEffect(ALeffect *effect)
void alc_pulse_deinit(void)
LPALGETAUXILIARYEFFECTSLOTFV alGetAuxiliaryEffectSlotfv
void alc_oss_deinit(void)
#define AL_REVERB_DENSITY
AL_API ALint AL_APIENTRY alGetInteger(ALenum param)
static __inline void UnlockUIntMapRead(UIntMap *map)
static void AppendList(const ALCchar *name, ALCchar **List, size_t *ListSize)
#define AL_AIR_ABSORPTION_FACTOR
#define ALC_MAJOR_VERSION
GLuint GLuint64EXT address
void ALCcontext_IncRef(ALCcontext *context)
volatile ALboolean SourceDistanceModel
#define AL_EAXREVERB_GAIN
static ALCdevice *volatile DeviceList
void alc_null_probe(enum DevProbe type)
LPALGETEFFECTIV alGetEffectiv
AL_API void AL_APIENTRY alSource3f(ALuint source, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3)
ALC_API ALCenum ALC_APIENTRY alcGetError(ALCdevice *device)
#define AL_BUFFERS_PROCESSED
volatile ALenum DeferUpdates
static ALboolean DecomposeDevFormat(ALenum format, enum DevFmtChannels *chans, enum DevFmtType *type)
ALCboolean alcMMDevApiInit(BackendFuncs *FuncList)
void alc_null_deinit(void)
static ALCvoid FreeDevice(ALCdevice *device)
GLint GLenum GLsizei GLsizei GLsizei GLint GLenum format
ALboolean DisabledEffects[MAX_EFFECTS]
ALvoid ReleaseALSources(ALCcontext *Context)
#define ALC_INVALID_DEVICE
void alc_opensl_probe(enum DevProbe type)
static ALeffect DefaultEffect
#define AL_5POINT1_16_SOFT
void InitContext(GLContext *ctx)
void FillCPUCaps(ALuint capfilter)
static ALCchar * alcAllDevicesList
AL_API void AL_APIENTRY alGetSourcef(ALuint source, ALenum param, ALfloat *value)
#define ALC_ALL_DEVICES_SPECIFIER
#define ALC_DEVICE_SPECIFIER
AL_API void AL_APIENTRY alGenBuffers(ALsizei n, ALuint *buffers)
ALCboolean alc_alsa_init(BackendFuncs *func_list)
ALC_API ALCcontext *ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCint *attrList)
static void ProbeAllDevicesList(void)
static const ALCchar alcErrOutOfMemory[]
AL_API void AL_APIENTRY alGetBufferi(ALuint buffer, ALenum param, ALint *value)
AL_API ALfloat AL_APIENTRY alGetFloat(ALenum param)
#define AL_DEDICATED_GAIN
#define AL_EAXREVERB_GAINHF
#define AL_SAMPLE_RW_OFFSETS_SOFT
enum DevFmtChannels FmtChans
volatile ALfloat DopplerVelocity
static __inline ALuint minu(ALuint a, ALuint b)
ALvoid LoadReverbPreset(const char *name, ALeffect *effect)
AL_API void AL_APIENTRY alSourcef(ALuint source, ALenum param, ALfloat value)
ALvoid ReleaseALAuxiliaryEffectSlots(ALCcontext *Context)
#define AL_FORMAT_61CHN32
LPALGETSOURCE3I64SOFT alGetSource3i64SOFT
AL_API void AL_APIENTRY alBufferi(ALuint buffer, ALenum param, ALint value)
AL_API void AL_APIENTRY alListeneriv(ALenum param, const ALint *values)
#define AL_EAXREVERB_DECAY_LFRATIO
static ALCdevice * VerifyDevice(ALCdevice *device)
static size_t alcCaptureDeviceListSize
AL_API void AL_APIENTRY alGetIntegerv(ALenum param, ALint *values)
LPALSOURCEI64SOFT alSourcei64SOFT
typedef LPVOID(WINAPI *PFNWGLCREATEIMAGEBUFFERI3DPROC)(HDC hDC
#define AL_SOURCE_RELATIVE
#define AL_EAXREVERB_ROOM_ROLLOFF_FACTOR
ALC_API void ALC_APIENTRY alcCaptureStart(ALCdevice *device)
#define DEVICE_CHANNELS_REQUEST
ALCboolean alc_sndio_init(BackendFuncs *func_list)
static struct BackendInfo PlaybackBackend
#define AL_LINEAR_DISTANCE_CLAMPED
AL_API void AL_APIENTRY alEnable(ALenum capability)
#define AL_CONE_OUTER_ANGLE
pthread_mutex_t CRITICAL_SECTION
#define ALCdevice_StartCapture(a)
#define AL_FORMAT_61CHN_MULAW
void alc_pa_probe(enum DevProbe type)
#define AL_EAXREVERB_DECAY_TIME
AL_API void AL_APIENTRY alBufferfv(ALuint buffer, ALenum param, const ALfloat *values)
static volatile ALCenum LastNullDeviceError
#define ALCdevice_OpenPlayback(a, b)
#define AL_EAXREVERB_AIR_ABSORPTION_GAINHF
#define AL_RING_MODULATOR_WAVEFORM
void EnterCriticalSection(CRITICAL_SECTION *cs)
#define AL_EAXREVERB_DECAY_HFLIMIT
#define AL_FORMAT_71CHN_MULAW
ALC_API ALCdevice *ALC_APIENTRY alcGetContextsDevice(ALCcontext *Context)
AL_API void AL_APIENTRY alGetBuffer3f(ALuint buffer, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3)
void ALCdevice_LockDefault(ALCdevice *device)
ALCboolean alc_oss_init(BackendFuncs *func_list)
#define ALC_ALL_ATTRIBUTES
#define AL_EAXREVERB_DENSITY
LPALAUXILIARYEFFECTSLOTI alAuxiliaryEffectSloti
void DeleteCriticalSection(CRITICAL_SECTION *cs)
void ALCcontext_DecRef(ALCcontext *context)
AL_API void AL_APIENTRY alBufferf(ALuint buffer, ALenum param, ALfloat value)
#define AL_EAXREVERB_REFLECTIONS_PAN
ALboolean EmulateEAXReverb
volatile ALfloat Velocity[3]
EGLSurface EGLint void ** value
static void ProbeList(ALCchar **list, size_t *listsize, enum DevProbe type)
#define AL_FORMAT_51CHN_MULAW
AL_API void AL_APIENTRY alSourcePausev(ALsizei n, const ALuint *sources)
AL_API ALboolean AL_APIENTRY alIsExtensionPresent(const ALchar *extname)
#define AL_EFFECT_PITCH_SHIFTER
ALC_API ALCdevice *ALC_APIENTRY alcLoopbackOpenDeviceSOFT(const ALCchar *deviceName)
void alc_sndio_deinit(void)
#define AL_FORMAT_71CHN32
LPALSOURCEDVSOFT alSourcedvSOFT
volatile ALfloat Forward[3]
AL_API void AL_APIENTRY alGetListener3f(ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3)
GLenum GLuint GLsizei const GLchar * buf
ALC_API ALCboolean ALC_APIENTRY alcSetThreadContext(ALCcontext *context)
ALvoid ReleaseALBuffers(ALCdevice *device)
AL_API const ALchar *AL_APIENTRY alGetString(ALenum param)
#define ALC_UNSIGNED_INT_SOFT
ALvoid aluInitPanning(ALCdevice *Device)
LPALAUXILIARYEFFECTSLOTFV alAuxiliaryEffectSlotfv
ALCcontext *volatile ContextList
#define AL_FORMAT_QUAD8_LOKI
#define AL_REVERB_LATE_REVERB_GAIN
#define ALCdevice_AvailableSamples(a)
#define AL_REFERENCE_DISTANCE
AL_API void AL_APIENTRY alSourceQueueBuffers(ALuint source, ALsizei nb, const ALuint *buffers)
#define AL_CONE_OUTER_GAIN
typedef DWORD(WINAPI *XInputGetState_t)(DWORD dwUserIndex
ALC_API void ALC_APIENTRY alcCaptureStop(ALCdevice *device)
AL_API void AL_APIENTRY alGetListenerf(ALenum param, ALfloat *value)
#define ALC_EFX_MAJOR_VERSION
AL_API ALvoid AL_APIENTRY alProcessUpdatesSOFT(void)
static __inline void LockUIntMapRead(UIntMap *map)
#define AL_FORMAT_71CHN16
#define AL_FORMAT_STEREO16
ALC_API ALCboolean ALC_APIENTRY alcIsRenderFormatSupportedSOFT(ALCdevice *device, ALCsizei freq, ALCenum channels, ALCenum type)
int ConfigValueFloat(const char *blockName, const char *keyName, float *ret)
static void alc_init(void)
#define AL_FORMAT_MONO_FLOAT32
void alcDSoundProbe(enum DevProbe type)
AL_API ALvoid AL_APIENTRY alGetFilterfv(ALuint filter, ALenum param, ALfloat *values)
AL_API void AL_APIENTRY alDisable(ALenum capability)
#define AL_EAXREVERB_LFREFERENCE
#define ALCdevice_StopCapture(a)
LPALGETSOURCEI64VSOFT alGetSourcei64vSOFT
#define ALC_INVALID_VALUE
LPALGENEFFECTS alGenEffects
#define ALC_OUT_OF_MEMORY
#define AL_UNSIGNED_SHORT_SOFT
#define AL_FORMAT_MONO_ALAW_EXT
#define AL_EAXREVERB_GAINLF
AL_API void AL_APIENTRY alGetBufferf(ALuint buffer, ALenum param, ALfloat *value)
AL_API void AL_APIENTRY alDistanceModel(ALenum distanceModel)
ALCcontext *volatile next
#define AL_EFFECT_RING_MODULATOR
#define AL_RING_MODULATOR_HIGHPASS_CUTOFF
AL_API void AL_APIENTRY alListener3f(ALenum param, ALfloat value1, ALfloat value2, ALfloat value3)
#define AL_ROOM_ROLLOFF_FACTOR
static ALCchar * alcDefaultAllDevicesSpecifier
static void ReleaseContext(ALCcontext *context, ALCdevice *device)
ALCboolean alc_solaris_init(BackendFuncs *func_list)
#define DEVICE_FORMAT_REQUEST
#define AL_DOPPLER_FACTOR
#define AL_FORMAT_STEREO_DOUBLE_EXT
LPALGETEFFECTFV alGetEffectfv
#define AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT
static ALCboolean IsValidALCType(ALCenum type)
void alcWinMMProbe(enum DevProbe type)
ALCboolean alcDSoundInit(BackendFuncs *FuncList)
#define AL_7POINT1_16_SOFT
AL_API void AL_APIENTRY alSourceUnqueueBuffers(ALuint source, ALsizei nb, ALuint *buffers)
#define ALCdevice_CaptureSamples(a, b, c)
void(* Probe)(enum DevProbe)
#define AL_RING_MODULATOR_FREQUENCY
#define AL_FORMAT_STEREO8
#define AL_INTERNAL_FORMAT_SOFT
AL_API void AL_APIENTRY alSourceRewindv(ALsizei n, const ALuint *sources)
AL_API void AL_APIENTRY alDeleteBuffers(ALsizei n, const ALuint *buffers)
#define AL_FORMAT_QUAD_MULAW
#define ALCdevice_OpenCapture(a, b)
AL_API void AL_APIENTRY alGetSource3i(ALuint source, ALenum param, ALint *value1, ALint *value2, ALint *value3)
void alc_wave_probe(enum DevProbe type)
static const ALCchar alcErrInvalidEnum[]
static void alcSetError(ALCdevice *device, ALCenum errorCode)
#define AL_SEC_LENGTH_SOFT
#define AL_EFFECT_EAXREVERB
#define AL_7POINT1_32F_SOFT
void ALCdevice_DecRef(ALCdevice *device)
static const ALCchar alcDefaultName[]
AL_API void AL_APIENTRY alSourcefv(ALuint source, ALenum param, const ALfloat *values)
AL_API void AL_APIENTRY alBuffer3i(ALuint buffer, ALenum param, ALint value1, ALint value2, ALint value3)
ALenum InitializeEffect(ALCdevice *Device, ALeffectslot *EffectSlot, ALeffect *effect)
#define ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER
void LeaveCriticalSection(CRITICAL_SECTION *cs)
const ALCchar * DevFmtTypeString(enum DevFmtType type)
struct ALsource::@61 Send[MAX_SENDS]
ALC_API ALCdevice *ALC_APIENTRY alcOpenDevice(const ALCchar *deviceName)
AL_API void AL_APIENTRY alSourcei(ALuint source, ALenum param, ALint value)
volatile ALCenum LastError
void alcDSoundDeinit(void)
struct Hrtf * GetHrtf(ALCdevice *device)
AL_API void AL_APIENTRY alListenerfv(ALenum param, const ALfloat *values)
AL_API ALvoid AL_APIENTRY alFilterf(ALuint filter, ALenum param, ALfloat value)
ALuint BytesFromDevFmt(enum DevFmtType type)
AL_API ALvoid AL_APIENTRY alGenFilters(ALsizei n, ALuint *filters)
struct ALeffectslot ** ActiveEffectSlots
#define ALC_MAX_AUXILIARY_SENDS
GLsizei GLsizei GLchar * source
#define AL_EFFECT_AUTOWAH
AL_API void AL_APIENTRY alGetBuffer3i(ALuint buffer, ALenum param, ALint *value1, ALint *value2, ALint *value3)
LPALAUXILIARYEFFECTSLOTIV alAuxiliaryEffectSlotiv
AL_API void AL_APIENTRY alGetSourceiv(ALuint source, ALenum param, ALint *values)
AL_API ALboolean AL_APIENTRY alIsSource(ALuint source)
#define AL_BUFFERS_QUEUED
#define AL_EAXREVERB_ECHO_DEPTH
#define AL_UNSIGNED_BYTE3_SOFT
static ALCchar * alcCaptureDefaultDeviceSpecifier
LPALGENAUXILIARYEFFECTSLOTS alGenAuxiliaryEffectSlots
AL_API void AL_APIENTRY alSourcePause(ALuint source)
#define AL_EFFECT_FREQUENCY_SHIFTER
ALvoid ReleaseALFilters(ALCdevice *device)
void ALCdevice_UnlockDefault(ALCdevice *device)
static __inline ALuint maxu(ALuint a, ALuint b)
void bs2b_set_level(struct bs2b *bs2b, int level)
#define AL_REVERB_ROOM_ROLLOFF_FACTOR
#define AL_CONE_INNER_ANGLE
#define AL_FORMAT_STEREO_MULAW_EXT
#define AL_INVALID_OPERATION
ALC_API ALCboolean ALC_APIENTRY alcIsExtensionPresent(ALCdevice *device, const ALCchar *extName)
#define AL_5POINT1_32F_SOFT
AL_API void AL_APIENTRY alSpeedOfSound(ALfloat value)
#define ALC_DEFAULT_ALL_DEVICES_SPECIFIER
#define AL_AUXILIARY_SEND_FILTER
#define AL_LINEAR_DISTANCE
ALuint ChannelsFromDevFmt(enum DevFmtChannels chans)
AL_API void AL_APIENTRY alBufferiv(ALuint buffer, ALenum param, const ALint *values)
LPALISBUFFERFORMATSUPPORTEDSOFT alIsBufferFormatSupportedSOFT
LPALDELETEEFFECTS alDeleteEffects
static const ALCint alcEFXMinorVersion
#define ALCdevice_Lock(a)
void alc_solaris_deinit(void)
AL_API void AL_APIENTRY alSourceStopv(ALsizei n, const ALuint *sources)
AL_API ALboolean AL_APIENTRY alIsBuffer(ALuint buffer)
AL_API void AL_APIENTRY alGetListenerfv(ALenum param, ALfloat *values)
AL_API void AL_APIENTRY alDeleteSources(ALsizei n, const ALuint *sources)
#define AL_SOURCE_DISTANCE_MODEL
typedef BOOL(WINAPI *PFNWGLSETSTEREOEMITTERSTATE3DLPROC)(HDC hDC
#define DEVICE_WIDE_STEREO
static const ALCchar alcErrInvalidValue[]
LPALISAUXILIARYEFFECTSLOT alIsAuxiliaryEffectSlot