Files
firestorm/Gameleap/code/mw4/Code/MW4/ABLAudio.cpp
T
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

245 lines
4.9 KiB
C++

#include "MW4Headers.hpp"
#include "ABLAudio.hpp"
#include <Adept\AudioChannel.hpp>
#include <Adept\AudioCommand.hpp>
#include <Adept\AudioRenderer.hpp>
#include "mwguimanager.hpp"
#include "hudcomm.hpp"
using namespace ABL;
using namespace Stuff;
AudioManager* AudioManager::m_Instance = 0;
int AudioManager::m_RefCount = 0;
AudioManager::AudioManager()
: m_AudioCommands(0)
, m_MusicCommands(0)
, m_OldTimeout(0)
, m_NewVolume(1)
, m_TransitionBegin(0)
, m_TransitionEnd(0)
{
}
AudioManager::~AudioManager()
{
m_WhoIsTalking.clear ();
}
void AudioManager::SetVOPlayed(int hash)
{
m_PlayedVoiceOvers.insert(hash);
}
void AudioManager::IncrementRefCount()
{
if (m_Instance == 0)
{
m_Instance = new AudioManager;
}
++m_RefCount;
}
void AudioManager::DecrementRefCount()
{
Verify(m_RefCount > 0);
Verify(m_Instance != 0);
--m_RefCount;
if (m_RefCount == 0)
{
delete m_Instance;
m_Instance = 0;
}
}
void AudioManager::Load(MemoryStream *stream)
{
Verify(1 == 0);
// BUGBUG: TODO: NOT YET IMPLEMENTED
}
void AudioManager::Save(MemoryStream *stream)
{
Verify(1 == 0);
// BUGBUG: TODO: NOT YET IMPLEMENTED
}
void AudioManager::AddCommand(AudioCommand* command,int talker_id)
{
m_AudioCommands.Add(command);
m_WhoIsTalking[command] = talker_id;
}
void AudioManager::DeleteAllCommands()
{
ChainIteratorOf<AudioCommand *> i(&m_AudioCommands);
AudioCommand *command;
while((command = i.ReadAndNext()) != NULL)
{
command->Stop();
}
m_WhoIsTalking.clear ();
}
void AudioManager::Update()
{
if (m_AudioCommands.GetSize () != 0)
{
MWGUIManager *gui;
gui = MWGUIManager::GetInstance ();
if (gui)
{
HUDComm *comm;
comm = Cast_Object (HUDComm *,gui->Component (MWGUIManager::HUD_COMM));
Verify (comm);
std::map<AudioCommand *,int>::iterator iter;
iter = m_WhoIsTalking.find (m_AudioCommands.GetNth(0));
int id;
if (iter == m_WhoIsTalking.end ())
id = -1;
else
id = iter->second;
comm->PlayVideo (id,m_AudioCommands.GetNth(0));
}
}
if ((m_MusicCommands.GetSize() == 0) ||
(m_TransitionEnd == 0))
{
return;
}
if ((m_MusicCommands.GetSize() > 1) &&
(gos_GetElapsedTime() > m_TransitionBegin + m_OldTimeout))
{
{
ChainIteratorOf<AudioCommand*> i(&m_MusicCommands);
AudioCommand* command = i.ReadAndNext();
command->Stop();
}
{
ChainIteratorOf<AudioCommand*> i(&m_MusicCommands);
AudioCommand* command = i.ReadAndNext();
command->Play();
}
}
ChainIteratorOf<AudioCommand*> i(&m_MusicCommands);
AudioCommand* command = i.ReadAndNext();
if (command->GetPlayMode() == gosAudio_Stop)
{
command->Play();
}
if ((AudioRenderer::Instance != 0) &&
(AudioRenderer::Instance->m_channelTypes.GetLength() > AudioRenderer::MusicType))
{
AudioRenderer::Instance->m_channelTypes[AudioRenderer::MusicType].SetVolume(GetFadeVolume());
}
if (gos_GetElapsedTime() > m_TransitionEnd)
{
m_TransitionBegin = 0;
m_TransitionEnd = 0;
}
}
void AudioManager::AddMusicCommand(AudioCommand* command, Scalar old_timeout, Scalar new_timein, Scalar new_volume)
{
m_MusicCommands.Add(command);
while (m_MusicCommands.GetSize() > 2)
{
ChainIteratorOf<AudioCommand*> i(&m_MusicCommands);
i.ReadAndNext();
i.Remove();
}
if (m_MusicCommands.GetSize() == 1)
{
old_timeout = 0;
command->Play();
}
m_OldVolume = m_NewVolume;
m_OldTimeout = old_timeout;
m_NewVolume = new_volume;
m_TransitionBegin = (Stuff::Scalar)gos_GetElapsedTime();
m_TransitionEnd = m_TransitionBegin + m_OldTimeout + new_timein;
}
Scalar AudioManager::GetFadeVolume() const
{
const Scalar elapsed_time((Scalar)gos_GetElapsedTime());
if (elapsed_time > m_TransitionEnd)
{
return (m_NewVolume);
}
if (elapsed_time < m_TransitionBegin)
{
return (m_OldVolume);
}
if (elapsed_time < m_TransitionBegin + m_OldTimeout)
{
Scalar normalized = ((Scalar)gos_GetElapsedTime() - m_TransitionBegin) / (m_OldTimeout);
return (m_OldVolume * (1 - normalized));
}
Scalar middle = m_TransitionBegin + m_OldTimeout;
Scalar normalized = (elapsed_time - middle) / (m_TransitionEnd - middle);
return (m_NewVolume * normalized);
}
void AudioManager::MapTalker(int talker, Adept::ObjectID object_id)
{
talker_mapping::iterator found = m_TalkerMappings.find(talker);
if (found != m_TalkerMappings.end())
{
(*found).second = object_id;
return;
}
talker_pair p(talker,object_id);
m_TalkerMappings.insert(p);
}
Adept::ObjectID AudioManager::TalkerObjectID(int talker)
{
talker_mapping::iterator found = m_TalkerMappings.find(talker);
if (found == m_TalkerMappings.end())
{
return (-2);
}
return ((*found).second);
}
bool AudioManager::IsVoiceOverPlaying()
{
return (m_AudioCommands.GetSize() != 0);
}
bool AudioManager::IsMusicPlaying()
{
return (m_MusicCommands.GetSize() != 0);
}