Go to the documentation of this file.
27 #ifndef _AK_PLATFORM_FUNCS_H_
28 #define _AK_PLATFORM_FUNCS_H_
36 #include <kernel/eventflag.h>
66 #define AK_DECLARE_THREAD_ROUTINE( FuncName ) void* FuncName(void* lpParameter)
67 #define AK_THREAD_RETURN( _param_ ) return (_param_);
68 #define AK_THREAD_ROUTINE_PARAMETER lpParameter
69 #define AK_GET_THREAD_ROUTINE_PARAMETER_PTR(type) reinterpret_cast<type*>( AK_THREAD_ROUTINE_PARAMETER )
71 #define AK_RETURN_THREAD_OK 0x00000000
72 #define AK_RETURN_THREAD_ERROR 0x00000001
73 #define AK_DEFAULT_STACK_SIZE (128*1024)
74 #define AK_THREAD_DEFAULT_SCHED_POLICY SCE_KERNEL_SCHED_FIFO
75 #define AK_THREAD_PRIORITY_NORMAL SCE_KERNEL_PRIO_FIFO_DEFAULT
76 #define AK_THREAD_PRIORITY_ABOVE_NORMAL SCE_KERNEL_PRIO_FIFO_HIGHEST
77 #define AK_THREAD_PRIORITY_BELOW_NORMAL SCE_KERNEL_PRIO_FIFO_LOWEST
79 #define AK_THREAD_AFFINITY_ALL 8191 // from 0b1'1111'1111'1111 -- 13 cores available
80 #define AK_THREAD_AFFINITY_DEFAULT 4095 // from 0b0'1111'1111'1111 -- Default to only the 12 fully-available cores. 13th core is half-available.
83 #define AK_NULL_THREAD NULL
85 #define AK_INFINITE (AK_UINT_MAX)
87 #define AkMax(x1, x2) (((x1) > (x2))? (x1): (x2))
88 #define AkMin(x1, x2) (((x1) < (x2))? (x1): (x2))
89 #define AkClamp(x, min, max) ((x) < (min)) ? (min) : (((x) > (max) ? (max) : (x)))
97 fputs( in_pszMsg, stderr );
102 fputws( in_pszMsg, stderr );
106 template <
int MaxSize = 0>
110 va_start(args, in_pszFmt);
111 vfwprintf(stderr, in_pszFmt, args);
116 template <
int MaxSize = 0>
120 va_start(args, in_pszFmt);
121 vfprintf(stderr, in_pszFmt, args);
128 template <
int MaxSize = 0>
131 template <
int MaxSize = 0>
149 int ret = sceKernelCreateEventFlag(
152 SCE_KERNEL_EVF_ATTR_MULTI,
172 sceKernelDeleteEventFlag(io_event);
182 SCE_KERNEL_EVF_WAITMODE_OR | SCE_KERNEL_EVF_WAITMODE_CLEAR_ALL,
190 AKVERIFY( sceKernelSetEventFlag( in_event, 1 ) == 0 );
202 int ret = sceKernelCreateSema(
216 AKVERIFY(sceKernelDeleteSema(io_semaphore) == SCE_OK);
222 AKVERIFY(sceKernelWaitSema(in_semaphore, 1,
NULL) == SCE_OK);
228 AKVERIFY(sceKernelSignalSema(in_semaphore, in_count) == SCE_OK);
258 #define AkExitThread( _result ) return _result; // ?????
275 const char * in_szThreadName )
282 AKVERIFY(!scePthreadAttrInit(&attr));
285 AKVERIFY(!scePthreadAttrSetdetachstate(&attr, SCE_PTHREAD_CREATE_JOINABLE));
286 AKVERIFY(!scePthreadAttrSetinheritsched(&attr, SCE_PTHREAD_EXPLICIT_SCHED));
291 if( scePthreadAttrSetschedpolicy( &attr, sched_policy ) )
293 AKASSERT( !
"AKCreateThread invalid sched policy, will automatically set it to FIFO scheduling" );
295 AKVERIFY( !scePthreadAttrSetschedpolicy( &attr, sched_policy ));
298 int minPriority, maxPriority;
299 minPriority = SCE_KERNEL_PRIO_FIFO_HIGHEST;
300 maxPriority = SCE_KERNEL_PRIO_FIFO_LOWEST;
304 if( in_threadProperties.
nPriority >= minPriority && in_threadProperties.
nPriority <= maxPriority )
306 SceKernelSchedParam schedParam;
307 AKVERIFY( scePthreadAttrGetschedparam(&attr, &schedParam) == 0 );
308 schedParam.sched_priority = in_threadProperties.
nPriority;
309 AKVERIFY( scePthreadAttrSetschedparam(&attr, &schedParam) == 0 );
313 int threadError = scePthreadCreate(out_pThread, &attr, pStartRoutine, pParams, in_szThreadName);
315 AKVERIFY(!scePthreadAttrDestroy(&attr));
317 if( threadError != 0 )
341 return scePthreadSelf();
347 usleep( in_ulMilliseconds * 1000 );
356 uint64_t uTime = sceKernelGetProcessTimeCounter();
357 *out_piLastTime = (
AkInt64)uTime;
363 *out_piFreq = (
AkInt64)sceKernelGetProcessTimeCounterFrequency();
383 char* io_pszAnsiString )
388 memset (&state,
'\0',
sizeof (state));
390 return (
AkInt32)wcsrtombs(io_pszAnsiString,
391 &in_pszUnicodeString,
400 void* io_pvUnicodeStringBuffer )
405 memset (&state,
'\0',
sizeof (state));
407 return (
AkInt32)mbsrtowcs((
wchar_t*)io_pvUnicodeStringBuffer,
415 void* io_pvUnicodeStringBuffer )
417 return AkCharToWideChar( in_pszUtf8String, in_uiOutBufferSize, (
wchar_t*)io_pvUnicodeStringBuffer );
423 size_t uSizeCopy =
AkMin( in_uDestMaxNumChars - 1, wcslen( in_pSrc ) + 1 );
424 wcsncpy( in_pDest, in_pSrc, uSizeCopy );
425 in_pDest[uSizeCopy] =
'\0';
431 size_t uSizeCopy =
AkMin( in_uDestMaxNumChars - 1, strlen( in_pSrc ) + 1 );
432 strncpy( in_pDest, in_pSrc, uSizeCopy );
433 in_pDest[uSizeCopy] =
'\0';
439 size_t uAvailableSize = ( in_uDestMaxNumChars - wcslen( in_pDest ) - 1 );
440 wcsncat( in_pDest, in_pSrc,
AkMin( uAvailableSize, wcslen( in_pSrc ) ) );
446 size_t uAvailableSize = ( in_uDestMaxNumChars - strlen( in_pDest ) - 1 );
447 strncat( in_pDest, in_pSrc,
AkMin( uAvailableSize, strlen( in_pSrc ) ) );
450 inline int SafeStrFormat(
wchar_t * in_pDest,
size_t in_uDestMaxNumChars,
const wchar_t* in_pszFmt, ...)
453 va_start(args, in_pszFmt);
454 int r = vswprintf(in_pDest, in_uDestMaxNumChars, in_pszFmt, args);
459 inline int SafeStrFormat(
char * in_pDest,
size_t in_uDestMaxNumChars,
const char* in_pszFmt, ...)
462 va_start(args, in_pszFmt);
463 int r = vsnprintf(in_pDest, in_uDestMaxNumChars, in_pszFmt, args);
469 #define AkAlloca( _size_ ) alloca( _size_ )
481 #define CONVERT_WIDE_TO_OSCHAR( _wstring_, _oscharstring_ ) \
482 _oscharstring_ = (AkOSChar*)AkAlloca( (1 + wcslen( _wstring_ )) * sizeof(AkOSChar) ); \
483 AKPLATFORM::AkWideCharToChar( _wstring_ , (AkUInt32)(1 + wcslen( _wstring_ )), (AkOSChar*)( _oscharstring_ ) )
494 #define CONVERT_CHAR_TO_OSCHAR( _astring_, _oscharstring_ ) ( _oscharstring_ ) = (AkOSChar*)( _astring_ )
504 #define CONVERT_OSCHAR_TO_WIDE( _osstring_, _wstring_ ) \
505 _wstring_ = (wchar_t*)AkAlloca((1+strlen(_osstring_)) * sizeof(wchar_t)); \
506 AKPLATFORM::AkCharToWideChar( _osstring_, (AkUInt32)(1 + strlen(_osstring_ )), _wstring_ )
516 #define CONVERT_OSCHAR_TO_CHAR( _osstring_, _astring_ ) _astring_ = (char*)_osstring_
522 return ( wcslen( in_pStr ) );
529 return ( strlen( in_pszString ) );
533 #define AK_OSPRINTF snprintf
543 return ( strcmp( in_pszString1, in_pszString2 ) );
554 return ( strncmp(in_pszString1, in_pszString2, in_MaxCountSize) );
560 return in_pathLen >= 1 && in_pszPath[0] ==
'/';
563 #define AK_UTF16_TO_WCHAR( in_pdDest, in_pSrc, in_MaxSize ) AKPLATFORM::SafeStrCpy( in_pdDest, in_pSrc, in_MaxSize )
564 #define AK_WCHAR_TO_UTF16( in_pdDest, in_pSrc, in_MaxSize ) AKPLATFORM::SafeStrCpy( in_pdDest, in_pSrc, in_MaxSize )
565 #define AK_UTF8_TO_OSCHAR( in_pdDest, in_pSrc, in_MaxSize ) AKPLATFORM::SafeStrCpy( in_pdDest, in_pSrc, in_MaxSize )
566 #define AK_UTF16_TO_OSCHAR( in_pdDest, in_pSrc, in_MaxSize ) AKPLATFORM::AkWideCharToChar( in_pSrc, in_MaxSize, in_pdDest )
567 #define AK_UTF16_TO_CHAR( in_pdDest, in_pSrc, in_MaxSize ) AKPLATFORM::AkWideCharToChar( in_pSrc, in_MaxSize, in_pdDest )
568 #define AK_CHAR_TO_UTF16( in_pdDest, in_pSrc, in_MaxSize ) AKPLATFORM::AkCharToWideChar( in_pSrc, in_MaxSize, in_pdDest )
569 #define AK_OSCHAR_TO_UTF16( in_pdDest, in_pSrc, in_MaxSize ) AKPLATFORM::AkCharToWideChar( in_pSrc, in_MaxSize, in_pdDest )
572 #define AK_PATH_SEPARATOR "/"
573 #define AK_LIBRARY_PREFIX ""
574 #define AK_DYNAMIC_LIBRARY_EXTENSION ".prx"
576 #define AK_FILEHANDLE_TO_UINTPTR(_h) ((AkUIntPtr)_h)
577 #define AK_SET_FILEHANDLE_TO_UINTPTR(_h,_u) _h = (AkFileHandle)_u
580 #endif // _AK_PLATFORM_FUNCS_H_
AKRESULT AkCreateSemaphore(AkSemaphore &out_semaphore, AkUInt32 in_initialCount)
Platform Independent Helper.
size_t AkUtf16StrLen(const AkUtf16 *in_pStr)
Definition of data structures for AkAudioObject.
@ 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)
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)
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.
Tell us about your project. We're here to help.
Register your project and we'll help you get started with no strings attached!
Get started with Wwise