aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Sandulenko2008-01-01 16:42:05 +0000
committerEugene Sandulenko2008-01-01 16:42:05 +0000
commit23313cb82ee260c08826ea95d5c67636f9667c52 (patch)
tree090290d8b7903e52c62f9c8a07c60ce6b10e7a2f
parent308b02f4ca5d179aab3cedd8ad9bd97c0685be73 (diff)
downloadscummvm-rg350-23313cb82ee260c08826ea95d5c67636f9667c52.tar.gz
scummvm-rg350-23313cb82ee260c08826ea95d5c67636f9667c52.tar.bz2
scummvm-rg350-23313cb82ee260c08826ea95d5c67636f9667c52.zip
Patch #1733017: "SWORD1: Possible patch for bug #1730183"
svn-id: r30124
-rw-r--r--engines/sword1/control.cpp27
-rw-r--r--engines/sword1/sword1.cpp54
2 files changed, 71 insertions, 10 deletions
diff --git a/engines/sword1/control.cpp b/engines/sword1/control.cpp
index 0ac32162b0..c2c6befbfd 100644
--- a/engines/sword1/control.cpp
+++ b/engines/sword1/control.cpp
@@ -221,6 +221,14 @@ void Control::askForCd(void) {
free(_screenBuf);
}
+static int volToBalance(int volL, int volR) {
+ if (volL + volR == 0) {
+ return 50;
+ } else {
+ return (100 * volL / (volL + volR));
+ }
+}
+
uint8 Control::runPanel(void) {
_mouseDown = false;
_restoreBuf = NULL;
@@ -310,6 +318,25 @@ uint8 Control::runPanel(void) {
delay(1000 / 12);
newMode = getClicks(mode, &retVal);
} while ((newMode != BUTTON_DONE) && (retVal == 0) && (!SwordEngine::_systemVars.engineQuit));
+
+ if (SwordEngine::_systemVars.controlPanelMode == CP_NORMAL) {
+ uint8 volL, volR;
+ _music->giveVolume(&volL, &volR);
+ ConfMan.setInt("music_volume", (int)((volR + volL) / 2));
+ ConfMan.setInt("music_balance", volToBalance(volL, volR));
+
+ _sound->giveSpeechVol(&volL, &volR);
+ ConfMan.setInt("speech_volume", (int)((volR + volL) / 2));
+ ConfMan.setInt("speech_balance", volToBalance(volL, volR));
+
+ _sound->giveSfxVol(&volL, &volR);
+ ConfMan.setInt("sfx_volume", (int)((volR + volL) / 2));
+ ConfMan.setInt("sfx_balance", volToBalance(volL, volR));
+
+ ConfMan.setBool("subtitles", SwordEngine::_systemVars.showText == 1);
+ ConfMan.flushToDisk();
+ }
+
destroyButtons();
_resMan->resClose(fontId);
_resMan->resClose(redFontId);
diff --git a/engines/sword1/sword1.cpp b/engines/sword1/sword1.cpp
index 04328c0571..5af045e0f3 100644
--- a/engines/sword1/sword1.cpp
+++ b/engines/sword1/sword1.cpp
@@ -241,16 +241,50 @@ int SwordEngine::init() {
uint musicVol = ConfMan.getInt("music_volume");
uint speechVol = ConfMan.getInt("speech_volume");
uint sfxVol = ConfMan.getInt("sfx_volume");
- if (musicVol > 255)
- musicVol = 255;
- if (speechVol > 255)
- speechVol = 255;
- if (sfxVol > 255)
- sfxVol = 255;
-
- _music->setVolume(musicVol, musicVol); // these routines expect left and right volume,
- _sound->setSpeechVol(speechVol, speechVol); // but our config manager doesn't support it.
- _sound->setSfxVol(sfxVol, sfxVol);
+ uint musicBal = 50;
+ if (ConfMan.hasKey("music_balance")) {
+ musicBal = CLIP(ConfMan.getInt("music_balance"), 0, 100);
+ }
+ uint speechBal = 50;
+ if (ConfMan.hasKey("speech_balance")) {
+ speechBal = CLIP(ConfMan.getInt("speech_balance"), 0, 100);
+ }
+ uint sfxBal = 50;
+ if (ConfMan.hasKey("sfx_balance")) {
+ sfxBal = CLIP(ConfMan.getInt("sfx_balance"), 0, 100);
+ }
+
+ uint musicVolL = 2 * musicVol * musicBal / 100;
+ uint musicVolR = 2 * musicVol - musicVolL;
+
+ uint speechVolL = 2 * speechVol * speechBal / 100;
+ uint speechVolR = 2 * speechVol - speechVolL;
+
+ uint sfxVolL = 2 * sfxVol * sfxBal / 100;
+ uint sfxVolR = 2 * sfxVol - sfxVolL;
+
+ if (musicVolR > 255) {
+ musicVolR = 255;
+ }
+ if (musicVolL > 255) {
+ musicVolL = 255;
+ }
+ if (speechVolR > 255) {
+ speechVolR = 255;
+ }
+ if (speechVolL > 255) {
+ speechVolL = 255;
+ }
+ if (sfxVolR > 255) {
+ sfxVolR = 255;
+ }
+ if (sfxVolL > 255) {
+ sfxVolL = 255;
+ }
+
+ _music->setVolume(musicVolL, musicVolR);
+ _sound->setSpeechVol(speechVolL, speechVolR);
+ _sound->setSfxVol(sfxVolL, sfxVolR);
_systemVars.justRestoredGame = 0;
_systemVars.currentCD = 0;