/* $Id$ */ /** @file newgrf_sound.cpp Handling NewGRF provided sounds. */ #include "stdafx.h" #include "engine_base.h" #include "newgrf_engine.h" #include "newgrf_sound.h" #include "vehicle_base.h" #include "sound_func.h" static uint _sound_count = 0; STATIC_OLD_POOL(SoundInternal, SoundEntry, 3, 1000, NULL, NULL) /* Allocate a new Sound */ SoundEntry *AllocateSound() { if (_sound_count == GetSoundInternalPoolSize()) { if (!_SoundInternal_pool.AddBlockToPool()) return NULL; } return GetSoundInternal(_sound_count++); } void InitializeSoundPool() { _SoundInternal_pool.CleanPool(); _sound_count = 0; /* Copy original sound data to the pool */ SndCopyToPool(); } SoundEntry *GetSound(SoundID index) { if (index >= GetNumSounds()) return NULL; return GetSoundInternal(index); } uint GetNumSounds() { return _sound_count; } bool PlayVehicleSound(const Vehicle *v, VehicleSoundEvent event) { const GRFFile *file = GetEngineGRF(v->engine_type); uint16 callback; /* If the engine has no GRF ID associated it can't ever play any new sounds */ if (file == NULL) return false; /* Check that the vehicle type uses the sound effect callback */ if (!HasBit(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_SOUND_EFFECT)) return false; callback = GetVehicleCallback(CBID_VEHICLE_SOUND_EFFECT, event, 0, v->engine_type, v); if (callback == CALLBACK_FAILED) return false; if (callback >= ORIGINAL_SAMPLE_COUNT) callback += file->sound_offset - ORIGINAL_SAMPLE_COUNT; if (callback < GetNumSounds()) SndPlayVehicleFx(callback, v); return true; } bool PlayTileSound(const GRFFile *file, SoundID sound_id, TileIndex tile) { if (sound_id >= ORIGINAL_SAMPLE_COUNT) sound_id += file->sound_offset - ORIGINAL_SAMPLE_COUNT; if (sound_id < GetNumSounds()) { SndPlayTileFx(sound_id, tile); return true; } return false; }