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
00054 bool PlayVehicleSound(const Vehicle *v, VehicleSoundEvent event)
00055 {
00056 const GRFFile *file = GetEngineGRF(v->engine_type);
00057 uint16 callback;
00058
00059
00060 if (file == NULL) return false;
00061
00062
00063 if (!HasBit(EngInfo(v->engine_type)->callback_mask, CBM_VEHICLE_SOUND_EFFECT)) return false;
00064
00065 callback = GetVehicleCallback(CBID_VEHICLE_SOUND_EFFECT, event, 0, v->engine_type, v);
00066 if (callback == CALLBACK_FAILED) return false;
00067 if (callback >= ORIGINAL_SAMPLE_COUNT) {
00068 callback -= ORIGINAL_SAMPLE_COUNT;
00069 if (callback > file->num_sounds) return false;
00070 callback += file->sound_offset;
00071 }
00072
00073 assert(callback < GetNumSounds());
00074 SndPlayVehicleFx(callback, v);
00075 return true;
00076 }
00077
00078 bool PlayTileSound(const GRFFile *file, SoundID sound_id, TileIndex tile)
00079 {
00080 if (sound_id >= ORIGINAL_SAMPLE_COUNT) {
00081 sound_id -= ORIGINAL_SAMPLE_COUNT;
00082 if (sound_id > file->num_sounds) return false;
00083 sound_id += file->sound_offset;
00084 }
00085
00086 assert(sound_id < GetNumSounds());
00087 SndPlayTileFx(sound_id, tile);
00088 return true;
00089 }