[Scummvm-cvs-logs] SF.net SVN: scummvm:[46665] scummvm/trunk/engines/sci
thebluegr at users.sourceforge.net
thebluegr at users.sourceforge.net
Mon Dec 28 00:46:11 CET 2009
Revision: 46665
http://scummvm.svn.sourceforge.net/scummvm/?rev=46665&view=rev
Author: thebluegr
Date: 2009-12-27 23:46:11 +0000 (Sun, 27 Dec 2009)
Log Message:
-----------
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
Modified Paths:
--------------
scummvm/trunk/engines/sci/engine/game.cpp
scummvm/trunk/engines/sci/engine/savegame.cpp
scummvm/trunk/engines/sci/sfx/music.cpp
scummvm/trunk/engines/sci/sfx/music.h
scummvm/trunk/engines/sci/sfx/soundcmd.cpp
scummvm/trunk/engines/sci/sfx/soundcmd.h
Modified: scummvm/trunk/engines/sci/engine/game.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/game.cpp 2009-12-27 23:35:22 UTC (rev 46664)
+++ scummvm/trunk/engines/sci/engine/game.cpp 2009-12-27 23:46:11 UTC (rev 46665)
@@ -441,7 +441,7 @@
game_init_sound(s, SFX_STATE_FLAG_NOSOUND, s->detectDoSoundType());
#else
s->_audio->stopAllAudio();
- s->_soundCmd->_music->stopAll();
+ s->_soundCmd->_music->clearPlayList();
#endif
}
Modified: scummvm/trunk/engines/sci/engine/savegame.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/savegame.cpp 2009-12-27 23:35:22 UTC (rev 46664)
+++ scummvm/trunk/engines/sci/engine/savegame.cpp 2009-12-27 23:46:11 UTC (rev 46665)
@@ -619,7 +619,7 @@
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 @@
s.syncAsUint32LE(songcount);
if (s.isLoading()) {
- stopAll();
+ clearPlayList();
for (int i = 0; i < songcount; i++) {
MusicEntry *curSong = new MusicEntry();
@@ -657,8 +657,6 @@
syncSong(s, _playList[i]);
}
}
-
- _mutex.unlock();
}
#endif
Modified: scummvm/trunk/engines/sci/sfx/music.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/music.cpp 2009-12-27 23:35:22 UTC (rev 46664)
+++ scummvm/trunk/engines/sci/sfx/music.cpp 2009-12-27 23:46:11 UTC (rev 46665)
@@ -123,7 +123,9 @@
}
//----------------------------------------
-void SciMusic::stopAll() {
+void SciMusic::clearPlayList() {
+ Common::StackLock lock(_mutex);
+
_pMixer->stopAll();
while (!_playList.empty()) {
@@ -132,6 +134,22 @@
}
}
//----------------------------------------
+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::onTimer() {
- _mutex.lock();
+ Common::StackLock lock(_mutex);
uint sz = _playList.size();
for (uint i = 0; i < sz; i++) {
@@ -359,8 +377,6 @@
}
}
}//for()
-
- _mutex.unlock();
}
//---------------------------------------------
void SciMusic::doFade(MusicEntry *pSnd) {
@@ -388,27 +404,24 @@
//---------------------------------------------
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::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 @@
pSnd->pStreamAud = NULL;
}
- _mutex.lock();
-
uint sz = _playList.size(), i;
// Remove sound from playlist
for (i = 0; i < sz; i++) {
@@ -464,8 +474,6 @@
break;
}
}
-
- _mutex.unlock();
}
//---------------------------------------------
void SciMusic::soundPause(MusicEntry *pSnd) {
@@ -491,7 +499,7 @@
}
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 @@
_playList[i]->soundRes = new SoundResource(_playList[i]->resnum, resMan, _soundVersion);
soundInitSnd(_playList[i]);
}
-
- _mutex.unlock();
}
} // end of namespace SCI
Modified: scummvm/trunk/engines/sci/sfx/music.h
===================================================================
--- scummvm/trunk/engines/sci/sfx/music.h 2009-12-27 23:35:22 UTC (rev 46664)
+++ scummvm/trunk/engines/sci/sfx/music.h 2009-12-27 23:46:11 UTC (rev 46665)
@@ -102,6 +102,7 @@
#endif
void onTimer();
bool saveState(Common::OutSaveFile *pFile);
+ void clearPlayList();
void stopAll();
// sound and midi functions
@@ -123,23 +124,20 @@
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);
Modified: scummvm/trunk/engines/sci/sfx/soundcmd.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/soundcmd.cpp 2009-12-27 23:35:22 UTC (rev 46664)
+++ scummvm/trunk/engines/sci/sfx/soundcmd.cpp 2009-12-27 23:46:11 UTC (rev 46665)
@@ -153,7 +153,7 @@
SOUNDCOMMAND(cmdUpdateHandle);
SOUNDCOMMAND(cmdFadeHandle);
SOUNDCOMMAND(cmdGetPolyphony);
- SOUNDCOMMAND(cmdGetPlayNext);
+ SOUNDCOMMAND(cmdStopAllSounds);
break;
case SCI_VERSION_1_EARLY:
SOUNDCOMMAND(cmdVolume);
@@ -644,7 +644,7 @@
}
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 @@
_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) {
Modified: scummvm/trunk/engines/sci/sfx/soundcmd.h
===================================================================
--- scummvm/trunk/engines/sci/sfx/soundcmd.h 2009-12-27 23:35:22 UTC (rev 46664)
+++ scummvm/trunk/engines/sci/sfx/soundcmd.h 2009-12-27 23:46:11 UTC (rev 46665)
@@ -81,7 +81,7 @@
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);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list