From 999490e88bc699b671b94b88c9a4327d963db378 Mon Sep 17 00:00:00 2001 From: krzys-h Date: Tue, 31 Dec 2013 16:58:21 +0100 Subject: Code for changing music in pause mode As requested by @Emxx52. Only code for now, we don't have the music yet. Temporairly in developements builds music will change to Prototype (in CBot editor) and Constructive Destruction (in SatCom) --- src/app/pausemanager.cpp | 49 ++++++++++++++++++++++++++++++-------- src/app/pausemanager.h | 5 ++++ src/object/robotmain.cpp | 2 +- src/sound/oalsound/alsound.cpp | 54 ++++++++++++++++++++++++++++++++++++++++++ src/sound/oalsound/alsound.h | 9 ++++--- src/sound/oalsound/channel.cpp | 15 ++++++++++++ src/sound/oalsound/channel.h | 1 + src/sound/sound.cpp | 14 +++++++++++ src/sound/sound.h | 25 +++++++++++++------ 9 files changed, 153 insertions(+), 21 deletions(-) diff --git a/src/app/pausemanager.cpp b/src/app/pausemanager.cpp index 847958d..761e158 100644 --- a/src/app/pausemanager.cpp +++ b/src/app/pausemanager.cpp @@ -15,6 +15,7 @@ // * You should have received a copy of the GNU General Public License // * along with this program. If not, see http://www.gnu.org/licenses/. +#include "app/app.h" #include "app/pausemanager.h" #include "common/logger.h" @@ -25,18 +26,43 @@ template<> CPauseManager* CSingleton::m_instance = nullptr; CPauseManager::CPauseManager() { + m_sound = CApplication::GetInstancePointer()->GetSound(); + m_pause = PAUSE_NONE; } CPauseManager::~CPauseManager() { + m_sound = nullptr; } void CPauseManager::SetPause(PauseType pause) { if(pause != PAUSE_NONE) { - if(m_pause != pause) + if(m_pause != pause) { CLogger::GetInstancePointer()->Info("Game paused - %s\n", GetPauseName(pause).c_str()); + switch(pause) { + case PAUSE_EDITOR: + // TODO: We don't have this music yet + // m_sound->PlayPauseMusic(""); + #if DEV_BUILD + m_sound->PlayPauseMusic("Prototype.ogg"); + #endif + break; + + case PAUSE_SATCOM: + // TODO: We don't have this music yet + // m_sound->PlayPauseMusic(""); + #if DEV_BUILD + m_sound->PlayPauseMusic("Constructive.ogg"); + #endif + break; + + default: + // Don't change music + break; + } + } m_pause = pause; } else @@ -45,8 +71,10 @@ void CPauseManager::SetPause(PauseType pause) void CPauseManager::ClearPause() { - if(m_pause != PAUSE_NONE) + if(m_pause != PAUSE_NONE) { CLogger::GetInstancePointer()->Info("Game resumed\n"); + m_sound->StopPauseMusic(); + } m_pause = PAUSE_NONE; } @@ -70,14 +98,15 @@ std::string CPauseManager::GetPauseName(PauseType pause) { switch(pause) { - case PAUSE_NONE: return "None"; - case PAUSE_USER: return "User"; - case PAUSE_SATCOM: return "SatCom"; - case PAUSE_DIALOG: return "Dialog"; - case PAUSE_EDITOR: return "CBot editor"; - case PAUSE_VISIT: return "Visit"; - case PAUSE_CHEAT: return "Cheat console"; - case PAUSE_PHOTO: return "Photo mode"; + case PAUSE_NONE: return "None"; + case PAUSE_USER: return "User"; + case PAUSE_SATCOM: return "SatCom"; + case PAUSE_SATCOMMOVIE: return "SatCom opening animation"; + case PAUSE_DIALOG: return "Dialog"; + case PAUSE_EDITOR: return "CBot editor"; + case PAUSE_VISIT: return "Visit"; + case PAUSE_CHEAT: return "Cheat console"; + case PAUSE_PHOTO: return "Photo mode"; default: assert(false); // Should never happen } } diff --git a/src/app/pausemanager.h b/src/app/pausemanager.h index d2c0eab..fefc4a5 100644 --- a/src/app/pausemanager.h +++ b/src/app/pausemanager.h @@ -22,6 +22,7 @@ #pragma once #include "common/singleton.h" +#include "sound/sound.h" #include @@ -30,6 +31,7 @@ enum PauseType { PAUSE_NONE = 0, PAUSE_USER, PAUSE_SATCOM, + PAUSE_SATCOMMOVIE, PAUSE_DIALOG, PAUSE_EDITOR, PAUSE_VISIT, @@ -52,6 +54,9 @@ public: private: std::string GetPauseName(PauseType pause); +private: + CSoundInterface* m_sound; + PauseType m_pause; }; diff --git a/src/object/robotmain.cpp b/src/object/robotmain.cpp index f1923a5..f8db286 100644 --- a/src/object/robotmain.cpp +++ b/src/object/robotmain.cpp @@ -2174,7 +2174,7 @@ void CRobotMain::StartDisplayInfo(int index, bool movie) { m_movieInfoIndex = index; m_movie->Start(MM_SATCOMopen, 2.5f); - ChangePause(PAUSE_SATCOM); + ChangePause(PAUSE_SATCOMMOVIE); m_infoObject = DeselectAll(); // removes the control buttons m_displayText->HideText(true); return; diff --git a/src/sound/oalsound/alsound.cpp b/src/sound/oalsound/alsound.cpp index 7f5d1f1..5058141 100644 --- a/src/sound/oalsound/alsound.cpp +++ b/src/sound/oalsound/alsound.cpp @@ -31,6 +31,8 @@ ALSound::ALSound() m_currentMusic = nullptr; m_eye.LoadZero(); m_lookat.LoadZero(); + m_previousMusic.fadeTime = 0.0f; + m_previousMusic.music = nullptr; } @@ -62,6 +64,11 @@ void ALSound::CleanUp() { delete item.music; } + + if (m_previousMusic.music) + { + delete m_previousMusic.music; + } for (auto item : m_sounds) { @@ -552,6 +559,15 @@ void ALSound::FrameMove(float delta) } } + if (m_previousMusic.fadeTime > 0.0f) { + if (m_previousMusic.currentTime >= m_previousMusic.fadeTime) { + m_previousMusic.music->Pause(); + } else { + m_previousMusic.currentTime += delta; + m_previousMusic.music->SetVolume(((m_previousMusic.fadeTime-m_previousMusic.currentTime) / m_previousMusic.fadeTime) * m_musicVolume); + } + } + for (auto it : toRemove) m_oldMusic.remove(it); } @@ -609,6 +625,7 @@ bool ALSound::PlayMusic(const std::string &filename, bool bRepeat, float fadeTim buffer = new Buffer(); buffer->LoadFromFile(file.str(), static_cast(-1)); + m_music[filename] = buffer; } else { @@ -633,6 +650,43 @@ bool ALSound::PlayMusic(const std::string &filename, bool bRepeat, float fadeTim return true; } +bool ALSound::PlayPauseMusic(const std::string &filename) +{ + if (m_previousMusic.fadeTime > 0.0f) { + OldMusic old; + old.music = m_currentMusic; + old.fadeTime = 2.0f; + old.currentTime = 0.0f; + m_oldMusic.push_back(old); + m_currentMusic = nullptr; + } else { + if (m_currentMusic) { + m_previousMusic.music = m_currentMusic; + m_previousMusic.fadeTime = 2.0f; + m_previousMusic.currentTime = 0.0f; + m_currentMusic = nullptr; + } + } + return PlayMusic(filename, true); +} + +void ALSound::StopPauseMusic() +{ + if (m_previousMusic.fadeTime > 0.0f) { + StopMusic(); + + m_currentMusic = m_previousMusic.music; + m_previousMusic.music = nullptr; + if(m_currentMusic != nullptr) { + m_currentMusic->SetVolume(m_musicVolume); + if(m_previousMusic.currentTime >= m_previousMusic.fadeTime) { + m_currentMusic->Play(); + } + } + m_previousMusic.fadeTime = 0.0f; + } +} + bool ALSound::RestartMusic() { diff --git a/src/sound/oalsound/alsound.h b/src/sound/oalsound/alsound.h index cd3bdd5..6fb832e 100644 --- a/src/sound/oalsound/alsound.h +++ b/src/sound/oalsound/alsound.h @@ -72,12 +72,14 @@ public: bool StopAll(); bool MuteAll(bool bMute); - bool PlayMusic(int rank, bool bRepeat, float fadeTime=5.0f); - bool PlayMusic(const std::string &filename, bool bRepeat, float fadeTime=5.0f); + bool PlayMusic(int rank, bool bRepeat, float fadeTime=2.0f); + bool PlayMusic(const std::string &filename, bool bRepeat, float fadeTime=2.0f); bool RestartMusic(); void SuspendMusic(); - void StopMusic(float fadeTime=5.0f); + void StopMusic(float fadeTime=2.0f); bool IsPlayingMusic(); + bool PlayPauseMusic(const std::string &filename); + void StopPauseMusic(); private: void CleanUp(); @@ -94,6 +96,7 @@ private: std::map m_channels; Channel *m_currentMusic; std::list m_oldMusic; + OldMusic m_previousMusic; Math::Vector m_eye; Math::Vector m_lookat; }; diff --git a/src/sound/oalsound/channel.cpp b/src/sound/oalsound/channel.cpp index b053316..e58ab54 100644 --- a/src/sound/oalsound/channel.cpp +++ b/src/sound/oalsound/channel.cpp @@ -74,6 +74,21 @@ bool Channel::Play() return true; } +bool Channel::Pause() +{ + if(!m_ready || !IsPlaying()) + { + return false; + } + + alSourcePause(m_source); + if (alCheck()) + { + GetLogger()->Warn("Could not pause audio sound source. Code: %d\n", alGetCode()); + } + return true; +} + bool Channel::SetPosition(const Math::Vector &pos) { diff --git a/src/sound/oalsound/channel.h b/src/sound/oalsound/channel.h index 0c6cafc..f973198 100644 --- a/src/sound/oalsound/channel.h +++ b/src/sound/oalsound/channel.h @@ -50,6 +50,7 @@ public: ~Channel(); bool Play(); + bool Pause(); bool Stop(); bool SetPosition(const Math::Vector &); diff --git a/src/sound/sound.cpp b/src/sound/sound.cpp index 1605e2b..3802611 100644 --- a/src/sound/sound.cpp +++ b/src/sound/sound.cpp @@ -59,6 +59,12 @@ void CSoundInterface::AddMusicFiles(const std::string &path) CacheMusic("Intro2.ogg"); CacheMusic("music010.ogg"); CacheMusic("music011.ogg"); + // TODO: Add pause music here + // CacheMusic(""); + #if DEV_BUILD + CacheMusic("Prototype.ogg"); + CacheMusic("Constructive.ogg"); + #endif } bool CSoundInterface::Cache(Sound bSound, const std::string &bFile) @@ -175,3 +181,11 @@ bool CSoundInterface::IsPlayingMusic() return true; } +bool CSoundInterface::PlayPauseMusic(const std::string &filename) +{ + return true; +} + +void CSoundInterface::StopPauseMusic() +{ +} diff --git a/src/sound/sound.h b/src/sound/sound.h index d2eee9c..135ee43 100644 --- a/src/sound/sound.h +++ b/src/sound/sound.h @@ -287,7 +287,7 @@ public: * \param fadeTime - time of transition between music * \return return true on success */ - virtual bool PlayMusic(int rank, bool bRepeat, float fadeTime=5.0f); + virtual bool PlayMusic(int rank, bool bRepeat, float fadeTime=2.0f); /** Start playing music * \param filename - name of file to play @@ -295,27 +295,38 @@ public: * \param fadeTime - time of transition between music * \return return true on success */ - virtual bool PlayMusic(const std::string &filename, bool bRepeat, float fadeTime=5.0f); + virtual bool PlayMusic(const std::string &filename, bool bRepeat, float fadeTime=2.0f); /** Restart music - * @return return true on success + * \return return true on success */ virtual bool RestartMusic(); - /** Susspend paying music - * \return return true on success + /** Susspend playing music + * \return nothing */ virtual void SuspendMusic(); /** Stop playing music - * \return return true on success + * \return nothing */ - virtual void StopMusic(float fadeTime=5.0f); + virtual void StopMusic(float fadeTime=2.0f); /** Check if music if playing * \return return true if music is playing */ virtual bool IsPlayingMusic(); + + /** Start playing pause music + * \param filename - name of file to play + * \return return true on success + */ + virtual bool PlayPauseMusic(const std::string &filename); + + /** Stop playing pause music and return to the mission music + * \return nothing + */ + virtual void StopPauseMusic(); protected: std::string m_soundPath; -- cgit v1.2.3-1-g7c22