31 #if defined(HAVE_GUIDDEF_H) || defined(HAVE_INITGUID_H)
40 DEFINE_GUID(KSDATAFORMAT_SUBTYPE_PCM, 0x00000001, 0x0000, 0x0010, 0x80,0x00, 0x00,0xaa,0x00,0x38,0x9b,0x71);
41 DEFINE_GUID(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, 0x00000003, 0x0000, 0x0010, 0x80,0x00, 0x00,0xaa,0x00,0x38,0x9b,0x71);
43 DEFINE_GUID(IID_IDirectSoundNotify, 0xb0210783, 0x89cd, 0x11d0, 0xaf,0x08, 0x00,0xa0,0xc9,0x25,0xcd,0x16);
45 DEFINE_GUID(CLSID_MMDeviceEnumerator, 0xbcde0395, 0xe52f, 0x467c, 0x8e,0x3d, 0xc4,0x57,0x92,0x91,0x69,0x2e);
46 DEFINE_GUID(IID_IMMDeviceEnumerator, 0xa95664d2, 0x9614, 0x4f35, 0xa7,0x46, 0xde,0x8d,0xb6,0x36,0x17,0xe6);
47 DEFINE_GUID(IID_IAudioClient, 0x1cb9ad4c, 0xdbfa, 0x4c32, 0xb1,0x78, 0xc2,0xf5,0x68,0xa7,0x03,0xb2);
48 DEFINE_GUID(IID_IAudioRenderClient, 0xf294acfc, 0x3146, 0x4483, 0xa7,0xbf, 0xad,0xdc,0xa7,0xc2,0x60,0xe2);
51 #include <devpropdef.h>
52 DEFINE_DEVPROPKEY(DEVPKEY_Device_FriendlyName, 0xa45c254e, 0xdf1c, 0x4efd, 0x80,0x20, 0x67,0xd1,0x46,0xa8,0x50,0xe0, 14);
79 #if defined(HAVE_CPUID_H) && (defined(__i386__) || defined(__x86_64__) || \
80 defined(_M_IX86) || defined(_M_X64))
83 char str[
sizeof(
unsigned int[4])];
86 if(!__get_cpuid(0, &cpuinf[0].regs[0], &cpuinf[0].regs[1], &cpuinf[0].regs[2], &cpuinf[0].regs[3]))
87 ERR(
"Failed to get CPUID\n");
90 unsigned int maxfunc = cpuinf[0].regs[0];
91 unsigned int maxextfunc = 0;
93 if(__get_cpuid(0x80000000, &cpuinf[0].regs[0], &cpuinf[0].regs[1], &cpuinf[0].regs[2], &cpuinf[0].regs[3]))
94 maxextfunc = cpuinf[0].regs[0];
95 TRACE(
"Detected max CPUID function: 0x%x (ext. 0x%x)\n", maxfunc, maxextfunc);
97 TRACE(
"Vendor ID: \"%.4s%.4s%.4s\"\n", cpuinf[0].
str+4, cpuinf[0].
str+12, cpuinf[0].
str+8);
98 if(maxextfunc >= 0x80000004 &&
99 __get_cpuid(0x80000002, &cpuinf[0].regs[0], &cpuinf[0].regs[1], &cpuinf[0].regs[2], &cpuinf[0].regs[3]) &&
100 __get_cpuid(0x80000003, &cpuinf[1].regs[0], &cpuinf[1].regs[1], &cpuinf[1].regs[2], &cpuinf[1].regs[3]) &&
101 __get_cpuid(0x80000004, &cpuinf[2].regs[0], &cpuinf[2].regs[1], &cpuinf[2].regs[2], &cpuinf[2].regs[3]))
102 TRACE(
"Name: \"%.16s%.16s%.16s\"\n", cpuinf[0].
str, cpuinf[1].str, cpuinf[2].str);
105 __get_cpuid(1, &cpuinf[0].regs[0], &cpuinf[0].regs[1], &cpuinf[0].regs[2], &cpuinf[0].regs[3]))
108 if((cpuinf[0].regs[3]&bit_SSE))
113 #elif defined(HAVE_WINDOWS_H)
114 HMODULE k32 = GetModuleHandleA(
"kernel32.dll");
115 BOOL (WINAPI*IsProcessorFeaturePresent)(
DWORD ProcessorFeature);
116 IsProcessorFeaturePresent = (
BOOL(WINAPI*)(
DWORD))GetProcAddress(k32,
"IsProcessorFeaturePresent");
117 if(!IsProcessorFeaturePresent)
118 ERR(
"IsProcessorFeaturePresent not available; CPU caps not detected\n");
121 if(IsProcessorFeaturePresent(PF_XMMI_INSTRUCTIONS_AVAILABLE))
130 TRACE(
"Got caps:%s%s%s\n", ((caps&
CPU_CAP_SSE)?((capfilter&CPU_CAP_SSE)?
" SSE":
" (SSE)"):
""),
131 ((caps&
CPU_CAP_NEON)?((capfilter&CPU_CAP_NEON)?
" Neon":
" (Neon)"):
""),
132 ((!caps)?
" -none-":
""));
139 #if defined(HAVE_ALIGNED_ALLOC)
140 size = (size+(alignment-1))&~(alignment-1);
141 return aligned_alloc(alignment, size);
142 #elif defined(HAVE_POSIX_MEMALIGN)
144 if(posix_memalign(&ret, alignment, size) == 0)
147 #elif defined(HAVE__ALIGNED_MALLOC)
148 return _aligned_malloc(size, alignment);
150 char *ret =
malloc(size+alignment);
164 if(ret)
memset(ret, 0, size);
170 #if defined(HAVE_ALIGNED_ALLOC) || defined(HAVE_POSIX_MEMALIGN)
172 #elif defined(HAVE__ALIGNED_MALLOC)
180 }
while(*finder == 0x55);
187 #if (defined(HAVE___CONTROL87_2) || defined(HAVE__CONTROLFP)) && (defined(__x86_64__) || defined(_M_X64))
195 #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
196 unsigned short fpuState;
197 __asm__ __volatile__(
"fnstcw %0" :
"=m" (*&fpuState));
198 ctl->
state = fpuState;
201 __asm__ __volatile__(
"fldcw %0" : :
"m" (*&fpuState));
206 __asm__ __volatile__(
"stmxcsr %0" :
"=m" (*&sseState));
207 ctl->sse_state = sseState;
210 __asm__ __volatile__(
"ldmxcsr %0" : :
"m" (*&sseState));
213 #elif defined(HAVE___CONTROL87_2)
216 __control87_2(_RC_CHOP|_PC_24, _MCW_RC|_MCW_PC, &mode,
NULL);
220 __control87_2(0, 0,
NULL, &ctl->sse_state);
221 __control87_2(_RC_CHOP|_DN_FLUSH, _MCW_RC|_MCW_DN,
NULL, &mode);
224 #elif defined(HAVE__CONTROLFP)
225 ctl->
state = _controlfp(0, 0);
226 (
void)_controlfp(_RC_CHOP|_PC_24, _MCW_RC|_MCW_PC);
227 #elif defined(HAVE_FESETROUND)
228 ctl->
state = fegetround();
230 fesetround(FE_TOWARDZERO);
237 #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
238 unsigned short fpuState = ctl->
state;
239 __asm__ __volatile__(
"fldcw %0" : :
"m" (*&fpuState));
242 __asm__ __volatile__(
"ldmxcsr %0" : :
"m" (*&ctl->sse_state));
244 #elif defined(HAVE___CONTROL87_2)
246 __control87_2(ctl->
state, _MCW_RC|_MCW_PC, &mode,
NULL);
249 __control87_2(ctl->sse_state, _MCW_RC|_MCW_DN,
NULL, &mode);
251 #elif defined(HAVE__CONTROLFP)
252 _controlfp(ctl->
state, _MCW_RC|_MCW_PC);
253 #elif defined(HAVE_FESETROUND)
254 fesetround(ctl->
state);
260 void pthread_once(pthread_once_t *once,
void (*callback)(
void))
263 while((ret=InterlockedExchange(once, 1)) == 1)
267 InterlockedExchange(once, 2);
271 int pthread_key_create(pthread_key_t *key,
void (*callback)(
void*))
279 int pthread_key_delete(pthread_key_t key)
286 void *pthread_getspecific(pthread_key_t key)
287 {
return TlsGetValue(key); }
289 int pthread_setspecific(pthread_key_t key,
void *
val)
291 TlsSetValue(key, val);
296 void *LoadLib(
const char *
name)
297 {
return LoadLibraryA(name); }
298 void CloseLib(
void *
handle)
299 { FreeLibrary((
HANDLE)handle); }
300 void *GetSymbol(
void *handle,
const char *
name)
306 ERR(
"Failed to load %s\n", name);
310 WCHAR *strdupW(
const WCHAR *
str)
320 ret =
calloc(
sizeof(WCHAR), len+1);
322 memcpy(ret, str,
sizeof(WCHAR)*len);
329 #ifdef HAVE_PTHREAD_NP_H
330 #include <pthread_np.h>
336 pthread_mutexattr_t attrib;
339 ret = pthread_mutexattr_init(&attrib);
342 ret = pthread_mutexattr_settype(&attrib, PTHREAD_MUTEX_RECURSIVE);
343 #ifdef HAVE_PTHREAD_NP_H
345 ret = pthread_mutexattr_setkind_np(&attrib, PTHREAD_MUTEX_RECURSIVE);
348 ret = pthread_mutex_init(cs, &attrib);
351 pthread_mutexattr_destroy(&attrib);
356 ret = pthread_mutex_destroy(cs);
362 ret = pthread_mutex_lock(cs);
368 ret = pthread_mutex_unlock(cs);
378 #if _POSIX_TIMERS > 0
382 #if defined(_POSIX_MONOTONIC_CLOCK) && (_POSIX_MONOTONIC_CLOCK >= 0)
383 #if _POSIX_MONOTONIC_CLOCK == 0
384 static int hasmono = 0;
385 if(hasmono > 0 || (hasmono == 0 &&
386 (hasmono=sysconf(_SC_MONOTONIC_CLOCK)) > 0))
388 ret = clock_gettime(CLOCK_MONOTONIC, &ts);
391 ret = clock_gettime(CLOCK_REALTIME, &ts);
394 return ts.tv_nsec/1000000 + ts.tv_sec*1000;
399 ret = gettimeofday(&tv,
NULL);
402 return tv.tv_usec/1000 + tv.tv_sec*1000;
408 struct timespec tv, rem;
409 tv.tv_nsec = (t*1000000)%1000000000;
412 while(nanosleep(&tv, &rem) == -1 && errno == EINTR)
418 void *LoadLib(
const char *name)
424 handle = dlopen(name, RTLD_NOW);
425 if((err=dlerror()) !=
NULL)
429 void CloseLib(
void *handle)
431 void *GetSymbol(
void *handle,
const char *name)
437 sym = dlsym(handle, name);
438 if((err=dlerror()) !=
NULL)
440 WARN(
"Failed to load %s: %s\n", name, err);
455 i = snprintf(str,
sizeof(str),
"AL lib: %s %s: ", type, func);
456 if(i > 0 && (
unsigned int)i <
sizeof(str))
460 vsnprintf(str+i,
sizeof(str)-i, fmt, ap);
463 str[
sizeof(
str)-1] = 0;
476 failed = !SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
477 #elif defined(HAVE_PTHREAD_SETSCHEDPARAM) && !defined(__OpenBSD__)
480 struct sched_param param;
483 param.sched_priority = sched_get_priority_min(SCHED_RR);
484 failed = !!pthread_setschedparam(pthread_self(), SCHED_RR, ¶m);
491 ERR(
"Failed to set priority level for thread\n");
643 if(low < map->
size-1)
645 (map->
size-1-low)*
sizeof(map->
array[0]));
GLuint const GLfloat * val
GLint GLenum GLsizei GLsizei GLsizei GLint GLenum GLenum type
GLvoid **typedef void(GLAPIENTRY *PFNGLGETVERTEXATTRIBDVPROC)(GLuint
struct UIntMap::@59 * array
void ReadLock(RWLock *lock)
static void Lock(volatile ALenum *l)
ALvoid * LookupUIntMapKey(UIntMap *map, ALuint key)
EGLImageKHR EGLint * name
void RestoreFPUMode(const FPUCtl *ctl)
void SetMixerFPUMode(FPUCtl *ctl)
volatile ALenum write_lock
void * al_calloc(size_t alignment, size_t size)
void ResetUIntMap(UIntMap *map)
void InitializeCriticalSection(CRITICAL_SECTION *cs)
void InitUIntMap(UIntMap *map, ALsizei limit)
typedef HANDLE(WINAPI *PFNWGLCREATEBUFFERREGIONARBPROC)(HDC hDC
void al_print(const char *type, const char *func, const char *fmt,...)
void WriteUnlock(RWLock *lock)
void ReadUnlock(RWLock *lock)
DEFINE_GUID(KSDATAFORMAT_SUBTYPE_PCM, 0x00000001, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71)
void FillCPUCaps(ALuint capfilter)
void RWLockInit(RWLock *lock)
void * al_malloc(size_t alignment, size_t size)
volatile ALenum read_lock
pthread_mutex_t CRITICAL_SECTION
void EnterCriticalSection(CRITICAL_SECTION *cs)
void DeleteCriticalSection(CRITICAL_SECTION *cs)
volatile ALenum read_entry_lock
EGLSurface EGLint void ** value
static void Unlock(volatile ALenum *l)
typedef DWORD(WINAPI *XInputGetState_t)(DWORD dwUserIndex
EGLImageKHR EGLint EGLint * handle
const GLubyte GLuint GLuint GLuint GLuint alpha GLboolean GLboolean GLboolean GLboolean alpha GLint GLint GLsizei GLsizei GLenum type GLenum GLint GLenum GLint GLint GLsizei GLsizei GLint border GLenum GLint GLint GLint GLint GLint GLsizei GLsizei height GLsizei GLsizei GLenum GLenum const GLvoid *pixels GLenum GLint GLint GLint GLint j2 GLdouble GLdouble GLdouble GLdouble GLdouble GLdouble zFar GLenum GLenum GLint *params GLenum GLenum GLint *params GLenum GLenum GLint *params GLenum GLenum GLfloat *params GLenum GLint GLenum GLenum GLvoid *pixels GLenum GLint GLenum GLint *params GLenum GLenum GLint *params GLenum GLsizei const GLvoid *pointer GLenum GLenum const GLint *params GLenum GLfloat GLfloat GLint GLint const GLfloat *points GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat *points GLint GLfloat GLfloat GLint GLfloat GLfloat v2 GLenum GLenum const GLint *params GLdouble GLdouble GLdouble GLdouble GLdouble GLdouble zFar GLenum map
void LeaveCriticalSection(CRITICAL_SECTION *cs)
ALenum InsertUIntMapEntry(UIntMap *map, ALuint key, ALvoid *value)
ALvoid * RemoveUIntMapKey(UIntMap *map, ALuint key)
volatile RefCount read_count
DEFINE_DEVPROPKEY(DEVPKEY_Device_FriendlyName, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 14)
volatile RefCount write_count
void WriteLock(RWLock *lock)
typedef BOOL(WINAPI *PFNWGLSETSTEREOEMITTERSTATE3DLPROC)(HDC hDC