Files @ r20790:1c40c83d41c6
Branch filter:

Location: cpp/openttd-patchpack/source/src/driver.h - annotation

frosch
(svn r25834) -Codechange: Use NUM_OBJECTS_PER_GRF instead of NUM_OBJECTS to properly distinguish limits per NewGRF and limits of the pool.
-Change: [NewGRF] Lower the limit of object types per NewGRF from 256 to 255 to prevent usage of ID 0xFF in Action3, and thus allowing it to become an extended byte somewhen.
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r9111:983de9c5a848
r6125:eb40461cb765
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
r8112:7d126d66990f
r10985:c2507f106432
r7170:38b143754b40
r5475:3f5cd13d1b63
r10616:b3d00d43c557
r7318:844268a38029
r7318:844268a38029
r5475:3f5cd13d1b63
r17626:6e08ec7d1a97
r7170:38b143754b40
r7170:38b143754b40
r17626:6e08ec7d1a97
r17626:6e08ec7d1a97
r17626:6e08ec7d1a97
r17626:6e08ec7d1a97
r17626:6e08ec7d1a97
r7170:38b143754b40
r7170:38b143754b40
r17626:6e08ec7d1a97
r17626:6e08ec7d1a97
r17626:6e08ec7d1a97
r7170:38b143754b40
r7170:38b143754b40
r7170:38b143754b40
r7170:38b143754b40
r14582:fbb94a5fa480
r7170:38b143754b40
r14582:fbb94a5fa480
r14582:fbb94a5fa480
r14582:fbb94a5fa480
r14582:fbb94a5fa480
r14582:fbb94a5fa480
r7170:38b143754b40
r12925:90ba6b12158c
r17626:6e08ec7d1a97
r17626:6e08ec7d1a97
r17626:6e08ec7d1a97
r17626:6e08ec7d1a97
r12925:90ba6b12158c
r7170:38b143754b40
r7170:38b143754b40
r14900:c679fdaeebe6
r7170:38b143754b40
r7170:38b143754b40
r17626:6e08ec7d1a97
r7170:38b143754b40
r7170:38b143754b40
r17626:6e08ec7d1a97
r17626:6e08ec7d1a97
r17626:6e08ec7d1a97
r9582:cb7711765a81
r17626:6e08ec7d1a97
r7170:38b143754b40
r17626:6e08ec7d1a97
r17626:6e08ec7d1a97
r17626:6e08ec7d1a97
r7170:38b143754b40
r7170:38b143754b40
r9260:a54ed53b7134
r7170:38b143754b40
r7170:38b143754b40
r7170:38b143754b40
r17626:6e08ec7d1a97
r17626:6e08ec7d1a97
r17626:6e08ec7d1a97
r17626:6e08ec7d1a97
r17626:6e08ec7d1a97
r7170:38b143754b40
r7170:38b143754b40
r7170:38b143754b40
r7170:38b143754b40
r7170:38b143754b40
r7170:38b143754b40
r17626:6e08ec7d1a97
r17626:6e08ec7d1a97
r17626:6e08ec7d1a97
r17626:6e08ec7d1a97
r17626:6e08ec7d1a97
r7170:38b143754b40
r7170:38b143754b40
r14582:fbb94a5fa480
r7170:38b143754b40
r7170:38b143754b40
r7170:38b143754b40
r7170:38b143754b40
r8844:7b7ef05d6025
r7170:38b143754b40
r7170:38b143754b40
r7170:38b143754b40
r7170:38b143754b40
r7170:38b143754b40
r7170:38b143754b40
r9489:7a345541bc8e
r9159:0c3d5148cb9a
r15610:623a23fb6560
r15610:623a23fb6560
r9159:0c3d5148cb9a
r9159:0c3d5148cb9a
r9159:0c3d5148cb9a
r9159:0c3d5148cb9a
r9159:0c3d5148cb9a
r9159:0c3d5148cb9a
r9159:0c3d5148cb9a
r9159:0c3d5148cb9a
r7170:38b143754b40
r12010:5513d8f8e97d
r8844:7b7ef05d6025
r7170:38b143754b40
r7170:38b143754b40
r7170:38b143754b40
r17626:6e08ec7d1a97
r7170:38b143754b40
r7170:38b143754b40
r7170:38b143754b40
r7170:38b143754b40
r7170:38b143754b40
r17626:6e08ec7d1a97
r7170:38b143754b40
r7170:38b143754b40
r7170:38b143754b40
r5475:3f5cd13d1b63
r5475:3f5cd13d1b63
/* $Id$ */

/*
 * This file is part of OpenTTD.
 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
 */

/** @file driver.h Base for all drivers (video, sound, music, etc). */

#ifndef DRIVER_H
#define DRIVER_H

#include "core/enum_type.hpp"
#include "core/string_compare_type.hpp"
#include <map>

const char *GetDriverParam(const char * const *parm, const char *name);
bool GetDriverParamBool(const char * const *parm, const char *name);
int GetDriverParamInt(const char * const *parm, const char *name, int def);

/** A driver for communicating with the user. */
class Driver {
public:
	/**
	 * Start this driver.
	 * @param parm Parameters passed to the driver.
	 * @return NULL if everything went okay, otherwise an error message.
	 */
	virtual const char *Start(const char * const *parm) = 0;

	/**
	 * Stop this driver.
	 */
	virtual void Stop() = 0;

	virtual ~Driver() { }

	/** The type of driver */
	enum Type {
		DT_BEGIN = 0, ///< Helper for iteration
		DT_MUSIC = 0, ///< A music driver, needs to be before sound to properly shut down extmidi forked music players
		DT_SOUND,     ///< A sound driver
		DT_VIDEO,     ///< A video driver
		DT_END,       ///< Helper for iteration
	};

	/**
	 * Get the name of this driver.
	 * @return The name of the driver.
	 */
	virtual const char *GetName() const = 0;
};

DECLARE_POSTFIX_INCREMENT(Driver::Type)


/** Base for all driver factories. */
class DriverFactoryBase {
private:
	Driver::Type type; ///< The type of driver.
	const char *name;  ///< The name of the drivers of this factory.
	int priority;      ///< The priority of this factory.

	typedef std::map<const char *, DriverFactoryBase *, StringCompare> Drivers; ///< Type for a map of drivers.

	/**
	 * Get the map with drivers.
	 */
	static Drivers &GetDrivers()
	{
		static Drivers &s_drivers = *new Drivers();
		return s_drivers;
	}

	/**
	 * Get the active driver for the given type.
	 * @param type The type to get the driver for.
	 * @return The active driver.
	 */
	static Driver **GetActiveDriver(Driver::Type type)
	{
		static Driver *s_driver[3] = { NULL, NULL, NULL };
		return &s_driver[type];
	}

	/**
	 * Get the driver type name.
	 * @param type The type of driver to get the name of.
	 * @return The name of the type.
	 */
	static const char *GetDriverTypeName(Driver::Type type)
	{
		static const char * const driver_type_name[] = { "music", "sound", "video" };
		return driver_type_name[type];
	}

protected:
	void RegisterDriver(const char *name, Driver::Type type, int priority);

public:
	DriverFactoryBase() :
		name(NULL)
	{}

	virtual ~DriverFactoryBase();

	/**
	 * Shuts down all active drivers
	 */
	static void ShutdownDrivers()
	{
		for (Driver::Type dt = Driver::DT_BEGIN; dt < Driver::DT_END; dt++) {
			Driver *driver = *GetActiveDriver(dt);
			if (driver != NULL) driver->Stop();
		}
	}

	static Driver *SelectDriver(const char *name, Driver::Type type);
	static char *GetDriversInfo(char *p, const char *last);

	/**
	 * Get a nice description of the driver-class.
	 * @return The description.
	 */
	virtual const char *GetDescription() = 0;

	/**
	 * Create an instance of this driver-class.
	 * @return The instance.
	 */
	virtual Driver *CreateInstance() = 0;
};

#endif /* DRIVER_H */