mirror of
https://github.com/Gigaslav/HL2Overcharged.git
synced 2026-01-02 17:48:11 +03:00
245 lines
6.2 KiB
C++
245 lines
6.2 KiB
C++
#include "cbase.h"
|
|
#include "fmod_manager.h"
|
|
#if 0
|
|
using namespace FMOD;
|
|
|
|
System *pSystem;
|
|
Sound *pSound;
|
|
SoundGroup *pSoundGroup;
|
|
Channel *pChannel;
|
|
ChannelGroup *pChannelGroup;
|
|
FMOD_RESULT result;
|
|
|
|
CFMODManager gFMODMng;
|
|
CFMODManager* FMODManager()
|
|
{
|
|
return &gFMODMng;
|
|
}
|
|
|
|
CFMODManager::CFMODManager()
|
|
{
|
|
m_fFadeDelay = 0.0;
|
|
newSoundFileToTransitionTo = "NULL";
|
|
currentSound = "NULL";
|
|
m_bShouldTransition = false;
|
|
m_bFadeIn = false;
|
|
m_bFadeOut = false;
|
|
}
|
|
|
|
CFMODManager::~CFMODManager()
|
|
{
|
|
m_fFadeDelay = 0.0;
|
|
newSoundFileToTransitionTo = "NULL";
|
|
currentSound = "NULL";
|
|
m_bShouldTransition = false;
|
|
m_bFadeIn = false;
|
|
m_bFadeOut = false;
|
|
}
|
|
|
|
// Starts FMOD
|
|
void CFMODManager::InitFMOD(void)
|
|
{
|
|
result = System_Create(&pSystem); // Create the main system object.
|
|
|
|
if (result != FMOD_OK)
|
|
Warning("FMOD ERROR: System creation failed!\n");
|
|
else
|
|
DevMsg("FMOD system successfully created.\n");
|
|
|
|
result = pSystem->init(100, FMOD_INIT_NORMAL, 0); // Initialize FMOD system.
|
|
/*char cDest[512] = { 0 };
|
|
Q_snprintf(cDest, 512, "%s/sound/", engine->GetGameDirectory());
|
|
result = pSystem->setOutput(FMOD_OUTPUTTYPE_WAVWRITER_NRT);
|
|
result = pSystem->init(100, FMOD_INIT_NORMAL | FMOD_INIT_ENABLE_PROFILE, cDest);*/
|
|
if (result != FMOD_OK)
|
|
Warning("FMOD ERROR: Failed to initialize properly!\n");
|
|
else
|
|
DevMsg("FMOD initialized successfully.\n");
|
|
}
|
|
|
|
// Stops FMOD
|
|
void CFMODManager::ExitFMOD(void)
|
|
{
|
|
result = pSystem->release();
|
|
|
|
if (result != FMOD_OK)
|
|
Warning("FMOD ERROR: System did not terminate properly!\n");
|
|
else
|
|
DevMsg("FMOD system terminated successfully.\n");
|
|
}
|
|
|
|
// Returns the full path of a specified sound file in the /sounds folder
|
|
const char* CFMODManager::GetFullPathToSound(const char* pathToFileFromModFolder)
|
|
{
|
|
char* resultpath = new char[512];
|
|
|
|
Q_snprintf(resultpath, 512, "%s/sound/%s", engine->GetGameDirectory(), pathToFileFromModFolder);
|
|
|
|
// convert backwards slashes to forward slashes
|
|
for (int i = 0; i < 512; i++)
|
|
{
|
|
if (resultpath[i] == '\\')
|
|
resultpath[i] = '/';
|
|
}
|
|
|
|
return resultpath;
|
|
}
|
|
|
|
// Returns the name of the current ambient sound being played
|
|
// If there is an error getting the name of the ambient sound or if no ambient sound is currently being played, returns "NULL"
|
|
const char* CFMODManager::GetCurrentSoundName(void)
|
|
{
|
|
return currentSound;
|
|
}
|
|
|
|
// Handles all fade-related sound stuffs
|
|
// Called every frame when the client is in-game
|
|
void CFMODManager::FadeThink(void)
|
|
{
|
|
if (m_bFadeOut)
|
|
{
|
|
if (gpGlobals->curtime >= m_fFadeDelay)
|
|
{
|
|
float tempvol;
|
|
pChannel->getVolume(&tempvol);
|
|
|
|
if (tempvol > 0.0)
|
|
{
|
|
pChannel->setVolume(tempvol - 0.05);
|
|
m_fFadeDelay = gpGlobals->curtime + 0.1;
|
|
}
|
|
else
|
|
{
|
|
pChannel->setVolume(0.0);
|
|
m_bFadeOut = false;
|
|
m_fFadeDelay = 0.0;
|
|
}
|
|
}
|
|
}
|
|
else if (m_bShouldTransition)
|
|
{
|
|
result = pSystem->createStream(GetFullPathToSound(newSoundFileToTransitionTo), FMOD_DEFAULT, 0, &pSound);
|
|
|
|
if (result != FMOD_OK)
|
|
{
|
|
Warning("FMOD: Failed to create stream of sound '%s' ! (ERROR NUMBER: %i)\n", newSoundFileToTransitionTo, result);
|
|
newSoundFileToTransitionTo = "NULL";
|
|
m_bShouldTransition = false;
|
|
return;
|
|
}
|
|
|
|
result = pSystem->playSound(FMOD_CHANNEL_REUSE, pSound, false, &pChannel);
|
|
|
|
if (result != FMOD_OK)
|
|
{
|
|
Warning("FMOD: Failed to play sound '%s' ! (ERROR NUMBER: %i)\n", newSoundFileToTransitionTo, result);
|
|
newSoundFileToTransitionTo = "NULL";
|
|
m_bShouldTransition = false;
|
|
return;
|
|
}
|
|
|
|
currentSound = newSoundFileToTransitionTo;
|
|
newSoundFileToTransitionTo = "NULL";
|
|
m_bShouldTransition = false;
|
|
}
|
|
else if (m_bFadeIn)
|
|
{
|
|
if (gpGlobals->curtime >= m_fFadeDelay)
|
|
{
|
|
float tempvol;
|
|
pChannel->getVolume(&tempvol);
|
|
|
|
if (tempvol < 1.0)
|
|
{
|
|
pChannel->setVolume(tempvol + 0.05);
|
|
m_fFadeDelay = gpGlobals->curtime + 0.1;
|
|
}
|
|
else
|
|
{
|
|
pChannel->setVolume(1.0);
|
|
m_bFadeIn = false;
|
|
m_fFadeDelay = 0.0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Compares specified ambient sound with the current ambient sound being played
|
|
// Returns true if they match, false if they do not or if no sound is being played
|
|
bool CFMODManager::IsSoundPlaying(const char* pathToFileFromSoundsFolder)
|
|
{
|
|
const char* currentSoundPlaying = GetCurrentSoundName();
|
|
|
|
return strcmp(currentSoundPlaying, pathToFileFromSoundsFolder) == 0;
|
|
}
|
|
|
|
// Abruptly starts playing a specified ambient sound
|
|
// In most cases, we'll want to use TransitionAmbientSounds instead
|
|
void CFMODManager::PlayAmbientSound(const char* pathToFileFromSoundsFolder, bool fadeIn)
|
|
{
|
|
char cDest[512] = { 0 };
|
|
Q_snprintf(cDest, 512, "%s/sound/%s", engine->GetGameDirectory(), pathToFileFromSoundsFolder);
|
|
// convert backwards slashes to forward slashes
|
|
for (int i = 0; i < 512; i++)
|
|
{
|
|
if (cDest[i] == '\\')
|
|
cDest[i] = '/';
|
|
}
|
|
result = pSystem->setOutput(FMOD_OUTPUTTYPE_WAVWRITER_NRT);
|
|
result = pSystem->init(100, FMOD_INIT_NORMAL | FMOD_INIT_ENABLE_PROFILE, cDest);
|
|
Warning("FMOD: cDest '%s' \n", cDest);
|
|
|
|
result = pSystem->createStream(GetFullPathToSound(pathToFileFromSoundsFolder), FMOD_DEFAULT, 0, &pSound);
|
|
//Warning("FMOD: pathToFileFromSoundsFolder '%s' \n", pathToFileFromSoundsFolder);
|
|
//Warning("FMOD: GetFullPathToSound '%s' \n", GetFullPathToSound(pathToFileFromSoundsFolder));
|
|
if (result != FMOD_OK)
|
|
{
|
|
Warning("FMOD: Failed to create stream of sound '%s' ! (ERROR NUMBER: %i)\n", pathToFileFromSoundsFolder, result);
|
|
return;
|
|
}
|
|
|
|
result = pSystem->playSound(FMOD_CHANNEL_REUSE, pSound, false, &pChannel);
|
|
|
|
if (result != FMOD_OK)
|
|
{
|
|
Warning("FMOD: Failed to play sound '%s' ! (ERROR NUMBER: %i)\n", pathToFileFromSoundsFolder, result);
|
|
return;
|
|
}
|
|
|
|
if (fadeIn)
|
|
{
|
|
pChannel->setVolume(0.0);
|
|
m_bFadeIn = true;
|
|
}
|
|
|
|
currentSound = pathToFileFromSoundsFolder;
|
|
}
|
|
|
|
// Abruptly stops playing all ambient sounds
|
|
void CFMODManager::StopAmbientSound(bool fadeOut)
|
|
{
|
|
if (fadeOut)
|
|
{
|
|
pChannel->setVolume(1.0);
|
|
m_bFadeOut = true;
|
|
}
|
|
else
|
|
{
|
|
pChannel->setVolume(0.0);
|
|
}
|
|
|
|
currentSound = "NULL";
|
|
}
|
|
|
|
// Transitions between two ambient sounds if necessary
|
|
// If a sound isn't already playing when this is called, don't worry about it
|
|
void CFMODManager::TransitionAmbientSounds(const char* pathToFileFromSoundsFolder)
|
|
{
|
|
pChannel->setVolume(1.0);
|
|
newSoundFileToTransitionTo = pathToFileFromSoundsFolder;
|
|
|
|
m_bFadeOut = true;
|
|
m_bShouldTransition = true;
|
|
m_bFadeIn = true;
|
|
}
|
|
#endif
|