Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00012 #include "stdafx.h"
00013 #include "engine_base.h"
00014 #include "newgrf.h"
00015 #include "newgrf_engine.h"
00016 #include "newgrf_sound.h"
00017 #include "vehicle_base.h"
00018 #include "sound_func.h"
00019
00020 static SmallVector<SoundEntry, 8> _sounds;
00021
00022
00023
00024 SoundEntry *AllocateSound()
00025 {
00026 SoundEntry *sound = _sounds.Append();
00027 MemSetT(sound, 0);
00028 return sound;
00029 }
00030
00031
00032 void InitializeSoundPool()
00033 {
00034 _sounds.Clear();
00035
00036
00037 SndCopyToPool();
00038 }
00039
00040
00041 SoundEntry *GetSound(SoundID index)
00042 {
00043 if (index >= _sounds.Length()) return NULL;
00044 return &_sounds[index];
00045 }
00046
00047
00048 uint GetNumSounds()
00049 {
00050 return _sounds.Length();
00051 }
00052
00053
00060 bool PlayVehicleSound(const Vehicle *v, VehicleSoundEvent event)
00061 {
00062 const GRFFile *file = v->GetGRF();
00063 uint16 callback;
00064
00065
00066 if (file == NULL) return false;
00067
00068
00069 if (!HasBit(EngInfo(v->engine_type)->callback_mask, CBM_VEHICLE_SOUND_EFFECT)) return false;
00070
00071 callback = GetVehicleCallback(CBID_VEHICLE_SOUND_EFFECT, event, 0, v->engine_type, v);
00072
00073 if (callback == CALLBACK_FAILED) return false;
00074
00075 if (callback >= ORIGINAL_SAMPLE_COUNT) {
00076 callback -= ORIGINAL_SAMPLE_COUNT;
00077
00078
00079 if (callback > file->num_sounds) return true;
00080
00081 callback += file->sound_offset;
00082 }
00083
00084 assert(callback < GetNumSounds());
00085 SndPlayVehicleFx(callback, v);
00086 return true;
00087 }
00088
00095 void PlayTileSound(const GRFFile *file, SoundID sound_id, TileIndex tile)
00096 {
00097 if (sound_id >= ORIGINAL_SAMPLE_COUNT) {
00098 sound_id -= ORIGINAL_SAMPLE_COUNT;
00099 if (sound_id > file->num_sounds) return;
00100 sound_id += file->sound_offset;
00101 }
00102
00103 assert(sound_id < GetNumSounds());
00104 SndPlayTileFx(sound_id, tile);
00105 }