From 90e8762cd56f88d90e5f9e7abf27ad13d822060d Mon Sep 17 00:00:00 2001 From: yangws Date: Mon, 24 Jan 2011 14:31:51 +0800 Subject: [PATCH] fixed bug: tests::CocosDenshionTest can't exit program when music playing. --- CocosDenshion/win32/SimpleAudioEngine.cpp | 172 +++++++++++----------- 1 file changed, 89 insertions(+), 83 deletions(-) diff --git a/CocosDenshion/win32/SimpleAudioEngine.cpp b/CocosDenshion/win32/SimpleAudioEngine.cpp index f2ff497145..7ffcffaf91 100644 --- a/CocosDenshion/win32/SimpleAudioEngine.cpp +++ b/CocosDenshion/win32/SimpleAudioEngine.cpp @@ -10,21 +10,29 @@ using namespace std; namespace CocosDenshion { typedef map EffectList; -typedef pair Effect; - -static SimpleAudioEngine s_SharedEngine; -static EffectList s_List; -static MciPlayer s_Music; -static char s_szRootPath[MAX_PATH]; -static DWORD s_dwRootLen; -static char s_szFullPath[MAX_PATH]; +typedef pair Effect; +static char s_szRootPath[MAX_PATH]; +static DWORD s_dwRootLen; +static char s_szFullPath[MAX_PATH]; static const char * _FullPath(const char * szPath); static unsigned int _Hash(const char *key); #define BREAK_IF(cond) if (cond) break; +static EffectList& sharedList() +{ + static EffectList s_List; + return s_List; +} + +static MciPlayer& sharedMusic() +{ + static MciPlayer s_Music; + return s_Music; +} + SimpleAudioEngine::SimpleAudioEngine() { } @@ -35,12 +43,15 @@ SimpleAudioEngine::~SimpleAudioEngine() SimpleAudioEngine* SimpleAudioEngine::sharedEngine() { + static SimpleAudioEngine s_SharedEngine; return &s_SharedEngine; } void SimpleAudioEngine::end() { - return; + sharedMusic().Close(); + sharedList().clear(); + return; } void SimpleAudioEngine::setResource(const char* pszResPath, const char* pszZipFileName) @@ -53,40 +64,40 @@ void SimpleAudioEngine::setResource(const char* pszResPath, const char* pszZipFi void SimpleAudioEngine::playBackgroundMusic(const char* pszFilePath, bool bLoop) { - if (! pszFilePath) - { - return; - } + if (! pszFilePath) + { + return; + } - s_Music.Open(_FullPath(pszFilePath), _Hash(pszFilePath)); - s_Music.Play((bLoop) ? -1 : 1); + sharedMusic().Open(_FullPath(pszFilePath), _Hash(pszFilePath)); + sharedMusic().Play((bLoop) ? -1 : 1); } void SimpleAudioEngine::stopBackgroundMusic(bool bReleaseData) { if (bReleaseData) { - s_Music.Close(); + sharedMusic().Close(); } else { - s_Music.Stop(); + sharedMusic().Stop(); } } void SimpleAudioEngine::pauseBackgroundMusic() { - s_Music.Pause(); + sharedMusic().Pause(); } void SimpleAudioEngine::resumeBackgroundMusic() { - s_Music.Resume(); + sharedMusic().Resume(); } void SimpleAudioEngine::rewindBackgroundMusic() { - s_Music.Rewind(); + sharedMusic().Rewind(); } bool SimpleAudioEngine::willPlayBackgroundMusic() @@ -96,7 +107,7 @@ bool SimpleAudioEngine::willPlayBackgroundMusic() bool SimpleAudioEngine::isBackgroundMusicPlaying() { - return s_Music.IsPlaying(); + return sharedMusic().IsPlaying(); } ////////////////////////////////////////////////////////////////////////// @@ -107,46 +118,46 @@ unsigned int SimpleAudioEngine::playEffect(const char* pszFilePath) { unsigned int nRet = _Hash(pszFilePath); - preloadEffect(pszFilePath); + preloadEffect(pszFilePath); - EffectList::iterator p = s_List.find(nRet); - if (p != s_List.end()) + EffectList::iterator p = sharedList().find(nRet); + if (p != sharedList().end()) { p->second.Rewind(); } - return nRet; + return nRet; } void SimpleAudioEngine::stopEffect(unsigned int nSoundId) { - EffectList::iterator p = s_List.find(nSoundId); - if (p != s_List.end()) - { - p->second.Stop(); - } + EffectList::iterator p = sharedList().find(nSoundId); + if (p != sharedList().end()) + { + p->second.Stop(); + } } void SimpleAudioEngine::preloadEffect(const char* pszFilePath) { - int nRet = 0; - do - { - BREAK_IF(! pszFilePath); + int nRet = 0; + do + { + BREAK_IF(! pszFilePath); - nRet = _Hash(pszFilePath); + nRet = _Hash(pszFilePath); - BREAK_IF(s_List.end() != s_List.find(nRet)); + BREAK_IF(sharedList().end() != sharedList().find(nRet)); - s_List.insert(Effect(nRet, MciPlayer())); - MciPlayer& player = s_List[nRet]; - player.Open(_FullPath(pszFilePath), nRet); + sharedList().insert(Effect(nRet, MciPlayer())); + MciPlayer& player = sharedList()[nRet]; + player.Open(_FullPath(pszFilePath), nRet); - BREAK_IF(nRet == player.GetSoundID()); + BREAK_IF(nRet == player.GetSoundID()); - s_List.erase(nRet); - nRet = 0; - } while (0); + sharedList().erase(nRet); + nRet = 0; + } while (0); } void SimpleAudioEngine::preloadBackgroundMusic(const char* pszFilePath) @@ -157,21 +168,16 @@ void SimpleAudioEngine::preloadBackgroundMusic(const char* pszFilePath) void SimpleAudioEngine::unloadEffect(const char* pszFilePath) { unsigned int nID = _Hash(pszFilePath); - s_List.erase(nID); + sharedList().erase(nID); } -// void SimpleAudioEngine::unloadEffectAll() -// { -// s_List.clear(); -// } - ////////////////////////////////////////////////////////////////////////// // volume interface ////////////////////////////////////////////////////////////////////////// float SimpleAudioEngine::getBackgroundMusicVolume() { - return 1.0; + return 1.0; } void SimpleAudioEngine::setBackgroundMusicVolume(float volume) @@ -180,7 +186,7 @@ void SimpleAudioEngine::setBackgroundMusicVolume(float volume) float SimpleAudioEngine::getEffectsVolume() { - return 1.0; + return 1.0; } void SimpleAudioEngine::setEffectsVolume(float volume) @@ -193,44 +199,44 @@ void SimpleAudioEngine::setEffectsVolume(float volume) const char * _FullPath(const char * szPath) { - if (! s_szRootPath[0]) - { - s_dwRootLen = GetModuleFileName(NULL, s_szRootPath, sizeof(s_szRootPath)); - while (--s_dwRootLen) - { - if ('\\' == s_szRootPath[s_dwRootLen]) - { - s_szRootPath[s_dwRootLen + 1] = 0; - strcpy_s(s_szFullPath, sizeof(s_szFullPath), s_szRootPath); - ++s_dwRootLen; - break; - } - } - } + if (! s_szRootPath[0]) + { + s_dwRootLen = GetModuleFileName(NULL, s_szRootPath, sizeof(s_szRootPath)); + while (--s_dwRootLen) + { + if ('\\' == s_szRootPath[s_dwRootLen]) + { + s_szRootPath[s_dwRootLen + 1] = 0; + strcpy_s(s_szFullPath, sizeof(s_szFullPath), s_szRootPath); + ++s_dwRootLen; + break; + } + } + } - if (0 != szPath[0] && ':' != szPath[1]) - { - strcpy_s(s_szFullPath + s_dwRootLen, sizeof(s_szFullPath) - s_dwRootLen, szPath); - return s_szFullPath; - } - else - { - return szPath; - } + if (0 != szPath[0] && ':' != szPath[1]) + { + strcpy_s(s_szFullPath + s_dwRootLen, sizeof(s_szFullPath) - s_dwRootLen, szPath); + return s_szFullPath; + } + else + { + return szPath; + } } unsigned int _Hash(const char *key) { - unsigned int len = strlen(key); - const char *end=key+len; - unsigned int hash; + unsigned int len = strlen(key); + const char *end=key+len; + unsigned int hash; - for (hash = 0; key < end; key++) - { - hash *= 16777619; - hash ^= (unsigned int) (unsigned char) toupper(*key); - } - return (hash); + for (hash = 0; key < end; key++) + { + hash *= 16777619; + hash ^= (unsigned int) (unsigned char) toupper(*key); + } + return (hash); } } // end of namespace CocosDenshion