diff options
author | Filippos Karapetis | 2009-12-27 23:46:11 +0000 |
---|---|---|
committer | Filippos Karapetis | 2009-12-27 23:46:11 +0000 |
commit | 5adb6277eb3bf0badd6d2403177ce4411c89ee13 (patch) | |
tree | aca71e4840b58b4f368b9539708e735356ca263f /engines/sci | |
parent | fedd4f10768771556c74ef24eacd31654b55af78 (diff) | |
download | scummvm-rg350-5adb6277eb3bf0badd6d2403177ce4411c89ee13.tar.gz scummvm-rg350-5adb6277eb3bf0badd6d2403177ce4411c89ee13.tar.bz2 scummvm-rg350-5adb6277eb3bf0badd6d2403177ce4411c89ee13.zip |
SCI/new music code:
- Switched to Common::StackLock for mutexes
- Renamed Music::stopAll() -> Music::clearPlayList()
- Implemented a better Music::stopAll method, which stops all sounds with proper signals, instead of destroying them
- Renamed the SCI0 command cmdGetPlayNext -> cmdStopAllSounds and implemented it
svn-id: r46665
Diffstat (limited to 'engines/sci')
-rw-r--r-- | engines/sci/engine/game.cpp | 2 | ||||
-rw-r--r-- | engines/sci/engine/savegame.cpp | 6 | ||||
-rw-r--r-- | engines/sci/sfx/music.cpp | 42 | ||||
-rw-r--r-- | engines/sci/sfx/music.h | 8 | ||||
-rw-r--r-- | engines/sci/sfx/soundcmd.cpp | 11 | ||||
-rw-r--r-- | engines/sci/sfx/soundcmd.h | 2 |
6 files changed, 37 insertions, 34 deletions
diff --git a/engines/sci/engine/game.cpp b/engines/sci/engine/game.cpp index d6b4c9cdb7..633d01f7f4 100644 --- a/engines/sci/engine/game.cpp +++ b/engines/sci/engine/game.cpp @@ -441,7 +441,7 @@ int game_exit(EngineState *s) { game_init_sound(s, SFX_STATE_FLAG_NOSOUND, s->detectDoSoundType()); #else s->_audio->stopAllAudio(); - s->_soundCmd->_music->stopAll(); + s->_soundCmd->_music->clearPlayList(); #endif } diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 7c0b33a6d6..7677157f48 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -619,7 +619,7 @@ static void sync_songlib(Common::Serializer &s, SongLibrary &obj) { void SciMusic::saveLoadWithSerializer(Common::Serializer &s) { // Sync song lib data. When loading, the actual song lib will be initialized // afterwards in gamestate_restore() - _mutex.lock(); + Common::StackLock lock(_mutex); int songcount = 0; byte masterVolume = soundGetMasterVolume(); @@ -645,7 +645,7 @@ void SciMusic::saveLoadWithSerializer(Common::Serializer &s) { s.syncAsUint32LE(songcount); if (s.isLoading()) { - stopAll(); + clearPlayList(); for (int i = 0; i < songcount; i++) { MusicEntry *curSong = new MusicEntry(); @@ -657,8 +657,6 @@ void SciMusic::saveLoadWithSerializer(Common::Serializer &s) { syncSong(s, _playList[i]); } } - - _mutex.unlock(); } #endif diff --git a/engines/sci/sfx/music.cpp b/engines/sci/sfx/music.cpp index 1931bf8757..089ae41afa 100644 --- a/engines/sci/sfx/music.cpp +++ b/engines/sci/sfx/music.cpp @@ -123,7 +123,9 @@ bool SciMusic::saveState(Common::OutSaveFile *pFile) { } //---------------------------------------- -void SciMusic::stopAll() { +void SciMusic::clearPlayList() { + Common::StackLock lock(_mutex); + _pMixer->stopAll(); while (!_playList.empty()) { @@ -132,6 +134,22 @@ void SciMusic::stopAll() { } } //---------------------------------------- +void SciMusic::stopAll() { + Common::StackLock lock(_mutex); + + SegManager *segMan = ((SciEngine *)g_engine)->getEngineState()->_segMan; // HACK + + for (uint32 i = 0; i < _playList.size(); i++) { + if (_soundVersion <= SCI_VERSION_0_LATE) + PUT_SEL32V(segMan, _playList[i]->soundObj, state, kSndStatusStopped); + else + PUT_SEL32V(segMan, _playList[i]->soundObj, signal, SIGNAL_OFFSET); + + _playList[i]->dataInc = 0; + soundStop(_playList[i]); + } +} +//---------------------------------------- void SciMusic::miditimerCallback(void *p) { SciMusic* aud = (SciMusic *)p; aud->onTimer(); @@ -331,7 +349,7 @@ void SciMusic::soundInitSnd(MusicEntry *pSnd) { } //---------------------------------------- void SciMusic::onTimer() { - _mutex.lock(); + Common::StackLock lock(_mutex); uint sz = _playList.size(); for (uint i = 0; i < sz; i++) { @@ -359,8 +377,6 @@ void SciMusic::onTimer() { } } }//for() - - _mutex.unlock(); } //--------------------------------------------- void SciMusic::doFade(MusicEntry *pSnd) { @@ -388,27 +404,24 @@ void SciMusic::doFade(MusicEntry *pSnd) { //--------------------------------------------- void SciMusic::soundPlay(MusicEntry *pSnd) { + Common::StackLock lock(_mutex); uint sz = _playList.size(), i; // searching if sound is already in _playList for (i = 0; i < sz && _playList[i] != pSnd; i++) ; if (i == sz) {// not found - _mutex.lock(); _playList.push_back(pSnd); sortPlayList(); - _mutex.unlock(); } if (pSnd->pStreamAud && !_pMixer->isSoundHandleActive(pSnd->hCurrentAud)) { _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; @@ -430,15 +443,14 @@ void SciMusic::soundSetVolume(MusicEntry *pSnd, byte volume) { } //--------------------------------------------- void SciMusic::soundSetPriority(MusicEntry *pSnd, byte prio) { - _mutex.lock(); + Common::StackLock lock(_mutex); pSnd->prio = prio; sortPlayList(); - - _mutex.unlock(); } //--------------------------------------------- void SciMusic::soundKill(MusicEntry *pSnd) { + Common::StackLock lock(_mutex); pSnd->status = kSndStatusStopped; @@ -452,8 +464,6 @@ 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++) { @@ -464,8 +474,6 @@ void SciMusic::soundKill(MusicEntry *pSnd) { break; } } - - _mutex.unlock(); } //--------------------------------------------- void SciMusic::soundPause(MusicEntry *pSnd) { @@ -491,7 +499,7 @@ void SciMusic::soundSetMasterVolume(uint16 vol) { } void SciMusic::reconstructSounds(int savegame_version) { - _mutex.lock(); + Common::StackLock lock(_mutex); SegManager *segMan = ((SciEngine *)g_engine)->getEngineState()->_segMan; // HACK ResourceManager *resMan = ((SciEngine *)g_engine)->getEngineState()->resMan; // HACK @@ -509,8 +517,6 @@ void SciMusic::reconstructSounds(int savegame_version) { _playList[i]->soundRes = new SoundResource(_playList[i]->resnum, resMan, _soundVersion); soundInitSnd(_playList[i]); } - - _mutex.unlock(); } } // end of namespace SCI diff --git a/engines/sci/sfx/music.h b/engines/sci/sfx/music.h index 0c7bc2e976..fb96063ff0 100644 --- a/engines/sci/sfx/music.h +++ b/engines/sci/sfx/music.h @@ -102,6 +102,7 @@ public: #endif void onTimer(); bool saveState(Common::OutSaveFile *pFile); + void clearPlayList(); void stopAll(); // sound and midi functions @@ -123,23 +124,20 @@ public: uint32 soundGetTempo() { return _dwTempo; } MusicEntry *getSlot(reg_t obj) { - _mutex.lock(); + Common::StackLock lock(_mutex); for (uint32 i = 0; i < _playList.size(); i++) { if (_playList[i]->soundObj == obj) { - _mutex.unlock(); return _playList[i]; } } - _mutex.unlock(); return NULL; } void pushBackSlot(MusicEntry *slotEntry) { - _mutex.lock(); + Common::StackLock lock(_mutex); _playList.push_back(slotEntry); - _mutex.unlock(); } void reconstructSounds(int savegame_version); diff --git a/engines/sci/sfx/soundcmd.cpp b/engines/sci/sfx/soundcmd.cpp index 7908d3a1e4..c4df4c9b85 100644 --- a/engines/sci/sfx/soundcmd.cpp +++ b/engines/sci/sfx/soundcmd.cpp @@ -153,7 +153,7 @@ SoundCommandParser::SoundCommandParser(ResourceManager *resMan, SegManager *segM SOUNDCOMMAND(cmdUpdateHandle); SOUNDCOMMAND(cmdFadeHandle); SOUNDCOMMAND(cmdGetPolyphony); - SOUNDCOMMAND(cmdGetPlayNext); + SOUNDCOMMAND(cmdStopAllSounds); break; case SCI_VERSION_1_EARLY: SOUNDCOMMAND(cmdVolume); @@ -644,7 +644,7 @@ void SoundCommandParser::cmdUpdateHandle(reg_t obj, int16 value) { } musicSlot->loop = (GET_SEL32V(_segMan, obj, loop) == 0xFFFF ? 1 : 0); - int32 objVol = CLIP<int>(GET_SEL32V(_segMan, obj, vol), 0, 255); + int16 objVol = CLIP<int>(GET_SEL32V(_segMan, obj, vol), 0, 255); if (objVol != musicSlot->volume) _music->soundSetVolume(musicSlot, objVol); uint32 objPrio = GET_SEL32V(_segMan, obj, pri); @@ -790,9 +790,10 @@ void SoundCommandParser::cmdGetAudioCapability(reg_t obj, int16 value) { _acc = make_reg(0, 1); } -void SoundCommandParser::cmdGetPlayNext(reg_t obj, int16 value) { - // TODO - warning("STUB: cmdGetPlayNext"); +void SoundCommandParser::cmdStopAllSounds(reg_t obj, int16 value) { +#ifndef USE_OLD_MUSIC_FUNCTIONS + _music->stopAll(); +#endif } void SoundCommandParser::cmdSetHandleVolume(reg_t obj, int16 value) { diff --git a/engines/sci/sfx/soundcmd.h b/engines/sci/sfx/soundcmd.h index de9d9650b4..35b0f18504 100644 --- a/engines/sci/sfx/soundcmd.h +++ b/engines/sci/sfx/soundcmd.h @@ -81,7 +81,7 @@ private: void cmdVolume(reg_t obj, int16 value); void cmdFadeHandle(reg_t obj, int16 value); void cmdGetPolyphony(reg_t obj, int16 value); - void cmdGetPlayNext(reg_t obj, int16 value); + void cmdStopAllSounds(reg_t obj, int16 value); void initHandle(reg_t obj, bool isSci1); |