diff options
author | rubidium <rubidium@openttd.org> | 2008-10-25 10:26:23 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2008-10-25 10:26:23 +0000 |
commit | 65e81d5e9bc69d1a58854d87ccb3da06eb108a57 (patch) | |
tree | 94591fd285646a7f2f10072d688fc496d6cd66a2 | |
parent | 33203c67c110b166a91d1d1ad43a6680ca78952e (diff) | |
download | openttd-65e81d5e9bc69d1a58854d87ccb3da06eb108a57.tar.xz |
(svn r14527) -Fix: allocate stub (empty) sound entries when loading an empty/corrupt/incorrectly sized sample.cat instead of making valid NewGRFs fail to load.
-rw-r--r-- | src/sound.cpp | 28 |
1 files changed, 11 insertions, 17 deletions
diff --git a/src/sound.cpp b/src/sound.cpp index 81c22cbb4..6c1039816 100644 --- a/src/sound.cpp +++ b/src/sound.cpp @@ -23,43 +23,37 @@ MusicFileSettings msf; // Number of levels of panning per side #define PANNING_LEVELS 16 +/** The number of sounds in the original sample.cat */ +static const uint ORIGINAL_SAMPLE_COUNT = 73; static void OpenBankFile(const char *filename) { - uint i; + FileEntry *fe = CallocT<FileEntry>(ORIGINAL_SAMPLE_COUNT); + _file_count = ORIGINAL_SAMPLE_COUNT; + _files = fe; FioOpenFile(SOUND_SLOT, filename); size_t pos = FioGetPos(); uint count = FioReadDword() / 8; /* Simple check for the correct number of original sounds. */ - if (count != 73) { + if (count != ORIGINAL_SAMPLE_COUNT) { + /* Corrupt sample data? Just leave the allocated memory as those tell + * there is no sound to play (size = 0 due to calloc). Not allocating + * the memory disables valid NewGRFs that replace sounds. */ DEBUG(misc, 6, "Incorrect number of sounds in '%s', ignoring.", filename); - _file_count = 0; - _files = NULL; return; } - FileEntry *fe = CallocT<FileEntry>(count); - - if (fe == NULL) { - _file_count = 0; - _files = NULL; - return; - } - - _file_count = count; - _files = fe; - FioSeekTo(pos, SEEK_SET); - for (i = 0; i != count; i++) { + for (uint i = 0; i != ORIGINAL_SAMPLE_COUNT; i++) { fe[i].file_slot = SOUND_SLOT; fe[i].file_offset = FioReadDword() + pos; fe[i].file_size = FioReadDword(); } - for (i = 0; i != count; i++, fe++) { + for (uint i = 0; i != ORIGINAL_SAMPLE_COUNT; i++, fe++) { char name[255]; FioSeekTo(fe->file_offset, SEEK_SET); |