Files @ r4381:c965d1f3016a
Branch filter:

Location: cpp/openttd-patchpack/source/driver.c - annotation

belugas
(svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
-Feature : both unifiedmaglevmode are now set.
Maglev and monorail are not allowed to run on each other tracks and will not be.
Setting those flags will allow grfsets as the Norvegian one to be loaded
-Codechange : link the TTDPatch's irregularstations with OTTD's nonuniform_stations
-Codechange : Reformat the whole array (thanks Rubidium, it sure looks better now)
r2186:5ee653b1b5e1
r2186:5ee653b1b5e1
r2171:969c16b625b3
r2171:969c16b625b3
r2210:ed1be54700ae
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2210:ed1be54700ae
r2210:ed1be54700ae
r2210:ed1be54700ae
r2210:ed1be54700ae
r2210:ed1be54700ae
r2210:ed1be54700ae
r2496:373e700a7e6c
r2210:ed1be54700ae
r2210:ed1be54700ae
r2210:ed1be54700ae
r2736:03cd6438b59f
r2210:ed1be54700ae
r2210:ed1be54700ae
r2210:ed1be54700ae
r2210:ed1be54700ae
r2210:ed1be54700ae
r2736:03cd6438b59f
r2210:ed1be54700ae
r2210:ed1be54700ae
r2219:89c04ca42ead
r2219:89c04ca42ead
r2219:89c04ca42ead
r2224:3bbef2e70fad
r2219:89c04ca42ead
r2219:89c04ca42ead
r2219:89c04ca42ead
r2171:969c16b625b3
r2171:969c16b625b3
r2224:3bbef2e70fad
r2171:969c16b625b3
r2171:969c16b625b3
r2222:76e052474372
r2902:3779ed30e1f4
r2222:76e052474372
r2222:76e052474372
r2224:3bbef2e70fad
r2222:76e052474372
r2222:76e052474372
r2224:3bbef2e70fad
r2222:76e052474372
r2222:76e052474372
r2224:3bbef2e70fad
r2222:76e052474372
r2222:76e052474372
r2224:3bbef2e70fad
r2222:76e052474372
r2500:4297cb3c6bc0
r2496:373e700a7e6c
r2496:373e700a7e6c
r2222:76e052474372
r2303:508f564fba26
r2224:3bbef2e70fad
r2222:76e052474372
r2222:76e052474372
r2224:3bbef2e70fad
r2224:3bbef2e70fad
r2222:76e052474372
r2222:76e052474372
r2222:76e052474372
r2222:76e052474372
r2224:3bbef2e70fad
r2222:76e052474372
r2222:76e052474372
r2224:3bbef2e70fad
r2222:76e052474372
r2736:03cd6438b59f
r2736:03cd6438b59f
r2736:03cd6438b59f
r2224:3bbef2e70fad
r2224:3bbef2e70fad
r2222:76e052474372
r2222:76e052474372
r2222:76e052474372
r2222:76e052474372
r2224:3bbef2e70fad
r2222:76e052474372
r2222:76e052474372
r2224:3bbef2e70fad
r2222:76e052474372
r2736:03cd6438b59f
r2736:03cd6438b59f
r2736:03cd6438b59f
r2224:3bbef2e70fad
r2222:76e052474372
r2224:3bbef2e70fad
r2222:76e052474372
r2224:3bbef2e70fad
r2222:76e052474372
r2224:3bbef2e70fad
r2222:76e052474372
r2219:89c04ca42ead
r2902:3779ed30e1f4
r2219:89c04ca42ead
r2224:3bbef2e70fad
r2224:3bbef2e70fad
r2224:3bbef2e70fad
r2171:969c16b625b3
r2224:3bbef2e70fad
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2210:ed1be54700ae
r2210:ed1be54700ae
r2224:3bbef2e70fad
r2210:ed1be54700ae
r2210:ed1be54700ae
r2210:ed1be54700ae
r2210:ed1be54700ae
r2210:ed1be54700ae
r2210:ed1be54700ae
r2210:ed1be54700ae
r2210:ed1be54700ae
r2210:ed1be54700ae
r2210:ed1be54700ae
r2210:ed1be54700ae
r2210:ed1be54700ae
r2224:3bbef2e70fad
r2171:969c16b625b3
r2224:3bbef2e70fad
r2224:3bbef2e70fad
r2224:3bbef2e70fad
r2224:3bbef2e70fad
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2224:3bbef2e70fad
r2224:3bbef2e70fad
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2224:3bbef2e70fad
r2171:969c16b625b3
r2171:969c16b625b3
r2224:3bbef2e70fad
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2210:ed1be54700ae
r2224:3bbef2e70fad
r2224:3bbef2e70fad
r2210:ed1be54700ae
r2224:3bbef2e70fad
r2210:ed1be54700ae
r2210:ed1be54700ae
r2210:ed1be54700ae
r2210:ed1be54700ae
r2210:ed1be54700ae
r2224:3bbef2e70fad
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2458:19436c43c92b
r2171:969c16b625b3
r2224:3bbef2e70fad
r2224:3bbef2e70fad
r2224:3bbef2e70fad
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2832:5e6ba1cf8b9e
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2171:969c16b625b3
r2832:5e6ba1cf8b9e
r2171:969c16b625b3
r2832:5e6ba1cf8b9e
r2171:969c16b625b3
r2832:5e6ba1cf8b9e
r2171:969c16b625b3
r2831:d60884940100
r2832:5e6ba1cf8b9e
r2171:969c16b625b3
/* $Id$ */

#include "stdafx.h"
#include "openttd.h"
#include "debug.h"
#include "driver.h"
#include "functions.h"
#include "hal.h"
#include "string.h"

#include "music/bemidi.h"
#include "music/dmusic.h"
#include "music/extmidi.h"
#include "music/null_m.h"
#include "music/os2_m.h"
#include "music/win32_m.h"
#include "music/qtmidi.h"

#include "sound/null_s.h"
#include "sound/sdl_s.h"
#include "sound/cocoa_s.h"
#include "sound/win32_s.h"

#include "video/dedicated_v.h"
#include "video/null_v.h"
#include "video/sdl_v.h"
#include "video/cocoa_v.h"
#include "video/win32_v.h"

typedef struct DriverDesc {
	const char* name;
	const char* longname;
	const HalCommonDriver* drv;
} DriverDesc;

typedef struct DriverClass {
	const DriverDesc *descs;
	const char *name;
	const HalCommonDriver** drv;
} DriverClass;


#define M(x, y, z) { x, y, (const HalCommonDriver *)(void *)z }
static const DriverDesc _music_driver_descs[] = {
#ifdef __BEOS__
	M("bemidi",  "BeOS MIDI Driver",        &_bemidi_music_driver),
#endif
#ifdef __OS2__
	M("os2",     "OS/2 Music Driver",       &_os2_music_driver),
#endif
#ifdef WIN32_ENABLE_DIRECTMUSIC_SUPPORT
	M("dmusic",  "DirectMusic MIDI Driver", &_dmusic_midi_driver),
#endif
#ifdef WIN32
	M("win32",   "Win32 MIDI Driver",       &_win32_music_driver),
#endif
#if defined(__APPLE__) && !defined(DEDICATED)
	M("qt",      "QuickTime MIDI Driver",   &_qtime_music_driver),
#endif
#ifdef UNIX
#if !defined(__MORPHOS__) && !defined(__AMIGA__)
	M("extmidi", "External MIDI Driver",    &_extmidi_music_driver),
#endif
#endif
	M("null",    "Null Music Driver",       &_null_music_driver),
	M(NULL, NULL, NULL)
};

static const DriverDesc _sound_driver_descs[] = {
#ifdef WIN32
	M("win32", "Win32 WaveOut Driver", &_win32_sound_driver),
#endif
#ifdef WITH_SDL
	M("sdl",   "SDL Sound Driver",     &_sdl_sound_driver),
#endif
#ifdef WITH_COCOA
	M("cocoa", "Cocoa Sound Driver",   &_cocoa_sound_driver),
#endif
	M("null",  "Null Sound Driver",    &_null_sound_driver),
	M(NULL, NULL, NULL)
};

static const DriverDesc _video_driver_descs[] = {
#ifdef WIN32
	M("win32",      "Win32 GDI Video Driver", &_win32_video_driver),
#endif
#ifdef WITH_SDL
	M("sdl",        "SDL Video Driver",       &_sdl_video_driver),
#endif
#ifdef WITH_COCOA
	M("cocoa",      "Cocoa Video Driver",       &_cocoa_video_driver),
#endif
	M("null",       "Null Video Driver",      &_null_video_driver),
#ifdef ENABLE_NETWORK
	M("dedicated",  "Dedicated Video Driver", &_dedicated_video_driver),
#endif
	M(NULL, NULL, NULL)
};
#undef M


#define M(x, y, z) { x, y, (const HalCommonDriver **)(void *)z }
static const DriverClass _driver_classes[] = {
	M(_video_driver_descs, "video", &_video_driver),
	M(_sound_driver_descs, "sound", &_sound_driver),
	M(_music_driver_descs, "music", &_music_driver)
};
#undef M

static const DriverDesc* GetDriverByName(const DriverDesc* dd, const char* name)
{
	for (; dd->name != NULL; dd++) {
		if (strcmp(dd->name, name) == 0) return dd;
	}
	return NULL;
}

void LoadDriver(int driver, const char *name)
{
	const DriverClass *dc = &_driver_classes[driver];
	const DriverDesc *dd;
	const char *err;

	if (*name == '\0') {
		for (dd = dc->descs; dd->name != NULL; dd++) {
			err = dd->drv->start(NULL);
			if (err == NULL) break;
			DEBUG(driver, 1) ("Probing %s driver \"%s\" failed with error: %s",
				dc->name, dd->name, err
			);
		}
		if (dd->name == NULL) {
			error("Couldn't find any suitable %s driver", dc->name);
		}

		DEBUG(driver, 1)
			("Successfully probed %s driver \"%s\"", dc->name, dd->name);

		*dc->drv = dd->drv;
	} else {
		char* parm;
		char buffer[256];
		const char* parms[32];

		// Extract the driver name and put parameter list in parm
		ttd_strlcpy(buffer, name, sizeof(buffer));
		parm = strchr(buffer, ':');
		parms[0] = NULL;
		if (parm != NULL) {
			uint np = 0;
			// Tokenize the parm.
			do {
				*parm++ = '\0';
				if (np < lengthof(parms) - 1)
					parms[np++] = parm;
				while (*parm != '\0' && *parm != ',')
					parm++;
			} while (*parm == ',');
			parms[np] = NULL;
		}
		dd = GetDriverByName(dc->descs, buffer);
		if (dd == NULL)
			error("No such %s driver: %s\n", dc->name, buffer);

		if (*dc->drv != NULL) (*dc->drv)->stop();
		*dc->drv = NULL;

		err = dd->drv->start(parms);
		if (err != NULL) {
			error("Unable to load driver %s(%s). The error was: %s\n",
				dd->name, dd->longname, err
			);
		}
		*dc->drv = dd->drv;
	}
}


static const char* GetDriverParam(const char* const* parm, const char* name)
{
	size_t len;

	if (parm == NULL) return NULL;

	len = strlen(name);
	for (; *parm != NULL; parm++) {
		const char* p = *parm;

		if (strncmp(p, name, len) == 0) {
			if (p[len] == '=')  return p + len + 1;
			if (p[len] == '\0') return p + len;
		}
	}
	return NULL;
}

bool GetDriverParamBool(const char* const* parm, const char* name)
{
	return GetDriverParam(parm, name) != NULL;
}

int GetDriverParamInt(const char* const* parm, const char* name, int def)
{
	const char* p = GetDriverParam(parm, name);
	return p != NULL ? atoi(p) : def;
}


char *GetDriverList(char* p)
{
	const DriverClass* dc;

	for (dc = _driver_classes; dc != endof(_driver_classes); dc++) {
		const DriverDesc* dd;

		p += sprintf(p, "List of %s drivers:\n", dc->name);
		for (dd = dc->descs; dd->name != NULL; dd++) {
			p += sprintf(p, "%10s: %s\n", dd->name, dd->longname);
		}
		p += sprintf(p, "\n");
	}

	return p;
}