이 파일의 문서화 페이지로 가기
27 #ifndef _AK_PLATFORM_FUNCS_H_
28 #define _AK_PLATFORM_FUNCS_H_
31 #include <sce_atomic.h>
37 #include <kernel/eventflag.h>
43 #include <x86intrin.h>
69 #define AK_DECLARE_THREAD_ROUTINE( FuncName ) void* FuncName(void* lpParameter)
70 #define AK_THREAD_RETURN( _param_ ) return (_param_);
71 #define AK_THREAD_ROUTINE_PARAMETER lpParameter
72 #define AK_GET_THREAD_ROUTINE_PARAMETER_PTR(type) reinterpret_cast<type*>( AK_THREAD_ROUTINE_PARAMETER )
74 #define AK_RETURN_THREAD_OK 0x00000000
75 #define AK_RETURN_THREAD_ERROR 0x00000001
76 #define AK_DEFAULT_STACK_SIZE (128*1024)
77 #define AK_THREAD_DEFAULT_SCHED_POLICY SCE_KERNEL_SCHED_FIFO
78 #define AK_THREAD_PRIORITY_NORMAL SCE_KERNEL_PRIO_FIFO_DEFAULT
79 #define AK_THREAD_PRIORITY_ABOVE_NORMAL SCE_KERNEL_PRIO_FIFO_HIGHEST
80 #define AK_THREAD_PRIORITY_BELOW_NORMAL SCE_KERNEL_PRIO_FIFO_LOWEST
82 #define AK_THREAD_AFFINITY_ALL 8191 // from 0b1'1111'1111'1111 -- 13 cores available
83 #define AK_THREAD_AFFINITY_DEFAULT 4095 // from 0b0'1111'1111'1111 -- Default to only the 12 fully-available cores. 13th core is half-available.
86 #define AK_NULL_THREAD NULL
88 #define AK_INFINITE (AK_UINT_MAX)
90 #define AkMax(x1, x2) (((x1) > (x2))? (x1): (x2))
91 #define AkMin(x1, x2) (((x1) < (x2))? (x1): (x2))
92 #define AkClamp(x, min, max) ((x) < (min)) ? (min) : (((x) > (max) ? (max) : (x)))
100 fputs( in_pszMsg, stderr );
105 fputws( in_pszMsg, stderr );
109 template <
int MaxSize = 0>
113 va_start(args, in_pszFmt);
114 vfwprintf(stderr, in_pszFmt, args);
119 template <
int MaxSize = 0>
123 va_start(args, in_pszFmt);
124 vfprintf(stderr, in_pszFmt, args);
131 template <
int MaxSize = 0>
134 template <
int MaxSize = 0>
152 int ret = sceKernelCreateEventFlag(
155 SCE_KERNEL_EVF_ATTR_MULTI,
175 sceKernelDeleteEventFlag(io_event);
185 SCE_KERNEL_EVF_WAITMODE_OR | SCE_KERNEL_EVF_WAITMODE_CLEAR_ALL,
193 AKVERIFY( sceKernelSetEventFlag( in_event, 1 ) == 0 );
205 int ret = sceKernelCreateSema(
219 AKVERIFY(sceKernelDeleteSema(io_semaphore) == SCE_OK);
225 AKVERIFY(sceKernelWaitSema(in_semaphore, 1,
NULL) == SCE_OK);
231 AKVERIFY(sceKernelSignalSema(in_semaphore, in_count) == SCE_OK);
261 #define AkExitThread( _result ) return _result; // ?????
278 const char * in_szThreadName )
285 AKVERIFY(!scePthreadAttrInit(&attr));
288 AKVERIFY(!scePthreadAttrSetdetachstate(&attr, SCE_PTHREAD_CREATE_JOINABLE));
289 AKVERIFY(!scePthreadAttrSetinheritsched(&attr, SCE_PTHREAD_EXPLICIT_SCHED));
294 if( scePthreadAttrSetschedpolicy( &attr, sched_policy ) )
296 AKASSERT( !
"AKCreateThread invalid sched policy, will automatically set it to FIFO scheduling" );
298 AKVERIFY( !scePthreadAttrSetschedpolicy( &attr, sched_policy ));
301 int minPriority, maxPriority;
302 minPriority = SCE_KERNEL_PRIO_FIFO_HIGHEST;
303 maxPriority = SCE_KERNEL_PRIO_FIFO_LOWEST;
307 if( in_threadProperties.
nPriority >= minPriority && in_threadProperties.
nPriority <= maxPriority )
309 SceKernelSchedParam schedParam;
310 AKVERIFY( scePthreadAttrGetschedparam(&attr, &schedParam) == 0 );
311 schedParam.sched_priority = in_threadProperties.
nPriority;
312 AKVERIFY( scePthreadAttrSetschedparam(&attr, &schedParam) == 0 );
316 int threadError = scePthreadCreate(out_pThread, &attr, pStartRoutine, pParams, in_szThreadName);
318 AKVERIFY(!scePthreadAttrDestroy(&attr));
320 if( threadError != 0 )
344 return scePthreadSelf();
350 usleep( in_ulMilliseconds * 1000 );
359 uint64_t uTime = sceKernelGetProcessTimeCounter();
360 *out_piLastTime = (
AkInt64)uTime;
366 *out_piFreq = (
AkInt64)sceKernelGetProcessTimeCounterFrequency();
388 _mm_monitorx((
void*)in_pVal, 0U, 0U);
395 _mm_mwaitx(2U, 0U, 1000U);
399 if (currentTime > endSpinTime)
425 _mm_monitorx((
void*)in_pVal, 0U, 0U);
432 _mm_mwaitx(2U, 0U, 1000U);
436 if (currentTime > endSpinTime)
443 #define AK_LIMITEDSPINFORZERO // mark AkLimitedSpinForZero as defined to avoid duplicate definitions
454 char* io_pszAnsiString )
459 memset (&state,
'\0',
sizeof (state));
461 return (
AkInt32)wcsrtombs(io_pszAnsiString,
462 &in_pszUnicodeString,
471 void* io_pvUnicodeStringBuffer )
476 memset (&state,
'\0',
sizeof (state));
478 return (
AkInt32)mbsrtowcs((
wchar_t*)io_pvUnicodeStringBuffer,
486 void* io_pvUnicodeStringBuffer )
488 return AkCharToWideChar( in_pszUtf8String, in_uiOutBufferSize, (
wchar_t*)io_pvUnicodeStringBuffer );
494 size_t uSizeCopy =
AkMin( in_uDestMaxNumChars - 1, wcslen( in_pSrc ) + 1 );
495 wcsncpy( in_pDest, in_pSrc, uSizeCopy );
496 in_pDest[uSizeCopy] =
'\0';
502 size_t uSizeCopy =
AkMin( in_uDestMaxNumChars - 1, strlen( in_pSrc ) + 1 );
503 strncpy( in_pDest, in_pSrc, uSizeCopy );
504 in_pDest[uSizeCopy] =
'\0';
510 size_t uAvailableSize = ( in_uDestMaxNumChars - wcslen( in_pDest ) - 1 );
511 wcsncat( in_pDest, in_pSrc,
AkMin( uAvailableSize, wcslen( in_pSrc ) ) );
517 size_t uAvailableSize = ( in_uDestMaxNumChars - strlen( in_pDest ) - 1 );
518 strncat( in_pDest, in_pSrc,
AkMin( uAvailableSize, strlen( in_pSrc ) ) );
521 inline int SafeStrFormat(
wchar_t * in_pDest,
size_t in_uDestMaxNumChars,
const wchar_t* in_pszFmt, ...)
524 va_start(args, in_pszFmt);
525 int r = vswprintf(in_pDest, in_uDestMaxNumChars, in_pszFmt, args);
530 inline int SafeStrFormat(
char * in_pDest,
size_t in_uDestMaxNumChars,
const char* in_pszFmt, ...)
533 va_start(args, in_pszFmt);
534 int r = vsnprintf(in_pDest, in_uDestMaxNumChars, in_pszFmt, args);
540 #define AkAlloca( _size_ ) alloca( _size_ )
552 #define CONVERT_WIDE_TO_OSCHAR( _wstring_, _oscharstring_ ) \
553 _oscharstring_ = (AkOSChar*)AkAlloca( (1 + wcslen( _wstring_ )) * sizeof(AkOSChar) ); \
554 AKPLATFORM::AkWideCharToChar( _wstring_ , (AkUInt32)(1 + wcslen( _wstring_ )), (AkOSChar*)( _oscharstring_ ) )
565 #define CONVERT_CHAR_TO_OSCHAR( _astring_, _oscharstring_ ) ( _oscharstring_ ) = (AkOSChar*)( _astring_ )
575 #define CONVERT_OSCHAR_TO_WIDE( _osstring_, _wstring_ ) \
576 _wstring_ = (wchar_t*)AkAlloca((1+strlen(_osstring_)) * sizeof(wchar_t)); \
577 AKPLATFORM::AkCharToWideChar( _osstring_, (AkUInt32)(1 + strlen(_osstring_ )), _wstring_ )
587 #define CONVERT_OSCHAR_TO_CHAR( _osstring_, _astring_ ) _astring_ = (char*)_osstring_
593 return ( wcslen( in_pStr ) );
600 return ( strlen( in_pszString ) );
604 #define AK_OSPRINTF snprintf
614 return ( strcmp( in_pszString1, in_pszString2 ) );
625 return ( strncmp(in_pszString1, in_pszString2, in_MaxCountSize) );
631 return in_pathLen >= 1 && in_pszPath[0] ==
'/';
634 #define AK_UTF16_TO_WCHAR( in_pdDest, in_pSrc, in_MaxSize ) AKPLATFORM::SafeStrCpy( in_pdDest, in_pSrc, in_MaxSize )
635 #define AK_WCHAR_TO_UTF16( in_pdDest, in_pSrc, in_MaxSize ) AKPLATFORM::SafeStrCpy( in_pdDest, in_pSrc, in_MaxSize )
636 #define AK_UTF8_TO_OSCHAR( in_pdDest, in_pSrc, in_MaxSize ) AKPLATFORM::SafeStrCpy( in_pdDest, in_pSrc, in_MaxSize )
637 #define AK_UTF16_TO_OSCHAR( in_pdDest, in_pSrc, in_MaxSize ) AKPLATFORM::AkWideCharToChar( in_pSrc, in_MaxSize, in_pdDest )
638 #define AK_UTF16_TO_CHAR( in_pdDest, in_pSrc, in_MaxSize ) AKPLATFORM::AkWideCharToChar( in_pSrc, in_MaxSize, in_pdDest )
639 #define AK_CHAR_TO_UTF16( in_pdDest, in_pSrc, in_MaxSize ) AKPLATFORM::AkCharToWideChar( in_pSrc, in_MaxSize, in_pdDest )
640 #define AK_OSCHAR_TO_UTF16( in_pdDest, in_pSrc, in_MaxSize ) AKPLATFORM::AkCharToWideChar( in_pSrc, in_MaxSize, in_pdDest )
643 #define AK_PATH_SEPARATOR "/"
644 #define AK_LIBRARY_PREFIX ""
645 #define AK_DYNAMIC_LIBRARY_EXTENSION ".prx"
647 #define AK_FILEHANDLE_TO_UINTPTR(_h) ((AkUIntPtr)_h)
648 #define AK_SET_FILEHANDLE_TO_UINTPTR(_h,_u) _h = (AkFileHandle)_u
653 inline void CPUID(
AkUInt32 in_uLeafOpcode,
AkUInt32 in_uSubLeafOpcode,
unsigned int out_uCPUFeatures[4])
655 __get_cpuid_count( in_uLeafOpcode, in_uSubLeafOpcode,
656 &out_uCPUFeatures[0],
657 &out_uCPUFeatures[1],
658 &out_uCPUFeatures[2],
659 &out_uCPUFeatures[3]);
663 #endif // _AK_PLATFORM_FUNCS_H_
AKRESULT AkCreateSemaphore(AkSemaphore &out_semaphore, AkUInt32 in_initialCount)
Platform Independent Helper
size_t AkUtf16StrLen(const AkUtf16 *in_pStr)
@ AK_Fail
The operation failed.
int nPriority
Thread priority
void AkClearEvent(AkEvent &out_event)
Platform Independent Helper
AkForceInline void AkClearSemaphore(AkSemaphore &io_semaphore)
Platform Independent Helper
Platform-dependent helpers
void AkWaitForEvent(AkEvent &in_event)
Platform Independent Helper
AkForceInline void UpdatePerformanceFrequency()
Platform Independent Helper
AKRESULT
Standard function call result.
void OutputDebugMsg(const char *in_pszMsg)
Output a debug message on the console (Ansi string)
void CPUID(AkUInt32 in_uLeafOpcode, AkUInt32 in_uSubLeafOpcode, unsigned int out_uCPUFeatures[4])
int SafeStrFormat(wchar_t *in_pDest, size_t in_uDestMaxNumChars, const wchar_t *in_pszFmt,...)
AkThreadID CurrentThread()
Returns the calling thread's ID.
bool IsAbsolutePath(const AkOSChar *in_pszPath, size_t in_pathLen)
Detects whether the string represents an absolute path to a file
float AkReal32
32-bit floating point
@ AK_Success
The operation was successful.
int32_t AkInt32
Signed 32-bit integer
void AkCreateThread(AkThreadRoutine pStartRoutine, void *pParams, const AkThreadProperties &in_threadProperties, AkThread *out_pThread, const char *)
Platform Independent Helper
void OutputDebugMsgV(const char *in_pszFmt,...)
Output a debug message on the console (variadic function).
void PerformanceCounter(AkInt64 *out_piLastTime)
Platform Independent Helper
void AkDestroySemaphore(AkSemaphore &io_semaphore)
Platform Independent Helper
void AkDestroyEvent(AkEvent &io_event)
Platform Independent Helper
AkForceInline bool AkIsValidThread(AkThread *in_pThread)
Platform Independent Helper
#define AKASSERT(Condition)
AkForceInline void AkSleep(AkUInt32 in_ulMilliseconds)
Platform Independent Helper
AkForceInline void AkClearThread(AkThread *in_pThread)
Platform Independent Helper
AkForceInline void AkGetDefaultThreadProperties(AkThreadProperties &out_threadProperties)
Platform Independent Helper
int OsStrNCmp(const AkOSChar *in_pszString1, const AkOSChar *in_pszString2, size_t in_MaxCountSize)
void AkLimitedSpinForZero(AkAtomic32 *in_pVal)
bool AkLimitedSpinToAcquire(AkAtomic32 *in_pVal, AkInt32 in_proposed, AkInt32 in_expected)
SceKernelCpumask dwAffinityMask
Affinity mask
double AkReal64
64-bit floating point
AKRESULT AkCreateEvent(AkEvent &out_event)
Platform Independent Helper
AkForceInline void SafeStrCpy(wchar_t *in_pDest, const wchar_t *in_pSrc, size_t in_uDestMaxNumChars)
Safe unicode string copy.
int64_t AkInt64
Signed 64-bit integer
void AkWaitForSemaphore(AkSemaphore &in_semaphore)
Platform Independent Helper - Semaphore wait, aka Operation P. Decrements value of semaphore,...
size_t uStackSize
Thread stack size
void PerformanceFrequency(AkInt64 *out_piFreq)
Platform Independent Helper
int uSchedPolicy
Thread scheduling policy
AkForceInline AkInt32 AkCharToWideChar(const char *in_pszAnsiString, AkUInt32 in_uiOutBufferSize, void *io_pvUnicodeStringBuffer)
String conversion helper
uint32_t AkUInt32
Unsigned 32-bit integer
void AkReleaseSemaphore(AkSemaphore &in_semaphore, AkUInt32 in_count)
Platform Independent Helper - Semaphore signal, aka Operation V. Increments value of semaphore by an ...
AkForceInline void SafeStrCat(wchar_t *in_pDest, const wchar_t *in_pSrc, size_t in_uDestMaxNumChars)
Safe unicode string concatenation.
AkForceInline AKRESULT AkCreateNamedEvent(AkEvent &out_event, const char *in_szName)
AkForceInline AkInt32 AkWideCharToChar(const wchar_t *in_pszUnicodeString, AkUInt32 in_uiOutBufferSize, char *io_pszAnsiString)
String conversion helper
AkForceInline void AkWaitForSingleThread(AkThread *in_pThread)
Platform Independent Helper
void AkSignalEvent(const AkEvent &in_event)
Platform Independent Helper
AkForceInline AkInt32 AkUtf8ToWideChar(const char *in_pszUtf8String, AkUInt32 in_uiOutBufferSize, void *io_pvUnicodeStringBuffer)
String conversion helper
AkForceInline void AkCloseThread(AkThread *in_pThread)
Platform Independent Helper
AkForceInline int OsStrCmp(const AkOSChar *in_pszString1, const AkOSChar *in_pszString2)
AkForceInline size_t OsStrLen(const AkOSChar *in_pszString)
AkForceInline AkReal32 Elapsed(const AkInt64 &in_iNow, const AkInt64 &in_iStart)
Returns a time range in milliseconds, using the sound engine's updated count->milliseconds ratio.
지원이 필요하신가요?
질문이 있으신가요? 문제를 겪고 계신가요? 더 많은 정보가 필요하신가요? 저희에게 문의해주시면 도와드리겠습니다!
지원 페이지를 방문해 주세요
작업하는 프로젝트에 대해 알려주세요. 언제든지 도와드릴 준비가 되어 있습니다.
프로젝트를 등록하세요. 아무런 조건이나 의무 사항 없이 빠른 시작을 도와드리겠습니다.
Wwise를 시작해 보세요