From 9db2f3cd8412faaa4771a17a8479f107e54e148f Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 4 May 2018 21:46:39 -0400 Subject: XEEN: In progress splitting of music and sfx volumes in sound driver --- engines/xeen/sound.cpp | 39 +++++++++++++++++++++++---------------- engines/xeen/sound.h | 8 +++++++- engines/xeen/sound_driver.cpp | 19 ++++++++++--------- engines/xeen/sound_driver.h | 11 +++++------ 4 files changed, 45 insertions(+), 32 deletions(-) diff --git a/engines/xeen/sound.cpp b/engines/xeen/sound.cpp index 9800af5403..ae70c1f5d8 100644 --- a/engines/xeen/sound.cpp +++ b/engines/xeen/sound.cpp @@ -29,7 +29,8 @@ namespace Xeen { Sound::Sound(Audio::Mixer *mixer) : _mixer(mixer), _fxOn(true), _musicOn(true), _subtitles(false), - _songData(nullptr), _effectsData(nullptr), _musicSide(0), _musicPercent(100) { + _songData(nullptr), _effectsData(nullptr), _musicSide(0), _musicPercent(100), + _musicVolume(0), _sfxVolume(0) { _SoundDriver = new AdlibSoundDriver(); } @@ -106,18 +107,6 @@ void Sound::setFxOn(bool isOn) { g_vm->syncSoundSettings(); } -void Sound::updateSoundSettings() { - _fxOn = !ConfMan.getBool("sfx_mute"); - if (!_fxOn) - stopFX(); - - _musicOn = !ConfMan.getBool("music_mute"); - if (!_musicOn) - stopSong(); - - _subtitles = ConfMan.hasKey("subtitles") ? ConfMan.getBool("subtitles") : true; -} - void Sound::loadEffectsData() { // Stop any prior FX stopFX(); @@ -160,8 +149,8 @@ void Sound::stopFX() { _SoundDriver->stopFX(); } -int Sound::songCommand(uint commandId, byte volume) { - int result = _SoundDriver->songCommand(commandId, volume); +int Sound::songCommand(uint commandId, byte musicVolume, byte sfxVolume) { + int result = _SoundDriver->songCommand(commandId, musicVolume, sfxVolume); if (commandId == STOP_SONG) { delete[] _songData; _songData = nullptr; @@ -212,8 +201,26 @@ void Sound::setMusicPercent(byte percent) { assert(percent <= 100); _musicPercent = percent; - songCommand(SET_VOLUME, (int)percent * 127 / 100); + updateVolume(); } +void Sound::updateSoundSettings() { + _fxOn = !ConfMan.getBool("sfx_mute"); + if (!_fxOn) + stopFX(); + + _musicOn = !ConfMan.getBool("music_mute"); + if (!_musicOn) + stopSong(); + + _subtitles = ConfMan.hasKey("subtitles") ? ConfMan.getBool("subtitles") : true; + _musicVolume = CLIP(ConfMan.getInt("music_volume"), 0, 255); + _sfxVolume = CLIP(ConfMan.getInt("sfx_volume"), 0, 255); + updateVolume(); +} + +void Sound::updateVolume() { + songCommand(SET_VOLUME, _musicPercent * _musicVolume / 100, _sfxVolume); +} } // End of namespace Xeen diff --git a/engines/xeen/sound.h b/engines/xeen/sound.h index 86303f682f..613299c6dc 100644 --- a/engines/xeen/sound.h +++ b/engines/xeen/sound.h @@ -40,6 +40,7 @@ private: Audio::Mixer *_mixer; Audio::SoundHandle _soundHandle; byte _musicPercent; + int _musicVolume, _sfxVolume; private: /** * Loads effects data that was embedded in the music driver @@ -50,6 +51,11 @@ private: * Updates any playing music */ void update(); + + /** + * Updates the music and sound effects playing volume + */ + void updateVolume(); public: bool _fxOn; bool _musicOn; @@ -73,7 +79,7 @@ public: /** * Executes special music command */ - int songCommand(uint commandId, byte volume = 0); + int songCommand(uint commandId, byte musicVolume = 0, byte sfxVolume = 0); /** * Stops any currently playing music diff --git a/engines/xeen/sound_driver.cpp b/engines/xeen/sound_driver.cpp index e79fcdd501..967f53ac49 100644 --- a/engines/xeen/sound_driver.cpp +++ b/engines/xeen/sound_driver.cpp @@ -225,7 +225,7 @@ void SoundDriver::playSong(const byte *data) { debugC(1, kDebugSound, "Starting song"); } -int SoundDriver::songCommand(uint commandId, byte volume) { +int SoundDriver::songCommand(uint commandId, byte musicVolume, byte sfxVolume) { if (commandId == STOP_SONG) { _musicPlaying = false; } else if (commandId == RESTART_SONG) { @@ -262,7 +262,7 @@ const CommandFn SoundDriver::FX_COMMANDS[16] = { /*------------------------------------------------------------------------*/ AdlibSoundDriver::AdlibSoundDriver() : _field180(0), _field181(0), _field182(0), - _volume(127) { + _musicVolume(0), _sfxVolume(0) { Common::fill(&_musInstrumentPtrs[0], &_musInstrumentPtrs[16], (const byte *)nullptr); Common::fill(&_fxInstrumentPtrs[0], &_fxInstrumentPtrs[16], (const byte *)nullptr); @@ -304,9 +304,9 @@ void AdlibSoundDriver::playSong(const byte *data) { resetFrequencies(); } -int AdlibSoundDriver::songCommand(uint commandId, byte volume) { +int AdlibSoundDriver::songCommand(uint commandId, byte musicVolume, byte sfxVolume) { Common::StackLock slock(_driverMutex); - SoundDriver::songCommand(commandId, volume); + SoundDriver::songCommand(commandId, musicVolume, sfxVolume); if (commandId == STOP_SONG) { _field180 = 0; @@ -320,7 +320,8 @@ int AdlibSoundDriver::songCommand(uint commandId, byte volume) { _field182 = 63; } } else if (commandId == SET_VOLUME) { - _volume = volume; + _musicVolume = musicVolume; + _sfxVolume = sfxVolume; } else if (commandId == GET_STATUS) { return _field180; } @@ -428,7 +429,7 @@ void AdlibSoundDriver::setOutputLevel(byte channelNum, uint level) { (_channels[channelNum]._scalingValue & 0xC0)); } -void AdlibSoundDriver::playInstrument(byte channelNum, const byte *data) { +void AdlibSoundDriver::playInstrument(byte channelNum, const byte *data, byte volume) { byte op1 = OPERATOR1_INDEXES[channelNum]; byte op2 = OPERATOR2_INDEXES[channelNum]; debugC(2, kDebugSound, "---START-playInstrument - %d", channelNum); @@ -441,7 +442,7 @@ void AdlibSoundDriver::playInstrument(byte channelNum, const byte *data) { int scalingVal = *data++; _channels[channelNum]._scalingValue = scalingVal; - scalingVal += (127 - _volume) / 2; + scalingVal += (127 - volume) / 2; if (scalingVal > 63) { scalingVal = 63; @@ -535,7 +536,7 @@ bool AdlibSoundDriver::musPlayInstrument(const byte *&srcP, byte param) { debugC(3, kDebugSound, "musPlayInstrument %d, %d", param, instrument); if (param < 7) - playInstrument(param, _musInstrumentPtrs[instrument]); + playInstrument(param, _musInstrumentPtrs[instrument], _musicVolume); return false; } @@ -633,7 +634,7 @@ bool AdlibSoundDriver::fxPlayInstrument(const byte *&srcP, byte param) { debugC(3, kDebugSound, "fxPlayInstrument %d, %d", param, instrument); if (!_exclude7 || param != 7) - playInstrument(param, _fxInstrumentPtrs[instrument]); + playInstrument(param, _fxInstrumentPtrs[instrument], _sfxVolume); return false; } diff --git a/engines/xeen/sound_driver.h b/engines/xeen/sound_driver.h index c78408b047..d4edd49c05 100644 --- a/engines/xeen/sound_driver.h +++ b/engines/xeen/sound_driver.h @@ -40,8 +40,7 @@ namespace OPL { namespace Xeen { enum MusicCommand { - STOP_SONG = 0, RESTART_SONG = 1, SET_VOLUME = 0x100, - GET_STATUS = 0xFFE0 + STOP_SONG = 0, RESTART_SONG = 1, SET_VOLUME = 0x100, GET_STATUS = 0xFFE0 }; class SoundDriver; @@ -170,7 +169,7 @@ public: /** * Executes special music command */ - virtual int songCommand(uint commandId, byte volume = 0); + virtual int songCommand(uint commandId, byte musicVolume = 0, byte sfxVolume = 0); /** * Returns whether music is currently playing @@ -200,7 +199,7 @@ private: int _field180; int _field181; int _field182; - int _volume; + int _musicVolume, _sfxVolume; private: /** * Initializes the state of the Adlib OPL driver @@ -246,7 +245,7 @@ private: /** * Starts playing an instrument */ - void playInstrument(byte channelNum, const byte *data); + void playInstrument(byte channelNum, const byte *data, byte volume); protected: virtual bool musSetInstrument(const byte *&srcP, byte param); virtual bool musSetPitchWheel(const byte *&srcP, byte param); @@ -301,7 +300,7 @@ public: /** * Executes special music command */ - virtual int songCommand(uint commandId, byte volume = 0); + virtual int songCommand(uint commandId, byte musicVolume = 0, byte sfxVolume = 0); }; } // End of namespace Xeen -- cgit v1.2.3