(svn r24052) -Fix (r23883) [FS#5107]: Imported GRF sounds were inserted into the wrong slots.

pull/155/head
frosch 12 years ago
parent 5fe58a74b3
commit 91e8aa00b1

@ -6874,10 +6874,13 @@ static void DefineGotoLabel(ByteReader *buf)
grfmsg(2, "DefineGotoLabel: GOTO target with label 0x%02X", label->label); grfmsg(2, "DefineGotoLabel: GOTO target with label 0x%02X", label->label);
} }
static void ImportGRFSound() /**
* Process a sound import from another GRF file.
* @param sound Destination for sound.
*/
static void ImportGRFSound(SoundEntry *sound)
{ {
const GRFFile *file; const GRFFile *file;
SoundEntry *sound = AllocateSound();
uint32 grfid = FioReadDword(); uint32 grfid = FioReadDword();
SoundID sound_id = FioReadWord(); SoundID sound_id = FioReadWord();
@ -6901,10 +6904,13 @@ static void ImportGRFSound()
sound->priority = 0; sound->priority = 0;
} }
static void LoadGRFSound(size_t offs) /**
* Load a sound from a file.
* @param offs File offset to read sound from.
* @param sound Destination for sound.
*/
static void LoadGRFSound(size_t offs, SoundEntry *sound)
{ {
SoundEntry *sound = AllocateSound();
/* Set default volume and priority */ /* Set default volume and priority */
sound->volume = 0x80; sound->volume = 0x80;
sound->priority = 0; sound->priority = 0;
@ -6925,15 +6931,24 @@ static void GRFSound(ByteReader *buf)
* W num Number of sound files that follow */ * W num Number of sound files that follow */
uint16 num = buf->ReadWord(); uint16 num = buf->ReadWord();
if (num == 0) return;
SoundEntry *sound;
if (_cur.grffile->sound_offset == 0) { if (_cur.grffile->sound_offset == 0) {
_cur.grffile->sound_offset = GetNumSounds(); _cur.grffile->sound_offset = GetNumSounds();
_cur.grffile->num_sounds = num; _cur.grffile->num_sounds = num;
sound = AllocateSound(num);
} else {
sound = GetSound(_cur.grffile->sound_offset);
} }
for (int i = 0; i < num; i++) { for (int i = 0; i < num; i++) {
_cur.nfo_line++; _cur.nfo_line++;
/* Check whether the index is in range. This might happen if multiple action 11 are present.
* While this is invalid, we do not check for this. But we should prevent it from causing bigger trouble */
bool invalid = i >= _cur.grffile->num_sounds;
size_t offs = FioGetPos(); size_t offs = FioGetPos();
uint32 len = _cur.grf_container_ver >= 2 ? FioReadDword() : FioReadWord(); uint32 len = _cur.grf_container_ver >= 2 ? FioReadDword() : FioReadWord();
@ -6941,12 +6956,15 @@ static void GRFSound(ByteReader *buf)
if (_cur.grf_container_ver >= 2 && type == 0xFD) { if (_cur.grf_container_ver >= 2 && type == 0xFD) {
/* Reference to sprite section. */ /* Reference to sprite section. */
if (len != 4) { if (invalid) {
grfmsg(1, "GRFSound: Sound index out of range (multiple Action 11?)");
FioSkipBytes(len);
} else if (len != 4) {
grfmsg(1, "GRFSound: Invalid sprite section import"); grfmsg(1, "GRFSound: Invalid sprite section import");
FioSkipBytes(len); FioSkipBytes(len);
} else { } else {
uint32 id = FioReadDword(); uint32 id = FioReadDword();
if (_cur.stage == GLS_INIT) LoadGRFSound(GetGRFSpriteOffset(id)); if (_cur.stage == GLS_INIT) LoadGRFSound(GetGRFSpriteOffset(id), sound + i);
} }
continue; continue;
} }
@ -6958,6 +6976,11 @@ static void GRFSound(ByteReader *buf)
continue; continue;
} }
if (invalid) {
grfmsg(1, "GRFSound: Sound index out of range (multiple Action 11?)");
FioSkipBytes(len);
}
byte action = FioReadByte(); byte action = FioReadByte();
switch (action) { switch (action) {
case 0xFF: case 0xFF:
@ -6966,7 +6989,7 @@ static void GRFSound(ByteReader *buf)
if (_cur.grf_container_ver >= 2) { if (_cur.grf_container_ver >= 2) {
grfmsg(1, "GRFSound: Inline sounds are not supported for container version >= 2"); grfmsg(1, "GRFSound: Inline sounds are not supported for container version >= 2");
} else { } else {
LoadGRFSound(offs); LoadGRFSound(offs, sound + i);
} }
} }
FioSkipBytes(len - 1); // already read <action> FioSkipBytes(len - 1); // already read <action>
@ -6977,7 +7000,7 @@ static void GRFSound(ByteReader *buf)
/* XXX 'Action 0xFE' isn't really specified. It is only mentioned for /* XXX 'Action 0xFE' isn't really specified. It is only mentioned for
* importing sounds, so this is probably all wrong... */ * importing sounds, so this is probably all wrong... */
if (FioReadByte() != 0) grfmsg(1, "GRFSound: Import type mismatch"); if (FioReadByte() != 0) grfmsg(1, "GRFSound: Import type mismatch");
ImportGRFSound(); ImportGRFSound(sound + i);
} else { } else {
FioSkipBytes(len - 1); // already read <action> FioSkipBytes(len - 1); // already read <action>
} }

@ -22,11 +22,15 @@
static SmallVector<SoundEntry, 8> _sounds; static SmallVector<SoundEntry, 8> _sounds;
/* Allocate a new Sound */ /**
SoundEntry *AllocateSound() * Allocate sound slots.
* @param num Number of slots to allocate.
* @return First allocated slot.
*/
SoundEntry *AllocateSound(uint num)
{ {
SoundEntry *sound = _sounds.Append(); SoundEntry *sound = _sounds.Append(num);
MemSetT(sound, 0); MemSetT(sound, 0, num);
return sound; return sound;
} }

@ -30,7 +30,7 @@ enum VehicleSoundEvent {
}; };
SoundEntry *AllocateSound(); SoundEntry *AllocateSound(uint num);
void InitializeSoundPool(); void InitializeSoundPool();
bool LoadNewGRFSound(SoundEntry *sound); bool LoadNewGRFSound(SoundEntry *sound);
SoundEntry *GetSound(SoundID sound_id); SoundEntry *GetSound(SoundID sound_id);

@ -218,11 +218,11 @@ static const byte _sound_idx[] = {
void SndCopyToPool() void SndCopyToPool()
{ {
SoundEntry *sound = AllocateSound(ORIGINAL_SAMPLE_COUNT);
for (uint i = 0; i < ORIGINAL_SAMPLE_COUNT; i++) { for (uint i = 0; i < ORIGINAL_SAMPLE_COUNT; i++) {
SoundEntry *sound = AllocateSound(); sound[i] = _original_sounds[_sound_idx[i]];
*sound = _original_sounds[_sound_idx[i]]; sound[i].volume = _sound_base_vol[i];
sound->volume = _sound_base_vol[i]; sound[i].priority = 0;
sound->priority = 0;
} }
} }

Loading…
Cancel
Save