diff options
author | Paul Gilbert | 2007-10-28 03:32:13 +0000 |
---|---|---|
committer | Paul Gilbert | 2007-10-28 03:32:13 +0000 |
commit | 5f1ef918209682bb7affb9f0c288b56163d3bc5f (patch) | |
tree | 011f7101d91e6a60cd9c0e3c716a80750b224031 /engines/lure/sound.cpp | |
parent | 9d14d74e8d763806afc7019ab5cdda4eab113a44 (diff) | |
download | scummvm-rg350-5f1ef918209682bb7affb9f0c288b56163d3bc5f.tar.gz scummvm-rg350-5f1ef918209682bb7affb9f0c288b56163d3bc5f.tar.bz2 scummvm-rg350-5f1ef918209682bb7affb9f0c288b56163d3bc5f.zip |
Added storing of playing sounds to savegame (note: only sounds flagged as restorable are restarted after loading a savegame)
svn-id: r29271
Diffstat (limited to 'engines/lure/sound.cpp')
-rw-r--r-- | engines/lure/sound.cpp | 45 |
1 files changed, 45 insertions, 0 deletions
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<SoundDescResource *>::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<SoundDescResource *>::iterator i; @@ -499,6 +541,9 @@ void SoundManager::onTimer(void *data) { } void SoundManager::doTimer() { + if (_paused) + return; + g_system->lockMutex(_soundMutex); ManagedList<MidiMusic *>::iterator i; |