diff options
author | athrxx | 2019-03-20 21:36:44 +0100 |
---|---|---|
committer | athrxx | 2019-04-13 18:54:58 +0200 |
commit | b80927992807ce9b9ce69920f86d7f2e7f7b45be (patch) | |
tree | 833637a9185dca3a62eec78867b38b31b3a6a275 /engines/kyra/sound/sound_amiga_eob.cpp | |
parent | 8c92e045ce59f456be5b2a3f51b558f9abc9d472 (diff) | |
download | scummvm-rg350-b80927992807ce9b9ce69920f86d7f2e7f7b45be.tar.gz scummvm-rg350-b80927992807ce9b9ce69920f86d7f2e7f7b45be.tar.bz2 scummvm-rg350-b80927992807ce9b9ce69920f86d7f2e7f7b45be.zip |
KYRA: (EOB2/Amiga) - update sound driver
- add fade out method
- some renaming
- turn a warning into a debug message
Diffstat (limited to 'engines/kyra/sound/sound_amiga_eob.cpp')
-rw-r--r-- | engines/kyra/sound/sound_amiga_eob.cpp | 43 |
1 files changed, 35 insertions, 8 deletions
diff --git a/engines/kyra/sound/sound_amiga_eob.cpp b/engines/kyra/sound/sound_amiga_eob.cpp index eccf380a69..444c85995c 100644 --- a/engines/kyra/sound/sound_amiga_eob.cpp +++ b/engines/kyra/sound/sound_amiga_eob.cpp @@ -104,20 +104,25 @@ void SoundAmiga_EoB::loadSoundFile(Common::String file) { if (!in) return; + // This value can deviate up to 5 bytes from the real size in EOB II Amiga. + // The original simply tries to read 64000 bytes from the file (ignoring this + // value). We do the same. + // EOB I strangely always seems to have correct values. uint16 readSize = in->readUint16LE() - 10; uint8 cmp = in->readByte(); in->seek(1, SEEK_CUR); uint32 outSize = in->readUint32LE(); in->seek(2, SEEK_CUR); - if (in->read(_fileBuffer, readSize) != readSize) - error("SoundAmiga_EoB::loadSoundFile(): Failed to load sound file '%s'", file.c_str()); + readSize = in->read(_fileBuffer, 64000); delete in; + if (cmp == 0 && readSize < outSize) + outSize = readSize; + uint8 *buf = new uint8[outSize]; if (cmp == 0) { - assert(readSize == outSize); memcpy(buf, _fileBuffer, outSize); } else if (cmp == 3) { Screen::decodeFrame3(_fileBuffer, buf, outSize, true); @@ -135,7 +140,7 @@ void SoundAmiga_EoB::loadSoundFile(Common::String file) { } void SoundAmiga_EoB::playTrack(uint8 track) { - if (!_musicEnabled) + if (!_musicEnabled || !_ready) return; Common::String newSound; @@ -149,7 +154,17 @@ void SoundAmiga_EoB::playTrack(uint8 track) { newSound = "FINALE.SMUS"; } } else if (_vm->game() == GI_EOB2) { - + if (_currentResourceSet == kMusicIntro) { + if (track > 11 && track < 16) { + const char *const songs[] = { "INTRO1A.SMUS", "CHARGEN3.SMUS", "INTRO1B.SMUS", "INTRO1C.SMUS" }; + newSound = songs[track - 12]; + } + } else if (_currentResourceSet == kMusicFinale) { + if (track > 0 && track < 4) { + const char *const songs[] = { "FINALE1B.SMUS", "FINALE1C.SMUS", "FINALE1D.SMUS" }; + newSound = songs[track - 1]; + } + } } if (!newSound.empty() && _ready) { @@ -161,11 +176,17 @@ void SoundAmiga_EoB::playTrack(uint8 track) { void SoundAmiga_EoB::haltTrack() { if (!_lastSound.empty()) _driver->stopSound(_lastSound); + _lastSound.clear(); } void SoundAmiga_EoB::playSoundEffect(uint8 track, uint8 volume) { - if (_currentResourceSet == -1 || !_ready) + if (_currentResourceSet == -1 || !_sfxEnabled || !_ready) + return; + + if (_vm->game() == GI_EOB2 && _currentResourceSet == kMusicIntro && track == 14) { + _driver->startSound("TELEPORT.SAM"); return; + } if (!_resInfo[_currentResourceSet]->soundList || track >= 120 || !_sfxEnabled) return; @@ -191,8 +212,10 @@ void SoundAmiga_EoB::playSoundEffect(uint8 track, uint8 volume) { } } -void SoundAmiga_EoB::beginFadeOut() { - haltTrack(); +void SoundAmiga_EoB::beginFadeOut(int delay) { + _driver->fadeOut(delay); + while (_driver->isFading() && !_vm->shouldQuit()) + _vm->delay(5); } void SoundAmiga_EoB::updateVolumeSettings() { @@ -207,6 +230,10 @@ void SoundAmiga_EoB::updateVolumeSettings() { _driver->setSoundEffectVolume((mute ? 0 : ConfMan.getInt("sfx_volume"))); } +int SoundAmiga_EoB::checkTrigger() { + return _driver->getPlayDuration(); +} + void SoundAmiga_EoB::unloadLevelSounds() { if (_currentFile != -1) { _driver->flushResource(Common::String::format("L%dM1A1", _currentFile)); |