From 5f1ef918209682bb7affb9f0c288b56163d3bc5f Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 28 Oct 2007 03:32:13 +0000 Subject: Added storing of playing sounds to savegame (note: only sounds flagged as restorable are restarted after loading a savegame) svn-id: r29271 --- engines/lure/sound.cpp | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) (limited to 'engines/lure/sound.cpp') diff --git a/engines/lure/sound.cpp b/engines/lure/sound.cpp index 850b549519..8a7e0856f4 100644 --- a/engines/lure/sound.cpp +++ b/engines/lure/sound.cpp @@ -42,6 +42,7 @@ SoundManager::SoundManager() { _descs = Disk::getReference().getEntry(SOUND_DESC_RESOURCE_ID); _numDescs = _descs->size() / sizeof(SoundDescResource); _soundData = NULL; + _paused = false; int midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); _nativeMT32 = ((midiDriver == MD_MT32) || ConfMan.getBool("native_mt32")); @@ -87,6 +88,36 @@ SoundManager::~SoundManager() { g_system->deleteMutex(_soundMutex); } +void SoundManager::saveToStream(WriteStream *stream) { + debugC(ERROR_BASIC, kLureDebugSounds, "SoundManager::saveToStream"); + ManagedList::iterator i; + + for (i = _activeSounds.begin(); i != _activeSounds.end(); ++i) { + SoundDescResource *rec = *i; + stream->writeByte(rec->soundNumber); + } + stream->writeByte(0xff); +} + +void SoundManager::loadFromStream(ReadStream *stream) { + // Stop any existing sounds playing + killSounds(); + + // Load any playing sounds + uint8 soundNumber; + while ((soundNumber = stream->readByte()) != 0xff) { + uint8 soundIndex = descIndexOf(soundNumber); + if (soundIndex != 0xff) { + // Make sure that the sound is allowed to be restored + SoundDescResource &rec = soundDescs()[soundIndex]; + if ((rec.flags & SF_RESTORE) != 0) + // Requeue the sound for playing + addSound(soundIndex, false); + } + } +} + + void SoundManager::loadSection(uint16 sectionId) { debugC(ERROR_BASIC, kLureDebugSounds, "SoundManager::loadSection = %xh", sectionId); killSounds(); @@ -247,6 +278,17 @@ void SoundManager::setVolume(uint8 volume) { } } +uint8 SoundManager::descIndexOf(uint8 soundNumber) { + SoundDescResource *rec = soundDescs(); + + for (uint8 index = 0; index < _numDescs; ++index, ++rec) { + if (rec->soundNumber == soundNumber) + return index; + } + + return 0xff; // Couldn't find entry +} + SoundDescResource *SoundManager::findSound(uint8 soundNumber) { debugC(ERROR_BASIC, kLureDebugSounds, "SoundManager::findSound soundNumber=%d", soundNumber); ManagedList::iterator i; @@ -499,6 +541,9 @@ void SoundManager::onTimer(void *data) { } void SoundManager::doTimer() { + if (_paused) + return; + g_system->lockMutex(_soundMutex); ManagedList::iterator i; -- cgit v1.2.3