XEEN: In progress splitting of music and sfx volumes in sound driver

This commit is contained in:
Paul Gilbert 2018-05-04 21:46:39 -04:00
parent 8fdf592fe1
commit 9db2f3cd84
4 changed files with 45 additions and 32 deletions

View file

@ -29,7 +29,8 @@
namespace Xeen { namespace Xeen {
Sound::Sound(Audio::Mixer *mixer) : _mixer(mixer), _fxOn(true), _musicOn(true), _subtitles(false), 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(); _SoundDriver = new AdlibSoundDriver();
} }
@ -106,18 +107,6 @@ void Sound::setFxOn(bool isOn) {
g_vm->syncSoundSettings(); 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() { void Sound::loadEffectsData() {
// Stop any prior FX // Stop any prior FX
stopFX(); stopFX();
@ -160,8 +149,8 @@ void Sound::stopFX() {
_SoundDriver->stopFX(); _SoundDriver->stopFX();
} }
int Sound::songCommand(uint commandId, byte volume) { int Sound::songCommand(uint commandId, byte musicVolume, byte sfxVolume) {
int result = _SoundDriver->songCommand(commandId, volume); int result = _SoundDriver->songCommand(commandId, musicVolume, sfxVolume);
if (commandId == STOP_SONG) { if (commandId == STOP_SONG) {
delete[] _songData; delete[] _songData;
_songData = nullptr; _songData = nullptr;
@ -212,8 +201,26 @@ void Sound::setMusicPercent(byte percent) {
assert(percent <= 100); assert(percent <= 100);
_musicPercent = percent; _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 } // End of namespace Xeen

View file

@ -40,6 +40,7 @@ private:
Audio::Mixer *_mixer; Audio::Mixer *_mixer;
Audio::SoundHandle _soundHandle; Audio::SoundHandle _soundHandle;
byte _musicPercent; byte _musicPercent;
int _musicVolume, _sfxVolume;
private: private:
/** /**
* Loads effects data that was embedded in the music driver * Loads effects data that was embedded in the music driver
@ -50,6 +51,11 @@ private:
* Updates any playing music * Updates any playing music
*/ */
void update(); void update();
/**
* Updates the music and sound effects playing volume
*/
void updateVolume();
public: public:
bool _fxOn; bool _fxOn;
bool _musicOn; bool _musicOn;
@ -73,7 +79,7 @@ public:
/** /**
* Executes special music command * 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 * Stops any currently playing music

View file

@ -225,7 +225,7 @@ void SoundDriver::playSong(const byte *data) {
debugC(1, kDebugSound, "Starting song"); 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) { if (commandId == STOP_SONG) {
_musicPlaying = false; _musicPlaying = false;
} else if (commandId == RESTART_SONG) { } else if (commandId == RESTART_SONG) {
@ -262,7 +262,7 @@ const CommandFn SoundDriver::FX_COMMANDS[16] = {
/*------------------------------------------------------------------------*/ /*------------------------------------------------------------------------*/
AdlibSoundDriver::AdlibSoundDriver() : _field180(0), _field181(0), _field182(0), 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(&_musInstrumentPtrs[0], &_musInstrumentPtrs[16], (const byte *)nullptr);
Common::fill(&_fxInstrumentPtrs[0], &_fxInstrumentPtrs[16], (const byte *)nullptr); Common::fill(&_fxInstrumentPtrs[0], &_fxInstrumentPtrs[16], (const byte *)nullptr);
@ -304,9 +304,9 @@ void AdlibSoundDriver::playSong(const byte *data) {
resetFrequencies(); resetFrequencies();
} }
int AdlibSoundDriver::songCommand(uint commandId, byte volume) { int AdlibSoundDriver::songCommand(uint commandId, byte musicVolume, byte sfxVolume) {
Common::StackLock slock(_driverMutex); Common::StackLock slock(_driverMutex);
SoundDriver::songCommand(commandId, volume); SoundDriver::songCommand(commandId, musicVolume, sfxVolume);
if (commandId == STOP_SONG) { if (commandId == STOP_SONG) {
_field180 = 0; _field180 = 0;
@ -320,7 +320,8 @@ int AdlibSoundDriver::songCommand(uint commandId, byte volume) {
_field182 = 63; _field182 = 63;
} }
} else if (commandId == SET_VOLUME) { } else if (commandId == SET_VOLUME) {
_volume = volume; _musicVolume = musicVolume;
_sfxVolume = sfxVolume;
} else if (commandId == GET_STATUS) { } else if (commandId == GET_STATUS) {
return _field180; return _field180;
} }
@ -428,7 +429,7 @@ void AdlibSoundDriver::setOutputLevel(byte channelNum, uint level) {
(_channels[channelNum]._scalingValue & 0xC0)); (_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 op1 = OPERATOR1_INDEXES[channelNum];
byte op2 = OPERATOR2_INDEXES[channelNum]; byte op2 = OPERATOR2_INDEXES[channelNum];
debugC(2, kDebugSound, "---START-playInstrument - %d", channelNum); debugC(2, kDebugSound, "---START-playInstrument - %d", channelNum);
@ -441,7 +442,7 @@ void AdlibSoundDriver::playInstrument(byte channelNum, const byte *data) {
int scalingVal = *data++; int scalingVal = *data++;
_channels[channelNum]._scalingValue = scalingVal; _channels[channelNum]._scalingValue = scalingVal;
scalingVal += (127 - _volume) / 2; scalingVal += (127 - volume) / 2;
if (scalingVal > 63) { if (scalingVal > 63) {
scalingVal = 63; scalingVal = 63;
@ -535,7 +536,7 @@ bool AdlibSoundDriver::musPlayInstrument(const byte *&srcP, byte param) {
debugC(3, kDebugSound, "musPlayInstrument %d, %d", param, instrument); debugC(3, kDebugSound, "musPlayInstrument %d, %d", param, instrument);
if (param < 7) if (param < 7)
playInstrument(param, _musInstrumentPtrs[instrument]); playInstrument(param, _musInstrumentPtrs[instrument], _musicVolume);
return false; return false;
} }
@ -633,7 +634,7 @@ bool AdlibSoundDriver::fxPlayInstrument(const byte *&srcP, byte param) {
debugC(3, kDebugSound, "fxPlayInstrument %d, %d", param, instrument); debugC(3, kDebugSound, "fxPlayInstrument %d, %d", param, instrument);
if (!_exclude7 || param != 7) if (!_exclude7 || param != 7)
playInstrument(param, _fxInstrumentPtrs[instrument]); playInstrument(param, _fxInstrumentPtrs[instrument], _sfxVolume);
return false; return false;
} }

View file

@ -40,8 +40,7 @@ namespace OPL {
namespace Xeen { namespace Xeen {
enum MusicCommand { enum MusicCommand {
STOP_SONG = 0, RESTART_SONG = 1, SET_VOLUME = 0x100, STOP_SONG = 0, RESTART_SONG = 1, SET_VOLUME = 0x100, GET_STATUS = 0xFFE0
GET_STATUS = 0xFFE0
}; };
class SoundDriver; class SoundDriver;
@ -170,7 +169,7 @@ public:
/** /**
* Executes special music command * 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 * Returns whether music is currently playing
@ -200,7 +199,7 @@ private:
int _field180; int _field180;
int _field181; int _field181;
int _field182; int _field182;
int _volume; int _musicVolume, _sfxVolume;
private: private:
/** /**
* Initializes the state of the Adlib OPL driver * Initializes the state of the Adlib OPL driver
@ -246,7 +245,7 @@ private:
/** /**
* Starts playing an instrument * Starts playing an instrument
*/ */
void playInstrument(byte channelNum, const byte *data); void playInstrument(byte channelNum, const byte *data, byte volume);
protected: protected:
virtual bool musSetInstrument(const byte *&srcP, byte param); virtual bool musSetInstrument(const byte *&srcP, byte param);
virtual bool musSetPitchWheel(const byte *&srcP, byte param); virtual bool musSetPitchWheel(const byte *&srcP, byte param);
@ -301,7 +300,7 @@ public:
/** /**
* Executes special music command * 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 } // End of namespace Xeen