summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2008-10-25 10:26:23 +0000
committerrubidium <rubidium@openttd.org>2008-10-25 10:26:23 +0000
commit65e81d5e9bc69d1a58854d87ccb3da06eb108a57 (patch)
tree94591fd285646a7f2f10072d688fc496d6cd66a2
parent33203c67c110b166a91d1d1ad43a6680ca78952e (diff)
downloadopenttd-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.cpp28
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);