Modified music handling, fixing the music heard during GP lost/won
git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@5513 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
parent
c496a82654
commit
4afb71659f
@ -38,7 +38,8 @@ public:
|
|||||||
virtual void updateFading(float percent) = 0;
|
virtual void updateFading(float percent) = 0;
|
||||||
virtual void updateFaster(float percent, float pitch) = 0;
|
virtual void updateFaster(float percent, float pitch) = 0;
|
||||||
virtual void update () = 0;
|
virtual void update () = 0;
|
||||||
|
virtual bool isPlaying () = 0;
|
||||||
|
|
||||||
virtual ~Music () {};
|
virtual ~Music () {};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -339,3 +339,10 @@ void MusicInformation::switchToFastMusic()
|
|||||||
} // switchToFastMusic
|
} // switchToFastMusic
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool MusicInformation::isPlaying() const
|
||||||
|
{
|
||||||
|
return (m_normal_music != NULL && m_normal_music->isPlaying()) || (m_fast_music != NULL && m_fast_music->isPlaying());
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
@ -82,5 +82,6 @@ public:
|
|||||||
void resumeMusic ();
|
void resumeMusic ();
|
||||||
void volumeMusic (float gain);
|
void volumeMusic (float gain);
|
||||||
void switchToFastMusic();
|
void switchToFastMusic();
|
||||||
|
bool isPlaying() const;
|
||||||
}; // MusicInformation
|
}; // MusicInformation
|
||||||
#endif
|
#endif
|
||||||
|
@ -134,8 +134,11 @@ void MusicManager::addMusicToTracks()
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void MusicManager::startMusic(MusicInformation* mi)
|
void MusicManager::startMusic(MusicInformation* mi)
|
||||||
{
|
{
|
||||||
|
// If this music is already playing, ignore this call.
|
||||||
|
if (m_current_music != NULL && m_current_music == mi && m_current_music->isPlaying()) return;
|
||||||
|
|
||||||
// It is possible here that startMusic() will be called without first calling stopMusic().
|
// It is possible here that startMusic() will be called without first calling stopMusic().
|
||||||
// This would cause a memory leak by overwriting m_current_music without first releasing it's resources.
|
// This would cause a memory leak by overwriting m_current_music without first releasing its resources.
|
||||||
// Guard against this here by making sure that stopMusic() is called before starting new music.
|
// Guard against this here by making sure that stopMusic() is called before starting new music.
|
||||||
stopMusic();
|
stopMusic();
|
||||||
m_current_music = mi;
|
m_current_music = mi;
|
||||||
|
@ -60,7 +60,8 @@ public:
|
|||||||
virtual bool pauseMusic();
|
virtual bool pauseMusic();
|
||||||
virtual bool resumeMusic();
|
virtual bool resumeMusic();
|
||||||
virtual void volumeMusic (float gain);
|
virtual void volumeMusic (float gain);
|
||||||
|
virtual bool isPlaying();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool empty();
|
bool empty();
|
||||||
bool check(const char* what);
|
bool check(const char* what);
|
||||||
@ -68,7 +69,6 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
bool release();
|
bool release();
|
||||||
bool isPlaying();
|
|
||||||
bool streamIntoBuffer(ALuint buffer);
|
bool streamIntoBuffer(ALuint buffer);
|
||||||
|
|
||||||
std::string m_fileName;
|
std::string m_fileName;
|
||||||
|
@ -98,8 +98,11 @@ void AbstractStateManager::pushMenu(std::string name)
|
|||||||
setGameState(MENU);
|
setGameState(MENU);
|
||||||
}
|
}
|
||||||
switchToScreen(name.c_str());
|
switchToScreen(name.c_str());
|
||||||
|
|
||||||
|
onTopMostScreenChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
void AbstractStateManager::pushScreen(Screen* screen)
|
void AbstractStateManager::pushScreen(Screen* screen)
|
||||||
@ -107,6 +110,8 @@ void AbstractStateManager::pushScreen(Screen* screen)
|
|||||||
if (!screen->isLoaded()) screen->loadFromFile();
|
if (!screen->isLoaded()) screen->loadFromFile();
|
||||||
pushMenu(screen->getName());
|
pushMenu(screen->getName());
|
||||||
screen->init();
|
screen->init();
|
||||||
|
|
||||||
|
onTopMostScreenChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
@ -128,6 +133,8 @@ void AbstractStateManager::replaceTopMostScreen(Screen* screen)
|
|||||||
|
|
||||||
// Send init event to new menu
|
// Send init event to new menu
|
||||||
getCurrentScreen()->init();
|
getCurrentScreen()->init();
|
||||||
|
|
||||||
|
onTopMostScreenChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
@ -149,6 +156,8 @@ void AbstractStateManager::reshowTopMostMenu()
|
|||||||
Screen* screen = getCurrentScreen();
|
Screen* screen = getCurrentScreen();
|
||||||
if (!screen->isLoaded()) screen->loadFromFile();
|
if (!screen->isLoaded()) screen->loadFromFile();
|
||||||
screen->init();
|
screen->init();
|
||||||
|
|
||||||
|
onTopMostScreenChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
@ -183,6 +192,8 @@ void AbstractStateManager::popMenu()
|
|||||||
if (!screen->isLoaded()) screen->loadFromFile();
|
if (!screen->isLoaded()) screen->loadFromFile();
|
||||||
screen->init();
|
screen->init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onTopMostScreenChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
@ -202,6 +213,8 @@ void AbstractStateManager::resetAndGoToScreen(Screen* screen)
|
|||||||
|
|
||||||
switchToScreen(name.c_str());
|
switchToScreen(name.c_str());
|
||||||
getCurrentScreen()->init();
|
getCurrentScreen()->init();
|
||||||
|
|
||||||
|
onTopMostScreenChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
@ -223,6 +236,8 @@ void AbstractStateManager::resetAndSetStack(Screen* screens[])
|
|||||||
|
|
||||||
switchToScreen(m_menu_stack[m_menu_stack.size()-1].c_str());
|
switchToScreen(m_menu_stack[m_menu_stack.size()-1].c_str());
|
||||||
getCurrentScreen()->init();
|
getCurrentScreen()->init();
|
||||||
|
|
||||||
|
onTopMostScreenChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -116,6 +116,8 @@ namespace GUIEngine
|
|||||||
*/
|
*/
|
||||||
virtual void onStackEmptied() = 0;
|
virtual void onStackEmptied() = 0;
|
||||||
|
|
||||||
|
virtual void onTopMostScreenChanged() = 0;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
#include "irrlicht.h"
|
#include "irrlicht.h"
|
||||||
|
|
||||||
|
#include "config/stk_config.hpp"
|
||||||
#include "guiengine/engine.hpp"
|
#include "guiengine/engine.hpp"
|
||||||
#include "guiengine/widget.hpp"
|
#include "guiengine/widget.hpp"
|
||||||
#include "input/input.hpp"
|
#include "input/input.hpp"
|
||||||
@ -267,7 +268,7 @@ namespace GUIEngine
|
|||||||
*/
|
*/
|
||||||
virtual void onUpdate(float dt, irr::video::IVideoDriver*) { };
|
virtual void onUpdate(float dt, irr::video::IVideoDriver*) { };
|
||||||
|
|
||||||
|
virtual MusicInformation* getMusic() const { return stk_config->m_title_music; }
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -118,20 +118,12 @@ void MainLoop::run()
|
|||||||
{
|
{
|
||||||
IrrlichtDevice* device = irr_driver->getDevice();
|
IrrlichtDevice* device = irr_driver->getDevice();
|
||||||
|
|
||||||
bool music_on = false;
|
|
||||||
m_curr_time = device->getTimer()->getRealTime();
|
m_curr_time = device->getTimer()->getRealTime();
|
||||||
while(!m_abort)
|
while(!m_abort)
|
||||||
{
|
{
|
||||||
m_prev_time = m_curr_time;
|
m_prev_time = m_curr_time;
|
||||||
float dt = getLimitedDt();
|
float dt = getLimitedDt();
|
||||||
|
|
||||||
if (!music_on && !World::getWorld())
|
|
||||||
{
|
|
||||||
//FIXME: that code can't really work, I don't think "music_on" is updated everytime it should
|
|
||||||
music_manager->stopMusic(); // stop potential 'left over' music from race
|
|
||||||
music_manager->startMusic(stk_config->m_title_music);
|
|
||||||
music_on = true;
|
|
||||||
}
|
|
||||||
network_manager->update(dt);
|
network_manager->update(dt);
|
||||||
|
|
||||||
if (World::getWorld()) // race is active if world exists
|
if (World::getWorld()) // race is active if world exists
|
||||||
@ -140,7 +132,6 @@ void MainLoop::run()
|
|||||||
// till all clients have reached this state.
|
// till all clients have reached this state.
|
||||||
if (network_manager->getState()==NetworkManager::NS_READY_SET_GO_BARRIER) continue;
|
if (network_manager->getState()==NetworkManager::NS_READY_SET_GO_BARRIER) continue;
|
||||||
updateRace(dt);
|
updateRace(dt);
|
||||||
music_on = false;
|
|
||||||
} // if race is active
|
} // if race is active
|
||||||
|
|
||||||
music_manager->update(dt);
|
music_manager->update(dt);
|
||||||
|
@ -47,6 +47,8 @@ GrandPrixLose::GrandPrixLose() : Screen("grand_prix_lose.stkgui")
|
|||||||
setNeeds3D(true);
|
setNeeds3D(true);
|
||||||
|
|
||||||
m_throttle_FPS = false;
|
m_throttle_FPS = false;
|
||||||
|
|
||||||
|
m_music = music_manager->getMusicInformation(file_manager->getMusicFile("lose_theme.music"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
@ -60,7 +62,7 @@ void GrandPrixLose::loadedFromFile()
|
|||||||
|
|
||||||
void GrandPrixLose::init()
|
void GrandPrixLose::init()
|
||||||
{
|
{
|
||||||
music_manager->startMusic(music_manager->getMusicInformation(file_manager->getMusicFile("lose_theme.music")));
|
//music_manager->startMusic(music_manager->getMusicInformation(file_manager->getMusicFile("lose_theme.music")));
|
||||||
|
|
||||||
m_phase = 1;
|
m_phase = 1;
|
||||||
m_sky_angle = 0.0f;
|
m_sky_angle = 0.0f;
|
||||||
|
@ -39,6 +39,8 @@ class GrandPrixLose : public GUIEngine::Screen, public GUIEngine::ScreenSingleto
|
|||||||
|
|
||||||
float m_camera_x, m_camera_y, m_camera_z;
|
float m_camera_x, m_camera_y, m_camera_z;
|
||||||
float m_camera_target_x, m_camera_target_z;
|
float m_camera_target_x, m_camera_target_z;
|
||||||
|
|
||||||
|
MusicInformation* m_music;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -59,6 +61,8 @@ public:
|
|||||||
|
|
||||||
void setKart(const std::string ident);
|
void setKart(const std::string ident);
|
||||||
|
|
||||||
|
virtual MusicInformation* getMusic() const { return m_music; }
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -34,6 +34,8 @@ GrandPrixWin::GrandPrixWin() : Screen("grand_prix_win.stkgui")
|
|||||||
setNeeds3D(true);
|
setNeeds3D(true);
|
||||||
|
|
||||||
m_throttle_FPS = false;
|
m_throttle_FPS = false;
|
||||||
|
|
||||||
|
m_music = music_manager->getMusicInformation(file_manager->getMusicFile("win_theme.music"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
@ -127,7 +129,7 @@ void GrandPrixWin::init()
|
|||||||
unlocked_label->add();
|
unlocked_label->add();
|
||||||
}
|
}
|
||||||
|
|
||||||
music_manager->startMusic(music_manager->getMusicInformation(file_manager->getMusicFile("win_theme.music")));
|
//music_manager->startMusic(music_manager->getMusicInformation(file_manager->getMusicFile("win_theme.music")));
|
||||||
|
|
||||||
m_phase = 1;
|
m_phase = 1;
|
||||||
m_sky_angle = 0.0f;
|
m_sky_angle = 0.0f;
|
||||||
|
@ -41,6 +41,8 @@ class GrandPrixWin : public GUIEngine::Screen, public GUIEngine::ScreenSingleton
|
|||||||
float m_camera_x, m_camera_y, m_camera_z;
|
float m_camera_x, m_camera_y, m_camera_z;
|
||||||
float m_camera_target_x, m_camera_target_z;
|
float m_camera_target_x, m_camera_target_z;
|
||||||
|
|
||||||
|
MusicInformation* m_music;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/** \brief implement callback from parent class GUIEngine::Screen */
|
/** \brief implement callback from parent class GUIEngine::Screen */
|
||||||
@ -61,6 +63,7 @@ public:
|
|||||||
/** \pre must be called after pushing the screen, but before onUpdate had the chance to be invoked */
|
/** \pre must be called after pushing the screen, but before onUpdate had the chance to be invoked */
|
||||||
void setKarts(const std::string idents[3]);
|
void setKarts(const std::string idents[3]);
|
||||||
|
|
||||||
|
virtual MusicInformation* getMusic() const { return m_music; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -198,7 +198,11 @@ void StateManager::onGameStateChange(GameState previousState, GameState newState
|
|||||||
|
|
||||||
if (newState == MENU)
|
if (newState == MENU)
|
||||||
{
|
{
|
||||||
music_manager->startMusic(stk_config->m_title_music);
|
Screen* screen = GUIEngine::getCurrentScreen();
|
||||||
|
if (screen != NULL)
|
||||||
|
{
|
||||||
|
music_manager->startMusic(GUIEngine::getCurrentScreen()->getMusic());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (newState == INGAME_MENU)
|
else if (newState == INGAME_MENU)
|
||||||
{
|
{
|
||||||
@ -211,6 +215,13 @@ void StateManager::onGameStateChange(GameState previousState, GameState newState
|
|||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void StateManager::onTopMostScreenChanged()
|
||||||
|
{
|
||||||
|
music_manager->startMusic(GUIEngine::getCurrentScreen()->getMusic());
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
void StateManager::onStackEmptied()
|
void StateManager::onStackEmptied()
|
||||||
{
|
{
|
||||||
main_loop->abort();
|
main_loop->abort();
|
||||||
|
@ -141,6 +141,9 @@ public:
|
|||||||
/** \brief implementing callback from base class AbstractStateManager */
|
/** \brief implementing callback from base class AbstractStateManager */
|
||||||
virtual void onStackEmptied();
|
virtual void onStackEmptied();
|
||||||
|
|
||||||
|
/** \brief implementing callback from base class AbstractStateManager */
|
||||||
|
virtual void onTopMostScreenChanged();
|
||||||
|
|
||||||
// singleton
|
// singleton
|
||||||
static StateManager* get();
|
static StateManager* get();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user