summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkrzys-h <krzys_h@interia.pl>2013-12-31 16:58:21 +0100
committerkrzys-h <krzys_h@interia.pl>2013-12-31 16:58:21 +0100
commit999490e88bc699b671b94b88c9a4327d963db378 (patch)
treed2f27e5c80fe00358e5759e9ee40b2fd11d1ccff
parent4a237f5925eb0d371e097416b17dd5e919cd2258 (diff)
downloadcolobot-999490e88bc699b671b94b88c9a4327d963db378.tar.gz
colobot-999490e88bc699b671b94b88c9a4327d963db378.tar.bz2
colobot-999490e88bc699b671b94b88c9a4327d963db378.zip
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)
-rw-r--r--src/app/pausemanager.cpp49
-rw-r--r--src/app/pausemanager.h5
-rw-r--r--src/object/robotmain.cpp2
-rw-r--r--src/sound/oalsound/alsound.cpp54
-rw-r--r--src/sound/oalsound/alsound.h9
-rw-r--r--src/sound/oalsound/channel.cpp15
-rw-r--r--src/sound/oalsound/channel.h1
-rw-r--r--src/sound/sound.cpp14
-rw-r--r--src/sound/sound.h25
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<CPauseManager>::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 <string>
@@ -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<Sound>(-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<int, Channel*> m_channels;
Channel *m_currentMusic;
std::list<OldMusic> 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;