[Scummvm-cvs-logs] scummvm master -> 8eb82fd6c1c65ad0590462853ade281101068afa
criezy
criezy at scummvm.org
Fri Sep 5 08:47:35 CEST 2014
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
8eb82fd6c1 SWORD1: Fix heuristic to determine the endianess of the speech in mac version
Commit: 8eb82fd6c1c65ad0590462853ade281101068afa
https://github.com/scummvm/scummvm/commit/8eb82fd6c1c65ad0590462853ade281101068afa
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2014-09-05T07:46:42+01:00
Commit Message:
SWORD1: Fix heuristic to determine the endianess of the speech in mac version
Because the data is compressed (a repeated sample is coded as a
negative length followed by the value), when the length is read with
the wrong endianess we get completely wrong data. So to get the BE
data we cannot just read them assuming LE and byteswap afterward.
Changed paths:
engines/sword1/sound.cpp
diff --git a/engines/sword1/sound.cpp b/engines/sword1/sound.cpp
index 0b4d382..ddde7f4 100644
--- a/engines/sword1/sound.cpp
+++ b/engines/sword1/sound.cpp
@@ -125,31 +125,39 @@ void Sound::checkSpeechFileEndianness() {
uint32 index = _cowHeader[locIndex + (localNo * 2) - 1];
if (sampleSize) {
uint32 size;
- double be_diff_sum = 0., le_diff_sum = 0.;
+ // Compute average of difference between two consecutive samples for both BE and LE
_bigEndianSpeech = false;
int16 *data = uncompressSpeech(index + _cowHeaderSize, sampleSize, &size);
- // Compute average of difference between two consecutive samples for both BE and LE
if (data) {
if (size > 4000)
size = 2000;
else
size /= 2;
- int16 prev_be_value = (int16)SWAP_BYTES_16(*((uint16 *)(data)));
- for (uint32 i = 1; i < size; ++i) {
+ double le_diff_sum = 0.;
+ for (uint32 i = 1; i < size; ++i)
le_diff_sum += fabs((double)(data[i] - data[i - 1]));
- int16 be_value = (int16)SWAP_BYTES_16(*((uint16 *)(data + i)));
- be_diff_sum += fabs((double)(be_value - prev_be_value));
- prev_be_value = be_value;
- }
delete[] data;
+ _bigEndianSpeech = true;
+ data = uncompressSpeech(index + _cowHeaderSize, sampleSize, &size);
+ if (data) {
+ if (size > 4000)
+ size = 2000;
+ else
+ size /= 2;
+ double be_diff_sum = 0.;
+ for (uint32 i = 1; i < size; ++i)
+ be_diff_sum += fabs((double)(data[i] - data[i - 1]));
+ delete [] data;
+ // Set the big endian flag
+ _bigEndianSpeech = (be_diff_sum < le_diff_sum);
+ if (_bigEndianSpeech)
+ debug(6, "Mac version: using big endian speech file");
+ else
+ debug(6, "Mac version: using little endian speech file");
+ debug(8, "Speech endianness heuristic: average = %f for BE and %f for LE, computed on %d samples)", be_diff_sum / (size - 1), le_diff_sum / (size - 1), size);
+ } else
+ _bigEndianSpeech = false;
}
- // Set the big endian flag
- _bigEndianSpeech = (be_diff_sum < le_diff_sum);
- if (_bigEndianSpeech)
- debug(6, "Mac version: using big endian speech file");
- else
- debug(6, "Mac version: using little endian speech file");
- debug(8, "Speech endianness heuristic: average = %f for BE and %f for LE, computed on %d samples)", be_diff_sum / (size - 1), le_diff_sum / (size - 1), size);
}
}
More information about the Scummvm-git-logs
mailing list