fmodex/fmod/src/fmod_debug.cpp

397 lines
9.4 KiB
C++
Executable file

#include "fmod_settings.h"
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include "fmod.h"
#include "fmod_debug.h"
#include "fmod_globals.h"
#include "fmod_os_misc.h"
#include "fmod_time.h"
#include "fmod_string.h"
#include "fmod_systemi.h"
extern "C"
{
/*
[API]
[
[DESCRIPTION]
Sets the level of debug logging to the tty / output for logging versions of FMOD Ex.
[PARAMETERS]
'level' Logging level to set.
[RETURN_VALUE]
[REMARKS]
This only has an effect with 'logging' versions of FMOD Ex. For example on windows it must be via fmodexL.dll, not fmodex.dll.<br>
On Xbox it would be fmodxboxL.lib not fmodxbox.lib.<br>
FMOD_ERR_UNSUPPORTED will be returned on non logging versions of FMOD Ex (ie full release).<br>
[PLATFORMS]
Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation 2, PlayStation Portable, PlayStation 3, Wii, Solaris, iPhone
[SEE_ALSO]
Debug_GetLevel
FMOD_DEBUGLEVEL
]
*/
FMOD_RESULT F_API FMOD_Debug_SetLevel(FMOD_DEBUGLEVEL level)
{
#ifdef FMOD_DEBUG
if (!FMOD::gGlobal)
{
#if !defined(FMOD_STATICFORPLUGINS) && !defined(PLATFORM_PS2_IOP)
FMOD::SystemI::getGlobals(&FMOD::gGlobal);
#else
return FMOD_ERR_UNINITIALIZED;
#endif
}
FMOD::gGlobal->gDebugLevel = (FMOD_DEBUGLEVEL)level;
return FMOD_OK;
#else
return FMOD_ERR_UNSUPPORTED;
#endif
}
/*
[API]
[
[DESCRIPTION]
Retrieves the current debug logging level.
[PARAMETERS]
'level' Address of a variable to receieve current debug level.
[RETURN_VALUE]
[REMARKS]
This only has an effect with 'logging' versions of FMOD Ex. For example on windows it must be via fmodexL.dll, not fmodex.dll.<br>
On Xbox it would be fmodxboxL.lib not fmodxbox.lib.<br>
FMOD_ERR_UNSUPPORTED will be returned on non logging versions of FMOD Ex (ie full release).<br>
[PLATFORMS]
Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation 2, PlayStation Portable, PlayStation 3, Wii, Solaris, iPhone
[SEE_ALSO]
Debug_SetLevel
FMOD_DEBUGLEVEL
]
*/
FMOD_RESULT F_API FMOD_Debug_GetLevel(FMOD_DEBUGLEVEL *level)
{
if (!level)
{
return FMOD_ERR_INVALID_PARAM;
}
#ifdef FMOD_DEBUG
*level = FMOD::gGlobal->gDebugLevel;
return FMOD_OK;
#else
*level = 0;
return FMOD_ERR_UNSUPPORTED;
#endif
}
/*
[
[DESCRIPTION]
[PARAMETERS]
'mode' Bitfield containing debug settings.
[RETURN_VALUE]
[REMARKS]
[PLATFORMS]
Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation 2, PlayStation Portable, PlayStation 3, Wii, Solaris, iPhone
[SEE_ALSO]
Debug_GetMode
]
*/
FMOD_RESULT F_API FMOD_Debug_SetMode(unsigned int mode)
{
#ifdef FMOD_DEBUG
if (!FMOD::gGlobal)
{
return FMOD_ERR_UNINITIALIZED;
}
FMOD::gGlobal->gDebugMode = (FMOD::FMOD_DEBUGMODE)mode;
#endif
return FMOD_OK;
}
/*
[
[DESCRIPTION]
[PARAMETERS]
'mode' Bitfield containing debug settings.
[RETURN_VALUE]
[REMARKS]
[PLATFORMS]
Win32, Win64, Linux, Linux64, Macintosh, Xbox360, PlayStation 2, PlayStation Portable, PlayStation 3, Wii, Solaris, iPhone
[SEE_ALSO]
Debug_SetMode
]
*/
FMOD_RESULT F_API FMOD_Debug_GetMode(unsigned int *mode)
{
if (!mode)
{
return FMOD_ERR_INVALID_PARAM;
}
#ifdef FMOD_DEBUG
*mode = (unsigned int )FMOD::gGlobal->gDebugMode;
#endif
return FMOD_OK;
}
}
#ifdef FMOD_DEBUG
namespace FMOD
{
static int gDebugMemory = 0;
int *gDebugIndent = &gDebugMemory;
#ifndef PLATFORM_PS2_IOP
#ifdef PLATFORM_PS2_EE
#include <eekernel.h>
#include <sifdev.h>
void DebugFile(const char *s)
{
static int debugFP = -666;
static bool debugfirsttime = true;
if (debugfirsttime)
{
debugFP = sceOpen(FMOD::gGlobal->gDebugFilename, SCE_CREAT | SCE_RDWR);
debugfirsttime = false;
}
if (debugFP >= 0)
{
sceWrite(debugFP, s, FMOD_strlen(s));
}
else
{
char s[256];
sprintf(s, "ERROR - failed to open %s! (result = %d)\n", FMOD::gGlobal->gDebugFilename, debugFP);
FMOD_OS_Debug_OutputStr(s);
}
}
#else
void DebugFile(const char *s)
{
FILE *debugFP;
const char *openstr = "atc";
static bool debugfirstfime = true;
if (debugfirstfime)
{
debugfirstfime = false;
openstr = "wt";
}
debugFP = fopen(FMOD::gGlobal->gDebugFilename, openstr);
if (debugFP)
{
fputs(s, debugFP);
fflush(debugFP);
fclose(debugFP);
}
}
#endif
#endif
void Debug(FMOD_DEBUGLEVEL type, const char *file, const int line, const char *fnname, const char *format, ...)
{
va_list arglist;
unsigned int now;
static unsigned int oldtime = 0;
const int BUFFER_SIZE = 256;
const int INDENT_SIZE = 64;
char s[BUFFER_SIZE], tmp[BUFFER_SIZE], indent[INDENT_SIZE];
if (!(type & FMOD::gGlobal->gDebugLevel))
{
return;
}
/*
Filter out users if one is specified.
*/
if (FMOD::gGlobal->gDebugLevel & FMOD_DEBUG_USER_ALL && type & FMOD_DEBUG_USER_ALL)
{
if (!((type & FMOD_DEBUG_USER_ALL) & (FMOD::gGlobal->gDebugLevel & FMOD_DEBUG_USER_ALL)))
{
return;
}
}
FMOD_OS_Time_GetMs(&now);
if (oldtime == 0)
{
oldtime = now;
}
va_start(arglist, format);
FMOD_vsnprintf(s, BUFFER_SIZE, format, arglist);
FMOD_snprintf(indent, INDENT_SIZE, "%*s", *gDebugIndent, "");
if (FMOD::gGlobal->gDebugLevel & FMOD_DEBUG_DISPLAY_LINENUMBERS)
{
char tmp2[BUFFER_SIZE];
FMOD_snprintf(tmp, BUFFER_SIZE, "%s(%d)", file, line);
#ifdef PLATFORM_PS2
#define LEADINGSPACES 40
#else
#define LEADINGSPACES 60
#endif
if (FMOD_strlen(tmp) < LEADINGSPACES)
{
FMOD_strncat(tmp, " ", LEADINGSPACES - FMOD_strlen(tmp));
}
if (FMOD::gGlobal->gDebugLevel & FMOD_DEBUG_DISPLAY_TIMESTAMPS)
{
if (FMOD::gGlobal->gDebugLevel & FMOD_DEBUG_DISPLAY_THREAD)
{
FMOD_UINT_NATIVE id;
FMOD_OS_Thread_GetCurrentID(&id),
FMOD_snprintf(tmp2, BUFFER_SIZE, ": [THREADID %d] [%8d ms delta = %4d] %-30s : %s%s", id, now, now - oldtime, fnname, indent, s);
}
else
{
FMOD_snprintf(tmp2, BUFFER_SIZE, ": [%8d ms delta = %4d] %-30s : %s%s", now, now - oldtime, fnname, indent, s);
}
}
else
{
if (FMOD::gGlobal->gDebugLevel & FMOD_DEBUG_DISPLAY_THREAD)
{
FMOD_UINT_NATIVE id;
FMOD_OS_Thread_GetCurrentID(&id),
FMOD_snprintf(tmp2, BUFFER_SIZE, ": [THREADID %d] %-30s : %s%s", id, fnname, indent, s);
}
else
{
FMOD_snprintf(tmp2, BUFFER_SIZE, ": %-30s : %s%s", fnname, indent, s);
}
}
FMOD_strncat(tmp, tmp2, BUFFER_SIZE - FMOD_strlen(tmp) - 1);
}
else
{
if (FMOD::gGlobal->gDebugLevel & FMOD_DEBUG_DISPLAY_TIMESTAMPS)
{
if (FMOD::gGlobal->gDebugLevel & FMOD_DEBUG_DISPLAY_THREAD)
{
FMOD_UINT_NATIVE id;
FMOD_OS_Thread_GetCurrentID(&id),
FMOD_snprintf(tmp, BUFFER_SIZE, "FMOD: [THREADID %d] [%8d ms delta = %4d] %-30s : %s%s", id, now, now - oldtime, fnname, indent, s);
}
else
{
FMOD_snprintf(tmp, BUFFER_SIZE, "FMOD: [%8d ms delta = %4d] %-30s : %s%s", now, now - oldtime, fnname, indent, s);
}
}
else
{
if (FMOD::gGlobal->gDebugLevel & FMOD_DEBUG_DISPLAY_THREAD)
{
FMOD_UINT_NATIVE id;
FMOD_OS_Thread_GetCurrentID(&id),
FMOD_snprintf(tmp, BUFFER_SIZE, "FMOD: [THREADID %d] %-30s : %s%s", id, fnname, indent, s);
}
else
{
FMOD_snprintf(tmp, BUFFER_SIZE, "FMOD: %-30s : %s%s", fnname, indent, s);
}
}
}
if (FMOD::gGlobal->gDebugLevel & FMOD_DEBUG_DISPLAY_COMPRESS)
{
static char lastmessage[BUFFER_SIZE] = "";
static char lasts[BUFFER_SIZE] = "";
static int numrepeats = 0;
if (!FMOD_strcmp(lasts, s) && (numrepeats < 100))
{
numrepeats++;
if (numrepeats > 5)
{
return;
}
}
else
{
if (numrepeats > 5)
{
char p[64];
FMOD_snprintf(p, 64, "FMOD: Last message repeated %d times\n", numrepeats);
#ifndef PLATFORM_PS2_IOP
if (FMOD::gGlobal->gDebugMode == DEBUG_FILE)
{
DebugFile(p);
}
else
#endif
{
FMOD_OS_Debug_OutputStr(p);
}
}
FMOD_strcpy(lasts, s);
FMOD_strcpy(lastmessage, tmp);
numrepeats = 0;
}
}
#ifndef PLATFORM_PS2_IOP
if (FMOD::gGlobal->gDebugMode == DEBUG_FILE)
{
DebugFile(tmp);
}
else
#endif
{
FMOD_OS_Debug_OutputStr(tmp);
}
va_end( arglist );
oldtime = now;
}
}
#endif