Changeset - r10288:74dee88391e8
[Not reviewed]
master
0 1 0
rubidium - 16 years ago 2008-10-25 10:26:23
rubidium@openttd.org
(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.
1 file changed with 11 insertions and 17 deletions:
0 comments (0 inline, 0 general)
src/sound.cpp
Show inline comments
 
@@ -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);
0 comments (0 inline, 0 general)