diff options
-rw-r--r-- | engines/sci/engine/savegame.cpp | 3 | ||||
-rw-r--r-- | engines/sci/sfx/music.cpp | 15 | ||||
-rw-r--r-- | engines/sci/sfx/music.h | 11 |
3 files changed, 13 insertions, 16 deletions
diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index da116edecf..735ba21836 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -628,12 +628,11 @@ static void sync_songlib(Common::Serializer &s, SciMusic *music) { if (s.isLoading()) { music->stopAll(); - music->resizeList(songcount); for (int i = 0; i < songcount; i++) { MusicEntry *curSong = new MusicEntry(); syncSong(s, curSong); - music->setSlot(i, curSong); + music->pushBackSlot(curSong); } } else { for (int i = 0; i < songcount; i++) { diff --git a/engines/sci/sfx/music.cpp b/engines/sci/sfx/music.cpp index ebe1d6616e..7559359325 100644 --- a/engines/sci/sfx/music.cpp +++ b/engines/sci/sfx/music.cpp @@ -43,6 +43,10 @@ static int f_compare(const void *arg1, const void *arg2) { SciMusic::SciMusic(SciVersion soundVersion) : _soundVersion(soundVersion) { + + // Reserve some space in the playlist, to avoid expensive insertion + // operations + _playList.reserve(10); } SciMusic::~SciMusic() { @@ -370,6 +374,8 @@ void SciMusic::onTimer() { } //--------------------------------------------- void SciMusic::doFade(MusicEntry *pSnd) { + // This is called from inside onTimer, where the mutex is already locked + if (pSnd->fadeTicker) pSnd->fadeTicker--; else { @@ -401,10 +407,13 @@ void SciMusic::soundPlay(MusicEntry *pSnd) { _pMixer->playInputStream(Audio::Mixer::kSFXSoundType, &pSnd->hCurrentAud, pSnd->pStreamAud, -1, pSnd->volume, 0, false); } else if (pSnd->pMidiParser) { + _mutex.lock(); pSnd->pMidiParser->setVolume(pSnd->volume); if (pSnd->status == kSndStatusStopped) pSnd->pMidiParser->jumpToTick(0); + _mutex.unlock(); } + pSnd->status = kSndStatusPlaying; } //--------------------------------------------- @@ -434,9 +443,8 @@ void SciMusic::soundSetPriority(MusicEntry *pSnd, byte prio) { //--------------------------------------------- void SciMusic::soundKill(MusicEntry *pSnd) { - _mutex.lock(); - pSnd->status = kSndStatusStopped; + if (pSnd->pMidiParser) { pSnd->pMidiParser->unloadMusic(); delete pSnd->pMidiParser; @@ -447,6 +455,8 @@ void SciMusic::soundKill(MusicEntry *pSnd) { pSnd->pStreamAud = NULL; } + _mutex.lock(); + uint sz = _playList.size(), i; // Remove sound from playlist for (i = 0; i < sz; i++) { @@ -459,7 +469,6 @@ void SciMusic::soundKill(MusicEntry *pSnd) { } _mutex.unlock(); - } //--------------------------------------------- void SciMusic::soundPause(MusicEntry *pSnd) { diff --git a/engines/sci/sfx/music.h b/engines/sci/sfx/music.h index f7066743f4..ca6d12613d 100644 --- a/engines/sci/sfx/music.h +++ b/engines/sci/sfx/music.h @@ -135,11 +135,6 @@ public: } MusicEntry *getSlot(int slot) { return _playList[slot]; } - void setSlot(uint32 slot, MusicEntry *slotEntry) { - _mutex.lock(); - _playList[slot] = slotEntry; - _mutex.unlock(); - } void pushBackSlot(MusicEntry *slotEntry) { _mutex.lock(); @@ -149,12 +144,6 @@ public: uint32 listSize() { return _playList.size(); } - void resizeList(uint32 newSize) { - _mutex.lock(); - _playList.resize(newSize); - _mutex.unlock(); - } - uint16 _savelen; protected: |