newgrf_sound.c
author Darkvater
Thu, 30 Nov 2006 22:23:11 +0000
changeset 5197 2b3a2494b2e1
parent 4975 7e2f5c450321
child 5216 8bd14ee39af2
permissions -rw-r--r--
(svn r7312) -Fix: When loading a game from a dedicated server the local player global variable was
wrongly set to 0. In theory this allowed a dedicated server to also play. I see no
history for this bug, but it has been there since the introduction of the dedicated
server probably. Thanks peter1138 for bringing it to my attention and thanks myself
for rewriting the code so this bug could surface ;p
/* $Id$ */

#include "stdafx.h"
#include "openttd.h"
#include "pool.h"
#include "sound.h"
#include "engine.h"
#include "vehicle.h"
#include "newgrf_callbacks.h"
#include "newgrf_engine.h"
#include "newgrf_sound.h"

static uint _sound_count = 0;
STATIC_POOL(SoundInternal, FileEntry, 3, 1000, NULL, NULL)


/* Allocate a new FileEntry */
FileEntry *AllocateFileEntry(void)
{
	if (_sound_count == GetSoundInternalPoolSize()) {
		if (!AddBlockToPool(&_SoundInternal_pool)) return NULL;
	}

	return GetSoundInternal(_sound_count++);
}


void InitializeSoundPool(void)
{
	CleanPool(&_SoundInternal_pool);
	_sound_count = 0;

	/* Copy original sound data to the pool */
	SndCopyToPool();
}


FileEntry *GetSound(uint index)
{
	if (index >= _sound_count) return NULL;
	return GetSoundInternal(index);
}


uint GetNumSounds(void)
{
	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_SOUND_EFFECT)) return false;

	callback = GetVehicleCallback(CBID_VEHICLE_SOUND_EFFECT, event, 0, v->engine_type, v);
	if (callback == CALLBACK_FAILED) return false;
	if (callback >= GetNumOriginalSounds()) callback += file->sound_offset - GetNumOriginalSounds();

	if (callback < GetNumSounds()) SndPlayVehicleFx(callback, v);
	return true;
}