aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilippos Karapetis2009-12-27 23:46:11 +0000
committerFilippos Karapetis2009-12-27 23:46:11 +0000
commit5adb6277eb3bf0badd6d2403177ce4411c89ee13 (patch)
treeaca71e4840b58b4f368b9539708e735356ca263f
parentfedd4f10768771556c74ef24eacd31654b55af78 (diff)
downloadscummvm-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
-rw-r--r--engines/sci/engine/game.cpp2
-rw-r--r--engines/sci/engine/savegame.cpp6
-rw-r--r--engines/sci/sfx/music.cpp42
-rw-r--r--engines/sci/sfx/music.h8
-rw-r--r--engines/sci/sfx/soundcmd.cpp11
-rw-r--r--engines/sci/sfx/soundcmd.h2
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);