diff --git a/stepmania/src/Screen.cpp b/stepmania/src/Screen.cpp index ec0d39b233..8c7e784f41 100644 --- a/stepmania/src/Screen.cpp +++ b/stepmania/src/Screen.cpp @@ -298,6 +298,7 @@ void Screen::ClearMessageQueue( const ScreenMessage SM ) #include "ScreenSelectMaster.h" #include "ScreenEditCoursesMenu.h" #include "ScreenProfileOptions.h" +#include "ScreenExit.h" Screen* Screen::Create( CString sClassName ) { @@ -366,6 +367,7 @@ Screen* Screen::Create( CString sClassName ) IF_RETURN( ScreenSelectMaster ); IF_RETURN( ScreenEditCoursesMenu ); IF_RETURN( ScreenProfileOptions ); + IF_RETURN( ScreenExit ); RageException::Throw( "Invalid Screen class name '%s'", sClassName.c_str() ); } diff --git a/stepmania/src/ScreenExit.cpp b/stepmania/src/ScreenExit.cpp new file mode 100644 index 0000000000..ac95e61e20 --- /dev/null +++ b/stepmania/src/ScreenExit.cpp @@ -0,0 +1,52 @@ +#include "global.h" + +#include "ScreenExit.h" +#include "RageUtil.h" +#include "RageSoundManager.h" +#include "RageSounds.h" +#include "RageSound.h" +#include "RageLog.h" +#include "StepMania.h" + +ScreenExit::ScreenExit(): Screen("ScreenExit") +{ + m_Exited = false; + + /* It'd be better for any previous screen playing music to fade it out as it fades + * out the screen. XXX: Check to see if it's fading out; if it'll stop playing in + * reasonable time, let it. */ + SOUND->StopMusic(); +} + +void ScreenExit::Update( float fDelta ) +{ + if( m_Exited ) + return; + + /* Grab the list of playing sounds, and see if it's empty. */ + const set &PlayingSounds = SOUNDMAN->GetPlayingSounds(); + bool DoQuit = PlayingSounds.empty(); + + /* As a safety precaution, don't wait indefinitely, in case some sound was + * inadvertently set to play too long. */ + if( !DoQuit && m_ShutdownTimer.PeekDeltaTime() > 3 ) + { + DoQuit = true; + CString warn = ssprintf("ScreenExit: %i sound%s failed to finish playing quickly: ", + PlayingSounds.size() ); + for( set::const_iterator i = PlayingSounds.begin(); + i != PlayingSounds.end(); ++i ) + { + warn += (*i)->GetLoadedFilePath() + "; "; + } + + LOG->Warn("%s", warn.c_str() ); + } + + if( DoQuit ) + { + m_Exited = true; + LOG->Trace("ScreenExit: shutting down"); + ExitGame(); + } +} diff --git a/stepmania/src/ScreenExit.h b/stepmania/src/ScreenExit.h new file mode 100644 index 0000000000..2f6e44c78b --- /dev/null +++ b/stepmania/src/ScreenExit.h @@ -0,0 +1,18 @@ +#ifndef SCREEN_EXIT_H +#define SCREEN_EXIT_H + +#include "Screen.h" +#include "RageTimer.h" + +class ScreenExit: public Screen +{ + bool m_Exited; + RageTimer m_ShutdownTimer; + +public: + ScreenExit(); + void Update( float fDelta ); +}; + + +#endif diff --git a/stepmania/src/StepMania.vcproj b/stepmania/src/StepMania.vcproj index ac496d4c6d..b0a9b88f13 100644 --- a/stepmania/src/StepMania.vcproj +++ b/stepmania/src/StepMania.vcproj @@ -247,6 +247,12 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)"\ + + + +