diff options
-rw-r--r-- | sword2/controls.cpp | 42 | ||||
-rw-r--r-- | sword2/driver/d_sound.cpp | 35 | ||||
-rw-r--r-- | sword2/driver/d_sound.h | 4 |
3 files changed, 39 insertions, 42 deletions
diff --git a/sword2/controls.cpp b/sword2/controls.cpp index 6b0c4fa7fe..71376c2911 100644 --- a/sword2/controls.cpp +++ b/sword2/controls.cpp @@ -777,9 +777,9 @@ public: gui->readOptionSettings(); - _objectLabelsSwitch->setValue(gui->_pointerTextSelected != 0); - _subtitlesSwitch->setValue(gui->_subtitles != 0); - _reverseStereoSwitch->setValue(gui->_stereoReversed != 0); + _objectLabelsSwitch->setValue(gui->_pointerTextSelected); + _subtitlesSwitch->setValue(gui->_subtitles); + _reverseStereoSwitch->setValue(gui->_stereoReversed); _musicSwitch->setValue(!g_sound->isMusicMute()); _speechSwitch->setValue(!g_sound->isSpeechMute()); _fxSwitch->setValue(!g_sound->isFxMute()); @@ -839,14 +839,9 @@ public: virtual void onAction(Widget *widget, int result = 0) { // Since there is music playing while the dialog is displayed - // we need to update music volume immediately. Everything else - // is handled when the dialog is terminated. - - if (widget == _reverseStereoSwitch) { - if (result != gui->_stereoReversed) - g_sound->reverseStereo(); - gui->_stereoReversed = result; - } else if (widget == _musicSwitch) { + // we need to update music volume immediately. + + if (widget == _musicSwitch) { g_sound->muteMusic(result); } else if (widget == _musicSlider) { g_sound->setMusicVolume(result); @@ -860,6 +855,10 @@ public: _gfxPreview->setState(result); gui->updateGraphicsLevel(result); } else if (widget == _okButton) { + gui->_subtitles = _subtitlesSwitch->getValue(); + gui->_pointerTextSelected = _objectLabelsSwitch->getValue(); + gui->_stereoReversed = _reverseStereoSwitch->getValue(); + // Apply the changes g_sound->muteMusic(!_musicSwitch->getValue()); g_sound->muteSpeech(!_speechSwitch->getValue()); @@ -867,13 +866,10 @@ public: g_sound->setMusicVolume(_musicSlider->getValue()); g_sound->setSpeechVolume(_speechSlider->getValue()); g_sound->setFxVolume(_fxSlider->getValue()); + g_sound->buildPanTable(gui->_stereoReversed); gui->updateGraphicsLevel(_gfxSlider->getValue()); - gui->_subtitles = _subtitlesSwitch->getValue(); - gui->_pointerTextSelected = _objectLabelsSwitch->getValue(); - gui->_stereoReversed = _reverseStereoSwitch->getValue(); - gui->writeOptionSettings(); setResult(1); } else if (widget == _cancelButton) { @@ -1365,7 +1361,11 @@ Gui::Gui() : _baseSlot(0) { } void Gui::readOptionSettings(void) { - bool newStereoReversed; + _subtitles = !ConfMan.getBool("nosubtitles"); + _pointerTextSelected = ConfMan.getBool("object_labels"); + _stereoReversed = ConfMan.getBool("reverse_stereo"); + + updateGraphicsLevel((uint8) ConfMan.getInt("gfx_details")); g_sound->setMusicVolume((16 * ConfMan.getInt("music_volume")) / 255); g_sound->setSpeechVolume((14 * ConfMan.getInt("speech_volume")) / 255); @@ -1373,15 +1373,7 @@ void Gui::readOptionSettings(void) { g_sound->muteMusic(ConfMan.getBool("music_mute")); g_sound->muteSpeech(ConfMan.getBool("speech_mute")); g_sound->muteFx(ConfMan.getBool("sfx_mute")); - updateGraphicsLevel((uint8) ConfMan.getInt("gfx_details")); - _subtitles = !ConfMan.getBool("nosubtitles"); - _pointerTextSelected = ConfMan.getBool("object_labels"); - newStereoReversed = ConfMan.getBool("reverse_stereo"); - - if (_stereoReversed != newStereoReversed) - g_sound->reverseStereo(); - - _stereoReversed = newStereoReversed; + g_sound->buildPanTable(_stereoReversed); } void Gui::writeOptionSettings(void) { diff --git a/sword2/driver/d_sound.cpp b/sword2/driver/d_sound.cpp index ca776e1118..2794f45989 100644 --- a/sword2/driver/d_sound.cpp +++ b/sword2/driver/d_sound.cpp @@ -52,14 +52,6 @@ static File fpMus; #define GetCompressedSign(n) (((n) >> 3) & 1) #define GetCompressedAmplitude(n) ((n) & 7) -static int32 panTable[33] = { - -127, -119, -111, -103, -95, -87, -79, -71, - -63, -55, -47, -39, -31, -23, -15, -7, - 0, - 7, 15, 23, 31, 39, 47, 55, 63, - 71, 79, 87, 95, 103, 111, 119, 127 -}; - static int32 musicVolTable[17] = { 0, 15, 31, 47, 63, 79, 95, 111, 127, 143, 159, 175, 191, 207, 223, 239, 255 @@ -165,12 +157,23 @@ Sound::~Sound() { // FIXME: We could probably use the FLAG_REVERSE_STEREO mixer flag here. /** - * This function reverses the pan table, thus reversing the stereo. + * This function creates the pan table. */ -void Sound::reverseStereo(void) { - for (int i = 0; i < 16; i++) - SWAP(panTable[i], panTable[32 - i]); +void Sound::buildPanTable(bool reverse) { + int i; + + for (i = 0; i < 16; i++) { + _panTable[i] = -127 + i * 8; + _panTable[i + 17] = (i + 1) * 8 - 1; + } + + _panTable[16] = 0; + + if (reverse) { + for (i = 0; i < 33; i++) + _panTable[i] = -_panTable[i]; + } } // Save/Restore information about current music so that we can restore it @@ -407,7 +410,7 @@ int32 Sound::playCompSpeech(const char *filename, uint32 speechid, uint8 vol, in // Modify the volume according to the master volume byte volume = _speechMuted ? 0 : vol * _speechVol; - int8 p = panTable[pan + 16]; + int8 p = _panTable[pan + 16]; // Start the speech playing @@ -659,7 +662,7 @@ int32 Sound::playFx(int32 id, uint8 *data, uint8 vol, int8 pan, uint8 type) { // Start the sound effect playing byte volume = _fxMuted ? 0 : vol * _fxVol; - int8 p = panTable[pan + 16]; + int8 p = _panTable[pan + 16]; g_engine->_mixer->playRaw(&_fx[i]._handle, _fx[i]._buf, _fx[i]._bufSize, _fx[i]._rate, _fx[i]._flags, -1, volume, p); } else { @@ -703,7 +706,7 @@ int32 Sound::playFx(int32 id, uint8 *data, uint8 vol, int8 pan, uint8 type) { // Start the sound effect playing byte volume = _fxMuted ? 0 : vol * _fxVol; - int8 p = panTable[pan + 16]; + int8 p = _panTable[pan + 16]; g_engine->_mixer->playRaw(&_fx[i]._handle, _fx[i]._buf, _fx[i]._bufSize, _fx[i]._rate, _fx[i]._flags, -1, volume, p); } @@ -733,7 +736,7 @@ int32 Sound::setFxIdVolumePan(int32 id, uint8 vol, int8 pan) { if (!_fxMuted) { g_engine->_mixer->setChannelVolume(_fx[i]._handle, _fx[i]._volume * _fxVol); - g_engine->_mixer->setChannelPan(_fx[i]._handle, panTable[pan + 16]); + g_engine->_mixer->setChannelPan(_fx[i]._handle, _panTable[pan + 16]); } return RD_OK; diff --git a/sword2/driver/d_sound.h b/sword2/driver/d_sound.h index 3b30b80ebd..8138acbf6f 100644 --- a/sword2/driver/d_sound.h +++ b/sword2/driver/d_sound.h @@ -76,6 +76,8 @@ private: OSystem::MutexRef _mutex; RateConverter *_converter; + uint32 _panTable[33]; + FxHandle _fx[MAXFX]; MusicHandle _music[MAXMUS + 1]; @@ -122,7 +124,7 @@ public: void restoreMusicState(); void playLeadOut(uint8 *leadOut); int32 musicTimeRemaining(); - void reverseStereo(void); + void buildPanTable(bool reverse); uint8 getFxVolume(void); uint8 getSpeechVolume(void); uint8 getMusicVolume(void); |