[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