# Conflicts:
#	wadsrc/static/language.enu
This commit is contained in:
Christoph Oelckers 2016-08-28 10:00:19 +02:00
commit abafcd5486
42 changed files with 513 additions and 182 deletions

View file

@ -1,11 +1,17 @@
cmake_minimum_required( VERSION 2.8.7 )
if( NOT NO_FMOD AND FMOD_INCLUDE_DIR )
add_library( output_sdl MODULE output_sdl.c )
include_directories( ${FMOD_INCLUDE_DIR} ${SDL2_INCLUDE_DIR} )
target_link_libraries( output_sdl ${SDL2_LIBRARY} )
check_library_exists(${FMOD_LIBRARY} "FMOD_System_GetDriverCaps" "fmod.h" FMOD_IS_EX)
FILE( WRITE ${CMAKE_CURRENT_BINARY_DIR}/link-make "if [ ! -e ${ZDOOM_OUTPUT_DIR}/liboutput_sdl.so ]; then ln -sf output_sdl/liboutput_sdl.so ${ZDOOM_OUTPUT_DIR}/liboutput_sdl.so; fi" )
add_custom_command( TARGET output_sdl POST_BUILD
COMMAND chmod +x ${CMAKE_CURRENT_BINARY_DIR}/link-make
COMMAND /bin/sh -c ${CMAKE_CURRENT_BINARY_DIR}/link-make )
# Only usable with FMOD Ex
if( FMOD_IS_EX )
include_directories( ${FMOD_INCLUDE_DIR} ${SDL2_INCLUDE_DIR} )
add_library( output_sdl MODULE output_sdl.c )
target_link_libraries( output_sdl ${SDL2_LIBRARY} )
FILE( WRITE ${CMAKE_CURRENT_BINARY_DIR}/link-make "if [ ! -e ${ZDOOM_OUTPUT_DIR}/liboutput_sdl.so ]; then ln -sf output_sdl/liboutput_sdl.so ${ZDOOM_OUTPUT_DIR}/liboutput_sdl.so; fi" )
add_custom_command( TARGET output_sdl POST_BUILD
COMMAND chmod +x ${CMAKE_CURRENT_BINARY_DIR}/link-make
COMMAND /bin/sh -c ${CMAKE_CURRENT_BINARY_DIR}/link-make )
endif()
endif()

View file

@ -494,7 +494,7 @@ bool FCajunMaster::LoadBots ()
tmp = M_GetCajunPath(BOTFILENAME);
if (tmp.IsEmpty())
{
DPrintf ("No " BOTFILENAME ", so no bots\n");
DPrintf (DMSG_ERROR, "No " BOTFILENAME ", so no bots\n");
return false;
}
try

View file

@ -612,12 +612,12 @@ int Printf (const char *format, ...)
return count;
}
int DPrintf (const char *format, ...)
int DPrintf (int level, const char *format, ...)
{
va_list argptr;
int count;
if (developer)
if (developer >= level)
{
va_start (argptr, format);
count = VPrintf (PRINT_HIGH, format, argptr);

View file

@ -399,7 +399,7 @@ void CheckCompatibility(MapData *map)
flags = BCompatMap.CheckKey(md5);
if (developer)
if (developer >= DMSG_NOTIFY)
{
Printf("MD5 = ");
for (size_t j = 0; j < sizeof(md5.Bytes); ++j)

View file

@ -450,7 +450,7 @@ int FindStyle (const char *namestr)
{
if (!stricmp(StyleNames[i].Name, namestr)) return StyleNames[i].Num;
}
DPrintf("Unknown render style %s\n", namestr);
DPrintf(DMSG_ERROR, "Unknown render style %s\n", namestr);
return -1;
}
@ -861,7 +861,7 @@ static int PatchThing (int thingy)
}
else
{
DPrintf ("Thing %d\n", thingy);
DPrintf (DMSG_SPAMMY, "Thing %d\n", thingy);
if (thingy > 0)
{
type = InfoNames[thingy - 1];
@ -1086,7 +1086,7 @@ static int PatchThing (int thingy)
}
if (i == BitNames.Size())
{
DPrintf("Unknown bit mnemonic %s\n", strval);
DPrintf(DMSG_ERROR, "Unknown bit mnemonic %s\n", strval);
}
}
}
@ -1242,7 +1242,7 @@ static int PatchThing (int thingy)
else
info->renderflags &= ~RF_INVISIBLE;
}
DPrintf ("Bits: %d,%d (0x%08x,0x%08x)\n", info->flags.GetValue(), info->flags2.GetValue(),
DPrintf (DMSG_SPAMMY, "Bits: %d,%d (0x%08x,0x%08x)\n", info->flags.GetValue(), info->flags2.GetValue(),
info->flags.GetValue(), info->flags2.GetValue());
}
else if (stricmp (Line1, "ID #") == 0)
@ -1328,7 +1328,7 @@ static int PatchSound (int soundNum)
{
int result;
DPrintf ("Sound %d (no longer supported)\n", soundNum);
//DPrintf ("Sound %d (no longer supported)\n", soundNum);
/*
sfxinfo_t *info, dummy;
int offset = 0;
@ -1385,7 +1385,7 @@ static int PatchFrame (int frameNum)
info = FindState (frameNum);
if (info)
{
DPrintf ("Frame %d\n", frameNum);
DPrintf (DMSG_SPAMMY, "Frame %d\n", frameNum);
if (frameNum == 47)
{ // Use original tics for S_DSGUNFLASH1
tics = 5;
@ -1487,7 +1487,7 @@ static int PatchSprite (int sprNum)
if ((unsigned)sprNum < OrgSprNames.Size())
{
DPrintf ("Sprite %d\n", sprNum);
DPrintf (DMSG_SPAMMY, "Sprite %d\n", sprNum);
}
else
{
@ -1534,7 +1534,7 @@ static int PatchAmmo (int ammoNum)
if (ammoNum >= 0 && ammoNum < 4 && (unsigned)ammoNum <= AmmoNames.Size())
{
DPrintf ("Ammo %d.\n", ammoNum);
DPrintf (DMSG_SPAMMY, "Ammo %d.\n", ammoNum);
ammoType = AmmoNames[ammoNum];
if (ammoType != NULL)
{
@ -1617,7 +1617,7 @@ static int PatchWeapon (int weapNum)
if (type != NULL)
{
info = (AWeapon *)GetDefaultByType (type);
DPrintf ("Weapon %d\n", weapNum);
DPrintf (DMSG_SPAMMY, "Weapon %d\n", weapNum);
}
}
@ -1757,7 +1757,7 @@ static int PatchPointer (int ptrNum)
{
if (CodePConv[ptrNum] == indexnum) break;
}
DPrintf("Final ptrNum: %i\n", ptrNum);
DPrintf(DMSG_SPAMMY, "Final ptrNum: %i\n", ptrNum);
}
// End of hack.
@ -1765,7 +1765,7 @@ static int PatchPointer (int ptrNum)
// Better to just use the size of the array rather than a hardcoded value.
if (ptrNum >= 0 && (unsigned int) ptrNum < CodePConv.Size())
{
DPrintf ("Pointer %d\n", ptrNum);
DPrintf (DMSG_SPAMMY, "Pointer %d\n", ptrNum);
}
else
{
@ -1789,7 +1789,7 @@ static int PatchPointer (int ptrNum)
{
SetPointer(state, Actions[index], CodePConv[ptrNum]);
}
DPrintf("%s has a hacked state for pointer num %i with index %i\nLine1=%s, Line2=%s\n",
DPrintf(DMSG_SPAMMY, "%s has a hacked state for pointer num %i with index %i\nLine1=%s, Line2=%s\n",
state->StaticFindStateOwner(state)->TypeName.GetChars(), ptrNum, index, Line1, Line2);
}
else
@ -1806,7 +1806,7 @@ static int PatchCheats (int dummy)
{
int result;
DPrintf ("Cheats (support removed by request)\n");
DPrintf (DMSG_NOTIFY, "Dehacked cheats support removed by request\n");
while ((result = GetLine ()) == 1)
{
@ -1836,7 +1836,7 @@ static int PatchMisc (int dummy)
};
int result;
DPrintf ("Misc\n");
DPrintf (DMSG_SPAMMY, "Misc\n");
while ((result = GetLine()) == 1)
{
@ -2017,7 +2017,7 @@ static int PatchPars (int dummy)
level_info_t *info;
int result, par;
DPrintf ("[Pars]\n");
DPrintf (DMSG_SPAMMY, "[Pars]\n");
while ( (result = GetLine()) ) {
// Argh! .bex doesn't follow the same rules as .deh
@ -2058,7 +2058,7 @@ static int PatchPars (int dummy)
}
info->partime = par;
DPrintf ("Par for %s changed to %d\n", mapname, par);
DPrintf (DMSG_SPAMMY, "Par for %s changed to %d\n", mapname, par);
}
return result;
}
@ -2067,7 +2067,7 @@ static int PatchCodePtrs (int dummy)
{
int result;
DPrintf ("[CodePtr]\n");
DPrintf (DMSG_SPAMMY, "[CodePtr]\n");
while ((result = GetLine()) == 1)
{
@ -2132,7 +2132,7 @@ static int PatchMusic (int dummy)
{
int result;
DPrintf ("[Music]\n");
DPrintf (DMSG_SPAMMY, "[Music]\n");
while ((result = GetLine()) == 1)
{
@ -2142,7 +2142,7 @@ static int PatchMusic (int dummy)
keystring << "MUSIC_" << Line1;
GStrings.SetString (keystring, newname);
DPrintf ("Music %s set to:\n%s\n", keystring.GetChars(), newname);
DPrintf (DMSG_SPAMMY, "Music %s set to:\n%s\n", keystring.GetChars(), newname);
}
return result;
@ -2198,7 +2198,7 @@ static int PatchText (int oldSize)
goto donewithtext;
}
DPrintf ("Searching for text:\n%s\n", oldStr);
DPrintf (DMSG_SPAMMY, "Searching for text:\n%s\n", oldStr);
good = false;
// Search through sprite names; they are always 4 chars
@ -2264,7 +2264,7 @@ static int PatchText (int oldSize)
if (!good)
{
DPrintf (" (Unmatched)\n");
DPrintf (DMSG_SPAMMY, " (Unmatched)\n");
}
donewithtext:
@ -2284,7 +2284,7 @@ static int PatchStrings (int dummy)
{
int result;
DPrintf ("[Strings]\n");
DPrintf (DMSG_SPAMMY, "[Strings]\n");
while ((result = GetLine()) == 1)
{
@ -2310,7 +2310,7 @@ static int PatchStrings (int dummy)
const char *ll = Line1;
if (!stricmp(ll, "GOTREDSKULL")) ll = "GOTREDSKUL";
GStrings.SetString (ll, holdstring);
DPrintf ("%s set to:\n%s\n", Line1, holdstring.GetChars());
DPrintf (DMSG_SPAMMY, "%s set to:\n%s\n", Line1, holdstring.GetChars());
}
return result;
@ -2350,7 +2350,7 @@ static int DoInclude (int dummy)
else
{
data = Line2;
DPrintf ("Including %s\n", data);
DPrintf (DMSG_SPAMMY, "Including %s\n", data);
savepatchname = PatchName;
savepatchfile = PatchFile;
savepatchpt = PatchPt;
@ -2384,7 +2384,7 @@ static int DoInclude (int dummy)
delete[] path;
}
DPrintf ("Done with include\n");
DPrintf (DMSG_SPAMMY, "Done with include\n");
PatchName = savepatchname;
PatchFile = savepatchfile;
PatchPt = savepatchpt;
@ -2536,7 +2536,7 @@ static bool DoDehPatch()
}
else
{
DPrintf ("Patch does not have DeHackEd signature. Assuming .bex\n");
DPrintf (DMSG_WARNING, "Patch does not have DeHackEd signature. Assuming .bex\n");
dversion = 19;
pversion = 6;
PatchPt = PatchFile;
@ -3027,7 +3027,7 @@ void FinishDehPatch ()
subclass->Replacement = old_replacement;
}
DPrintf ("%s replaces %s\n", subclass->TypeName.GetChars(), type->TypeName.GetChars());
DPrintf (DMSG_NOTIFY, "%s replaces %s\n", subclass->TypeName.GetChars(), type->TypeName.GetChars());
}
// Now that all Dehacked patches have been processed, it's okay to free StateMap.

View file

@ -231,7 +231,7 @@ static struct TicSpecial
specialsize = MAX(specialsize * 2, needed + 30);
DPrintf ("Expanding special size to %zu\n", specialsize);
DPrintf (DMSG_NOTIFY, "Expanding special size to %zu\n", specialsize);
for (i = 0; i < BACKUPTICS; i++)
streams[i] = (BYTE *)M_Realloc (streams[i], specialsize);

View file

@ -2134,7 +2134,7 @@ bool PArray::ReadValue(FArchive &ar, void *addr) const
}
if (i < ElementCount)
{
DPrintf("Array on disk (%u) is bigger than in memory (%u)\n",
DPrintf(DMSG_WARNING, "Array on disk (%u) is bigger than in memory (%u)\n",
count, ElementCount);
for (; i < ElementCount; ++i)
{
@ -2501,13 +2501,13 @@ bool PStruct::ReadFields(FArchive &ar, void *addr) const
const PSymbol *sym = Symbols.FindSymbol(FName(label, true), true);
if (sym == NULL)
{
DPrintf("Cannot find field %s in %s\n",
DPrintf(DMSG_ERROR, "Cannot find field %s in %s\n",
label, TypeName.GetChars());
SkipValue(ar);
}
else if (!sym->IsKindOf(RUNTIME_CLASS(PField)))
{
DPrintf("Symbol %s in %s is not a field\n",
DPrintf(DMSG_ERROR, "Symbol %s in %s is not a field\n",
label, TypeName.GetChars());
SkipValue(ar);
}
@ -2806,7 +2806,7 @@ bool PClass::ReadValue(FArchive &ar, void *addr) const
}
else
{
DPrintf("Unknown superclass %s of class %s\n",
DPrintf(DMSG_ERROR, "Unknown superclass %s of class %s\n",
type->TypeName.GetChars(), TypeName.GetChars());
SkipValue(ar, VAL_Struct);
}
@ -3243,7 +3243,7 @@ PClass *PClass::CreateDerivedClass(FName name, unsigned int size)
{
I_Error("%s must inherit from %s but doesn't.", name.GetChars(), type->ParentClass->TypeName.GetChars());
}
DPrintf("Defining placeholder class %s\n", name.GetChars());
DPrintf(DMSG_SPAMMY, "Defining placeholder class %s\n", name.GetChars());
notnew = true;
}
else
@ -3327,7 +3327,7 @@ PClass *PClass::FindClassTentative(FName name, bool fatal)
return static_cast<PClass *>(found);
}
PClass *type = static_cast<PClass *>(GetClass()->CreateNew());
DPrintf("Creating placeholder class %s : %s\n", name.GetChars(), TypeName.GetChars());
DPrintf(DMSG_SPAMMY, "Creating placeholder class %s : %s\n", name.GetChars(), TypeName.GetChars());
type->TypeName = name;
type->ParentClass = this;

View file

@ -39,7 +39,7 @@ FStringTable GStrings;
EGameSpeed GameSpeed = SPEED_Normal;
// Show developer messages if true.
CVAR (Bool, developer, false, 0)
CVAR (Int, developer, 0, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
// [RH] Feature control cvars
CVAR (Bool, var_friction, true, CVAR_SERVERINFO);

View file

@ -204,7 +204,7 @@ extern int bodyqueslot;
// ---- [RH] ----
EXTERN_CVAR (Bool, developer)
EXTERN_CVAR (Int, developer)
extern bool ToggleFullscreen;

View file

@ -147,7 +147,7 @@ int Printf (int printlevel, const char *, ...) GCCPRINTF(2,3);
int Printf (const char *, ...) GCCPRINTF(1,2);
// [RH] Same here:
int DPrintf (const char *, ...) GCCPRINTF(1,2);
int DPrintf (int level, const char *, ...) GCCPRINTF(2,3);
extern "C" int mysnprintf(char *buffer, size_t count, const char *format, ...) GCCPRINTF(3,4);
extern "C" int myvsnprintf(char *buffer, size_t count, const char *format, va_list argptr) GCCFORMAT(3);
@ -160,15 +160,19 @@ enum
PRINT_MEDIUM, // death messages
PRINT_HIGH, // critical messages
PRINT_CHAT, // chat messages
PRINT_TEAMCHAT // chat messages from a teammate
PRINT_TEAMCHAT, // chat messages from a teammate
PRINT_LOG, // only to logfile
PRINT_BOLD = 200 // What Printf_Bold used
};
enum
{
DMSG_OFF, // no developer messages.
DMSG_ERROR, // general notification messages
DMSG_WARNING, // warnings
DMSG_NOTIFY, // general notification messages
DMSG_SPAMMY, // for those who want to see everything, regardless of its usefulness.
};
#define PRINT_LOW 0 // pickup messages
#define PRINT_MEDIUM 1 // death messages
#define PRINT_HIGH 2 // critical messages
#define PRINT_CHAT 3 // chat messages
#define PRINT_TEAMCHAT 4 // chat messages from a teammate
#define PRINT_LOG 5 // only to logfile
#define PRINT_BOLD 200 // What Printf_Bold used
struct PalEntry
{

View file

@ -79,8 +79,8 @@ public:
static void DestroyMostThinkers ();
static void DestroyThinkersInList(int statnum)
{
DestroyThinkersInList(Thinkers[STAT_TRAVELLING]);
DestroyThinkersInList(FreshThinkers[STAT_TRAVELLING]);
DestroyThinkersInList(Thinkers[statnum]);
DestroyThinkersInList(FreshThinkers[statnum]);
}
static void SerializeAll (FArchive &arc, bool keepPlayers);
static void MarkRoots();

View file

@ -354,12 +354,12 @@ void FCompressedFile::Implode ()
// If the data could not be compressed, store it as-is.
if (r != Z_OK || outlen >= len)
{
DPrintf ("cfile could not be compressed\n");
DPrintf (DMSG_SPAMMY, "cfile could not be compressed\n");
outlen = 0;
}
else
{
DPrintf ("cfile shrank from %lu to %lu bytes\n", len, outlen);
DPrintf (DMSG_SPAMMY, "cfile shrank from %lu to %lu bytes\n", len, outlen);
}
}
else
@ -717,7 +717,7 @@ void FArchive::Close ()
{
m_File->Close ();
m_File = NULL;
DPrintf ("Processed %u objects\n", ArchiveToObject.Size());
DPrintf (DMSG_SPAMMY, "Processed %u objects\n", ArchiveToObject.Size());
}
}

View file

@ -825,13 +825,13 @@ void ADecal::BeginPlay ()
// without effectively doing anything.
if (NULL == ShootDecal(tpl, this, Sector, X(), Y(), Z(), Angles.Yaw + 180, 64., true))
{
DPrintf ("Could not find a wall to stick decal to at (%f,%f)\n", X(), Y());
DPrintf (DMSG_WARNING, "Could not find a wall to stick decal to at (%f,%f)\n", X(), Y());
}
}
}
else
{
DPrintf ("Decal actor at (%f,%f) does not have a good template\n", X(), Y());
DPrintf (DMSG_ERROR, "Decal actor at (%f,%f) does not have a good template\n", X(), Y());
}
// This actor doesn't need to stick around anymore.
Destroy();

View file

@ -322,7 +322,7 @@ void PacketGet (void)
// Don't show the message for disconnect notifications.
if (c != 2 || TransmitBuffer[0] != PRE_FAKE || TransmitBuffer[1] != PRE_DISCONNECT)
{
DPrintf("Dropped packet: Unknown host (%s:%d)\n", inet_ntoa(fromaddress.sin_addr), fromaddress.sin_port);
DPrintf(DMSG_WARNING, "Dropped packet: Unknown host (%s:%d)\n", inet_ntoa(fromaddress.sin_addr), fromaddress.sin_port);
}
doomcom.remotenode = -1;
return;

View file

@ -1331,12 +1331,12 @@ static int CheckInventory (AActor *activator, const char *type, bool max)
if (info == NULL)
{
Printf ("ACS: I don't know what '%s' is.\n", type);
DPrintf (DMSG_ERROR, "ACS: '%s': Unknown actor class.\n", type);
return 0;
}
else if (!info->IsDescendantOf(RUNTIME_CLASS(AInventory)))
{
Printf ("ACS: '%s' is not an inventory item.\n", type);
DPrintf(DMSG_ERROR, "ACS: '%s' is not an inventory item.\n", type);
return 0;
}
@ -2237,7 +2237,7 @@ bool FBehavior::Init(int lumpnum, FileReader * fr, int len)
}
}
DPrintf ("Loaded %d scripts, %d functions\n", NumScripts, NumFunctions);
DPrintf (DMSG_NOTIFY, "Loaded %d scripts, %d functions\n", NumScripts, NumFunctions);
return true;
}
@ -2824,7 +2824,7 @@ void FBehavior::StaticStartTypedScripts (WORD type, AActor *activator, bool alwa
"Disconnect",
"Return"
};
DPrintf("Starting all scripts of type %d (%s)\n", type,
DPrintf(DMSG_NOTIFY, "Starting all scripts of type %d (%s)\n", type,
type < countof(TypeNames) ? TypeNames[type] : TypeNames[SCRIPT_Lightning - 1]);
for (unsigned int i = 0; i < StaticModules.Size(); ++i)
{
@ -6209,7 +6209,7 @@ int DLevelScript::RunScript ()
activeBehavior = savedActiveBehavior;
// fall through
case PCD_TERMINATE:
DPrintf ("%s finished\n", ScriptPresentation(script).GetChars());
DPrintf (DMSG_NOTIFY, "%s finished\n", ScriptPresentation(script).GetChars());
state = SCRIPT_PleaseRemove;
break;
@ -7646,7 +7646,7 @@ scriptwait:
if (activationline != NULL)
{
activationline->special = 0;
DPrintf("Cleared line special on line %d\n", (int)(activationline - lines));
DPrintf(DMSG_SPAMMY, "Cleared line special on line %d\n", (int)(activationline - lines));
}
break;
@ -8285,7 +8285,7 @@ scriptwait:
line->args[2] = STACK(3);
line->args[3] = STACK(2);
line->args[4] = STACK(1);
DPrintf("Set special on line %d (id %d) to %d(%d,%d,%d,%d,%d)\n",
DPrintf(DMSG_SPAMMY, "Set special on line %d (id %d) to %d(%d,%d,%d,%d,%d)\n",
linenum, STACK(7), specnum, arg0, STACK(4), STACK(3), STACK(2), STACK(1));
}
sp -= 7;
@ -9663,7 +9663,7 @@ DLevelScript::DLevelScript (AActor *who, line_t *where, int num, const ScriptPtr
PutLast();
}
DPrintf("%s started.\n", ScriptPresentation(num).GetChars());
DPrintf(DMSG_SPAMMY, "%s started.\n", ScriptPresentation(num).GetChars());
}
static void SetScriptState (int script, DLevelScript::EScriptState state)
@ -9710,12 +9710,12 @@ void P_DoDeferedScripts ()
case acsdefered_t::defsuspend:
SetScriptState (def->script, DLevelScript::SCRIPT_Suspended);
DPrintf ("Deferred suspend of %s\n", ScriptPresentation(def->script).GetChars());
DPrintf (DMSG_SPAMMY, "Deferred suspend of %s\n", ScriptPresentation(def->script).GetChars());
break;
case acsdefered_t::defterminate:
SetScriptState (def->script, DLevelScript::SCRIPT_PleaseRemove);
DPrintf ("Deferred terminate of %s\n", ScriptPresentation(def->script).GetChars());
DPrintf (DMSG_SPAMMY, "Deferred terminate of %s\n", ScriptPresentation(def->script).GetChars());
break;
}
delete def;
@ -9751,7 +9751,7 @@ static void addDefered (level_info_t *i, acsdefered_t::EType type, int script, c
def->playernum = -1;
}
i->defered = def;
DPrintf ("%s on map %s deferred\n", ScriptPresentation(script).GetChars(), i->MapName.GetChars());
DPrintf (DMSG_SPAMMY, "%s on map %s deferred\n", ScriptPresentation(script).GetChars(), i->MapName.GetChars());
}
}

View file

@ -253,7 +253,7 @@ static bool LoadScriptFile(int lumpnum, FileReader *lump, int numnodes, bool inc
if ((type == 1 && !isbinary) || (type == 2 && isbinary))
{
DPrintf("Incorrect data format for %s.", Wads.GetLumpFullName(lumpnum));
DPrintf(DMSG_ERROR, "Incorrect data format for %s.", Wads.GetLumpFullName(lumpnum));
return false;
}
@ -273,7 +273,7 @@ static bool LoadScriptFile(int lumpnum, FileReader *lump, int numnodes, bool inc
// is exactly 1516 bytes long.
if (numnodes % 1516 != 0)
{
DPrintf("Incorrect data format for %s.", Wads.GetLumpFullName(lumpnum));
DPrintf(DMSG_ERROR, "Incorrect data format for %s.", Wads.GetLumpFullName(lumpnum));
return false;
}
numnodes /= 1516;
@ -283,7 +283,7 @@ static bool LoadScriptFile(int lumpnum, FileReader *lump, int numnodes, bool inc
// And the teaser version has 1488-byte entries.
if (numnodes % 1488 != 0)
{
DPrintf("Incorrect data format for %s.", Wads.GetLumpFullName(lumpnum));
DPrintf(DMSG_ERROR, "Incorrect data format for %s.", Wads.GetLumpFullName(lumpnum));
return false;
}
numnodes /= 1488;

View file

@ -1013,7 +1013,7 @@ bool P_CheckNodes(MapData * map, bool rebuilt, int buildtime)
subsectors, numsubsectors,
vertexes, numvertexes);
endTime = I_FPSTime ();
DPrintf ("BSP generation took %.3f sec (%d segs)\n", (endTime - startTime) * 0.001, numsegs);
DPrintf (DMSG_NOTIFY, "BSP generation took %.3f sec (%d segs)\n", (endTime - startTime) * 0.001, numsegs);
buildtime = endTime - startTime;
}
}
@ -1026,12 +1026,12 @@ bool P_CheckNodes(MapData * map, bool rebuilt, int buildtime)
#endif
if (level.maptype != MAPTYPE_BUILD && gl_cachenodes && buildtime/1000.f >= gl_cachetime)
{
DPrintf("Caching nodes\n");
DPrintf(DMSG_NOTIFY, "Caching nodes\n");
CreateCachedNodes(map);
}
else
{
DPrintf("Not caching nodes (time = %f)\n", buildtime/1000.f);
DPrintf(DMSG_NOTIFY, "Not caching nodes (time = %f)\n", buildtime/1000.f);
}
}

View file

@ -361,7 +361,7 @@ bool AActor::FixMapthingPos()
if (distance < radius)
{
DPrintf("%s at (%f,%f) lies on %s line %td, distance = %f\n",
DPrintf(DMSG_NOTIFY, "%s at (%f,%f) lies on %s line %td, distance = %f\n",
this->GetClass()->TypeName.GetChars(), X(), Y(),
ldef->Delta().X == 0 ? "vertical" : ldef->Delta().Y == 0 ? "horizontal" : "diagonal",
ldef - lines, distance);

View file

@ -1689,7 +1689,7 @@ static void SetMapThingUserData(AActor *actor, unsigned udi)
if (var == NULL || (var->Flags & VARF_Native) || !var->Type->IsKindOf(RUNTIME_CLASS(PBasicType)))
{
DPrintf("%s is not a user variable in class %s\n", varname.GetChars(),
DPrintf(DMSG_WARNING, "%s is not a user variable in class %s\n", varname.GetChars(),
actor->GetClass()->TypeName.GetChars());
}
else
@ -2477,7 +2477,7 @@ int P_DetermineTranslucency (int lumpnum)
if (newcolor2.r == 255) // if black on white results in white it's either
// fully transparent or additive
{
if (developer)
if (developer >= DMSG_NOTIFY)
{
char lumpname[9];
lumpname[8] = 0;
@ -2488,7 +2488,7 @@ int P_DetermineTranslucency (int lumpnum)
return -newcolor.r;
}
if (developer)
if (developer >= DMSG_NOTIFY)
{
char lumpname[9];
lumpname[8] = 0;
@ -3028,7 +3028,7 @@ void P_LoadBlockMap (MapData * map)
Args->CheckParm("-blockmap")
)
{
DPrintf ("Generating BLOCKMAP\n");
DPrintf (DMSG_SPAMMY, "Generating BLOCKMAP\n");
P_CreateBlockMap ();
}
else
@ -3060,7 +3060,7 @@ void P_LoadBlockMap (MapData * map)
if (!P_VerifyBlockMap(count))
{
DPrintf ("Generating BLOCKMAP\n");
DPrintf (DMSG_SPAMMY, "Generating BLOCKMAP\n");
P_CreateBlockMap();
}
@ -3957,7 +3957,7 @@ void P_SetupLevel (const char *lumpname, int position)
subsectors, numsubsectors,
vertexes, numvertexes);
endTime = I_FPSTime ();
DPrintf ("BSP generation took %.3f sec (%d segs)\n", (endTime - startTime) * 0.001, numsegs);
DPrintf (DMSG_NOTIFY, "BSP generation took %.3f sec (%d segs)\n", (endTime - startTime) * 0.001, numsegs);
oldvertextable = builder.GetOldVertexTable();
reloop = true;
}

View file

@ -186,7 +186,7 @@ bool P_ActivateLine (line_t *line, AActor *mo, int side, int activationType, DVe
line->special = 0;
}
// end of changed code
if (developer && buttonSuccess)
if (developer >= DMSG_SPAMMY && buttonSuccess)
{
Printf ("Line special %d activated on line %i\n", special, int(line - lines));
}
@ -358,7 +358,7 @@ bool P_PredictLine(line_t *line, AActor *mo, int side, int activationType)
special = line->special;
// end of changed code
if (developer && buttonSuccess)
if (developer >= DMSG_SPAMMY && buttonSuccess)
{
Printf("Line special %d predicted on line %i\n", special, int(line - lines));
}

View file

@ -42,7 +42,7 @@ extern gamestate_t wipegamestate;
//
// P_CheckTickerPaused
//
// Returns true if the ticker should be paused. In that cause, it also
// Returns true if the ticker should be paused. In that case, it also
// pauses sound effects and possibly music. If the ticker should not be
// paused, then it returns false but does not unpause anything.
//

View file

@ -147,7 +147,7 @@ extern TArray<int> linemap;
void UDMFParserBase::Skip()
{
if (developer) sc.ScriptMessage("Ignoring unknown key \"%s\".", sc.String);
if (developer >= DMSG_WARNING) sc.ScriptMessage("Ignoring unknown UDMF key \"%s\".", sc.String);
if(sc.CheckToken('{'))
{
int level = 1;

View file

@ -2441,7 +2441,7 @@ void P_PlayerThink (player_t *player)
S_ChangeMusic("*");
}
}
DPrintf("MUSINFO change for player %d to %d\n", (int)(player - players), player->MUSINFOactor->args[0]);
DPrintf(DMSG_NOTIFY, "MUSINFO change for player %d to %d\n", (int)(player - players), player->MUSINFOactor->args[0]);
}
}
@ -2828,9 +2828,9 @@ void P_PredictPlayer (player_t *player)
DoLerp = (int)PredictionLast.pos.X != (int)player->mo->X() || (int)PredictionLast.pos.Y != (int)player->mo->Y();
// Aditional Debug information
if (developer && DoLerp)
if (developer >= DMSG_NOTIFY && DoLerp)
{
DPrintf("Lerp! Ltic (%d) && Ptic (%d) | Lx (%f) && Px (%f) | Ly (%f) && Py (%f)\n",
DPrintf(DMSG_NOTIFY, "Lerp! Ltic (%d) && Ptic (%d) | Lx (%f) && Px (%f) | Ly (%f) && Py (%f)\n",
PredictionLast.gametic, i,
(PredictionLast.pos.X), (player->mo->X()),
(PredictionLast.pos.Y), (player->mo->Y()));

View file

@ -280,18 +280,18 @@ void I_SetFPSLimit(int limit)
}
if (limit == 0)
{ // no limit
DPrintf("FPS timer disabled\n");
DPrintf(DMSG_NOTIFY, "FPS timer disabled\n");
}
else
{
FPSLimitTimerEnabled = true;
if(timer_create(CLOCK_REALTIME, &FPSLimitEvent, &FPSLimitTimer) == -1)
Printf("Failed to create FPS limitter event\n");
Printf(DMSG_WARNING, "Failed to create FPS limitter event\n");
itimerspec period = { {0, 0}, {0, 0} };
period.it_value.tv_nsec = period.it_interval.tv_nsec = 1000000000 / limit;
if(timer_settime(FPSLimitTimer, 0, &period, NULL) == -1)
Printf("Failed to set FPS limitter timer\n");
DPrintf("FPS timer set to %u ms\n", (unsigned int) period.it_interval.tv_nsec / 1000000);
Printf(DMSG_WARNING, "Failed to set FPS limitter timer\n");
DPrintf(DMSG_NOTIFY, "FPS timer set to %u ms\n", (unsigned int) period.it_interval.tv_nsec / 1000000);
}
}
#else

View file

@ -2341,7 +2341,7 @@ void R_CheckDrawSegs ()
firstdrawseg = drawsegs + firstofs;
ds_p = drawsegs + MaxDrawSegs;
MaxDrawSegs = newdrawsegs;
DPrintf ("MaxDrawSegs increased to %zu\n", MaxDrawSegs);
DPrintf (DMSG_NOTIFY, "MaxDrawSegs increased to %zu\n", MaxDrawSegs);
}
}
@ -2360,7 +2360,7 @@ ptrdiff_t R_NewOpening (ptrdiff_t len)
maxopenings = maxopenings ? maxopenings*2 : 16384;
while ((size_t)lastopening > maxopenings);
openings = (short *)M_Realloc (openings, maxopenings * sizeof(*openings));
DPrintf ("MaxOpenings increased to %zu\n", maxopenings);
DPrintf (DMSG_NOTIFY, "MaxOpenings increased to %zu\n", maxopenings);
}
return res;
}

View file

@ -222,7 +222,7 @@ vissprite_t *R_NewVisSprite (void)
lastvissprite = &vissprites[MaxVisSprites];
firstvissprite = &vissprites[firstvisspritenum];
vissprite_p = &vissprites[prevvisspritenum];
DPrintf ("MaxVisSprites increased to %d\n", MaxVisSprites);
DPrintf (DMSG_NOTIFY, "MaxVisSprites increased to %d\n", MaxVisSprites);
// Allocate sprites from the new pile
for (vissprite_t **p = vissprite_p; p < lastvissprite; ++p)
@ -832,13 +832,11 @@ void R_ProjectSprite (AActor *thing, int fakeside, F3DFloor *fakefloor, F3DFloor
else
{
// decide which texture to use for the sprite
#ifdef RANGECHECK
if (spritenum >= (signed)sprites.Size () || spritenum < 0)
if ((unsigned)spritenum >= sprites.Size ())
{
DPrintf ("R_ProjectSprite: invalid sprite number %u\n", spritenum);
DPrintf (DMSG_ERROR, "R_ProjectSprite: invalid sprite number %u\n", spritenum);
return;
}
#endif
spritedef_t *sprdef = &sprites[spritenum];
if (thing->frame >= sprdef->numframes)
{
@ -1312,13 +1310,13 @@ void R_DrawPSprite(DPSprite *pspr, AActor *owner, float bobx, float boby, double
// decide which patch to use
if ((unsigned)pspr->GetSprite() >= (unsigned)sprites.Size())
{
DPrintf("R_DrawPSprite: invalid sprite number %i\n", pspr->GetSprite());
DPrintf(DMSG_ERROR, "R_DrawPSprite: invalid sprite number %i\n", pspr->GetSprite());
return;
}
sprdef = &sprites[pspr->GetSprite()];
if (pspr->GetFrame() >= sprdef->numframes)
{
DPrintf("R_DrawPSprite: invalid sprite frame %i : %i\n", pspr->GetSprite(), pspr->GetFrame());
DPrintf(DMSG_ERROR, "R_DrawPSprite: invalid sprite frame %i : %i\n", pspr->GetSprite(), pspr->GetFrame());
return;
}
sprframe = &SpriteFrames[sprdef->spriteframes + pspr->GetFrame()];

View file

@ -471,7 +471,7 @@ void FWadFile::SetNamespace(const char *startmarker, const char *endmarker, name
{
// We can't add this to the flats namespace but
// it needs to be flagged for the texture manager.
DPrintf("Marking %s as potential flat\n", Lumps[i].Name);
DPrintf(DMSG_NOTIFY, "Marking %s as potential flat\n", Lumps[i].Name);
Lumps[i].Flags |= LUMPF_MAYBEFLAT;
}
}
@ -517,7 +517,7 @@ void FWadFile::SetNamespace(const char *startmarker, const char *endmarker, name
}
// we found a marked block
DPrintf("Found %s block at (%d-%d)\n", startmarker, markers[start].index, end);
DPrintf(DMSG_NOTIFY, "Found %s block at (%d-%d)\n", startmarker, markers[start].index, end);
for(int j = markers[start].index + 1; j < end; j++)
{
if (Lumps[j].Namespace != ns_global)
@ -534,7 +534,7 @@ void FWadFile::SetNamespace(const char *startmarker, const char *endmarker, name
// ignore sprite lumps smaller than 8 bytes (the smallest possible)
// in size -- this was used by some dmadds wads
// as an 'empty' graphics resource
DPrintf(" Skipped empty sprite %s (lump %d)\n", Lumps[j].Name, j);
DPrintf(DMSG_WARNING, " Skipped empty sprite %s (lump %d)\n", Lumps[j].Name, j);
}
else
{

View file

@ -182,7 +182,7 @@ int FPlayList::SetPosition (int position)
{
Position = position;
}
DPrintf ("Playlist position set to %d\n", Position);
DPrintf (DMSG_NOTIFY, "Playlist position set to %d\n", Position);
return Position;
}
@ -197,7 +197,7 @@ int FPlayList::Advance ()
{
Position = 0;
}
DPrintf ("Playlist advanced to song %d\n", Position);
DPrintf (DMSG_NOTIFY, "Playlist advanced to song %d\n", Position);
return Position;
}
@ -207,7 +207,7 @@ int FPlayList::Backup ()
{
Position = Songs.Size() - 1;
}
DPrintf ("Playlist backed up to song %d\n", Position);
DPrintf (DMSG_NOTIFY, "Playlist backed up to song %d\n", Position);
return Position;
}

View file

@ -552,7 +552,7 @@ void S_UnloadSound (sfxinfo_t *sfx)
GSnd->UnloadSound(sfx->data);
sfx->data.Clear();
sfx->data3d.Clear();
DPrintf("Unloaded sound \"%s\" (%td)\n", sfx->name.GetChars(), sfx - &S_sfx[0]);
DPrintf(DMSG_NOTIFY, "Unloaded sound \"%s\" (%td)\n", sfx->name.GetChars(), sfx - &S_sfx[0]);
}
}
@ -1327,7 +1327,7 @@ sfxinfo_t *S_LoadSound(sfxinfo_t *sfx)
{
if (S_sfx[i].data.isValid() && S_sfx[i].link == sfxinfo_t::NO_LINK && S_sfx[i].lumpnum == sfx->lumpnum)
{
DPrintf ("Linked %s to %s (%d)\n", sfx->name.GetChars(), S_sfx[i].name.GetChars(), i);
DPrintf (DMSG_NOTIFY, "Linked %s to %s (%d)\n", sfx->name.GetChars(), S_sfx[i].name.GetChars(), i);
sfx->link = i;
// This is necessary to avoid using the rolloff settings of the linked sound if its
// settings are different.
@ -1336,7 +1336,7 @@ sfxinfo_t *S_LoadSound(sfxinfo_t *sfx)
}
}
DPrintf("Loading sound \"%s\" (%td)\n", sfx->name.GetChars(), sfx - &S_sfx[0]);
DPrintf(DMSG_NOTIFY, "Loading sound \"%s\" (%td)\n", sfx->name.GetChars(), sfx - &S_sfx[0]);
int size = Wads.LumpLength(sfx->lumpnum);
if (size > 0)
@ -1396,7 +1396,7 @@ static void S_LoadSound3D(sfxinfo_t *sfx)
if(sfx->data3d.isValid())
return;
DPrintf("Loading monoized sound \"%s\" (%td)\n", sfx->name.GetChars(), sfx - &S_sfx[0]);
DPrintf(DMSG_NOTIFY, "Loading monoized sound \"%s\" (%td)\n", sfx->name.GetChars(), sfx - &S_sfx[0]);
int size = Wads.LumpLength(sfx->lumpnum);
if(size <= 0) return;

View file

@ -1044,7 +1044,7 @@ void FScriptPosition::Message (int severity, const char *message, ...) const
{
FString composed;
if ((severity == MSG_DEBUG || severity == MSG_DEBUGLOG) && !developer) return;
if ((severity == MSG_DEBUG || severity == MSG_DEBUGLOG) && developer < DMSG_NOTIFY) return;
if (severity == MSG_OPTERROR)
{
severity = strictdecorate ? MSG_ERROR : MSG_WARNING;

View file

@ -611,5 +611,14 @@ namespace FMOD
}
#endif
// FMOD Ex vs FMOD Studio
#if FMOD_VERSION >= 0x00040000 && FMOD_VERSION <= 0x0004FFFF
#define FMOD_STUDIO 0
#else
#define FMOD_STUDIO 1
#define FMOD_SOFTWARE 0
#endif
#endif
#endif

View file

@ -122,10 +122,14 @@ CUSTOM_CVAR (Int, snd_streambuffersize, 64, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
}
#ifndef NO_FMOD
#if FMOD_VERSION < 0x43400
#if !FMOD_STUDIO && FMOD_VERSION < 0x43400
#define FMOD_OPENSTATE_PLAYING FMOD_OPENSTATE_STREAMING
#endif
#if !FMOD_STUDIO
#define setParameterFloat setParameter
#endif
// TYPES -------------------------------------------------------------------
struct FEnumList
@ -183,15 +187,28 @@ static const FEnumList OutputNames[] =
{ "WASAPI", FMOD_OUTPUTTYPE_WASAPI },
{ "ASIO", FMOD_OUTPUTTYPE_ASIO },
#if FMOD_STUDIO
//Android
{ "OPENSL", FMOD_OUTPUTTYPE_OPENSL },
{ "Android Audio Track", FMOD_OUTPUTTYPE_AUDIOTRACK },
#endif
// Linux
#if !FMOD_STUDIO
{ "OSS", FMOD_OUTPUTTYPE_OSS },
#endif
{ "ALSA", FMOD_OUTPUTTYPE_ALSA },
#if !FMOD_STUDIO
{ "ESD", FMOD_OUTPUTTYPE_ESD },
#if FMOD_VERSION >= 0x43400
#endif
#if FMOD_STUDIO || FMOD_VERSION >= 0x43400
{ "PulseAudio", FMOD_OUTPUTTYPE_PULSEAUDIO },
{ "Pulse", FMOD_OUTPUTTYPE_PULSEAUDIO },
#endif
#if !FMOD_STUDIO
{ "SDL", 666 },
#endif
// Mac
{ "Core Audio", FMOD_OUTPUTTYPE_COREAUDIO },
@ -207,7 +224,7 @@ static const FEnumList SpeakerModeNames[] =
{ "Surround", FMOD_SPEAKERMODE_SURROUND },
{ "5.1", FMOD_SPEAKERMODE_5POINT1 },
{ "7.1", FMOD_SPEAKERMODE_7POINT1 },
#if FMOD_VERSION < 0x44000
#if !FMOD_STUDIO && FMOD_VERSION < 0x44000
{ "Prologic", FMOD_SPEAKERMODE_PROLOGIC },
#endif
{ "1", FMOD_SPEAKERMODE_MONO },
@ -222,7 +239,7 @@ static const FEnumList ResamplerNames[] =
{ "NoInterp", FMOD_DSP_RESAMPLER_NOINTERP },
{ "Linear", FMOD_DSP_RESAMPLER_LINEAR },
// [BL] 64-bit version of FMOD Ex 4.26 crashes with these resamplers.
#if !(defined(_M_X64) || defined(__amd64__)) || !(FMOD_VERSION >= 0x42600 && FMOD_VERSION <= 0x426FF)
#if FMOD_STUDIO || !(defined(_M_X64) || defined(__amd64__)) || !(FMOD_VERSION >= 0x42600 && FMOD_VERSION <= 0x426FF)
{ "Cubic", FMOD_DSP_RESAMPLER_CUBIC },
{ "Spline", FMOD_DSP_RESAMPLER_SPLINE },
#endif
@ -237,11 +254,13 @@ static const FEnumList SoundFormatNames[] =
{ "PCM-24", FMOD_SOUND_FORMAT_PCM24 },
{ "PCM-32", FMOD_SOUND_FORMAT_PCM32 },
{ "PCM-Float", FMOD_SOUND_FORMAT_PCMFLOAT },
#if FMOD_STUDIO && FMOD_VERSION < 0x10700
{ "GCADPCM", FMOD_SOUND_FORMAT_GCADPCM },
{ "IMAADPCM", FMOD_SOUND_FORMAT_IMAADPCM },
{ "VAG", FMOD_SOUND_FORMAT_VAG },
{ "XMA", FMOD_SOUND_FORMAT_XMA },
{ "MPEG", FMOD_SOUND_FORMAT_MPEG },
#endif
{ NULL, 0 }
};
@ -356,10 +375,13 @@ public:
Stream = stream;
// As this interface is for music, make it super-high priority.
#if FMOD_STUDIO
if (FMOD_OK == stream->getDefaults(&frequency, NULL))
stream->setDefaults(frequency, 1);
#else
if (FMOD_OK == stream->getDefaults(&frequency, NULL, NULL, NULL))
{
stream->setDefaults(frequency, 1, 0, 0);
}
#endif
}
bool Play(bool looping, float volume)
@ -371,21 +393,33 @@ public:
looping = false;
}
Stream->setMode((looping ? FMOD_LOOP_NORMAL : FMOD_LOOP_OFF) | FMOD_SOFTWARE | FMOD_2D);
#if FMOD_STUDIO
result = Owner->Sys->playSound(Stream,0, true, &Channel);
#else
result = Owner->Sys->playSound(FMOD_CHANNEL_FREE, Stream, true, &Channel);
#endif
if (result != FMOD_OK)
{
return false;
}
Channel->setChannelGroup(Owner->MusicGroup);
#if FMOD_STUDIO
Channel->setMixLevelsOutput(1, 1, 1, 1, 1, 1, 1, 1);
#else
Channel->setSpeakerMix(1, 1, 1, 1, 1, 1, 1, 1);
#endif
Channel->setVolume(volume);
// Ensure reverb is disabled.
#if FMOD_STUDIO
Channel->setReverbProperties(0,0.f);
#else
FMOD_REVERB_CHANNELPROPERTIES reverb = { 0, };
if (FMOD_OK == Channel->getReverbProperties(&reverb))
{
reverb.Room = -10000;
Channel->setReverbProperties(&reverb);
}
#endif
Channel->setPaused(false);
Ended = false;
JustStarted = true;
@ -429,7 +463,7 @@ public:
bool is;
FMOD_OPENSTATE openstate = FMOD_OPENSTATE_MAX;
bool starving;
#if FMOD_VERSION >= 0x43400
#if FMOD_STUDIO || FMOD_VERSION >= 0x43400
bool diskbusy;
#endif
@ -437,7 +471,7 @@ public:
{
return true;
}
#if FMOD_VERSION < 0x43400
#if !FMOD_STUDIO && FMOD_VERSION < 0x43400
if (FMOD_OK != Stream->getOpenState(&openstate, NULL, &starving))
#else
if (FMOD_OK != Stream->getOpenState(&openstate, NULL, &starving, &diskbusy))
@ -526,7 +560,7 @@ public:
unsigned int percentbuffered;
unsigned int position;
bool starving;
#if FMOD_VERSION >= 0x43400
#if FMOD_STUDIO || FMOD_VERSION >= 0x43400
bool diskbusy;
#endif
float volume;
@ -534,7 +568,7 @@ public:
bool paused;
bool isplaying;
#if FMOD_VERSION < 0x43400
#if !FMOD_STUDIO && FMOD_VERSION < 0x43400
if (FMOD_OK == Stream->getOpenState(&openstate, &percentbuffered, &starving))
#else
if (FMOD_OK == Stream->getOpenState(&openstate, &percentbuffered, &starving, &diskbusy))
@ -710,7 +744,9 @@ bool FMODSoundRenderer::Init()
}
const char *wrongver = NULL;
#if FMOD_VERSION >= 0x43600
#if FMOD_STUDIO
if (version < (FMOD_VERSION & 0xFFFF00))
#elif FMOD_VERSION >= 0x43600
if (version < 0x43600)
#else
if (version < 0x42000)
@ -718,7 +754,7 @@ bool FMODSoundRenderer::Init()
{
wrongver = "an old";
}
#if FMOD_VERSION < 0x42700
#if !FMOD_STUDIO && FMOD_VERSION < 0x42700
else if ((version & 0xFFFF00) > 0x42600)
#else
else if ((version & 0xFFFF00) > (FMOD_VERSION & 0xFFFF00))
@ -744,7 +780,7 @@ bool FMODSoundRenderer::Init()
Printf("Loaded FMOD version %x.%02x.%02x\n", version >> 16, (version >> 8) & 255, version & 255);
ShowedBanner = true;
}
#ifdef _WIN32
#if defined(_WIN32) && !FMOD_STUDIO
if (OSPlatform == os_WinNT4)
{
// The following was true as of FMOD 3. I don't know if it still
@ -781,7 +817,7 @@ bool FMODSoundRenderer::Init()
}
#endif
#if !defined _WIN32 && !defined __APPLE__
#if !defined _WIN32 && !defined __APPLE__ && !FMOD_STUDIO
// Try to load SDL output plugin
result = Sys->setPluginPath(progdir); // Should we really look for it in the program directory?
result = Sys->loadPlugin("liboutput_sdl.so", &OutputPlugin);
@ -812,7 +848,7 @@ bool FMODSoundRenderer::Init()
}
result = Sys->getNumDrivers(&driver);
#ifdef __unix__
#if defined(__unix__) && !FMOD_STUDIO
if (result == FMOD_OK)
{
// On Linux, FMOD defaults to OSS. If OSS is not present, it doesn't
@ -852,7 +888,11 @@ bool FMODSoundRenderer::Init()
result = Sys->setDriver(driver);
}
result = Sys->getDriver(&driver);
#if FMOD_VERSION >= 0x43600
#if FMOD_STUDIO
// We were built with an FMOD Studio that only returns the control panel frequency
result = Sys->getDriverInfo(driver, nullptr, 0, nullptr, &Driver_MinFrequency, &speakermode, nullptr);
Driver_MaxFrequency = Driver_MinFrequency;
#elif FMOD_VERSION >= 0x43600
// We were built with an FMOD that only returns the control panel frequency
result = Sys->getDriverCaps(driver, &Driver_Caps, &Driver_MinFrequency, &speakermode);
Driver_MaxFrequency = Driver_MinFrequency;
@ -865,7 +905,9 @@ bool FMODSoundRenderer::Init()
Printf(TEXTCOLOR_BLUE"Could not ascertain driver capabilities. Some things may be weird. (Error %d)\n", result);
// Fill in some default to pretend it worked. (But as long as we specify a valid driver,
// can this call actually fail?)
#if !FMOD_STUDIO
Driver_Caps = 0;
#endif
Driver_MinFrequency = 4000;
Driver_MaxFrequency = 48000;
speakermode = FMOD_SPEAKERMODE_STEREO;
@ -877,11 +919,13 @@ bool FMODSoundRenderer::Init()
{
speakermode = FMOD_SPEAKERMODE(eval);
}
#if !FMOD_STUDIO
result = Sys->setSpeakerMode(speakermode);
if (result != FMOD_OK)
{
Printf(TEXTCOLOR_BLUE"Could not set speaker mode to '%s'. (Error %d)\n", *snd_speakermode, result);
}
#endif
// Set software format
eval = Enum_NumForName(SoundFormatNames, snd_output_format);
@ -902,7 +946,11 @@ bool FMODSoundRenderer::Init()
samplerate = snd_samplerate;
if (samplerate == 0 || snd_samplerate == 0)
{ // Creative's ASIO drivers report the only supported frequency as 0!
#if FMOD_STUDIO
if (FMOD_OK != Sys->getSoftwareFormat(&samplerate, NULL, NULL))
#else
if (FMOD_OK != Sys->getSoftwareFormat(&samplerate, NULL, NULL, NULL, NULL, NULL))
#endif
{
samplerate = 48000;
}
@ -911,12 +959,26 @@ bool FMODSoundRenderer::Init()
{
Printf(TEXTCOLOR_BLUE"Sample rate %d is unsupported. Trying %d.\n", *snd_samplerate, samplerate);
}
#if FMOD_STUDIO
result = Sys->setSoftwareFormat(samplerate, speakermode, 0);
#else
result = Sys->setSoftwareFormat(samplerate, format, 0, 0, resampler);
#endif
if (result != FMOD_OK)
{
Printf(TEXTCOLOR_BLUE"Could not set mixing format. Defaults will be used. (Error %d)\n", result);
}
#if FMOD_STUDIO
FMOD_ADVANCEDSETTINGS advSettings = {};
advSettings.resamplerMethod = resampler;
result = Sys->setAdvancedSettings(&advSettings);
if (result != FMOD_OK)
{
Printf(TEXTCOLOR_BLUE"Could not set resampler method. Defaults will be used. (Error %d)\n", result);
}
#endif
// Set software channels according to snd_channels
result = Sys->setSoftwareChannels(snd_channels + NUM_EXTRA_SOFTWARE_CHANNELS);
if (result != FMOD_OK)
@ -924,6 +986,7 @@ bool FMODSoundRenderer::Init()
Printf(TEXTCOLOR_BLUE"Failed to set the preferred number of channels. (Error %d)\n", result);
}
#if !FMOD_STUDIO
if (Driver_Caps & FMOD_CAPS_HARDWARE_EMULATED)
{ // The user has the 'Acceleration' slider set to off!
// This is really bad for latency!
@ -931,7 +994,9 @@ bool FMODSoundRenderer::Init()
Printf (TEXTCOLOR_BLUE"Please turn it back on if you want decent sound.\n");
result = Sys->setDSPBufferSize(1024, 10); // At 48khz, the latency between issuing an fmod command and hearing it will now be about 213ms.
}
else if (snd_buffersize != 0 || snd_buffercount != 0)
else
#endif
if (snd_buffersize != 0 || snd_buffercount != 0)
{
int buffersize = snd_buffersize ? snd_buffersize : 1024;
int buffercount = snd_buffercount ? snd_buffercount : 4;
@ -951,7 +1016,9 @@ bool FMODSoundRenderer::Init()
if (snd_hrtf)
{
// These flags are the same thing, just with different names.
#ifdef FMOD_INIT_SOFTWARE_HRTF
#ifdef FMOD_INIT_CHANNEL_LOWPASS
initflags |= FMOD_INIT_CHANNEL_LOWPASS;
#elif defined(FMOD_INIT_SOFTWARE_HRTF)
initflags |= FMOD_INIT_SOFTWARE_HRTF;
#else
initflags |= FMOD_INIT_HRTF_LOWPASS;
@ -959,7 +1026,11 @@ bool FMODSoundRenderer::Init()
}
if (snd_profile)
{
#ifdef FMOD_INIT_PROFILE_ENABLE
initflags |= FMOD_INIT_PROFILE_ENABLE;
#else
initflags |= FMOD_INIT_ENABLE_PROFILE;
#endif
}
for (;;)
{
@ -970,14 +1041,23 @@ bool FMODSoundRenderer::Init()
// 1. The speaker mode selected isn't supported by this soundcard. Force it to stereo.
// 2. The output format is unsupported. Force it to 16-bit PCM.
// 3. ???
#if FMOD_STUDIO
result = Sys->getSoftwareFormat(nullptr, &speakermode, nullptr);
#else
result = Sys->getSpeakerMode(&speakermode);
#endif
if (result == FMOD_OK &&
speakermode != FMOD_SPEAKERMODE_STEREO &&
#if FMOD_STUDIO
FMOD_OK == Sys->setSoftwareFormat(samplerate, FMOD_SPEAKERMODE_STEREO, 0))
#else
FMOD_OK == Sys->setSpeakerMode(FMOD_SPEAKERMODE_STEREO))
#endif
{
Printf(TEXTCOLOR_RED" Buffer creation failed. Retrying with stereo output.\n");
continue;
}
#if !FMOD_STUDIO
result = Sys->getSoftwareFormat(&samplerate, &format, NULL, NULL, &resampler, NULL);
if (result == FMOD_OK &&
format != FMOD_SOUND_FORMAT_PCM16 &&
@ -986,11 +1066,21 @@ bool FMODSoundRenderer::Init()
Printf(TEXTCOLOR_RED" Buffer creation failed. Retrying with PCM-16 output.\n");
continue;
}
#endif
}
else if (result == FMOD_ERR_NET_SOCKET_ERROR && (initflags & FMOD_INIT_ENABLE_PROFILE))
else if (result == FMOD_ERR_NET_SOCKET_ERROR &&
#ifdef FMOD_INIT_PROFILE_ENABLE
(initflags & FMOD_INIT_PROFILE_ENABLE))
#else
(initflags & FMOD_INIT_ENABLE_PROFILE))
#endif
{
Printf(TEXTCOLOR_RED" Could not create socket. Retrying without profiling.\n");
#ifdef FMOD_INIT_PROFILE_ENABLE
initflags &= ~FMOD_INIT_PROFILE_ENABLE;
#else
initflags &= ~FMOD_INIT_ENABLE_PROFILE;
#endif
continue;
}
#ifdef _WIN32
@ -1066,7 +1156,11 @@ bool FMODSoundRenderer::Init()
{
FMOD::DSP *sfx_head, *pausable_head;
#if FMOD_STUDIO
result = SfxGroup->getDSP(FMOD_CHANNELCONTROL_DSP_HEAD, &sfx_head);
#else
result = SfxGroup->getDSPHead(&sfx_head);
#endif
if (result == FMOD_OK)
{
result = sfx_head->getInput(0, &pausable_head, &SfxConnection);
@ -1103,8 +1197,8 @@ bool FMODSoundRenderer::Init()
}
result = WaterLP->addInput(pausable_head, NULL);
WaterLP->setActive(false);
WaterLP->setParameter(FMOD_DSP_LOWPASS_CUTOFF, snd_waterlp);
WaterLP->setParameter(FMOD_DSP_LOWPASS_RESONANCE, 2);
WaterLP->setParameterFloat(FMOD_DSP_LOWPASS_CUTOFF, snd_waterlp);
WaterLP->setParameterFloat(FMOD_DSP_LOWPASS_RESONANCE, 2);
if (WaterReverb != NULL)
{
@ -1120,15 +1214,25 @@ bool FMODSoundRenderer::Init()
// These parameters are entirely empirical and can probably
// stand some improvement, but it sounds remarkably close
// to the old reverb unit's output.
WaterReverb->setParameter(FMOD_DSP_SFXREVERB_LFREFERENCE, 150);
WaterReverb->setParameter(FMOD_DSP_SFXREVERB_HFREFERENCE, 10000);
WaterReverb->setParameter(FMOD_DSP_SFXREVERB_ROOM, 0);
WaterReverb->setParameter(FMOD_DSP_SFXREVERB_ROOMHF, -5000);
WaterReverb->setParameter(FMOD_DSP_SFXREVERB_DRYLEVEL, 0);
WaterReverb->setParameter(FMOD_DSP_SFXREVERB_DECAYHFRATIO, 1);
WaterReverb->setParameter(FMOD_DSP_SFXREVERB_DECAYTIME, 0.25f);
WaterReverb->setParameter(FMOD_DSP_SFXREVERB_DENSITY, 100);
WaterReverb->setParameter(FMOD_DSP_SFXREVERB_DIFFUSION, 100);
#if FMOD_STUDIO
WaterReverb->setParameterFloat(FMOD_DSP_SFXREVERB_LOWSHELFFREQUENCY, 150);
#else
WaterReverb->setParameterFloat(FMOD_DSP_SFXREVERB_LFREFERENCE, 150);
#endif
WaterReverb->setParameterFloat(FMOD_DSP_SFXREVERB_HFREFERENCE, 10000);
#if !FMOD_STUDIO
WaterReverb->setParameterFloat(FMOD_DSP_SFXREVERB_ROOM, 0);
WaterReverb->setParameterFloat(FMOD_DSP_SFXREVERB_ROOMHF, -5000);
#endif
WaterReverb->setParameterFloat(FMOD_DSP_SFXREVERB_DRYLEVEL, 0);
#if FMOD_STUDIO
WaterReverb->setParameterFloat(FMOD_DSP_SFXREVERB_HFDECAYRATIO, 100);
#else
WaterReverb->setParameterFloat(FMOD_DSP_SFXREVERB_DECAYHFRATIO, 1);
#endif
WaterReverb->setParameterFloat(FMOD_DSP_SFXREVERB_DECAYTIME, 0.25f);
WaterReverb->setParameterFloat(FMOD_DSP_SFXREVERB_DENSITY, 100);
WaterReverb->setParameterFloat(FMOD_DSP_SFXREVERB_DIFFUSION, 100);
WaterReverb->setActive(false);
}
}
@ -1154,7 +1258,11 @@ bool FMODSoundRenderer::Init()
{
FMOD::DSP *master_head;
#if FMOD_STUDIO
result = master_group->getDSP(FMOD_CHANNELCONTROL_DSP_HEAD, &master_head);
#else
result = master_group->getDSPHead(&master_head);
#endif
if (result == FMOD_OK)
{
result = master_head->getOutput(0, &ChannelGroupTargetUnit, NULL);
@ -1174,7 +1282,11 @@ bool FMODSoundRenderer::Init()
}
}
#if FMOD_STUDIO
if (FMOD_OK != Sys->getSoftwareFormat(&OutputRate, NULL, NULL))
#else
if (FMOD_OK != Sys->getSoftwareFormat(&OutputRate, NULL, NULL, NULL, NULL, NULL))
#endif
{
OutputRate = 48000; // Guess, but this should never happen.
}
@ -1272,20 +1384,35 @@ void FMODSoundRenderer::PrintStatus()
{
Printf ("Output type: " TEXTCOLOR_GREEN "%s\n", Enum_NameForNum(OutputNames, output));
}
#if FMOD_STUDIO
if (FMOD_OK == Sys->getSoftwareFormat(&samplerate, &speakermode, nullptr))
{
Printf ("Speaker mode: " TEXTCOLOR_GREEN "%s\n", Enum_NameForNum(SpeakerModeNames, speakermode));
Printf (TEXTCOLOR_LIGHTBLUE "Software mixer sample rate: " TEXTCOLOR_GREEN "%d\n", samplerate);
}
#else
if (FMOD_OK == Sys->getSpeakerMode(&speakermode))
{
Printf ("Speaker mode: " TEXTCOLOR_GREEN "%s\n", Enum_NameForNum(SpeakerModeNames, speakermode));
}
#endif
if (FMOD_OK == Sys->getDriver(&driver))
{
char name[256];
#if FMOD_STUDIO
if (FMOD_OK != Sys->getDriverInfo(driver, name, sizeof(name), nullptr, nullptr, nullptr, nullptr))
#else
if (FMOD_OK != Sys->getDriverInfo(driver, name, sizeof(name), NULL))
#endif
{
strcpy(name, "Unknown");
}
Printf ("Driver: " TEXTCOLOR_GREEN "%d" TEXTCOLOR_NORMAL " (" TEXTCOLOR_ORANGE "%s" TEXTCOLOR_NORMAL ")\n", driver, name);
#if !FMOD_STUDIO
DumpDriverCaps(Driver_Caps, Driver_MinFrequency, Driver_MaxFrequency);
#endif
}
#if !FMOD_STUDIO
if (FMOD_OK == Sys->getSoftwareFormat(&samplerate, &format, &numoutputchannels, NULL, &resampler, NULL))
{
Printf (TEXTCOLOR_LIGHTBLUE "Software mixer sample rate: " TEXTCOLOR_GREEN "%d\n", samplerate);
@ -1293,6 +1420,7 @@ void FMODSoundRenderer::PrintStatus()
Printf (TEXTCOLOR_LIGHTBLUE "Software mixer channels: " TEXTCOLOR_GREEN "%d\n", numoutputchannels);
Printf (TEXTCOLOR_LIGHTBLUE "Software mixer resampler: " TEXTCOLOR_GREEN "%s\n", Enum_NameForNum(ResamplerNames, resampler));
}
#endif
if (FMOD_OK == Sys->getDSPBufferSize(&bufferlength, &numbuffers))
{
Printf (TEXTCOLOR_LIGHTBLUE "DSP buffers: " TEXTCOLOR_GREEN "%u samples x %d\n", bufferlength, numbuffers);
@ -1305,6 +1433,7 @@ void FMODSoundRenderer::PrintStatus()
//
//==========================================================================
#if !FMOD_STUDIO
void FMODSoundRenderer::DumpDriverCaps(FMOD_CAPS caps, int minfrequency, int maxfrequency)
{
Printf (TEXTCOLOR_OLIVE " Min. frequency: " TEXTCOLOR_GREEN "%d\n", minfrequency);
@ -1325,6 +1454,7 @@ void FMODSoundRenderer::DumpDriverCaps(FMOD_CAPS caps, int minfrequency, int max
}
if (caps & FMOD_CAPS_REVERB_LIMITED) Printf(TEXTCOLOR_OLIVE " Limited reverb\n");
}
#endif
//==========================================================================
//
@ -1342,7 +1472,11 @@ void FMODSoundRenderer::PrintDriversList()
{
for (i = 0; i < numdrivers; ++i)
{
#if FMOD_STUDIO
if (FMOD_OK == Sys->getDriverInfo(i, name, sizeof(name), nullptr, nullptr, nullptr, nullptr))
#else
if (FMOD_OK == Sys->getDriverInfo(i, name, sizeof(name), NULL))
#endif
{
Printf("%d. %s\n", i, name);
}
@ -1365,7 +1499,7 @@ FString FMODSoundRenderer::GatherStats()
channels = 0;
total = update = geometry = stream = dsp = 0;
Sys->getChannelsPlaying(&channels);
#if FMOD_VERSION >= 0x42501
#if FMOD_STUDIO || FMOD_VERSION >= 0x42501
// We were built with an FMOD with the geometry parameter.
if (ActiveFMODVersion >= 0x42501)
{ // And we are running with an FMOD that includes it.
@ -1612,7 +1746,11 @@ static void SetCustomLoopPts(FMOD::Sound *sound)
//
//==========================================================================
#if FMOD_STUDIO
static FMOD_RESULT F_CALLBACK open_reader_callback(const char *name, unsigned int *filesize, void **handle, void *userdata)
#else
static FMOD_RESULT F_CALLBACK open_reader_callback(const char *name, int unicode, unsigned int *filesize, void **handle, void **userdata)
#endif
{
FileReader *reader = NULL;
if(sscanf(name, "_FileReader_%p", &reader) != 1)
@ -1623,7 +1761,9 @@ static FMOD_RESULT F_CALLBACK open_reader_callback(const char *name, int unicode
*filesize = reader->GetLength();
*handle = reader;
#if !FMOD_STUDIO
*userdata = reader;
#endif
return FMOD_OK;
}
@ -1667,10 +1807,17 @@ SoundStream *FMODSoundRenderer::OpenStream(FileReader *reader, int flags)
FString name;
InitCreateSoundExInfo(&exinfo);
#if FMOD_STUDIO
exinfo.fileuseropen = open_reader_callback;
exinfo.fileuserclose = close_reader_callback;
exinfo.fileuserread = read_reader_callback;
exinfo.fileuserseek = seek_reader_callback;
#else
exinfo.useropen = open_reader_callback;
exinfo.userclose = close_reader_callback;
exinfo.userread = read_reader_callback;
exinfo.userseek = seek_reader_callback;
#endif
mode = FMOD_SOFTWARE | FMOD_2D | FMOD_CREATESTREAM;
if(flags & SoundStream::Loop)
@ -1775,7 +1922,11 @@ FISoundChannel *FMODSoundRenderer::StartSound(SoundHandle sfx, float vol, int pi
FMOD::Channel *chan;
float freq;
#if FMOD_STUDIO
if (FMOD_OK == ((FMOD::Sound *)sfx.data)->getDefaults(&freq, NULL))
#else
if (FMOD_OK == ((FMOD::Sound *)sfx.data)->getDefaults(&freq, NULL, NULL, NULL))
#endif
{
freq = PITCH(freq, pitch);
}
@ -1785,7 +1936,11 @@ FISoundChannel *FMODSoundRenderer::StartSound(SoundHandle sfx, float vol, int pi
}
GRolloff = NULL; // Do 2D sounds need rolloff?
#if FMOD_STUDIO
result = Sys->playSound((FMOD::Sound *)sfx.data, (flags & SNDF_NOPAUSE) ? SfxGroup : PausableSfx, true, &chan);
#else
result = Sys->playSound(FMOD_CHANNEL_FREE, (FMOD::Sound *)sfx.data, true, &chan);
#endif
if (FMOD_OK == result)
{
result = chan->getMode(&mode);
@ -1809,7 +1964,9 @@ FISoundChannel *FMODSoundRenderer::StartSound(SoundHandle sfx, float vol, int pi
mode |= FMOD_LOOP_OFF;
}
chan->setMode(mode);
#if !FMOD_STUDIO
chan->setChannelGroup((flags & SNDF_NOPAUSE) ? SfxGroup : PausableSfx);
#endif
if (freq != 0)
{
chan->setFrequency(freq);
@ -1822,18 +1979,22 @@ FISoundChannel *FMODSoundRenderer::StartSound(SoundHandle sfx, float vol, int pi
}
if (flags & SNDF_NOREVERB)
{
#if FMOD_STUDIO
chan->setReverbProperties(0,0.f);
#else
FMOD_REVERB_CHANNELPROPERTIES reverb = { 0, };
if (FMOD_OK == chan->getReverbProperties(&reverb))
{
reverb.Room = -10000;
chan->setReverbProperties(&reverb);
}
#endif
}
chan->setPaused(false);
return CommonChannelSetup(chan, reuse_chan);
}
//DPrintf ("Sound %s failed to play: %d\n", sfx->name.GetChars(), result);
//DPrintf (DMSG_WARNING, "Sound %s failed to play: %d\n", sfx->name.GetChars(), result);
return NULL;
}
@ -1852,15 +2013,26 @@ FISoundChannel *FMODSoundRenderer::StartSound3D(SoundHandle sfx, SoundListener *
FMOD_MODE mode;
FMOD::Channel *chan;
float freq;
float def_freq, def_vol, def_pan;
float def_freq;
#if !FMOD_STUDIO
float def_vol, def_pan;
#endif
int numchans;
int def_priority;
#if FMOD_STUDIO
if (FMOD_OK == ((FMOD::Sound *)sfx.data)->getDefaults(&def_freq, &def_priority))
#else
if (FMOD_OK == ((FMOD::Sound *)sfx.data)->getDefaults(&def_freq, &def_vol, &def_pan, &def_priority))
#endif
{
freq = PITCH(def_freq, pitch);
// Change the sound's default priority before playing it.
#if FMOD_STUDIO
((FMOD::Sound *)sfx.data)->setDefaults(def_freq, clamp(def_priority - priority, 1, 256));
#else
((FMOD::Sound *)sfx.data)->setDefaults(def_freq, def_vol, def_pan, clamp(def_priority - priority, 1, 256));
#endif
}
else
{
@ -1876,12 +2048,20 @@ FISoundChannel *FMODSoundRenderer::StartSound3D(SoundHandle sfx, SoundListener *
// as long as the parameters are set properly. It will first try to kick out sounds
// with the same priority level but has no problem with kicking out sounds at
// higher priority levels if it needs to.
#if FMOD_STUDIO
result = Sys->playSound((FMOD::Sound *)sfx.data, (flags & SNDF_NOPAUSE) ? SfxGroup : PausableSfx, true, &chan);
#else
result = Sys->playSound(FMOD_CHANNEL_FREE, (FMOD::Sound *)sfx.data, true, &chan);
#endif
// Then set the priority back.
if (def_priority >= 0)
{
#if FMOD_STUDIO
((FMOD::Sound *)sfx.data)->setDefaults(def_freq, def_priority);
#else
((FMOD::Sound *)sfx.data)->setDefaults(def_freq, def_vol, def_pan, def_priority);
#endif
}
if (FMOD_OK == result)
@ -1906,7 +2086,9 @@ FISoundChannel *FMODSoundRenderer::StartSound3D(SoundHandle sfx, SoundListener *
}
mode = SetChanHeadSettings(listener, chan, pos, !!(flags & SNDF_AREA), mode);
chan->setMode(mode);
#if !FMOD_STUDIO
chan->setChannelGroup((flags & SNDF_NOPAUSE) ? SfxGroup : PausableSfx);
#endif
if (mode & FMOD_3D)
{
@ -1941,12 +2123,16 @@ FISoundChannel *FMODSoundRenderer::StartSound3D(SoundHandle sfx, SoundListener *
}
if (flags & SNDF_NOREVERB)
{
#if FMOD_STUDIO
chan->setReverbProperties(0,0.f);
#else
FMOD_REVERB_CHANNELPROPERTIES reverb = { 0, };
if (FMOD_OK == chan->getReverbProperties(&reverb))
{
reverb.Room = -10000;
chan->setReverbProperties(&reverb);
}
#endif
}
chan->setPaused(false);
chan->getPriority(&def_priority);
@ -1956,7 +2142,7 @@ FISoundChannel *FMODSoundRenderer::StartSound3D(SoundHandle sfx, SoundListener *
}
GRolloff = NULL;
//DPrintf ("Sound %s failed to play: %d\n", sfx->name.GetChars(), result);
//DPrintf (DMSG_WARNING, "Sound %s failed to play: %d\n", sfx->name.GetChars(), result);
return 0;
}
@ -1970,7 +2156,14 @@ FISoundChannel *FMODSoundRenderer::StartSound3D(SoundHandle sfx, SoundListener *
void FMODSoundRenderer::MarkStartTime(FISoundChannel *chan)
{
#if FMOD_STUDIO
unsigned long long int dsp_time;
((FMOD::Channel *)chan->SysChannel)->getDSPClock(&dsp_time,NULL);
chan->StartTime.Lo = dsp_time & 0xFFFFFFFF;
chan->StartTime.Hi = dsp_time >> 32;
#else
Sys->getDSPClock(&chan->StartTime.Hi, &chan->StartTime.Lo);
#endif
}
//==========================================================================
@ -1990,7 +2183,14 @@ bool FMODSoundRenderer::HandleChannelDelay(FMOD::Channel *chan, FISoundChannel *
{ // Sound is being restarted, so seek it to the position
// it would be in now if it had never been evicted.
QWORD_UNION nowtime;
#if FMOD_STUDIO
unsigned long long int delay;
chan->getDelay(&delay,NULL,NULL);
nowtime.Lo = delay & 0xFFFFFFFF;
nowtime.Hi = delay >> 32;
#else
chan->getDelay(FMOD_DELAYTYPE_DSPCLOCK_START, &nowtime.Hi, &nowtime.Lo);
#endif
// If abstime is set, the sound is being restored, and
// the channel's start time is actually its seek position.
@ -2078,14 +2278,24 @@ FMOD_MODE FMODSoundRenderer::SetChanHeadSettings(SoundListener *listener, FMOD::
{ // Beyond interp_range: Normal 3D panning.
level = 1;
}
#if FMOD_STUDIO
if (chan->get3DLevel(&old_level) == FMOD_OK && old_level != level)
{ // Only set it if it's different.
chan->set3DLevel(level);
#else
if (chan->get3DPanLevel(&old_level) == FMOD_OK && old_level != level)
{ // Only set it if it's different.
chan->set3DPanLevel(level);
#endif
if (level < 1)
{ // Let the noise come from all speakers, not just the front ones.
// A centered 3D sound does not play at full volume, so neither should the 2D-panned one.
// This is sqrt(0.5), which is the result for a centered equal power panning.
#if FMOD_STUDIO
chan->setMixLevelsOutput(0.70711f,0.70711f,0.70711f,0.70711f,0.70711f,0.70711f,0.70711f,0.70711f);
#else
chan->setSpeakerMix(0.70711f,0.70711f,0.70711f,0.70711f,0.70711f,0.70711f,0.70711f,0.70711f);
#endif
}
}
return oldmode;
@ -2119,7 +2329,14 @@ FISoundChannel *FMODSoundRenderer::CommonChannelSetup(FMOD::Channel *chan, FISou
else
{
schan = S_GetChannel(chan);
#if FMOD_STUDIO
unsigned long long int time;
chan->getDelay(&time,NULL,NULL);
schan->StartTime.Lo = time & 0xFFFFFFFF;
schan->StartTime.Hi = time >> 32;
#else
chan->getDelay(FMOD_DELAYTYPE_DSPCLOCK_START, &schan->StartTime.Hi, &schan->StartTime.Lo);
#endif
}
chan->setUserData(schan);
chan->setCallback(ChannelCallback);
@ -2349,7 +2566,7 @@ void FMODSoundRenderer::UpdateListener(SoundListener *listener)
}
if (env != PrevEnvironment || env->Modified)
{
DPrintf ("Reverb Environment %s\n", env->Name);
DPrintf (DMSG_NOTIFY, "Reverb Environment %s\n", env->Name);
const_cast<ReverbContainer*>(env)->Modified = false;
SetSystemReverbProperties(&env->Properties);
PrevEnvironment = env;
@ -2369,7 +2586,7 @@ void FMODSoundRenderer::UpdateListener(SoundListener *listener)
if (LastWaterLP != snd_waterlp)
{
LastWaterLP = snd_waterlp;
WaterLP->setParameter(FMOD_DSP_LOWPASS_CUTOFF, snd_waterlp);
WaterLP->setParameterFloat(FMOD_DSP_LOWPASS_CUTOFF, snd_waterlp);
}
WaterLP->setActive(true);
if (WaterReverb != NULL && snd_waterreverb)
@ -2481,7 +2698,14 @@ void FMODSoundRenderer::Sync(bool sync)
if (sync)
{
Sys->lockDSP();
#if FMOD_STUDIO
unsigned long long int clock;
SfxGroup->getDSPClock(&clock,NULL);
DSPClock.Lo = clock & 0xFFFFFFFF;
DSPClock.Hi = clock >> 32;
#else
Sys->getDSPClock(&DSPClock.Hi, &DSPClock.Lo);
#endif
}
else
{
@ -2499,7 +2723,14 @@ void FMODSoundRenderer::UpdateSounds()
{
// Any sounds played between now and the next call to this function
// will start exactly one tic from now.
#if FMOD_STUDIO
unsigned long long int clock;
SfxGroup->getDSPClock(&clock,NULL);
DSPClock.Lo = clock & 0xFFFFFFFF;
DSPClock.Hi = clock >> 32;
#else
Sys->getDSPClock(&DSPClock.Hi, &DSPClock.Lo);
#endif
DSPClock.AsOne += OutputRate / TICRATE;
Sys->update();
}
@ -2560,7 +2791,7 @@ std::pair<SoundHandle,bool> FMODSoundRenderer::LoadSoundRaw(BYTE *sfxdata, int l
result = Sys->createSound((char *)sfxdata, samplemode, &exinfo, &sample);
if (result != FMOD_OK)
{
DPrintf("Failed to allocate sample: Error %d\n", result);
DPrintf(DMSG_ERROR, "Failed to allocate sample: Error %d\n", result);
return std::make_pair(retval, true);
}
@ -2598,7 +2829,7 @@ std::pair<SoundHandle,bool> FMODSoundRenderer::LoadSound(BYTE *sfxdata, int leng
result = Sys->createSound((char *)sfxdata, samplemode, &exinfo, &sample);
if (result != FMOD_OK)
{
DPrintf("Failed to allocate sample: Error %d\n", result);
DPrintf(DMSG_ERROR, "Failed to allocate sample: Error %d\n", result);
return std::make_pair(retval, true);
}
SetCustomLoopPts(sample);
@ -2673,18 +2904,34 @@ unsigned int FMODSoundRenderer::GetSampleLength(SoundHandle sfx)
//==========================================================================
FMOD_RESULT F_CALLBACK FMODSoundRenderer::ChannelCallback
#if FMOD_STUDIO
(FMOD_CHANNELCONTROL *channel, FMOD_CHANNELCONTROL_TYPE controltype, FMOD_CHANNELCONTROL_CALLBACK_TYPE type, void *data1, void *data2)
#else
(FMOD_CHANNEL *channel, FMOD_CHANNEL_CALLBACKTYPE type, void *data1, void *data2)
#endif
{
#if FMOD_STUDIO
FMOD::ChannelControl *chan = (FMOD::ChannelControl *)channel;
#else
FMOD::Channel *chan = (FMOD::Channel *)channel;
#endif
FISoundChannel *schan;
if (chan->getUserData((void **)&schan) == FMOD_OK && schan != NULL)
{
#if FMOD_STUDIO
if (type == FMOD_CHANNELCONTROL_CALLBACK_END)
#else
if (type == FMOD_CHANNEL_CALLBACKTYPE_END)
#endif
{
S_ChannelEnded(schan);
}
#if FMOD_STUDIO
else if (type == FMOD_CHANNELCONTROL_CALLBACK_VIRTUALVOICE)
#else
else if (type == FMOD_CHANNEL_CALLBACKTYPE_VIRTUALVOICE)
#endif
{
S_ChannelVirtualChanged(schan, data1 != 0);
}
@ -2701,9 +2948,17 @@ FMOD_RESULT F_CALLBACK FMODSoundRenderer::ChannelCallback
//
//==========================================================================
#if FMOD_STUDIO
float F_CALLBACK FMODSoundRenderer::RolloffCallback(FMOD_CHANNELCONTROL *channel, float distance)
#else
float F_CALLBACK FMODSoundRenderer::RolloffCallback(FMOD_CHANNEL *channel, float distance)
#endif
{
#if FMOD_STUDIO
FMOD::ChannelControl *chan = (FMOD::ChannelControl *)channel;
#else
FMOD::Channel *chan = (FMOD::Channel *)channel;
#endif
FISoundChannel *schan;
if (GRolloff != NULL)
@ -2742,7 +2997,11 @@ void FMODSoundRenderer::DrawWaveDebug(int mode)
const spk *labels;
int labelcount;
#if FMOD_STUDIO
if (FMOD_OK != Sys->getSoftwareFormat(NULL, NULL, &numoutchans))
#else
if (FMOD_OK != Sys->getSoftwareFormat(NULL, NULL, &numoutchans, NULL, NULL, NULL))
#endif
{
return;
}
@ -2866,12 +3125,14 @@ int FMODSoundRenderer::DrawChannelGroupWaveData(FMOD::ChannelGroup *group, float
int drawn = 0;
int x = 16;
#if !FMOD_STUDIO
while (FMOD_OK == group->getWaveData(wavearray, width, drawn))
{
drawn++;
DrawWave(wavearray, x, y, width, height);
x += (width + 16) << int(skip);
}
#endif
if (drawn)
{
y += height + 16;
@ -2893,12 +3154,14 @@ int FMODSoundRenderer::DrawSystemWaveData(float *wavearray, int width, int heigh
int drawn = 0;
int x = 16;
#if !FMOD_STUDIO
while (FMOD_OK == Sys->getWaveData(wavearray, width, drawn))
{
drawn++;
DrawWave(wavearray, x, y, width, height);
x += (width + 16) << int(skip);
}
#endif
if (drawn)
{
y += height + 16;
@ -2970,12 +3233,15 @@ int FMODSoundRenderer::DrawChannelGroupSpectrum(FMOD::ChannelGroup *group, float
{
x += width + 16;
}
// TODO: FMOD Studio: Grab from DSP
#if !FMOD_STUDIO
while (FMOD_OK == group->getSpectrum(spectrumarray, SPECTRUM_SIZE, drawn, FMOD_DSP_FFT_WINDOW_TRIANGLE))
{
drawn++;
DrawSpectrum(spectrumarray, x, y, width, height);
x += (width + 16) << int(skip);
}
#endif
if (drawn)
{
y += height + 16;
@ -3001,12 +3267,15 @@ int FMODSoundRenderer::DrawSystemSpectrum(float *spectrumarray, int width, int h
{
x += width + 16;
}
// TODO: FMOD Studio: Grab from DSP
#if !FMOD_STUDIO
while (FMOD_OK == Sys->getSpectrum(spectrumarray, SPECTRUM_SIZE, drawn, FMOD_DSP_FFT_WINDOW_TRIANGLE))
{
drawn++;
DrawSpectrum(spectrumarray, x, y, width, height);
x += (width + 16) << int(skip);
}
#endif
if (drawn)
{
y += height + 16;
@ -3121,7 +3390,7 @@ short *FMODSoundRenderer::DecodeSample(int outlen, const void *coded, int sizeby
void FMODSoundRenderer::InitCreateSoundExInfo(FMOD_CREATESOUNDEXINFO *exinfo) const
{
memset(exinfo, 0, sizeof(*exinfo));
#if FMOD_VERSION >= 0x42600 && FMOD_VERSION < 0x43800
#if !FMOD_STUDIO && FMOD_VERSION >= 0x42600 && FMOD_VERSION < 0x43800
if (ActiveFMODVersion < 0x42600)
{
// This parameter was added for 4.26.00, and trying to pass it to older
@ -3145,13 +3414,32 @@ void FMODSoundRenderer::InitCreateSoundExInfo(FMOD_CREATESOUNDEXINFO *exinfo) co
FMOD_RESULT FMODSoundRenderer::SetSystemReverbProperties(const REVERB_PROPERTIES *props)
{
#if FMOD_VERSION < 0x43600
#if !FMOD_STUDIO && FMOD_VERSION < 0x43600
return Sys->setReverbProperties((const FMOD_REVERB_PROPERTIES *)props);
#else
// The reverb format changed when hardware mixing support was dropped, because
// all EAX-only properties were removed from the structure.
FMOD_REVERB_PROPERTIES fr;
#if FMOD_STUDIO
const float LateEarlyRatio = powf(10.f, (props->Reverb - props->Reflections)/2000.f);
const float EarlyAndLatePower = powf(10.f, props->Reflections/1000.f) + powf(10, props->Reverb/1000.f);
const float HFGain = powf(10.f, props->RoomHF/2000.f);
fr.DecayTime = props->DecayTime*1000.f;
fr.EarlyDelay = props->ReflectionsDelay*1000.f;
fr.LateDelay = props->ReverbDelay*1000.f;
fr.HFReference = props->HFReference;
fr.HFDecayRatio = clamp<float>(props->DecayHFRatio*100.f, 0.f, 100.f);
fr.Diffusion = props->Diffusion;
fr.Density = props->Density;
fr.LowShelfFrequency = props->DecayLFRatio;
fr.LowShelfGain = clamp<float>(props->RoomLF/100.f, -48.f, 12.f);
fr.HighCut = clamp<float>(props->RoomLF < 0 ? props->HFReference/sqrtf((1.f-HFGain)/HFGain) : 20000.f, 20.f, 20000.f);
fr.EarlyLateMix = props->Reflections > -10000.f ? LateEarlyRatio/(LateEarlyRatio + 1)*100.f : 100.f;
fr.WetLevel = clamp<float>(10*log10f(EarlyAndLatePower)+props->Room/100.f, -80.f, 20.f);
return Sys->setReverbProperties(0, &fr);
#else
fr.Instance = props->Instance;
fr.Environment = props->Environment;
fr.EnvDiffusion = props->EnvDiffusion;
@ -3175,6 +3463,7 @@ FMOD_RESULT FMODSoundRenderer::SetSystemReverbProperties(const REVERB_PROPERTIES
return Sys->setReverbProperties(&fr);
#endif
#endif
}
#endif // NO_FMOD

View file

@ -76,8 +76,13 @@ private:
QWORD_UNION DSPClock;
int OutputRate;
#if FMOD_STUDIO
static FMOD_RESULT F_CALLBACK ChannelCallback(FMOD_CHANNELCONTROL *channel, FMOD_CHANNELCONTROL_TYPE controltype, FMOD_CHANNELCONTROL_CALLBACK_TYPE type, void *data1, void *data2);
static float F_CALLBACK RolloffCallback(FMOD_CHANNELCONTROL *channel, float distance);
#else
static FMOD_RESULT F_CALLBACK ChannelCallback(FMOD_CHANNEL *channel, FMOD_CHANNEL_CALLBACKTYPE type, void *data1, void *data2);
static float F_CALLBACK RolloffCallback(FMOD_CHANNEL *channel, float distance);
#endif
bool HandleChannelDelay(FMOD::Channel *chan, FISoundChannel *reuse_chan, int flags, float freq) const;
FISoundChannel *CommonChannelSetup(FMOD::Channel *chan, FISoundChannel *reuse_chan) const;
@ -89,7 +94,9 @@ private:
bool Init ();
void Shutdown ();
#if !FMOD_STUDIO
void DumpDriverCaps(FMOD_CAPS caps, int minfrequency, int maxfrequency);
#endif
int DrawChannelGroupOutput(FMOD::ChannelGroup *group, float *wavearray, int width, int height, int y, int mode);
int DrawSystemOutput(float *wavearray, int width, int height, int y, int mode);
@ -121,7 +128,9 @@ private:
// Just for snd_status display
int Driver_MinFrequency;
int Driver_MaxFrequency;
#if !FMOD_STUDIO
FMOD_CAPS Driver_Caps;
#endif
friend class FMODStreamCapsule;
};

View file

@ -417,7 +417,7 @@ short *SoundRenderer::DecodeSample(int outlen, const void *coded, int sizebytes,
decoder->getInfo(&srate, &chans, &type);
if(chans != ChannelConfig_Mono || type != SampleType_Int16)
{
DPrintf("Sample is not 16-bit mono\n");
DPrintf(DMSG_WARNING, "Sample is not 16-bit mono\n");
delete decoder;
return samples;
}
@ -553,7 +553,7 @@ std::pair<SoundHandle,bool> SoundRenderer::LoadSoundVoc(BYTE *sfxdata, int lengt
break;
default: // Unknown block type
okay = false;
DPrintf ("Unknown VOC block type %i\n", blocktype);
DPrintf (DMSG_ERROR, "Unknown VOC block type %i\n", blocktype);
break;
}
// Move to next block

View file

@ -498,12 +498,12 @@ int FluidSynthMIDIDevice::LoadPatchSets(const char *patches)
}
if (FLUID_FAILED != fluid_synth_sfload(FluidSynth, path, count == 0))
{
DPrintf("Loaded patch set %s.\n", tok);
DPrintf(DMSG_NOTIFY, "Loaded patch set %s.\n", tok);
count++;
}
else
{
DPrintf("Failed to load patch set %s.\n", tok);
DPrintf(DMSG_ERROR, "Failed to load patch set %s.\n", tok);
}
tok = strtok(NULL, delim);
}

View file

@ -376,7 +376,7 @@ bool TimidityPPMIDIDevice::LaunchTimidity ()
return false;
}
DPrintf ("cmd: \x1cG%s\n", CommandLine.GetChars());
DPrintf (DMSG_NOTIFY, "cmd: \x1cG%s\n", CommandLine.GetChars());
#ifdef _WIN32
STARTUPINFO startup = { sizeof(startup), };

View file

@ -143,7 +143,7 @@ XMISong::XMISong (FileReader &reader, EMidiDevice type, const char *args)
memset(Songs, 0, sizeof(*Songs) * NumSongs);
FindXMIDforms(MusHeader, SongLen, Songs);
CurrSong = Songs;
DPrintf("XMI song count: %d\n", NumSongs);
DPrintf(DMSG_SPAMMY, "XMI song count: %d\n", NumSongs);
}
//==========================================================================

View file

@ -747,8 +747,8 @@ OpenALSoundRenderer::OpenALSoundRenderer()
ALCint major=0, minor=0;
alcGetIntegerv(Device, ALC_MAJOR_VERSION, 1, &major);
alcGetIntegerv(Device, ALC_MINOR_VERSION, 1, &minor);
DPrintf(" ALC Version: " TEXTCOLOR_BLUE"%d.%d\n", major, minor);
DPrintf(" ALC Extensions: " TEXTCOLOR_ORANGE"%s\n", alcGetString(Device, ALC_EXTENSIONS));
DPrintf(DMSG_SPAMMY, " ALC Version: " TEXTCOLOR_BLUE"%d.%d\n", major, minor);
DPrintf(DMSG_SPAMMY, " ALC Extensions: " TEXTCOLOR_ORANGE"%s\n", alcGetString(Device, ALC_EXTENSIONS));
TArray<ALCint> attribs;
if(*snd_samplerate > 0)
@ -778,10 +778,10 @@ OpenALSoundRenderer::OpenALSoundRenderer()
}
attribs.Clear();
DPrintf(" Vendor: " TEXTCOLOR_ORANGE"%s\n", alGetString(AL_VENDOR));
DPrintf(" Renderer: " TEXTCOLOR_ORANGE"%s\n", alGetString(AL_RENDERER));
DPrintf(" Version: " TEXTCOLOR_ORANGE"%s\n", alGetString(AL_VERSION));
DPrintf(" Extensions: " TEXTCOLOR_ORANGE"%s\n", alGetString(AL_EXTENSIONS));
DPrintf(DMSG_SPAMMY, " Vendor: " TEXTCOLOR_ORANGE"%s\n", alGetString(AL_VENDOR));
DPrintf(DMSG_SPAMMY, " Renderer: " TEXTCOLOR_ORANGE"%s\n", alGetString(AL_RENDERER));
DPrintf(DMSG_SPAMMY, " Version: " TEXTCOLOR_ORANGE"%s\n", alGetString(AL_VERSION));
DPrintf(DMSG_SPAMMY, " Extensions: " TEXTCOLOR_ORANGE"%s\n", alGetString(AL_EXTENSIONS));
ALC.EXT_EFX = !!alcIsExtensionPresent(Device, "ALC_EXT_EFX");
ALC.EXT_disconnect = !!alcIsExtensionPresent(Device, "ALC_EXT_disconnect");
@ -864,7 +864,7 @@ OpenALSoundRenderer::OpenALSoundRenderer()
return;
}
FreeSfx = Sources;
DPrintf(" Allocated " TEXTCOLOR_BLUE"%u" TEXTCOLOR_NORMAL" sources\n", Sources.Size());
DPrintf(DMSG_NOTIFY, " Allocated " TEXTCOLOR_BLUE"%u" TEXTCOLOR_NORMAL" sources\n", Sources.Size());
WasInWater = false;
if(*snd_efx && ALC.EXT_EFX)
@ -913,10 +913,10 @@ OpenALSoundRenderer::OpenALSoundRenderer()
{
alEffecti(envReverb, AL_EFFECT_TYPE, AL_EFFECT_EAXREVERB);
if(alGetError() == AL_NO_ERROR)
DPrintf(" EAX Reverb found\n");
DPrintf(DMSG_SPAMMY, " EAX Reverb found\n");
alEffecti(envReverb, AL_EFFECT_TYPE, AL_EFFECT_REVERB);
if(alGetError() == AL_NO_ERROR)
DPrintf(" Standard Reverb found\n");
DPrintf(DMSG_SPAMMY, " Standard Reverb found\n");
alDeleteEffects(1, &envReverb);
getALError();
@ -929,7 +929,7 @@ OpenALSoundRenderer::OpenALSoundRenderer()
alFilteri(EnvFilters[0], AL_FILTER_TYPE, AL_FILTER_LOWPASS);
alFilteri(EnvFilters[1], AL_FILTER_TYPE, AL_FILTER_LOWPASS);
if(getALError() == AL_NO_ERROR)
DPrintf(" Lowpass found\n");
DPrintf(DMSG_SPAMMY, " Lowpass found\n");
else
{
alDeleteFilters(2, EnvFilters);
@ -1194,7 +1194,7 @@ std::pair<SoundHandle,bool> OpenALSoundRenderer::LoadSoundRaw(BYTE *sfxdata, int
loopend = length / (channels*bits/8);
ALint loops[2] = { loopstart, loopend };
DPrintf("Setting loop points %d -> %d\n", loops[0], loops[1]);
DPrintf(DMSG_NOTIFY, "Setting loop points %d -> %d\n", loops[0], loops[1]);
alBufferiv(buffer, AL_LOOP_POINTS_SOFT, loops);
getALError();
}
@ -1202,7 +1202,7 @@ std::pair<SoundHandle,bool> OpenALSoundRenderer::LoadSoundRaw(BYTE *sfxdata, int
{
static bool warned = false;
if(!warned)
Printf("Loop points not supported!\n");
Printf(DMSG_WARNING, "Loop points not supported!\n");
warned = true;
}
@ -1867,7 +1867,7 @@ void OpenALSoundRenderer::UpdateListener(SoundListener *listener)
if(env != PrevEnvironment || env->Modified)
{
PrevEnvironment = env;
DPrintf("Reverb Environment %s\n", env->Name);
DPrintf(DMSG_NOTIFY, "Reverb Environment %s\n", env->Name);
if(EnvSlot != 0)
LoadReverb(env);

View file

@ -907,11 +907,12 @@ void DFrameBuffer::DrawRateStuff ()
// Drawing it as a texture does and continues to show how
// well the PalTex shader is working.
static FPaletteTester palette;
int size = screen->GetHeight() < 800 ? 16 * 7 : 16 * 7 * 2;
palette.SetTranslation(vid_showpalette);
DrawTexture(&palette, 0, 0,
DTA_DestWidth, 16*7,
DTA_DestHeight, 16*7,
DTA_DestWidth, size,
DTA_DestHeight, size,
DTA_Masked, false,
TAG_DONE);
}

View file

@ -793,7 +793,7 @@ void I_SetFPSLimit(int limit)
CloseHandle(FPSLimitEvent);
FPSLimitEvent = NULL;
}
DPrintf("FPS timer disabled\n");
DPrintf(DMSG_NOTIFY, "FPS timer disabled\n");
}
else
{
@ -802,7 +802,7 @@ void I_SetFPSLimit(int limit)
FPSLimitEvent = CreateEvent(NULL, FALSE, TRUE, NULL);
if (FPSLimitEvent == NULL)
{ // Could not create event, so cannot use timer.
Printf("Failed to create FPS limitter event\n");
Printf(DMSG_WARNING, "Failed to create FPS limitter event\n");
return;
}
}
@ -817,7 +817,7 @@ void I_SetFPSLimit(int limit)
Printf("Failed to create FPS limitter timer\n");
return;
}
DPrintf("FPS timer set to %u ms\n", period);
DPrintf(DMSG_NOTIFY, "FPS timer set to %u ms\n", period);
}
}

View file

@ -1957,6 +1957,7 @@ MSGMNU_TEAMMESSAGES = "Team Messages";
MSGMNU_CENTEREDMESSAGES = "Centered Messages";
MSGMNU_SCREENSHOTMESSAGES = "Screenshot messages";
MSGMNU_LONGSAVEMESSAGES = "Detailed save messages";
MSGMNU_DEVELOPER = "Developer message mode";
// Scoreboard Options
SCRBRDMNU_TITLE = "SCOREBOARD OPTIONS";
@ -2287,6 +2288,10 @@ OPTVAL_SINC = "Sinc";
OPTVAL_NOTEONOFFONLY = "Note on/off only";
OPTVAL_FULLRAMPING = "Full ramping";
OPTVAL_ALLUNACKNOWLEDGED = "All unacknowledged";
OPTVAL_ERRORS = "Errors";
OPTVAL_WARNINGS = "Warnings";
OPTVAL_NOTIFICATIONS = "Notifications";
OPTVAL_EVERYTHING = "Everything";
OPTVAL_FULLSCREENONLY = "Fullscreen only";
// Colors
C_BRICK = "\cabrick";

View file

@ -1131,6 +1131,15 @@ OptionValue MessageLevels
2.0, "$OPTVAL_CRITICALMESSAGES"
}
OptionValue DevMessageLevels
{
0, "$OPTVAL_OFF"
1, "$OPTVAL_ERRORS"
2, "$OPTVAL_WARNINGS",
3, "$OPTVAL_NOTIFICATIONS"
4, "$OPTVAL_EVERYTHING"
}
OptionMenu MessageOptions
{
Title "$MSGMNU_TITLE"
@ -1139,6 +1148,7 @@ OptionMenu MessageOptions
Option "$MSGMNU_SHOWSECRETS", "cl_showsecretmessage", "OnOff"
Option "$MSGMNU_SCALETEXT", "con_scaletext", "ScaleValues"
Option "$MSGMNU_MESSAGELEVEL", "msg", "MessageLevels"
Option "$MSGMNU_DEVELOPER", "developer", "DevMessageLevels"
Option "$MSGMNU_CENTERMESSAGES", "con_centernotify", "OnOff"
StaticText " "
StaticText "$MSGMNU_MESSAGECOLORS", 1