XEEN: In progress splitting of music and sfx volumes in sound driver
This commit is contained in:
parent
8fdf592fe1
commit
9db2f3cd84
4 changed files with 45 additions and 32 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue