aboutsummaryrefslogtreecommitdiff
path: root/simon
diff options
context:
space:
mode:
authorRuediger Hanke2002-04-21 12:51:13 +0000
committerRuediger Hanke2002-04-21 12:51:13 +0000
commitabc4c2f34f37ec746ee3e5145d45425a108fa846 (patch)
treeadd48c05a85b639e8d7468154e3f177f6b2dc64f /simon
parent43a4a9c8e5ffabe252a6a629550527424387f08f (diff)
downloadscummvm-rg350-abc4c2f34f37ec746ee3e5145d45425a108fa846.tar.gz
scummvm-rg350-abc4c2f34f37ec746ee3e5145d45425a108fa846.tar.bz2
scummvm-rg350-abc4c2f34f37ec746ee3e5145d45425a108fa846.zip
Endian and alignment fixes to make Simon games boot (and play) on big endian systems
svn-id: r4033
Diffstat (limited to 'simon')
-rw-r--r--simon/simon.cpp27
1 files changed, 19 insertions, 8 deletions
diff --git a/simon/simon.cpp b/simon/simon.cpp
index 0d9e8db987..7bd3827b10 100644
--- a/simon/simon.cpp
+++ b/simon/simon.cpp
@@ -7704,6 +7704,10 @@ void SimonState::openGameFile() {
error("out of memory, game offsets");
resfile_read(_game_offsets_ptr, 0, gss->NUM_GAME_OFFSETS*sizeof(uint32));
+#if defined(SCUMM_BIG_ENDIAN)
+ for( int r = 0; r < gss->NUM_GAME_OFFSETS; r++ )
+ _game_offsets_ptr[ r ] = READ_LE_UINT32( &_game_offsets_ptr[ r ] );
+#endif
}
loadIconFile();
@@ -8237,6 +8241,10 @@ void SimonState::initSound() {
if (fread(_voice_offsets, gss->NUM_VOICE_RESOURCES * sizeof(uint32), 1, _voice_file) != 1)
error("Cannot read voice offsets");
+#if defined(SCUMM_BIG_ENDIAN)
+ for( int r = 0; r < gss->NUM_VOICE_RESOURCES; r++ )
+ _voice_offsets[ r ] = READ_LE_UINT32( &_voice_offsets[ r ] );
+#endif
}
}
@@ -8255,7 +8263,7 @@ struct WaveHeader {
uint16 block_align;
uint16 bits_per_sample;
-};
+} GCC_PACK;
void SimonState::playVoice(uint voice) {
WaveHeader wave_hdr;
@@ -8271,21 +8279,24 @@ void SimonState::playVoice(uint voice) {
fseek(_voice_file, _voice_offsets[voice], SEEK_SET);
if (fread(&wave_hdr, sizeof(wave_hdr), 1, _voice_file)!=1 ||
- wave_hdr.riff!='FFIR' || wave_hdr.wave!='EVAW' || wave_hdr.fmt!=' tmf' ||
- wave_hdr.format_tag!=1 || wave_hdr.channels!=1 || wave_hdr.bits_per_sample!=8) {
+ wave_hdr.riff!=MKID('RIFF') || wave_hdr.wave!=MKID('WAVE') || wave_hdr.fmt!=MKID('fmt ') ||
+ READ_LE_UINT16(&wave_hdr.format_tag)!=1 || READ_LE_UINT16(&wave_hdr.channels)!=1 ||
+ READ_LE_UINT16(&wave_hdr.bits_per_sample)!=8) {
warning("playVoice(%d): cannot read RIFF header", voice);
return;
}
- fseek(_voice_file, wave_hdr.size - sizeof(wave_hdr) + 20, SEEK_CUR);
+ fseek(_voice_file, READ_LE_UINT32(&wave_hdr.size) - sizeof(wave_hdr) + 20, SEEK_CUR);
- if (fread(data, sizeof(data), 1, _voice_file) != 1 ||
+ data[ 0 ] = fileReadLE32(_voice_file);
+ data[ 1 ] = fileReadLE32(_voice_file);
+ if (//fread(data, sizeof(data), 1, _voice_file) != 1 ||
data[0] != 'atad' ) {
warning("playVoice(%d): cannot read data header",voice);
return;
}
- _mixer->play_raw(&_voice_sound, _voice_file, data[1], wave_hdr.samples_per_sec,
+ _mixer->play_raw(&_voice_sound, _voice_file, data[1], READ_LE_UINT32(&wave_hdr.samples_per_sec),
SoundMixer::FLAG_FILE|SoundMixer::FLAG_UNSIGNED);
}
@@ -8302,7 +8313,7 @@ void SimonState::playSound(uint sound) {
return;
}
- p = _sfx_heap + ((uint32*)_sfx_heap)[sound];
+ p = _sfx_heap + READ_LE_UINT32(&((uint32*)_sfx_heap)[sound]);
for(;;) {
p = (byte*)memchr(p, 'd', 1000);
@@ -8316,7 +8327,7 @@ void SimonState::playSound(uint sound) {
p++;
}
- _mixer->play_raw(&_playing_sound, p+8,*(uint32*)(p+4),22050,SoundMixer::FLAG_UNSIGNED);
+ _mixer->play_raw(&_playing_sound, p+8,READ_LE_UINT32(p+4),22050,SoundMixer::FLAG_UNSIGNED);
} else {
warning("playSound(%d)", sound);
}