23 #include "inprogext.h" 25 #include "polymorphism.h" 26 #include "static_assert.h" 44 #define HAS_BUILTIN __has_builtin 46 #define HAS_BUILTIN(x) (0) 54 #define LIKELY(x) __builtin_expect(!!(x), !0) 56 #define UNLIKELY(x) __builtin_expect(!!(x), 0) 61 #if HAS_BUILTIN(__builtin_assume) 62 #define ASSUME __builtin_assume 64 #define ASSUME(x) do { if(!(x)) __builtin_unreachable(); } while(0) 69 #define LIKELY(x) (!!(x)) 70 #define UNLIKELY(x) (!!(x)) 72 #define ASSUME __assume 74 #define ASSUME(x) ((void)0) 79 #define UINT64_MAX U64(18446744073709551615) 83 #if defined(__cplusplus) 85 #elif defined(__GNUC__) 86 #define UNUSED(x) UNUSED_##x __attribute__((unused)) 87 #elif defined(__LCLINT__) 98 #define FAM_SIZE(T, M, N) (offsetof(T, M) + sizeof(((T*)NULL)->M[0])*(N)) 105 typedef ALint64SOFT ALint64;
106 typedef ALuint64SOFT ALuint64;
109 #if defined(_MSC_VER) 110 #define U64(x) ((ALuint64)(x##ui64)) 111 #elif SIZEOF_LONG == 8 112 #define U64(x) ((ALuint64)(x##ul)) 113 #elif SIZEOF_LONG_LONG == 8 114 #define U64(x) ((ALuint64)(x##ull)) 119 #if defined(_MSC_VER) 120 #define I64(x) ((ALint64)(x##i64)) 121 #elif SIZEOF_LONG == 8 122 #define I64(x) ((ALint64)(x##l)) 123 #elif SIZEOF_LONG_LONG == 8 124 #define I64(x) ((ALint64)(x##ll)) 134 #define CTZ64 __builtin_ctzl 136 #define CTZ64 __builtin_ctzll 139 #elif defined(HAVE_BITSCANFORWARD64_INTRINSIC) 141 inline int msvc64_ctz64(ALuint64 v)
143 unsigned long idx = 64;
144 _BitScanForward64(&idx, v);
147 #define CTZ64 msvc64_ctz64 149 #elif defined(HAVE_BITSCANFORWARD_INTRINSIC) 151 inline int msvc_ctz64(ALuint64 v)
153 unsigned long idx = 64;
154 if(!_BitScanForward(&idx, v&0xffffffff))
156 if(_BitScanForward(&idx, v>>32))
161 #define CTZ64 msvc_ctz64 172 inline int fallback_popcnt64(ALuint64 v)
174 v = v - ((v >> 1) & U64(0x5555555555555555));
175 v = (v & U64(0x3333333333333333)) + ((v >> 2) & U64(0x3333333333333333));
176 v = (v + (v >> 4)) & U64(0x0f0f0f0f0f0f0f0f);
177 return (
int)((v * U64(0x0101010101010101)) >> 56);
180 inline int fallback_ctz64(ALuint64 value)
182 return fallback_popcnt64(~value & (value - 1));
184 #define CTZ64 fallback_ctz64 187 #if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) 188 #define IS_LITTLE_ENDIAN (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) 192 ALubyte b[
sizeof(ALuint)];
193 } EndianTest = { 1 };
194 #define IS_LITTLE_ENDIAN (EndianTest.b[0] == 1) 197 #define COUNTOF(x) (sizeof(x) / sizeof(0[x])) 200 struct ll_ringbuffer;
203 struct DirectHrtfState;
204 struct FrontStablizer;
211 struct ALcontextProps;
212 struct ALlistenerProps;
214 struct ALeffectslotProps;
217 #define DEFAULT_OUTPUT_RATE (44100) 218 #define MIN_OUTPUT_RATE (8000) 222 inline ALuint NextPowerOf2(ALuint value)
237 inline size_t RoundUp(
size_t value,
size_t r)
240 return value - (value%r);
248 inline ALint fastf2i(ALfloat f)
250 #if defined(HAVE_INTRIN_H) && ((defined(_M_IX86_FP) && (_M_IX86_FP > 0)) || defined(_M_X64)) 251 return _mm_cvt_ss2si(_mm_set1_ps(f));
253 #elif defined(_MSC_VER) && defined(_M_IX86_FP) 260 #elif (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) 264 __asm__(
"cvtss2si %1, %0" :
"=r"(i) :
"x"(f));
266 __asm__ __volatile__(
"fistpl %0" :
"=m"(i) :
"t"(f) :
"st");
275 #elif defined(HAVE_LRINTF) && !defined(_MSC_VER) && !defined(__clang__) 286 inline int float2int(
float f)
288 #if ((defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) && \ 289 !defined(__SSE_MATH__)) || (defined(_MSC_VER) && defined(_M_IX86_FP) && _M_IX86_FP == 0) 290 ALint sign, shift, mant;
297 sign = (conv.i>>31) | 1;
298 shift = ((conv.i>>23)&0xff) - (127+23);
301 if(UNLIKELY(shift >= 31 || shift < -23))
304 mant = (conv.i&0x7fffff) | 0x800000;
305 if(LIKELY(shift < 0))
306 return (mant >> -shift) * sign;
307 return (mant << shift) * sign;
319 inline float fast_roundf(
float f)
321 #if (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) && \ 322 !defined(__SSE_MATH__) 325 __asm__ __volatile__(
"frndint" :
"=t"(out) :
"0"(f));
333 static const float ilim[2] = {
344 sign = (conv.i>>31)&0x01;
345 expo = (conv.i>>23)&0xff;
347 if(UNLIKELY(expo >= 150))
365 return f - ilim[sign];
377 InverseDistanceClamped = AL_INVERSE_DISTANCE_CLAMPED,
378 LinearDistanceClamped = AL_LINEAR_DISTANCE_CLAMPED,
379 ExponentDistanceClamped = AL_EXPONENT_DISTANCE_CLAMPED,
380 InverseDistance = AL_INVERSE_DISTANCE,
381 LinearDistance = AL_LINEAR_DISTANCE,
382 ExponentDistance = AL_EXPONENT_DISTANCE,
383 DisableDistance = AL_NONE,
385 DefaultDistanceModel = InverseDistanceClamped
431 DevFmtByte = ALC_BYTE_SOFT,
432 DevFmtUByte = ALC_UNSIGNED_BYTE_SOFT,
433 DevFmtShort = ALC_SHORT_SOFT,
434 DevFmtUShort = ALC_UNSIGNED_SHORT_SOFT,
435 DevFmtInt = ALC_INT_SOFT,
436 DevFmtUInt = ALC_UNSIGNED_INT_SOFT,
437 DevFmtFloat = ALC_FLOAT_SOFT,
439 DevFmtTypeDefault = DevFmtFloat
441 enum DevFmtChannels {
442 DevFmtMono = ALC_MONO_SOFT,
443 DevFmtStereo = ALC_STEREO_SOFT,
444 DevFmtQuad = ALC_QUAD_SOFT,
445 DevFmtX51 = ALC_5POINT1_SOFT,
446 DevFmtX61 = ALC_6POINT1_SOFT,
447 DevFmtX71 = ALC_7POINT1_SOFT,
448 DevFmtAmbi3D = ALC_BFORMAT3D_SOFT,
451 DevFmtX51Rear = 0x80000000,
453 DevFmtChannelsDefault = DevFmtStereo
455 #define MAX_OUTPUT_CHANNELS (16) 457 ALsizei BytesFromDevFmt(
enum DevFmtType type);
458 ALsizei ChannelsFromDevFmt(
enum DevFmtChannels chans, ALsizei ambiorder);
459 inline ALsizei FrameSizeFromDevFmt(
enum DevFmtChannels chans,
enum DevFmtType type, ALsizei ambiorder)
461 return ChannelsFromDevFmt(chans, ambiorder) * BytesFromDevFmt(type);
465 AmbiLayout_FuMa = ALC_FUMA_SOFT,
466 AmbiLayout_ACN = ALC_ACN_SOFT,
468 AmbiLayout_Default = AmbiLayout_ACN
472 AmbiNorm_FuMa = ALC_FUMA_SOFT,
473 AmbiNorm_SN3D = ALC_SN3D_SOFT,
474 AmbiNorm_N3D = ALC_N3D_SOFT,
476 AmbiNorm_Default = AmbiNorm_SN3D
498 #define MAX_AMBI_ORDER 3 499 #define MAX_AMBI_COEFFS ((MAX_AMBI_ORDER+1) * (MAX_AMBI_ORDER+1)) 507 #define AMBI_PERIPHONIC_MASK (0xfe7ce4) 513 #define MAX_AMBI2D_COEFFS (MAX_AMBI_ORDER*2 + 1) 516 typedef ALfloat ChannelConfig[MAX_AMBI_COEFFS];
517 typedef struct BFChannelConfig {
522 typedef union AmbiConfig {
524 ChannelConfig Coeffs[MAX_OUTPUT_CHANNELS];
526 BFChannelConfig Map[MAX_OUTPUT_CHANNELS];
530 typedef struct BufferSubList {
532 struct ALbuffer *Buffers;
534 TYPEDEF_VECTOR(BufferSubList, vector_BufferSubList)
536 typedef struct EffectSubList {
538 struct ALeffect *Effects;
540 TYPEDEF_VECTOR(EffectSubList, vector_EffectSubList)
542 typedef struct FilterSubList {
544 struct ALfilter *Filters;
546 TYPEDEF_VECTOR(FilterSubList, vector_FilterSubList)
548 typedef struct SourceSubList {
550 struct ALsource *Sources;
552 TYPEDEF_VECTOR(SourceSubList, vector_SourceSubList)
557 typedef struct ALeffectslot *ALeffectslotPtr;
558 TYPEDEF_VECTOR(ALeffectslotPtr, vector_ALeffectslotPtr)
561 typedef struct EnumeratedHrtf {
564 struct HrtfEntry *hrtf;
566 TYPEDEF_VECTOR(EnumeratedHrtf, vector_EnumeratedHrtf)
570 #define MAX_DELAY_LENGTH 1024 572 typedef struct DistanceComp {
583 #define BUFFERSIZE 2048 585 typedef struct MixParams {
593 ALfloat (*Buffer)[BUFFERSIZE];
597 typedef struct RealMixParams {
598 enum Channel ChannelName[MAX_OUTPUT_CHANNELS];
600 ALfloat (*Buffer)[BUFFERSIZE];
604 typedef void (*POSTPROCESS)(ALCdevice *device, ALsizei SamplesToDo);
606 struct ALCdevice_struct {
609 ATOMIC(ALenum) Connected;
610 enum DeviceType Type;
615 enum DevFmtChannels FmtChans;
616 enum DevFmtType FmtType;
617 ALboolean IsHeadphones;
622 enum AmbiLayout AmbiLayout;
623 enum AmbiNorm AmbiScale;
625 ALCenum LimiterState;
627 al_string DeviceName;
629 ATOMIC(ALCenum) LastError;
634 ALuint AuxiliaryEffectSlotMax;
636 ALCuint NumMonoSources;
637 ALCuint NumStereoSources;
641 vector_BufferSubList BufferList;
645 vector_EffectSubList EffectList;
649 vector_FilterSubList FilterList;
652 POSTPROCESS PostProcess;
655 struct DirectHrtfState *Hrtf;
657 struct Hrtf *HrtfHandle;
658 vector_EnumeratedHrtf HrtfList;
662 struct Uhj2Encoder *Uhj_Encoder;
665 struct BFormatDec *AmbiDecoder;
671 struct AmbiUpsampler *AmbiUp;
674 enum RenderMode Render_Mode;
684 alignas(16) ALfloat TempBuffer[4][BUFFERSIZE];
688 ALsizei NumChannelsPerOrder[MAX_AMBI_ORDER+1];
696 RealMixParams RealOut;
698 struct FrontStablizer *Stablizer;
700 struct Compressor *Limiter;
705 ALfloat AvgSpeakerDist;
708 DistanceComp ChannelDelay[MAX_OUTPUT_CHANNELS];
722 ATOMIC(ALCcontext*) ContextList;
725 struct ALCbackend *Backend;
727 ATOMIC(ALCdevice*) next;
731 #define DEVICE_FREQUENCY_REQUEST (1u<<1) 733 #define DEVICE_CHANNELS_REQUEST (1u<<2) 735 #define DEVICE_SAMPLE_TYPE_REQUEST (1u<<3) 738 #define DEVICE_PAUSED (1u<<30) 741 #define DEVICE_RUNNING (1u<<31) 745 #define DEVICE_CLOCK_RES U64(1000000000) 750 #define MIXER_THREAD_NAME "alsoft-mixer" 752 #define RECORD_THREAD_NAME "alsoft-record" 757 EventType_KillThread = 0,
760 EventType_SourceStateChange = 1<<0,
761 EventType_BufferCompleted = 1<<1,
762 EventType_Error = 1<<2,
763 EventType_Performance = 1<<3,
764 EventType_Deprecated = 1<<4,
765 EventType_Disconnected = 1<<5,
768 EventType_ReleaseEffectState = 65536,
771 typedef struct AsyncEvent {
772 unsigned int EnumType;
781 struct ALeffectState *EffectState;
784 #define ASYNC_EVENT(t) { t, { 0 } } 786 struct ALCcontext_struct {
789 struct ALlistener *Listener;
791 vector_SourceSubList SourceList;
795 vector_ALeffectslotPtr EffectSlotList;
796 almtx_t EffectSlotLock;
798 ATOMIC(ALenum) LastError;
800 enum DistanceModel DistanceModel;
801 ALboolean SourceDistanceModel;
803 ALfloat DopplerFactor;
804 ALfloat DopplerVelocity;
805 ALfloat SpeedOfSound;
806 ALfloat MetersPerUnit;
808 ATOMIC_FLAG PropsClean;
809 ATOMIC(ALenum) DeferUpdates;
816 RefCount UpdateCount;
817 ATOMIC(ALenum) HoldUpdates;
821 ATOMIC(
struct ALcontextProps*) Update;
826 ATOMIC(
struct ALcontextProps*) FreeContextProps;
827 ATOMIC(
struct ALlistenerProps*) FreeListenerProps;
828 ATOMIC(
struct ALvoiceProps*) FreeVoiceProps;
829 ATOMIC(
struct ALeffectslotProps*) FreeEffectslotProps;
831 struct ALvoice **Voices;
835 ATOMIC(
struct ALeffectslotArray*) ActiveAuxSlots;
837 althrd_t EventThread;
839 struct ll_ringbuffer *AsyncEvents;
840 ATOMIC(ALbitfieldSOFT) EnabledEvts;
842 ALEVENTPROCSOFT EventCb;
846 struct ALeffectslot *DefaultSlot;
849 const ALCchar *ExtensionList;
851 ATOMIC(ALCcontext*) next;
854 alignas(16) ALCbyte _listener_mem[];
857 ALCcontext *GetContextRef(
void);
859 void ALCcontext_DecRef(ALCcontext *context);
861 void ALCcontext_DeferUpdates(ALCcontext *context);
862 void ALCcontext_ProcessUpdates(ALCcontext *context);
864 void AllocateVoices(ALCcontext *context, ALsizei num_voices, ALsizei old_sends);
867 extern ALint RTPrioLevel;
868 void SetRTPriority(
void);
870 void SetDefaultChannelOrder(ALCdevice *device);
871 void SetDefaultWFXChannelOrder(ALCdevice *device);
873 const ALCchar *DevFmtTypeString(
enum DevFmtType type);
874 const ALCchar *DevFmtChannelsString(
enum DevFmtChannels chans);
876 inline ALint GetChannelIndex(
const enum Channel names[MAX_OUTPUT_CHANNELS],
enum Channel chan)
879 for(i = 0;i < MAX_OUTPUT_CHANNELS;i++)
892 inline ALint GetChannelIdxByName(
const RealMixParams *real,
enum Channel chan)
893 {
return GetChannelIndex(real->ChannelName, chan); }
896 inline void LockBufferList(ALCdevice *device) { almtx_lock(&device->BufferLock); }
897 inline void UnlockBufferList(ALCdevice *device) { almtx_unlock(&device->BufferLock); }
899 inline void LockEffectList(ALCdevice *device) { almtx_lock(&device->EffectLock); }
900 inline void UnlockEffectList(ALCdevice *device) { almtx_unlock(&device->EffectLock); }
902 inline void LockFilterList(ALCdevice *device) { almtx_lock(&device->FilterLock); }
903 inline void UnlockFilterList(ALCdevice *device) { almtx_unlock(&device->FilterLock); }
905 inline void LockEffectSlotList(ALCcontext *context)
906 { almtx_lock(&context->EffectSlotLock); }
907 inline void UnlockEffectSlotList(ALCcontext *context)
908 { almtx_unlock(&context->EffectSlotLock); }
911 int EventThread(
void *arg);
914 vector_al_string SearchDataFiles(
const char *match,
const char *subdir);