diff --git a/driver.c b/driver.c --- a/driver.c +++ b/driver.c @@ -2,11 +2,28 @@ #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 "sound/null_s.h" +#include "sound/sdl_s.h" +#include "sound/win32_s.h" + +#include "video/dedicated_v.h" +#include "video/null_v.h" +#include "video/sdl_v.h" +#include "video/win32_v.h" + typedef struct { const DriverDesc *descs; const char *name; @@ -31,21 +48,6 @@ static const DriverDesc* GetDriverByName return NULL; } -static const DriverDesc* ChooseDefaultDriver(const DriverDesc* dd) -{ - byte os_version = GetOSVersion(); - const DriverDesc *best = NULL; - int best_pri = -1; - - for (; dd->name != NULL; dd++) { - if ((int)(dd->flags & DF_PRIORITY_MASK) > best_pri && os_version >= (byte)dd->flags) { - best_pri = dd->flags & DF_PRIORITY_MASK; - best = dd; - } - } - return best; -} - void LoadDriver(int driver, const char *name) { const DriverClass *dc = &_driver_classes[driver]; @@ -59,8 +61,23 @@ void LoadDriver(int driver, const char * parms[0] = NULL; - if (!*name) { - dd = ChooseDefaultDriver(dc->descs); + if (*name == '\0') { + for (dd = dc->descs; dd->name != NULL; dd++) { + err = ((const HalCommonDriver*)dd->drv)->start(parms); + 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); + + var = dc->var; + *var = dd->drv; } else { // Extract the driver name and put parameter list in parm ttd_strlcpy(buffer, name, sizeof(buffer)); @@ -80,16 +97,20 @@ void LoadDriver(int driver, const char * dd = GetDriverByName(dc->descs, buffer); if (dd == NULL) error("No such %s driver: %s\n", dc->name, buffer); + + var = dc->var; + if (*var != NULL) ((const HalCommonDriver*)*var)->stop(); + *var = NULL; + drv = dd->drv; + + err = ((const HalCommonDriver*)drv)->start(parms); + if (err != NULL) { + error("Unable to load driver %s(%s). The error was: %s\n", + dd->name, dd->longname, err + ); + } + *var = drv; } - var = dc->var; - if (*var != NULL) ((const HalCommonDriver*)*var)->stop(); - *var = NULL; - drv = dd->drv; - - err = ((const HalCommonDriver*)drv)->start(parms); - if (err != NULL) - error("Unable to load driver %s(%s). The error was: %s\n", dd->name, dd->longname, err); - *var = drv; } @@ -133,3 +154,51 @@ void GetDriverList(char* p) } } } + + +const DriverDesc _music_driver_descs[] = { +#ifdef __BEOS__ + { "bemidi", "BeOS MIDI Driver", &_bemidi_music_driver }, +#endif +#ifdef __OS2__ + { "os2", "OS/2 Music Driver", &_os2_music_driver}, +#endif +#ifdef WIN32_ENABLE_DIRECTMUSIC_SUPPORT + { "dmusic", "DirectMusic MIDI Driver", &_dmusic_midi_driver }, +#endif +#ifdef WIN32 + { "win32", "Win32 MIDI Driver", &_win32_music_driver }, +#endif +#ifdef UNIX +#if !defined(__BEOS__) && !defined(__MORPHOS__) && !defined(__AMIGA__) + { "extmidi", "External MIDI Driver", &_extmidi_music_driver }, +#endif +#endif + { "null", "Null Music Driver", &_null_music_driver }, + { NULL, NULL, NULL} +}; + +const DriverDesc _sound_driver_descs[] = { +#ifdef WIN32 + { "win32", "Win32 WaveOut Driver", &_win32_sound_driver }, +#endif +#ifdef WITH_SDL + { "sdl", "SDL Sound Driver", &_sdl_sound_driver }, +#endif + { "null", "Null Sound Driver", &_null_sound_driver }, + { NULL, NULL, NULL} +}; + +const DriverDesc _video_driver_descs[] = { +#ifdef WIN32 + { "win32", "Win32 GDI Video Driver", &_win32_video_driver }, +#endif +#ifdef WITH_SDL + { "sdl", "SDL Video Driver", &_sdl_video_driver }, +#endif + { "null", "Null Video Driver", &_null_video_driver}, +#ifdef ENABLE_NETWORK + { "dedicated", "Dedicated Video Driver", &_dedicated_video_driver}, +#endif + { NULL, NULL, NULL} +};