summaryrefslogtreecommitdiffstats
path: root/src
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 /src
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)
Diffstat (limited to 'src')
-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;