Update audio cvars from legacy to AZ_CVARs (#2182)

* Upgrade s_AudioLoggingOptions to AZ_CVAR

Removes this legacy CVar and reimplements it as an AZ_CVAR with similar
functionality of setting flags using alpha characters.

Signed-off-by: amzn-phist <52085794+amzn-phist@users.noreply.github.com>

* Upgrade s_DrawAudioDebug to AZ_CVAR

Removes the legacy CVar and reimplements it as an AZ_CVAR with similar
functionality and options.

Additional updates to the logging options CVar to fix up flag enums.

Signed-off-by: amzn-phist <52085794+amzn-phist@users.noreply.github.com>

* Upgrade s_FileCacheManagerDebugFilter to AZ_CVAR

Removes the legacy CVar and reimplements it as an AZ_CVAR with similar
functionality.

Signed-off-by: amzn-phist <52085794+amzn-phist@users.noreply.github.com>

* Removal of legacy IConsole dependencies from Audio

Moves a g_languageAudio cvar from CrySystem to AudioSystem.
Convert all cvar commands to AZ_CONSOLEFREEFUNC's.
Remove IConsole.h includes from source files.
Removes the CSoundCVars class.

Signed-off-by: amzn-phist <52085794+amzn-phist@users.noreply.github.com>

* Minor update to cvar comments etc.

Signed-off-by: amzn-phist <52085794+amzn-phist@users.noreply.github.com>
This commit is contained in:
amzn-phist
2021-07-16 12:25:32 -05:00
committed by GitHub
parent 23e22dbb4c
commit 4407891740
14 changed files with 511 additions and 535 deletions
-14
View File
@@ -1431,20 +1431,6 @@ void CSystem::OnLanguageCVarChanged(ICVar* language)
}
}
//////////////////////////////////////////////////////////////////////
void CSystem::OnLanguageAudioCVarChanged(ICVar* language)
{
static Audio::SAudioRequest oLanguageRequest;
static Audio::SAudioManagerRequestData<Audio::eAMRT_CHANGE_LANGUAGE> oLanguageRequestData;
if (language && (language->GetType() == CVAR_STRING))
{
oLanguageRequest.pData = &oLanguageRequestData;
oLanguageRequest.nFlags = Audio::eARF_PRIORITY_HIGH;
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequest, oLanguageRequest);
}
}
//////////////////////////////////////////////////////////////////////////
void CSystem::OnLocalizationFolderCVarChanged(ICVar* const pLocalizationFolder)
{
-1
View File
@@ -277,7 +277,6 @@ public:
~CSystem();
static void OnLanguageCVarChanged(ICVar* language);
static void OnLanguageAudioCVarChanged(ICVar* language);
static void OnLocalizationFolderCVarChanged(ICVar* const pLocalizationFolder);
// adding CVAR to toggle assert verbosity level
static void OnAssertLevelCvarChanged(ICVar* pArgs);
+11 -9
View File
@@ -892,16 +892,19 @@ void CSystem::InitLocalization()
OpenLanguagePak(language);
}
pCVar = m_env.pConsole != 0 ? m_env.pConsole->GetCVar("g_languageAudio") : 0;
if (pCVar)
if (auto console = AZ::Interface<AZ::IConsole>::Get(); console != nullptr)
{
if (strlen(pCVar->GetString()) == 0)
AZ::CVarFixedString languageAudio;
if (auto result = console->GetCvarValue("g_languageAudio", languageAudio); result == AZ::GetValueResult::Success)
{
pCVar->Set(language);
}
else
{
language = pCVar->GetString();
if (languageAudio.size() == 0)
{
console->PerformCommand(AZStd::string::format("g_languageAudio %s", language.c_str()).c_str());
}
else
{
language.assign(languageAudio.data(), languageAudio.size());
}
}
}
OpenLanguageAudioPak(language);
@@ -2079,7 +2082,6 @@ void CSystem::CreateSystemVars()
//Defines selected language.
REGISTER_STRING_CB("g_language", "", VF_NULL, "Defines which language pak is loaded", CSystem::OnLanguageCVarChanged);
REGISTER_STRING_CB("g_languageAudio", "", VF_NULL, "Will automatically match g_language setting unless specified otherwise", CSystem::OnLanguageAudioCVarChanged);
#if defined(WIN32)
REGISTER_CVAR2("sys_display_threads", &g_cvars.sys_display_threads, 0, 0, "Displays Thread info");
@@ -23,16 +23,18 @@ namespace Audio
eALT_ALWAYS,
};
enum EAudioLoggingOptions
{
eALO_NONE = 0,
eALO_ERRORS = AUDIO_BIT(6), // a
eALO_WARNINGS = AUDIO_BIT(7), // b
eALO_COMMENTS = AUDIO_BIT(8), // c
};
namespace Log
{
enum Options : AZ::u8
{
None = 0,
Errors = (1 << 0),
Warnings = (1 << 1),
Comments = (1 << 2),
};
inline AZ::u32 s_audioLogOptions = 0;
#if defined(ENABLE_AUDIO_LOGGING)
// Eventually will get rid of the CAudioLogger class and objects and convert
// all audio log calls to use Audio::Log::Print.
@@ -40,19 +42,6 @@ namespace Audio
// arguments in CAudioLogger::Log and call this PrintMsg.
inline void PrintMsg(const EAudioLogType type, const char* const message)
{
EAudioLoggingOptions logLevel = eALO_NONE;
auto verbosityVar = AZ::Environment::FindVariable<int*>("AudioLogVerbosity");
if (verbosityVar.IsConstructed())
{
logLevel = static_cast<EAudioLoggingOptions>(*(verbosityVar.Get()));
}
if (logLevel == eALO_NONE)
{
return;
}
static constexpr const char* AudioWindow = "Audio";
switch (type)
@@ -64,7 +53,7 @@ namespace Audio
}
case eALT_ERROR:
{
if (logLevel & eALO_ERRORS)
if ((s_audioLogOptions & Log::Options::Errors) != 0)
{
AZ_Error(AudioWindow, false, message);
}
@@ -72,7 +61,7 @@ namespace Audio
}
case eALT_WARNING:
{
if (logLevel & eALO_WARNINGS)
if ((s_audioLogOptions & Log::Options::Warnings) != 0)
{
AZ_Warning(AudioWindow, false, message);
}
@@ -80,7 +69,7 @@ namespace Audio
}
case eALT_COMMENT:
{
if (logLevel & eALO_COMMENTS)
if ((s_audioLogOptions & Log::Options::Comments) != 0)
{
AZ_TracePrintf(AudioWindow, message);
}
@@ -17,7 +17,6 @@
#include <AudioLogger.h>
#include <AudioSystem.h>
#include <NullAudioSystem.h>
#include <SoundCVars.h>
#if defined(AUDIO_SYSTEM_EDITOR)
#include <AzToolsFramework/API/ToolsApplicationAPI.h>
@@ -29,9 +28,7 @@
namespace Audio
{
// Module globals/statics
CSoundCVars g_audioCVars;
CAudioLogger g_audioLogger;
AZ::EnvironmentVariable<int*> g_audioVerbosityVar;
namespace Platform
{
@@ -134,13 +131,6 @@ namespace AudioSystemGem
return CreateNullAudioSystem();
}
g_audioCVars.RegisterVariables();
#if !defined(AUDIO_RELEASE)
g_audioVerbosityVar = AZ::Environment::CreateVariable<int*>("AudioLogVerbosity");
g_audioVerbosityVar.Set(&g_audioCVars.m_nAudioLoggingOptions);
#endif // !AUDIO_RELEASE
bool success = false;
if (CreateAudioSystem())
@@ -191,9 +181,6 @@ namespace AudioSystemGem
// It should be the last object that is freed from the audio system memory pool before the allocator is destroyed.
m_audioSystem.reset();
g_audioVerbosityVar.Reset();
g_audioCVars.UnregisterVariables();
GetISystem()->GetISystemEventDispatcher()->RemoveListener(this);
}
+12 -8
View File
@@ -19,7 +19,6 @@
#include <ATLAudioObject.h>
#include <IAudioSystemImplementation.h>
#include <IConsole.h>
#include <ISystem.h>
#include <IPhysics.h>
#include <IRenderAuxGeom.h>
@@ -1896,9 +1895,14 @@ namespace Audio
///////////////////////////////////////////////////////////////////////////////////////////////////
void CAudioTranslationLayer::SetImplLanguage()
{
if (ICVar* pCVar = gEnv->pConsole->GetCVar("g_languageAudio"))
if (auto console = AZ::Interface<AZ::IConsole>::Get(); console != nullptr)
{
AudioSystemImplementationRequestBus::Broadcast(&AudioSystemImplementationRequestBus::Events::SetLanguage, pCVar->GetString());
AZ::CVarFixedString languageAudio;
if (auto result = console->GetCvarValue("g_languageAudio", languageAudio); result == AZ::GetValueResult::Success)
{
AudioSystemImplementationRequestBus::Broadcast(
&AudioSystemImplementationRequestBus::Events::SetLanguage, languageAudio.data());
}
}
}
@@ -2014,7 +2018,7 @@ namespace Audio
AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Audio);
// ToDo: Update to work with Atom? LYN-3677
/*if (g_audioCVars.m_nDrawAudioDebug > 0)
/*if (CVars::s_debugDrawOptions.GetRawFlags() != 0)
{
DrawAudioObjectDebugInfo(*pAuxGeom); // needs to be called first so that the rest of the labels are printed
// on top (Draw2dLabel doesn't provide a way set which labels are printed on top)
@@ -2112,23 +2116,23 @@ namespace Audio
{
m_oFileCacheMgr.DrawDebugInfo(auxGeom, fPosX, fPosY);
if ((g_audioCVars.m_nDrawAudioDebug & eADDF_SHOW_IMPL_MEMORY_POOL_USAGE) != 0)
if (CVars::s_debugDrawOptions.AreAllFlagsActive(DebugDraw::Options::MemoryInfo))
{
DrawImplMemoryPoolDebugInfo(auxGeom, fPosX, fPosY);
}
if ((g_audioCVars.m_nDrawAudioDebug & eADDF_SHOW_ACTIVE_OBJECTS) != 0)
if (CVars::s_debugDrawOptions.AreAllFlagsActive(DebugDraw::Options::ActiveObjects))
{
m_oAudioObjectMgr.DrawDebugInfo(auxGeom, fPosX, fPosY);
fPosX += 800.0f;
}
if ((g_audioCVars.m_nDrawAudioDebug & eADDF_SHOW_ACTIVE_EVENTS) != 0)
if (CVars::s_debugDrawOptions.AreAllFlagsActive(DebugDraw::Options::ActiveEvents))
{
m_oAudioEventMgr.DrawDebugInfo(auxGeom, fPosX, fPosY);
}
if ((g_audioCVars.m_nDrawAudioDebug & eADDF_DRAW_LISTENER_SPHERE) != 0)
if (CVars::s_debugDrawOptions.AreAllFlagsActive(DebugDraw::Options::DrawListener))
{
m_oAudioListenerMgr.DrawDebugInfo(auxGeom);
}
@@ -23,7 +23,6 @@
#include <IRenderer.h>
#include <IRenderAuxGeom.h>
#include <IConsole.h>
namespace Audio
{
@@ -850,7 +849,7 @@ namespace Audio
{
const float fDist = vPos.GetDistance(vListenerPos);
if ((g_audioCVars.m_nDrawAudioDebug & eADDF_DRAW_SPHERES) != 0)
if (CVars::s_debugDrawOptions.AreAllFlagsActive(DebugDraw::Options::DrawObjects))
{
const SAuxGeomRenderFlags nPreviousRenderFlags = auxGeom.GetRenderFlags();
SAuxGeomRenderFlags nNewRenderFlags(e_Def3DPublicRenderflags | e_AlphaBlended);
@@ -865,7 +864,7 @@ namespace Audio
const float fFontSize = 1.3f;
const float fLineHeight = 12.0f;
if ((g_audioCVars.m_nDrawAudioDebug & eADDF_SHOW_OBJECT_STATES) != 0)
if (CVars::s_debugDrawOptions.AreAllFlagsActive(DebugDraw::Options::ObjectStates))
{
AZ::Vector3 vSwitchPos(vScreenPos);
@@ -901,7 +900,7 @@ namespace Audio
const AZ::Color normalTextColor(0.75f, 0.75f, 0.75f, 1.f);
const AZ::Color dimmedTextColor(0.5f, 0.5f, 0.5f, 1.f);
if ((g_audioCVars.m_nDrawAudioDebug & eADDF_SHOW_OBJECT_LABEL) != 0)
if (CVars::s_debugDrawOptions.AreAllFlagsActive(DebugDraw::Options::ObjectLabels))
{
const TAudioObjectID nObjectID = GetID();
auxGeom.Draw2dLabel(
@@ -931,7 +930,7 @@ namespace Audio
);
}
if ((g_audioCVars.m_nDrawAudioDebug & eADDF_SHOW_OBJECT_TRIGGERS) != 0)
if (CVars::s_debugDrawOptions.AreAllFlagsActive(DebugDraw::Options::ObjectTriggers))
{
AZStd::string triggerStringFormatted;
@@ -963,7 +962,7 @@ namespace Audio
triggerStringFormatted.c_str());
}
if ((g_audioCVars.m_nDrawAudioDebug & eADDF_SHOW_OBJECT_RTPCS) != 0)
if (CVars::s_debugDrawOptions.AreAllFlagsActive(DebugDraw::Options::ObjectRtpcs))
{
AZ::Vector3 vRtpcPos(vScreenPos);
@@ -990,7 +989,7 @@ namespace Audio
}
}
if ((g_audioCVars.m_nDrawAudioDebug & eADDF_SHOW_OBJECT_ENVIRONMENTS) != 0)
if (CVars::s_debugDrawOptions.AreAllFlagsActive(DebugDraw::Options::ObjectEnvironments))
{
AZ::Vector3 vEnvPos(vScreenPos);
@@ -1041,8 +1040,8 @@ namespace Audio
newRenderFlags.SetCullMode(e_CullModeNone);
auxGeom.SetRenderFlags(newRenderFlags);
const bool drawRays = ((g_audioCVars.m_nDrawAudioDebug & eADDF_DRAW_OBSTRUCTION_RAYS) != 0);
const bool drawLabels = ((g_audioCVars.m_nDrawAudioDebug & eADDF_SHOW_OBSTRUCTION_RAY_LABELS) != 0);
const bool drawRays = CVars::s_debugDrawOptions.AreAllFlagsActive(DebugDraw::Options::DrawRays);
const bool drawLabels = CVars::s_debugDrawOptions.AreAllFlagsActive(DebugDraw::Options::RayLabels);
size_t numRays = m_obstOccType == eAOOCT_SINGLE_RAY ? 1 : s_maxRaysPerObject;
for (size_t rayIndex = 0; rayIndex < numRays; ++rayIndex)
@@ -29,7 +29,6 @@
#include <MathConversion.h>
#include <IRenderAuxGeom.h>
#include <IConsole.h>
namespace Audio
{
@@ -899,25 +899,38 @@ namespace Audio
///////////////////////////////////////////////////////////////////////////////////////////////////
#if !defined(AUDIO_RELEASE)
// Filter for drawing debug info to the screen
enum EAudioDebugDrawFilter : TATLEnumFlagsType
namespace DebugDraw
{
eADDF_NONE = 0,
eADDF_DRAW_SPHERES = AUDIO_BIT(6),// a
eADDF_SHOW_OBJECT_LABEL = AUDIO_BIT(7),// b
eADDF_SHOW_OBJECT_TRIGGERS = AUDIO_BIT(8),// c
eADDF_SHOW_OBJECT_STATES = AUDIO_BIT(9),// d
eADDF_SHOW_OBJECT_RTPCS = AUDIO_BIT(10),// e
eADDF_SHOW_OBJECT_ENVIRONMENTS = AUDIO_BIT(11),// f
eADDF_DRAW_OBSTRUCTION_RAYS = AUDIO_BIT(12),// g
eADDF_SHOW_OBSTRUCTION_RAY_LABELS = AUDIO_BIT(13),// h
eADDF_DRAW_LISTENER_SPHERE = AUDIO_BIT(14),// i
enum Options : AZ::u32
{
None = 0,
DrawObjects = (1 << 0),
ObjectLabels = (1 << 1),
ObjectTriggers = (1 << 2),
ObjectStates = (1 << 3),
ObjectRtpcs = (1 << 4),
ObjectEnvironments = (1 << 5),
DrawRays = (1 << 6),
RayLabels = (1 << 7),
DrawListener = (1 << 8),
ActiveEvents = (1 << 9),
ActiveObjects = (1 << 10),
FileCacheInfo = (1 << 11),
MemoryInfo = (1 << 12),
};
}
eADDF_SHOW_ACTIVE_EVENTS = AUDIO_BIT(27),// v
eADDF_SHOW_ACTIVE_OBJECTS = AUDIO_BIT(28),// w
eADDF_SHOW_FILECACHE_MANAGER_INFO = AUDIO_BIT(29),// x
eADDF_SHOW_IMPL_MEMORY_POOL_USAGE = AUDIO_BIT(30),// y
};
namespace FileCacheManagerDebugDraw
{
enum Options : AZ::u8
{
All = 0,
Global = (1 << 0),
LevelSpecific = (1 << 1),
UseCounted = (1 << 2),
Loaded = (1 << 3),
};
}
#endif // !AUDIO_RELEASE
} // namespace Audio
@@ -699,7 +699,7 @@ namespace Audio
{
AZ_Assert(gEnv->mMainThreadId == CryGetCurrentThreadId(), "AudioSystem::DrawAudioDebugData - called from non-Main thread!");
if (g_audioCVars.m_nDrawAudioDebug > 0)
if (CVars::s_debugDrawOptions.GetRawFlags() != 0)
{
SAudioRequest oRequest;
oRequest.nFlags = (eARF_PRIORITY_HIGH | eARF_EXECUTE_BLOCKING);
@@ -339,20 +339,17 @@ namespace Audio
///////////////////////////////////////////////////////////////////////////////////////////////
void CFileCacheManager::DrawDebugInfo(IRenderAuxGeom& auxGeom, const float posX, const float posY)
{
if ((g_audioCVars.m_nDrawAudioDebug & eADDF_SHOW_FILECACHE_MANAGER_INFO) != 0)
if (CVars::s_debugDrawOptions.AreAllFlagsActive(DebugDraw::Options::FileCacheInfo))
{
EATLDataScope dataScope = eADS_ALL;
if ((g_audioCVars.m_nFileCacheManagerDebugFilter & eAFCMDF_ALL) == 0)
if (CVars::s_fcmDrawOptions.AreAllFlagsActive(FileCacheManagerDebugDraw::Options::Global))
{
if ((g_audioCVars.m_nFileCacheManagerDebugFilter & eAFCMDF_GLOBALS) != 0)
{
dataScope = eADS_GLOBAL;
}
else if ((g_audioCVars.m_nFileCacheManagerDebugFilter & eAFCMDF_LEVEL_SPECIFICS) != 0)
{
dataScope = eADS_LEVEL_SPECIFIC;
}
dataScope = eADS_GLOBAL;
}
else if (CVars::s_fcmDrawOptions.AreAllFlagsActive(FileCacheManagerDebugDraw::Options::LevelSpecific))
{
dataScope = eADS_LEVEL_SPECIFIC;
}
const auto frameTime = AZStd::chrono::system_clock::now();
@@ -381,11 +378,11 @@ namespace Audio
"FileCacheManager (%zu of %zu KiB) [Entries: %zu]", m_currentByteTotal >> 10, m_maxByteTotal >> 10, m_audioFileEntries.size());
positionY += 15.0f;
bool displayAll = (g_audioCVars.m_nFileCacheManagerDebugFilter == eAFCMDF_ALL);
bool displayGlobals = ((g_audioCVars.m_nFileCacheManagerDebugFilter & eAFCMDF_GLOBALS) != 0);
bool displayLevels = ((g_audioCVars.m_nFileCacheManagerDebugFilter & eAFCMDF_LEVEL_SPECIFICS) != 0);
bool displayUseCounted = ((g_audioCVars.m_nFileCacheManagerDebugFilter & eAFCMDF_USE_COUNTED) != 0);
bool displayLoaded = ((g_audioCVars.m_nFileCacheManagerDebugFilter & eAFCMDF_LOADED) != 0);
const bool displayAll = CVars::s_fcmDrawOptions.GetRawFlags() == 0;
const bool displayGlobals = CVars::s_fcmDrawOptions.AreAllFlagsActive(FileCacheManagerDebugDraw::Options::Global);
const bool displayLevels = CVars::s_fcmDrawOptions.AreAllFlagsActive(FileCacheManagerDebugDraw::Options::LevelSpecific);
const bool displayUseCounted = CVars::s_fcmDrawOptions.AreAllFlagsActive(FileCacheManagerDebugDraw::Options::UseCounted);
const bool displayLoaded = CVars::s_fcmDrawOptions.AreAllFlagsActive(FileCacheManagerDebugDraw::Options::Loaded);
for (auto& audioFileEntryPair : m_audioFileEntries)
{
@@ -100,16 +100,4 @@ namespace Audio
size_t m_currentByteTotal;
size_t m_maxByteTotal;
};
///////////////////////////////////////////////////////////////////////////////////////////////
// Filter for drawing debug info to the screen
enum EAudioFileCacheManagerDebugFilter
{
eAFCMDF_ALL = 0,
eAFCMDF_GLOBALS = AUDIO_BIT(6), // a
eAFCMDF_LEVEL_SPECIFICS = AUDIO_BIT(7), // b
eAFCMDF_USE_COUNTED = AUDIO_BIT(8), // c
eAFCMDF_LOADED = AUDIO_BIT(9), // d
};
} // namespace Audio
File diff suppressed because it is too large Load Diff
@@ -8,14 +8,11 @@
#pragma once
#include <IAudioSystem.h>
#include <ATLUtils.h>
#include <AzCore/Console/IConsole.h>
struct IConsoleCmdArgs;
namespace Audio::CVars
{
///////////////////////////////////////////////////////////////////////////////////////////////////
AZ_CVAR_EXTERNED(AZ::u64, s_ATLMemorySize);
AZ_CVAR_EXTERNED(AZ::u64, s_FileCacheManagerMemorySize);
AZ_CVAR_EXTERNED(AZ::u64, s_AudioObjectPoolSize);
@@ -31,48 +28,18 @@ namespace Audio::CVars
AZ_CVAR_EXTERNED(float, s_VelocityTrackingThreshold);
AZ_CVAR_EXTERNED(AZ::u32, s_AudioProxiesInitType);
AZ_CVAR_EXTERNED(AZ::CVarFixedString, g_languageAudio);
#if !defined(AUDIO_RELEASE)
AZ_CVAR_EXTERNED(bool, s_IgnoreWindowFocus);
AZ_CVAR_EXTERNED(bool, s_ShowActiveAudioObjectsOnly);
AZ_CVAR_EXTERNED(AZ::CVarFixedString, s_AudioTriggersDebugFilter);
AZ_CVAR_EXTERNED(AZ::CVarFixedString, s_AudioObjectsDebugFilter);
AZ_CVAR_EXTERNED(AZ::CVarFixedString, s_AudioLoggingOptions);
AZ_CVAR_EXTERNED(AZ::CVarFixedString, s_DrawAudioDebug);
inline Audio::Flags<AZ::u32> s_debugDrawOptions;
AZ_CVAR_EXTERNED(AZ::CVarFixedString, s_FileCacheManagerDebugFilter);
inline Audio::Flags<AZ::u32> s_fcmDrawOptions;
#endif // !AUDIO_RELEASE
} // namespace Audio::CVars
namespace Audio
{
///////////////////////////////////////////////////////////////////////////////////////////////////
class CSoundCVars
{
public:
CSoundCVars();
~CSoundCVars() = default;
CSoundCVars(const CSoundCVars&) = delete; // Copy protection
CSoundCVars& operator=(const CSoundCVars&) = delete; // Copy protection
void RegisterVariables();
void UnregisterVariables();
#if !defined(AUDIO_RELEASE)
int m_nDrawAudioDebug;
int m_nFileCacheManagerDebugFilter;
int m_nAudioLoggingOptions;
private:
static void CmdExecuteTrigger(IConsoleCmdArgs* pCmdArgs);
static void CmdStopTrigger(IConsoleCmdArgs* pCmdArgs);
static void CmdSetRtpc(IConsoleCmdArgs* pCmdArgs);
static void CmdSetSwitchState(IConsoleCmdArgs* pCmdArgs);
static void CmdLoadPreload(IConsoleCmdArgs* pCmdArgs);
static void CmdUnloadPreload(IConsoleCmdArgs* pCmdArgs);
static void CmdPlayFile(IConsoleCmdArgs* pCmdArgs);
static void CmdMicrophone(IConsoleCmdArgs* pCmdArgs);
static void CmdPlayExternalSource(IConsoleCmdArgs* pCmdArgs);
static void CmdSetPanningMode(IConsoleCmdArgs* pCmdArgs);
#endif // !AUDIO_RELEASE
};
extern CSoundCVars g_audioCVars;
} // namespace Audio