[Scummvm-cvs-logs] SF.net SVN: scummvm:[47422] scummvm/trunk/engines/sci

thebluegr at users.sourceforge.net thebluegr at users.sourceforge.net
Thu Jan 21 22:28:57 CET 2010


Revision: 47422
          http://scummvm.svn.sourceforge.net/scummvm/?rev=47422&view=rev
Author:   thebluegr
Date:     2010-01-21 21:28:32 +0000 (Thu, 21 Jan 2010)

Log Message:
-----------
- Fixed pausing of all sounds in the playlist
- Sounds are now paused correctly when opening/closing the debug console
- Some cleanup

Modified Paths:
--------------
    scummvm/trunk/engines/sci/console.cpp
    scummvm/trunk/engines/sci/sound/music.cpp
    scummvm/trunk/engines/sci/sound/music.h
    scummvm/trunk/engines/sci/sound/soundcmd.cpp
    scummvm/trunk/engines/sci/sound/soundcmd.h

Modified: scummvm/trunk/engines/sci/console.cpp
===================================================================
--- scummvm/trunk/engines/sci/console.cpp	2010-01-21 20:42:45 UTC (rev 47421)
+++ scummvm/trunk/engines/sci/console.cpp	2010-01-21 21:28:32 UTC (rev 47422)
@@ -197,7 +197,7 @@
 	if (_vm->_gamestate)
 		_vm->_gamestate->_sound.sfx_suspend(true);
 #endif
-	_vm->_mixer->pauseAll(true);
+	_vm->getEngineState()->_soundCmd->pauseAll(true);
 }
 
 void Console::postEnter() {
@@ -205,7 +205,7 @@
 	if (_vm->_gamestate)
 		_vm->_gamestate->_sound.sfx_suspend(false);
 #endif
-	_vm->_mixer->pauseAll(false);
+	_vm->getEngineState()->_soundCmd->pauseAll(false);
 
 	if (!_videoFile.empty()) {
 		_vm->_gamestate->_gui->hideCursor();

Modified: scummvm/trunk/engines/sci/sound/music.cpp
===================================================================
--- scummvm/trunk/engines/sci/sound/music.cpp	2010-01-21 20:42:45 UTC (rev 47421)
+++ scummvm/trunk/engines/sci/sound/music.cpp	2010-01-21 21:28:32 UTC (rev 47422)
@@ -91,14 +91,23 @@
 }
 
 void SciMusic::clearPlayList() {
-	_mutex.lock();
+	Common::StackLock lock(_mutex);
+
 	while (!_playList.empty()) {
 		soundStop(_playList[0]);
 		soundKill(_playList[0]);
 	}
-	_mutex.unlock();
 }
 
+void SciMusic::pauseAll(bool pause) {
+	Common::StackLock lock(_mutex);
+
+	const MusicList::iterator end = _playList.end();
+	for (MusicList::iterator i = _playList.begin(); i != end; ++i) {
+		soundToggle(*i, pause);
+	}
+}
+
 void SciMusic::miditimerCallback(void *p) {
 	SciMusic *aud = (SciMusic *)p;
 
@@ -326,6 +335,13 @@
 	soundPlay(pSnd);
 }
 
+void SciMusic::soundToggle(MusicEntry *pSnd, bool pause) {
+	if (pause)
+		soundPause(pSnd);
+	else
+		soundResume(pSnd);
+}
+
 uint16 SciMusic::soundGetMasterVolume() {
 	return _masterVolume;
 }

Modified: scummvm/trunk/engines/sci/sound/music.h
===================================================================
--- scummvm/trunk/engines/sci/sound/music.h	2010-01-21 20:42:45 UTC (rev 47421)
+++ scummvm/trunk/engines/sci/sound/music.h	2010-01-21 21:28:32 UTC (rev 47422)
@@ -139,6 +139,7 @@
 	void init();
 	void onTimer();
 	void clearPlayList();
+	void pauseAll(bool pause);
 
 	// sound and midi functions
 	void soundInitSnd(MusicEntry *pSnd);
@@ -147,6 +148,7 @@
 	void soundKill(MusicEntry *pSnd);
 	void soundPause(MusicEntry *pSnd);
 	void soundResume(MusicEntry *pSnd);
+	void soundToggle(MusicEntry *pSnd, bool pause);
 	void soundSetVolume(MusicEntry *pSnd, byte volume);
 	void soundSetPriority(MusicEntry *pSnd, byte prio);
 	uint16 soundGetMasterVolume();

Modified: scummvm/trunk/engines/sci/sound/soundcmd.cpp
===================================================================
--- scummvm/trunk/engines/sci/sound/soundcmd.cpp	2010-01-21 20:42:45 UTC (rev 47421)
+++ scummvm/trunk/engines/sci/sound/soundcmd.cpp	2010-01-21 21:28:32 UTC (rev 47422)
@@ -530,52 +530,30 @@
 		changeSoundStatus(obj, value ? SOUND_STATUS_SUSPENDED : SOUND_STATUS_PLAYING);
 #else
 
-	MusicEntry *musicSlot = NULL;
-	MusicList::iterator slotLoop = NULL;
-	MusicList::iterator listEnd = NULL;
-
-	if (!obj.segment) {
+	if (!obj.segment) {		// pause the whole playlist
 		// Pausing/Resuming the whole playlist was introduced 
 		// in the SCI1 late sound scheme
 		if (_soundVersion <= SCI_VERSION_1_EARLY)
 			return;
-		_music->_mutex.lock();
-		slotLoop = _music->getPlayListStart();
-		listEnd = _music->getPlayListEnd();
-		musicSlot = *slotLoop;
-		_music->_mutex.unlock();
-	} else {
-		_music->_mutex.lock();
-		musicSlot = _music->getSlot(obj);
-		_music->_mutex.unlock();
+
+		_music->pauseAll(value);
+	} else {	// pause a playlist slot
+		Common::StackLock lock(_music->_mutex);
+		MusicEntry *musicSlot = _music->getSlot(obj);
 		if (!musicSlot) {
 			warning("cmdPauseSound: Slot not found (%04x:%04x)", PRINT_REG(obj));
 			return;
 		}
-	}
 
-	do {
 		if (_soundVersion <= SCI_VERSION_0_LATE) {
+			// Always pause the sound in SCI0 games. It's resumed in cmdResumeSound()
 			PUT_SEL32V(_segMan, musicSlot->soundObj, state, kSoundPaused);
 			_music->soundPause(musicSlot);
 		} else {
-			if (value)
-				_music->soundPause(musicSlot);
-			else
-				_music->soundResume(musicSlot);
+			_music->soundToggle(musicSlot, value);
 		}
+	}
 
-		if (slotLoop) {
-			if (slotLoop == listEnd) {
-				break;
-			} else {
-				_music->_mutex.lock();
-				musicSlot = *(slotLoop++);
-				_music->_mutex.unlock();
-			}
-		}
-	} while (slotLoop);
-
 #endif
 }
 
@@ -1100,4 +1078,10 @@
 #endif
 }
 
+void SoundCommandParser::pauseAll(bool pause) {
+#ifndef USE_OLD_MUSIC_FUNCTIONS
+	_music->pauseAll(pause);
+#endif
+}
+
 } // End of namespace Sci

Modified: scummvm/trunk/engines/sci/sound/soundcmd.h
===================================================================
--- scummvm/trunk/engines/sci/sound/soundcmd.h	2010-01-21 20:42:45 UTC (rev 47421)
+++ scummvm/trunk/engines/sci/sound/soundcmd.h	2010-01-21 21:28:32 UTC (rev 47422)
@@ -63,6 +63,7 @@
 	void reconstructPlayList(int savegame_version);
 	void printPlayList(Console *con);
 	void setMasterVolume(int vol);
+	void pauseAll(bool pause);
 
 #ifndef USE_OLD_MUSIC_FUNCTIONS
 	/**


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