diff options
author | Torbjörn Andersson | 2006-04-23 15:42:02 +0000 |
---|---|---|
committer | Torbjörn Andersson | 2006-04-23 15:42:02 +0000 |
commit | beb72667dcf1f6141d9f2e08f73cc60adad34eea (patch) | |
tree | 52cf66baaee8c5c913a11db2799ab0a5181bd84f /engines | |
parent | 5e3e026f92cca8fb75800baa5eaf3918cb9e08ca (diff) | |
download | scummvm-rg350-beb72667dcf1f6141d9f2e08f73cc60adad34eea.tar.gz scummvm-rg350-beb72667dcf1f6141d9f2e08f73cc60adad34eea.tar.bz2 scummvm-rg350-beb72667dcf1f6141d9f2e08f73cc60adad34eea.zip |
Implemented volume and panning for FF sound effects. I hope my mapping from
DirectSound's logarithmic scale to ScummVM's linear scale is at least
reasonably collect. This should keep the sound effects from overpowering the
spoken voices in some scenes.
svn-id: r22107
Diffstat (limited to 'engines')
-rw-r--r-- | engines/simon/res.cpp | 2 | ||||
-rw-r--r-- | engines/simon/simon.h | 2 | ||||
-rw-r--r-- | engines/simon/sound.cpp | 37 | ||||
-rw-r--r-- | engines/simon/sound.h | 2 | ||||
-rw-r--r-- | engines/simon/vga.cpp | 12 |
5 files changed, 43 insertions, 12 deletions
diff --git a/engines/simon/res.cpp b/engines/simon/res.cpp index 67fa3501c2..e4ac479e7b 100644 --- a/engines/simon/res.cpp +++ b/engines/simon/res.cpp @@ -710,7 +710,7 @@ byte *SimonEngine::loadVGAFile(uint id, uint type, uint32 &dstSize) { return dst; } -void SimonEngine::loadSound(uint sound, uint pan, uint vol, uint type) { +void SimonEngine::loadSound(uint sound, int pan, int vol, uint type) { byte *dst; if (getFeatures() & GF_ZLIBCOMP) { diff --git a/engines/simon/simon.h b/engines/simon/simon.h index 8be62e5306..d39d842675 100644 --- a/engines/simon/simon.h +++ b/engines/simon/simon.h @@ -496,7 +496,7 @@ protected: void loadGamePcFile(); void decompressData(const char *srcName, byte *dst, uint32 offset, uint32 srcSize, uint32 dstSize); void loadOffsets(const char *filename, int number, uint32 &file, uint32 &offset, uint32 &compressedSize, uint32 &size); - void loadSound(uint sound, uint pan, uint vol, uint type); + void loadSound(uint sound, int pan, int vol, uint type); void loadVoice(uint speechId); void palette_fadeout(uint32 *pal_values, uint num); diff --git a/engines/simon/sound.cpp b/engines/simon/sound.cpp index b9a2bf6539..7f28dfdd56 100644 --- a/engines/simon/sound.cpp +++ b/engines/simon/sound.cpp @@ -265,7 +265,6 @@ Sound::Sound(SimonEngine *vm, const GameSpecificSettings *gss, Audio::Mixer *mix if (_vm->getGameType() == GType_SIMON1) loadSfxFile(gss); } - } Sound::~Sound() { @@ -585,7 +584,7 @@ void Sound::playVoiceData(byte *soundData, uint sound) { playSoundData(&_voiceHandle, soundData, sound); } -void Sound::playSoundData(Audio::SoundHandle *handle, byte *soundData, uint sound, uint pan, uint vol, bool loop) { +void Sound::playSoundData(Audio::SoundHandle *handle, byte *soundData, uint sound, int pan, int vol, bool loop) { byte *buffer, flags; uint16 compType; int blockAlign, rate; @@ -596,6 +595,38 @@ void Sound::playSoundData(Audio::SoundHandle *handle, byte *soundData, uint soun error("playSoundData: Not a valid WAV data"); } + // The Feeble Files originally used DirectSound, which specifies volume + // and panning differently than ScummVM does, using a logarithmic scale + // rather than a linear one. + // + // Volume is a value between -10,000 and 0. + // Panning is a value between -10,000 and 10,000. + // + // In both cases, the -10,000 represents -100 dB. When panning, only + // one speaker's volume is affected - just like in ScummVM - with + // negative values affecting the left speaker, and positive values + // affecting the right speaker. Thus -10,000 means the left speaker is + // silent. + + int v, p; + + vol = CLIP(vol, -10000, 0); + pan = CLIP(pan, -10000, 10000); + + if (vol) { + v = (int)((double)Audio::Mixer::kMaxChannelVolume * pow(10.0, (double)vol / 2000.0) + 0.5); + } else { + v = Audio::Mixer::kMaxChannelVolume; + } + + if (pan < 0) { + p = (int)(255.0 * pow(10.0, (double)pan / 2000.0) + 127.5); + } else if (pan > 0) { + p = (int)(255.0 * pow(10.0, (double)pan / -2000.0) - 127.5); + } else { + p = 0; + } + if (loop == true) flags |= Audio::Mixer::FLAG_LOOP; @@ -610,7 +641,7 @@ void Sound::playSoundData(Audio::SoundHandle *handle, byte *soundData, uint soun memcpy(buffer, soundData + stream.pos(), size); } - _mixer->playRaw(handle, buffer, size, rate, flags | Audio::Mixer::FLAG_AUTOFREE); + _mixer->playRaw(handle, buffer, size, rate, flags | Audio::Mixer::FLAG_AUTOFREE, -1, v, p); } void Sound::stopSfx5() { diff --git a/engines/simon/sound.h b/engines/simon/sound.h index 350f30273d..9f5d612678 100644 --- a/engines/simon/sound.h +++ b/engines/simon/sound.h @@ -76,7 +76,7 @@ public: void playAmbientData(byte *soundData, uint sound, uint pan, uint vol); void playSfxData(byte *soundData, uint sound, uint pan, uint vol); void playSfx5Data(byte *soundData, uint sound, uint pan, uint vol); - void playSoundData(Audio::SoundHandle *handle, byte *soundData, uint sound, uint pan = 0, uint vol = 0, bool loop = false); + void playSoundData(Audio::SoundHandle *handle, byte *soundData, uint sound, int pan = 0, int vol = 0, bool loop = false); void playVoiceData(byte *soundData, uint sound); void switchVoiceFile(const GameSpecificSettings *gss, uint disc); diff --git a/engines/simon/vga.cpp b/engines/simon/vga.cpp index a12d199e28..b97040db9d 100644 --- a/engines/simon/vga.cpp +++ b/engines/simon/vga.cpp @@ -1965,8 +1965,8 @@ void SimonEngine::vc52_playSound() { } if (getGameType() == GType_FF) { - uint16 pan = vcReadNextWord(); - uint16 vol = vcReadNextWord(); + int16 pan = vcReadNextWord(); + int16 vol = vcReadNextWord(); if (ambient) loadSound(sound, pan, vol, 2); @@ -1986,11 +1986,11 @@ void SimonEngine::vc52_playSound() { void SimonEngine::vc53_panSFX() { VgaSprite *vsp = findCurSprite(); - int32 pan; + int pan; uint16 sound = vcReadNextWord(); int16 xoffs = vcReadNextWord(); - uint16 vol = vcReadNextWord(); + int16 vol = vcReadNextWord(); pan = (vsp->x - _scrollX + xoffs) * 8 - 2560; if (pan < -10000) @@ -2488,8 +2488,8 @@ void SimonEngine::vc82_getPathValue() { void SimonEngine::vc83_playSoundLoop() { uint sound = vcReadNextWord(); - uint vol = vcReadNextWord(); - uint pan = vcReadNextWord(); + int16 vol = vcReadNextWord(); + int16 pan = vcReadNextWord(); loadSound(sound, pan, vol, 3); } |