r5sdk/r5dev/codecs/Miles/miles_impl.cpp
Kawe Mazidjatari 8c593f666f Miles: add global type and prevent non-existent banks from loading
This patch adds miles globals and additional code to prevent banks from loading that don't exist. It falls back to "english" if requested language isn't installed.
2024-04-05 18:28:26 +02:00

98 lines
3.8 KiB
C++

#include "core/stdafx.h"
#include "miles_impl.h"
#include "tier0/fasttimer.h"
#include "tier0/commandline.h"
#include "tier1/cvar.h"
#include "filesystem/filesystem.h"
static ConVar miles_debug("miles_debug", "0", FCVAR_RELEASE, "Enables debug prints for the Miles Sound System", "1 = print; 0 (zero) = no print");
//-----------------------------------------------------------------------------
// Purpose: logs debug output emitted from the Miles Sound System
// Input : nLogLevel -
// pszMessage -
//-----------------------------------------------------------------------------
void AIL_LogFunc(int64_t nLogLevel, const char* pszMessage)
{
Msg(eDLL_T::AUDIO, "%s\n", pszMessage);
v_AIL_LogFunc(nLogLevel, pszMessage);
}
//-----------------------------------------------------------------------------
// Purpose: initializes the miles sound system
// Output : true on success, false otherwise
//-----------------------------------------------------------------------------
bool Miles_Initialize()
{
const char* pszLanguage = miles_language->GetString();
if (!pszLanguage[0])
pszLanguage = MILES_DEFAULT_LANGUAGE;
const bool isEnglishLanguage = _stricmp(pszLanguage, "english") == 0;
if (!isEnglishLanguage)
{
const bool useShipSound = !CommandLine()->FindParm("-devsound") || CommandLine()->FindParm("-shipsound");
const std::string baseStreamFilePath = Format("%s/general_%s.mstr", useShipSound ? "audio/ship" : "audio/dev", pszLanguage);
// if the requested language for miles does not have a MSTR file present, throw a non-fatal error and force english as a fallback
// if we are loading english and the file is still not found, we can let it hit the regular engine error, since that is not recoverable
if (!FileSystem()->FileExists(baseStreamFilePath.c_str()))
{
Error(eDLL_T::AUDIO, NO_ERROR, "%s: attempted to load language '%s' but the required stream bank (%s) was not found. falling back to english...\n", pszLanguage, baseStreamFilePath.c_str());
pszLanguage = MILES_DEFAULT_LANGUAGE;
}
}
Msg(eDLL_T::AUDIO, "%s: initializing MSS with language: '%s'\n", __FUNCTION__, pszLanguage);
CFastTimer initTimer;
initTimer.Start();
bool bResult = v_Miles_Initialize();
initTimer.End();
Msg(eDLL_T::AUDIO, "%s: %s ('%f' seconds)\n", __FUNCTION__, bResult ? "success" : "failure", initTimer.GetDuration().GetSeconds());
return bResult;
}
void MilesQueueEventRun(Miles::Queue* queue, const char* eventName)
{
if(miles_debug.GetBool())
Msg(eDLL_T::AUDIO, "%s: running event: '%s'\n", __FUNCTION__, eventName);
v_MilesQueueEventRun(queue, eventName);
}
void MilesBankPatch(Miles::Bank* bank, char* streamPatch, char* localizedStreamPatch)
{
// TODO [REXX]: add print for patch loading when Miles::Bank struct is mapped out a bit better with file name
v_MilesBankPatch(bank, streamPatch, localizedStreamPatch);
}
void CSOM_AddEventToQueue(const char* eventName)
{
if (miles_debug.GetBool())
Msg(eDLL_T::AUDIO, "%s: queuing audio event '%s'\n", __FUNCTION__, eventName);
v_CSOM_AddEventToQueue(eventName);
if (g_milesGlobals->queuedEventHash == 1)
Warning(eDLL_T::AUDIO, "%s: failed to add event to queue; invalid event name '%s'\n", __FUNCTION__, eventName);
if (g_milesGlobals->queuedEventHash == 2)
Warning(eDLL_T::AUDIO, "%s: failed to add event to queue; event '%s' not found.\n", __FUNCTION__, eventName);
};
///////////////////////////////////////////////////////////////////////////////
void MilesCore::Detour(const bool bAttach) const
{
DetourSetup(&v_AIL_LogFunc, &AIL_LogFunc, bAttach);
DetourSetup(&v_Miles_Initialize, &Miles_Initialize, bAttach);
DetourSetup(&v_MilesQueueEventRun, &MilesQueueEventRun, bAttach);
DetourSetup(&v_MilesBankPatch, &MilesBankPatch, bAttach);
DetourSetup(&v_CSOM_AddEventToQueue, &CSOM_AddEventToQueue, bAttach);
}