aboutsummaryrefslogtreecommitdiff
path: root/engines/sci
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci')
-rw-r--r--engines/sci/sound/decoders/sol.cpp17
1 files changed, 12 insertions, 5 deletions
diff --git a/engines/sci/sound/decoders/sol.cpp b/engines/sci/sound/decoders/sol.cpp
index 121ffe400a..4b366ce9f4 100644
--- a/engines/sci/sound/decoders/sol.cpp
+++ b/engines/sci/sound/decoders/sol.cpp
@@ -54,13 +54,21 @@ static const byte tableDPCM8[8] = { 0, 1, 2, 3, 6, 10, 15, 21 };
* Decompresses one channel of 16-bit DPCM compressed audio.
*/
static void deDPCM16Channel(int16 *out, int16 &sample, uint8 delta) {
+ int32 nextSample = sample;
if (delta & 0x80) {
- sample -= tableDPCM16[delta & 0x7f];
+ nextSample -= tableDPCM16[delta & 0x7f];
} else {
- sample += tableDPCM16[delta];
+ nextSample += tableDPCM16[delta];
}
- sample = CLIP<int16>(sample, -32768, 32767);
- *out = sample;
+
+ // Emulating x86 16-bit signed register overflow
+ if (nextSample > 32767) {
+ nextSample -= 65536;
+ } else if (nextSample < -32768) {
+ nextSample += 65536;
+ }
+
+ *out = sample = nextSample;
}
/**
@@ -101,7 +109,6 @@ static void deDPCM8Nibble(int16 *out, uint8 &sample, uint8 delta) {
} else {
sample += tableDPCM8[delta & 7];
}
- sample = CLIP<byte>(sample, 0, 255);
*out = ((lastSample + sample) << 7) ^ 0x8000;
}