From 9ec8c509da0db5d1b172ab30e13e93948c70e419 Mon Sep 17 00:00:00 2001 From: Einar Johan Trøan Sømåen Date: Tue, 22 Jan 2013 15:42:56 +0100 Subject: WINTERMUTE: Lie to the scripts about the exact master volume-% to avoid round-off-issues. (Fix Bug #3592875) --- engines/wintermute/base/sound/base_sound_manager.cpp | 12 ++++++++++-- engines/wintermute/base/sound/base_sound_manager.h | 4 +++- 2 files changed, 13 insertions(+), 3 deletions(-) (limited to 'engines/wintermute/base/sound') diff --git a/engines/wintermute/base/sound/base_sound_manager.cpp b/engines/wintermute/base/sound/base_sound_manager.cpp index 441793144d..f5f1190331 100644 --- a/engines/wintermute/base/sound/base_sound_manager.cpp +++ b/engines/wintermute/base/sound/base_sound_manager.cpp @@ -26,6 +26,7 @@ * Copyright (c) 2011 Jan Nedoma */ +#include #include "engines/wintermute/base/sound/base_sound_manager.h" #include "engines/wintermute/base/base_engine.h" #include "engines/wintermute/utils/path_util.h" @@ -50,6 +51,7 @@ namespace Wintermute { BaseSoundMgr::BaseSoundMgr(BaseGame *inGame) : BaseClass(inGame) { _soundAvailable = false; _volumeMaster = 255; + _volumeMasterPercent = 100; } @@ -217,6 +219,11 @@ byte BaseSoundMgr::getVolumePercent(Audio::Mixer::SoundType type) { ////////////////////////////////////////////////////////////////////////// bool BaseSoundMgr::setMasterVolume(byte value) { + // This function intentionally doesn't touch _volumeMasterPercent, + // as that variable keeps track of what the game actually wanted, + // and this gives a close approximation, while letting the game + // be none the wiser about round-off-errors. This function should thus + // ONLY be called by setMasterVolumePercent. _volumeMaster = value; for (uint32 i = 0; i < _sounds.size(); i++) { _sounds[i]->updateVolume(); @@ -226,14 +233,15 @@ bool BaseSoundMgr::setMasterVolume(byte value) { ////////////////////////////////////////////////////////////////////////// bool BaseSoundMgr::setMasterVolumePercent(byte percent) { - setMasterVolume(percent * 255 / 100); + _volumeMasterPercent = percent; + setMasterVolume((int)ceil(percent * 255.0 / 100.0)); return STATUS_OK; } ////////////////////////////////////////////////////////////////////////// byte BaseSoundMgr::getMasterVolumePercent() { - return getMasterVolume() * 100 / 255; + return _volumeMasterPercent; } ////////////////////////////////////////////////////////////////////////// diff --git a/engines/wintermute/base/sound/base_sound_manager.h b/engines/wintermute/base/sound/base_sound_manager.h index 36a729b5ae..1ee3c13fdb 100644 --- a/engines/wintermute/base/sound/base_sound_manager.h +++ b/engines/wintermute/base/sound/base_sound_manager.h @@ -45,7 +45,6 @@ public: //DECLARE_PERSISTENT(BaseSoundMgr, BaseClass); byte getMasterVolumePercent(); byte getMasterVolume(); - bool setMasterVolume(byte percent); bool setMasterVolumePercent(byte percent); byte getVolumePercent(Audio::Mixer::SoundType type); bool setVolumePercent(Audio::Mixer::SoundType type, byte percent); @@ -61,6 +60,9 @@ public: virtual ~BaseSoundMgr(); Common::Array _sounds; void saveSettings(); +private: + int _volumeMasterPercent; // Necessary to avoid round-offs. + bool setMasterVolume(byte percent); }; } // end of namespace Wintermute -- cgit v1.2.3