void SimpleAudioEngine::preloadEffect(const char* pszFilePath) { int nRet = 0; CCAudioOut* pEffectPlayer = NULL; do { BREAK_IF(! pszFilePath); string strFilePath = fullPathFromRelativePath(pszFilePath); nRet = _Hash(strFilePath.c_str()); BREAK_IF(s_List.end() != s_List.find(nRet)); //AppLog("not find effect, create it..."); if (s_List.size() >= 64) { // get the first effect, and remove it form list //AppLog("effect preload more than 64, delete the first effect"); pEffectPlayer = s_List.begin()->second; pEffectPlayer->Finalize(); s_List.erase(s_List.begin()->first); } if (pEffectPlayer == NULL) pEffectPlayer = new CCAudioOut; pEffectPlayer->Initialize(strFilePath.c_str()); s_List.insert(Effect(nRet, pEffectPlayer)); } while (0); }
void SimpleAudioEngine::stopEffect(unsigned int nSoundId) { EffectList::iterator p = s_List.find(nSoundId); if (p != s_List.end()) { p->second.Stop(); } }
void SimpleAudioEngine::playPreloadedEffect(int nSoundId) { EffectList::iterator p = s_List.find(nSoundId); if (p != s_List.end()) { p->second.Rewind(); } }
unsigned int SimpleAudioEngine::playEffect(const char* pszFilePath) { unsigned int nRet = _Hash(pszFilePath); preloadEffect(pszFilePath); EffectList::iterator p = s_List.find(nRet); if (p != s_List.end()) { p->second.Rewind(); } return nRet; }
void QBSoundMac::unloadEffect(const char* filename) { QBSoundLocker locker(&mMutex,"unloadEffect"); if (filename) { unsigned int nRet = _Hash(filename); EffectList::iterator p = effectTrack.find(nRet); if (p != effectTrack.end()) { delete p->second; p->second = NULL; effectTrack.erase(nRet); } } }
unsigned int QBSoundMac::playEffect(const char* filename,bool bLoop,float pitch, float pan, float gain) { QBSoundLocker locker(&mMutex,"playEffect"); if (filename) { unsigned int nRet = _Hash(filename); do { if (filename==NULL) break; unsigned int nRet = _Hash(filename); if (effectTrack.end() != effectTrack.find(nRet)) break; effectTrack.insert(make_pair(nRet,new EffectBuffer())); EffectBuffer* buffer = effectTrack[nRet]; if (buffer->load(filename)!=0) { effectTrack.erase(nRet); } } while (0); EffectList::iterator p = effectTrack.find(nRet); if (p != effectTrack.end()) { EffectBuffer* effect = p->second; findPlayer(soundID)->setVolume(gain); findPlayer(soundID)->play((unsigned char*)effect->pcmbuffer,effect->pcmsize); soundID ++; if (soundID > 9999) soundID = 1; } return soundID; } return 0; }
void QBSoundMac::preloadEffect(const char* filename) { QBSoundLocker locker(&mMutex,"preloadEffect"); do { if (filename==NULL) break; unsigned int nRet = _Hash(filename); if (effectTrack.end() != effectTrack.find(nRet)) break; effectTrack.insert(make_pair(nRet,new EffectBuffer())); EffectBuffer* buffer = effectTrack[nRet]; if (buffer->load(filename)!=0) { effectTrack.erase(nRet); } } while (0); }
void SimpleAudioEngine::preloadEffect(const char* pszFilePath) { int nRet = 0; do { BREAK_IF(! pszFilePath); nRet = _Hash(pszFilePath); BREAK_IF(s_List.end() != s_List.find(nRet)); s_List.insert(Effect(nRet, MciPlayer())); MciPlayer& player = s_List[nRet]; player.Open(_FullPath(pszFilePath), nRet); BREAK_IF(nRet == player.GetSoundID()); s_List.erase(nRet); nRet = 0; } while (0); }
// for sound effects unsigned int SimpleAudioEngine::playEffect(const char* pszFilePath, bool bLoop/* = false*/) { result r = E_FAILURE; string strFilePath = fullPathFromRelativePath(pszFilePath); unsigned int nRet = _Hash(strFilePath.c_str()); preloadEffect(pszFilePath); EffectList::iterator p = s_List.find(nRet); if (p != s_List.end()) { p->second->SetVolume((int) (s_fEffectsVolume * 99)); int volume = p->second->GetVolume(); if (s_fEffectsVolume > 0.0f && volume == 0) { p->second->SetVolume(1); } if (AUDIOOUT_STATE_PLAYING == p->second->GetState()) { return nRet; // Stop waste a lot of time, so just return. //r = p->second->Stop(); } if (s_fEffectsVolume > 0.0f) { r = p->second->Play(bLoop); } if (IsFailed(r)) { AppLog("play effect fails, error code = %d", r); } } return nRet; }