diff --git a/source/ps/Globals.cpp b/source/ps/Globals.cpp index a4d6bde55c..9fdbf0ea2e 100644 --- a/source/ps/Globals.cpp +++ b/source/ps/Globals.cpp @@ -19,7 +19,7 @@ #include "Globals.h" #include "lib/external_libraries/libsdl.h" - +#include "soundmanager/SoundManager.h" bool g_app_minimized = false; bool g_app_has_focus = true; @@ -68,9 +68,15 @@ InReaction GlobalsInputHandler(const SDL_Event_* ev) #else case SDL_ACTIVEEVENT: if(ev->ev.active.state & SDL_APPACTIVE) + { g_app_minimized = (ev->ev.active.gain == 0); // negated + g_SoundManager->Pause( g_app_minimized ); + } if(ev->ev.active.state & SDL_APPINPUTFOCUS) + { g_app_has_focus = (ev->ev.active.gain != 0); + g_SoundManager->Pause( !g_app_has_focus ); + } if(ev->ev.active.state & SDL_APPMOUSEFOCUS) g_mouse_active = (ev->ev.active.gain != 0); return IN_PASS; diff --git a/source/scripting/ScriptGlue.cpp b/source/scripting/ScriptGlue.cpp index d433aee30a..2bf25c9450 100644 --- a/source/scripting/ScriptGlue.cpp +++ b/source/scripting/ScriptGlue.cpp @@ -53,6 +53,7 @@ #include "renderer/Renderer.h" #include "scriptinterface/ScriptInterface.h" #include "simulation2/Simulation2.h" +#include "soundmanager/SoundManager.h" // rationale: the function table is now at the end of the source file to // avoid the need for forward declarations for every function. @@ -340,6 +341,7 @@ JSBool SetPaused(JSContext* cx, uintN argc, jsval* vp) try { g_Game->m_Paused = ToPrimitive (JS_ARGV(cx, vp)[0]); + g_SoundManager->Pause(g_Game->m_Paused); } catch (PSERROR_Scripting_ConversionFailed) { diff --git a/source/soundmanager/SoundManager.cpp b/source/soundmanager/SoundManager.cpp index eb2fb4183f..ff23fb001f 100644 --- a/source/soundmanager/SoundManager.cpp +++ b/source/soundmanager/SoundManager.cpp @@ -270,6 +270,10 @@ CSoundManager::CSoundManager() m_BufferCount = 50; m_BufferSize = 65536; m_MusicEnabled = true; + m_MusicPaused = false; + m_AmbientPaused = false; + m_ActionPaused = false; + m_DistressTime = 0; m_DistressErrCount = 0; @@ -649,5 +653,39 @@ void CSoundManager::SetAmbientItem(ISoundItem* anItem) AL_CHECK } + +void CSoundManager::Pause(bool pauseIt) +{ + PauseMusic(pauseIt); + PauseAmbient(pauseIt); + PauseAction(pauseIt); +} + +void CSoundManager::PauseMusic (bool pauseIt) +{ + if (m_CurrentTune && pauseIt) + m_CurrentTune->Pause(); + else if ( m_CurrentTune ) + m_CurrentTune->Resume(); + + m_MusicPaused = pauseIt; +} + +void CSoundManager::PauseAmbient (bool pauseIt) +{ + if (m_CurrentEnvirons && pauseIt) + m_CurrentEnvirons->Pause(); + else if ( m_CurrentEnvirons ) + m_CurrentEnvirons->Resume(); + + m_AmbientPaused = pauseIt; +} + +void CSoundManager::PauseAction (bool pauseIt) +{ + m_ActionPaused = pauseIt; +} + + #endif // CONFIG2_AUDIO diff --git a/source/soundmanager/SoundManager.h b/source/soundmanager/SoundManager.h index f3518595cd..1c1c90788d 100644 --- a/source/soundmanager/SoundManager.h +++ b/source/soundmanager/SoundManager.h @@ -71,6 +71,10 @@ protected: bool m_MusicEnabled; bool m_SoundEnabled; + bool m_MusicPaused; + bool m_AmbientPaused; + bool m_ActionPaused; + long m_DistressErrCount; long m_DistressTime; @@ -122,6 +126,11 @@ public: void SetDistressThroughShortage(); void SetDistressThroughError(); + void Pause(bool pauseIt); + void PauseMusic (bool pauseIt); + void PauseAmbient (bool pauseIt); + void PauseAction (bool pauseIt); + protected: void InitListener(); virtual Status AlcInit(); diff --git a/source/soundmanager/items/CSoundBase.cpp b/source/soundmanager/items/CSoundBase.cpp index 2ac84e5422..304d6ffd4c 100644 --- a/source/soundmanager/items/CSoundBase.cpp +++ b/source/soundmanager/items/CSoundBase.cpp @@ -381,5 +381,23 @@ CStrW* CSoundBase::GetName() return NULL; } +void CSoundBase::Pause() +{ + if (m_ALSource != 0) + { + alSourcePause(m_ALSource); + AL_CHECK + } +} + +void CSoundBase::Resume() +{ + if (m_ALSource != 0) + { + alSourcePlay(m_ALSource); + AL_CHECK + } +} + #endif // CONFIG2_AUDIO diff --git a/source/soundmanager/items/CSoundBase.h b/source/soundmanager/items/CSoundBase.h index 46b26381f5..aac6d6cc84 100644 --- a/source/soundmanager/items/CSoundBase.h +++ b/source/soundmanager/items/CSoundBase.h @@ -89,6 +89,8 @@ public: virtual void FadeAndDelete(double fadeTime); virtual bool SoundStale(); + void Pause(); + void Resume(); protected: void SetNameFromPath(VfsPath& itemPath); diff --git a/source/soundmanager/items/ISoundItem.h b/source/soundmanager/items/ISoundItem.h index 2e59b7da37..a246f46f32 100644 --- a/source/soundmanager/items/ISoundItem.h +++ b/source/soundmanager/items/ISoundItem.h @@ -64,6 +64,9 @@ public: virtual void SetGain(ALfloat gain) = 0; virtual void SetLocation(const CVector3D& position) = 0; virtual void SetRollOff(ALfloat gain) = 0; + + virtual void Pause() = 0; + virtual void Resume() = 0; }; #endif // CONFIG2_AUDIO