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

thebluegr at users.sourceforge.net thebluegr at users.sourceforge.net
Sat Dec 26 12:54:57 CET 2009


Revision: 46578
          http://scummvm.svn.sourceforge.net/scummvm/?rev=46578&view=rev
Author:   thebluegr
Date:     2009-12-26 11:54:57 +0000 (Sat, 26 Dec 2009)

Log Message:
-----------
- Made the music playlist private
- Removed some leaks
- Fixed the destruction of the music playlist
- Made mutexes more sane
- Removed some dead code
- Cleanup

Modified Paths:
--------------
    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

Modified: scummvm/trunk/engines/sci/engine/savegame.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/savegame.cpp	2009-12-26 10:50:05 UTC (rev 46577)
+++ scummvm/trunk/engines/sci/engine/savegame.cpp	2009-12-26 11:54:57 UTC (rev 46578)
@@ -623,21 +623,21 @@
 	// afterwards in gamestate_restore()
 	int songcount = 0;
 	if (s.isSaving())
-		songcount = music->_playList.size();
+		songcount = music->listSize();
 	s.syncAsUint32LE(songcount);
 
 	if (s.isLoading()) {
 		music->stopAll();
-		music->_playList.resize(songcount);
+		music->resizeList(songcount);
 
 		for (int i = 0; i < songcount; i++) {
 			MusicEntry *curSong = new MusicEntry();
 			syncSong(s, curSong);
-			music->_playList[i] = curSong;
+			music->setSlot(i, curSong);
 		}
 	} else {
 		for (int i = 0; i < songcount; i++) {
-			syncSong(s, music->_playList[i]);
+			syncSong(s, music->getSlot(i));
 		}
 	}
 }
@@ -954,18 +954,18 @@
 #else
 	// Reconstruct sounds
 	SciMusic *music = retval->_soundCmd->_music;
-	for (uint32 i = 0; i < music->_playList.size(); i++) {
+	for (uint32 i = 0; i < music->listSize(); i++) {
 		if (meta.savegame_version < 14) {
 			if (retval->detectDoSoundType() >= SCI_VERSION_1_EARLY) {
-				music->_playList[i]->dataInc = GET_SEL32V(retval->_segMan, music->_playList[i]->soundObj, dataInc);
-				music->_playList[i]->volume = GET_SEL32V(retval->_segMan, music->_playList[i]->soundObj, vol);
+				music->getSlot(i)->dataInc = GET_SEL32V(retval->_segMan, music->getSlot(i)->soundObj, dataInc);
+				music->getSlot(i)->volume = GET_SEL32V(retval->_segMan, music->getSlot(i)->soundObj, vol);
 			} else {
-				music->_playList[i]->volume = 100;
+				music->getSlot(i)->volume = 100;
 			}
 		}
 
-		music->_playList[i]->soundRes = new SoundResource(music->_playList[i]->resnum, retval->resMan, retval->detectDoSoundType());
-		music->soundInitSnd(music->_playList[i]);
+		music->getSlot(i)->soundRes = new SoundResource(music->getSlot(i)->resnum, retval->resMan, retval->detectDoSoundType());
+		music->soundInitSnd(music->getSlot(i));
 	}
 #endif
 

Modified: scummvm/trunk/engines/sci/sfx/music.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/music.cpp	2009-12-26 10:50:05 UTC (rev 46577)
+++ scummvm/trunk/engines/sci/sfx/music.cpp	2009-12-26 11:54:57 UTC (rev 46578)
@@ -128,15 +128,12 @@
 }
 //----------------------------------------
 void SciMusic::stopAll() {
-	_mutex.lock();
 	_pMixer->stopAll();
 
-	for (uint i = 0; i < _playList.size(); i++){
-		soundStop(_playList[i]);
-		soundKill(_playList[i]);
+	while (!_playList.empty()) {
+		soundStop(_playList[0]);
+		soundKill(_playList[0]);
 	}
-
-	_mutex.unlock();
 }
 //----------------------------------------
 void SciMusic::miditimerCallback(void *p) {
@@ -285,7 +282,6 @@
 
 //----------------------------------------
 void SciMusic::soundInitSnd(MusicEntry *pSnd) {
-	_mutex.lock();
 	SoundResource::Track *track = NULL;
 	int channelFilterMask = 0;
 
@@ -340,8 +336,6 @@
 			pSnd->pMidiParser->loadMusic(track, pSnd, channelFilterMask, _soundVersion);
 		}
 	}
-
-	_mutex.unlock();
 }
 //----------------------------------------
 void SciMusic::onTimer() {
@@ -376,8 +370,6 @@
 }
 //---------------------------------------------
 void SciMusic::doFade(MusicEntry *pSnd) {
-	_mutex.lock();
-
 	if (pSnd->fadeTicker)
 		pSnd->fadeTicker--;
 	else {
@@ -389,21 +381,20 @@
 			pSnd->volume += pSnd->fadeStep;
 		pSnd->pMidiParser->setVolume(pSnd->volume);
 	}
-
-	_mutex.unlock();
 }
 
 //---------------------------------------------
 void SciMusic::soundPlay(MusicEntry *pSnd) {
-	_mutex.lock();
 
 	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)) {
@@ -415,31 +406,21 @@
 			pSnd->pMidiParser->jumpToTick(0);
 	}
 	pSnd->status = kSndStatusPlaying;
-
-	_mutex.unlock();
 }
 //---------------------------------------------
 void SciMusic::soundStop(MusicEntry *pSnd) {
-	_mutex.lock();
-
 	pSnd->status = kSndStatusStopped;
 	if (pSnd->pStreamAud)
 		_pMixer->stopHandle(pSnd->hCurrentAud);
 	if (pSnd->pMidiParser)
 		pSnd->pMidiParser->stop();
-
-	_mutex.unlock();
 }
 //---------------------------------------------
 void SciMusic::soundSetVolume(MusicEntry *pSnd, byte volume) {
-	_mutex.lock();
-
 	if (pSnd->pStreamAud)
 		_pMixer->setChannelVolume(pSnd->hCurrentAud, volume);
 	else if (pSnd->pMidiParser)
 		pSnd->pMidiParser->setVolume(volume);
-
-	_mutex.unlock();
 }
 //---------------------------------------------
 void SciMusic::soundSetPriority(MusicEntry *pSnd, byte prio) {
@@ -453,7 +434,7 @@
 //---------------------------------------------
 void SciMusic::soundKill(MusicEntry *pSnd) {
 
-	// For some reason, adding a mutex here freezes some games (e.g. LSL5)
+	_mutex.lock();
 
 	pSnd->status = kSndStatusStopped;
 	if (pSnd->pMidiParser) {
@@ -471,24 +452,22 @@
 	for (i = 0; i < sz; i++) {
 		if (_playList[i] == pSnd) {
 			delete _playList[i]->soundRes;
-			_playList[i]->soundRes = 0;
+			delete _playList[i];
 			_playList.remove_at(i);
 			break;
 		}
 	}
 
+	_mutex.unlock();
+
 }
 //---------------------------------------------
 void SciMusic::soundPause(MusicEntry *pSnd) {
-	_mutex.lock();
-
 	pSnd->status = kSndStatusPaused;
 	if (pSnd->pStreamAud)
 		_pMixer->pauseHandle(pSnd->hCurrentAud, true);
 	else if (pSnd->pMidiParser)
 		pSnd->pMidiParser->pause();
-
-	_mutex.unlock();
 }
 
 //---------------------------------------------
@@ -498,16 +477,12 @@
 }
 //---------------------------------------------
 void SciMusic::soundSetMasterVolume(uint16 vol) {
-	_mutex.lock();
-
 	vol = vol & 0xF; // 0..15
 	vol = vol * Audio::Mixer::kMaxMixerVolume / 0xF;
 	_pMixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, vol);
 	_pMixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, vol);
 	_pMixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, vol);
 	_pMixer->setVolumeForSoundType(Audio::Mixer::kPlainSoundType, vol);
-
-	_mutex.unlock();
 }
 
 //---------------------------------------------
@@ -568,7 +543,7 @@
 	if (_signalSet) {
 		_signalSet = false;
 		PUT_SEL32V(segMan, _pSnd->soundObj, signal, _signalToSet);
-		warning("signal %04x", _signalToSet);
+		debugC(2, kDebugLevelSound, "signal %04x", _signalToSet);
 	}
 
 	info.start = _position._play_pos;
@@ -685,7 +660,7 @@
 				} else {
 					_pSnd->status = kSndStatusStopped;
 					PUT_SEL32V(segMan, _pSnd->soundObj, signal, 0xFFFF);
-					warning("signal EOT");
+					debugC(2, kDebugLevelSound, "signal EOT");
 				}
 			}
 			break;

Modified: scummvm/trunk/engines/sci/sfx/music.h
===================================================================
--- scummvm/trunk/engines/sci/sfx/music.h	2009-12-26 10:50:05 UTC (rev 46577)
+++ scummvm/trunk/engines/sci/sfx/music.h	2009-12-26 11:54:57 UTC (rev 46578)
@@ -110,9 +110,7 @@
 	bool saveState(Common::OutSaveFile *pFile);
 	bool restoreState(Common::InSaveFile *pFile);
 	void stopAll();
-	void clearPlaylist() {
-		_playList.clear();
-	}
+
 	// sound and midi functions
 	void soundInitSnd(MusicEntry *pSnd);
 	void soundPlay(MusicEntry *pSnd);
@@ -136,8 +134,28 @@
 		return -1;
 	}
 
+	MusicEntry *getSlot(int slot) { return _playList[slot]; }
+	void setSlot(uint32 slot, MusicEntry *slotEntry) {
+		_mutex.lock();
+		_playList[slot] = slotEntry;
+		_mutex.unlock();
+	}
+
+	void pushBackSlot(MusicEntry *slotEntry) {
+		_mutex.lock();
+		_playList.push_back(slotEntry);
+		_mutex.unlock();
+	}
+
+	uint32 listSize() { return _playList.size(); }
+
+	void resizeList(uint32 newSize) {
+		_mutex.lock();
+		_playList.resize(newSize);
+		_mutex.unlock();
+	}
+
 	uint16 _savelen;
-	MusicList _playList;
 
 protected:
 	byte findAudEntry(uint16 nAud, byte&oVolume, uint32& oOffset, uint32&oSize);
@@ -161,6 +179,8 @@
 	bool _bMultiMidi; // use adlib's digital track if midi track don't have one
 private:
 	static void miditimerCallback(void *p);
+
+	MusicList _playList;
 };
 
 class MidiParser_SCI : public MidiParser {

Modified: scummvm/trunk/engines/sci/sfx/soundcmd.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/soundcmd.cpp	2009-12-26 10:50:05 UTC (rev 46577)
+++ scummvm/trunk/engines/sci/sfx/soundcmd.cpp	2009-12-26 11:54:57 UTC (rev 46578)
@@ -275,7 +275,7 @@
 	// Check if a track with the same sound object is already playing
 	int prevTrack = _music->findListSlot(obj);
 	if (prevTrack > -1)
-		_music->soundKill(_music->_playList[prevTrack]);
+		_music->soundKill(_music->getSlot(prevTrack));
 
 	MusicEntry *newSound = new MusicEntry();
 	newSound->soundRes = 0;
@@ -295,7 +295,7 @@
 	newSound->fadeTicker = 0;
 	newSound->fadeTickerStep = 0;
 	newSound->status = kSndStatusStopped;
-	_music->_playList.push_back(newSound);
+	_music->pushBackSlot(newSound);
 
 	// In SCI1.1 games, sound effects are started from here. If we can find
 	// a relevant audio resource, play it, otherwise switch to synthesized
@@ -394,7 +394,7 @@
 
 	int number = obj.segment ? GET_SEL32V(_segMan, obj, number) : -1;
 
-	if (_music->_playList[slot]->resnum != number) { // another sound loaded into struct
+	if (_music->getSlot(slot)->resnum != number) { // another sound loaded into struct
 		cmdDisposeHandle(obj, value);
 		cmdInitHandle(obj, value);
 		// Find slot again :)
@@ -410,14 +410,15 @@
 		PUT_SEL32V(_segMan, obj, state, kSndStatusPlaying);
 	}
 
-	_music->_playList[slot]->loop = GET_SEL32V(_segMan, obj, loop) == 0xFFFF ? 1 : 0;
-	_music->_playList[slot]->prio = GET_SEL32V(_segMan, obj, priority);
+	MusicEntry *musicSlot = _music->getSlot(slot);
+	musicSlot->loop = GET_SEL32V(_segMan, obj, loop) == 0xFFFF ? 1 : 0;
+	musicSlot->prio = GET_SEL32V(_segMan, obj, priority);
 	// vol selector doesnt get used before sci1late
 	if (_soundVersion < SCI_VERSION_1_LATE)
-		_music->_playList[slot]->volume = 100;
+		musicSlot->volume = 100;
 	else
-		_music->_playList[slot]->volume = GET_SEL32V(_segMan, obj, vol);
-	_music->soundPlay(_music->_playList[slot]);
+		musicSlot->volume = GET_SEL32V(_segMan, obj, vol);
+	_music->soundPlay(musicSlot);
 
 #endif
 
@@ -463,7 +464,7 @@
 
 	cmdStopHandle(obj, value);
 
-	_music->soundKill(_music->_playList[slot]);
+	_music->soundKill(_music->getSlot(slot));
 	if (_hasNodePtr)
 		PUT_SEL32(_segMan, obj, nodePtr, NULL_REG);
 	else
@@ -493,8 +494,8 @@
 	else
 		PUT_SEL32V(_segMan, obj, signal, SIGNAL_OFFSET);
 
-	_music->_playList[slot]->dataInc = 0;
-	_music->soundStop(_music->_playList[slot]);
+	_music->getSlot(slot)->dataInc = 0;
+	_music->soundStop(_music->getSlot(slot));
 #endif
 }
 
@@ -516,12 +517,12 @@
 
 	if (!_hasNodePtr) {
 		PUT_SEL32V(_segMan, obj, state, kSndStatusPaused);
-		_music->soundPause(_music->_playList[slot]);
+		_music->soundPause(_music->getSlot(slot));
 	} else {
 		if (value)
-			_music->soundPause(_music->_playList[slot]);
+			_music->soundPause(_music->getSlot(slot));
 		else
-			_music->soundPlay(_music->_playList[slot]);
+			_music->soundPlay(_music->getSlot(slot));
 	}
 #endif
 }
@@ -542,7 +543,7 @@
 	}
 
 	PUT_SEL32V(_segMan, obj, state, kSndStatusPlaying);
-	_music->soundPlay(_music->_playList[slot]);
+	_music->soundPlay(_music->getSlot(slot));
 #endif
 }
 
@@ -619,10 +620,11 @@
 	}
 
 	int volume = GET_SEL32V(_segMan, obj, vol);
-	_music->_playList[slot]->fadeTo = _argv[2].toUint16();
-	_music->_playList[slot]->fadeStep = volume > _argv[2].toUint16() ? -_argv[4].toUint16() : _argv[4].toUint16();
-	_music->_playList[slot]->fadeTickerStep = _argv[3].toUint16() * 16667 / _music->soundGetTempo();
-	_music->_playList[slot]->fadeTicker = 0;
+	MusicEntry *musicSlot = _music->getSlot(slot);
+	musicSlot->fadeTo = _argv[2].toUint16();
+	musicSlot->fadeStep = volume > _argv[2].toUint16() ? -_argv[4].toUint16() : _argv[4].toUint16();
+	musicSlot->fadeTickerStep = _argv[3].toUint16() * 16667 / _music->soundGetTempo();
+	musicSlot->fadeTicker = 0;
 #endif
 }
 
@@ -651,13 +653,14 @@
 		return;
 	}
 
-	_music->_playList[slot]->loop = (GET_SEL32V(_segMan, obj, loop) == 0xFFFF ? 1 : 0);
+	MusicEntry *musicSlot = _music->getSlot(slot);
+	musicSlot->loop = (GET_SEL32V(_segMan, obj, loop) == 0xFFFF ? 1 : 0);
 	uint32 objVol = CLIP<int>(GET_SEL32V(_segMan, obj, vol), 0, 255);
-	if (objVol != _music->_playList[slot]->volume)
-		_music->soundSetVolume(_music->_playList[slot], objVol);
+	if (objVol != musicSlot->volume)
+		_music->soundSetVolume(musicSlot, objVol);
 	uint32 objPrio = GET_SEL32V(_segMan, obj, vol);
-	if (objPrio != _music->_playList[slot]->prio)
-		_music->soundSetPriority(_music->_playList[slot], objPrio);
+	if (objPrio != musicSlot->prio)
+		_music->soundSetPriority(musicSlot, objPrio);
 
 #endif
 }
@@ -745,7 +748,7 @@
 	}
 
 	uint16 signal = GET_SEL32V(_segMan, obj, signal);
-	uint16 dataInc = _music->_playList[slot]->dataInc;
+	uint16 dataInc = _music->getSlot(slot)->dataInc;
 
 	switch (signal) {
 		case 0:
@@ -761,7 +764,7 @@
 			break;
 	}
 
-	uint16 ticker = _music->_playList[slot]->ticker;
+	uint16 ticker = _music->getSlot(slot)->ticker;
 	PUT_SEL32V(_segMan, obj, min, ticker / 3600);
 	PUT_SEL32V(_segMan, obj, sec, ticker % 3600 / 60);
 	PUT_SEL32V(_segMan, obj, frame, ticker);
@@ -816,9 +819,9 @@
 
 	value = CLIP<int>(value, 0, Audio::Mixer::kMaxChannelVolume);
 
-	if (_music->_playList[slot]->volume != value) {
-		_music->_playList[slot]->volume = value;
-		_music->soundSetVolume(_music->_playList[slot], value);
+	if (_music->getSlot(slot)->volume != value) {
+		_music->getSlot(slot)->volume = value;
+		_music->soundSetVolume(_music->getSlot(slot), value);
 		PUT_SEL32V(_segMan, obj, vol, value);
 	}
 #endif
@@ -864,10 +867,10 @@
 		return;
 	}
 	if (value == -1) {
-		_music->_playList[slot]->loop = 1;
+		_music->getSlot(slot)->loop = 1;
 		PUT_SEL32V(_segMan, obj, loop, 0xFFFF);
 	} else {
-		_music->_playList[slot]->loop = 0;
+		_music->getSlot(slot)->loop = 0;
 		PUT_SEL32V(_segMan, obj, loop, 1);
 	}
 #endif


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