diff --git a/debug.c b/debug.c --- a/debug.c +++ b/debug.c @@ -10,6 +10,7 @@ #include "string.h" int _debug_ai_level; +int _debug_driver_level; int _debug_grf_level; int _debug_map_level; int _debug_misc_level; @@ -45,6 +46,7 @@ typedef struct DebugLevel { #define DEBUG_LEVEL(x) { #x, &_debug_##x##_level } static const DebugLevel debug_level[] = { DEBUG_LEVEL(ai), + DEBUG_LEVEL(driver), DEBUG_LEVEL(grf), DEBUG_LEVEL(map), DEBUG_LEVEL(misc), diff --git a/debug.h b/debug.h --- a/debug.h +++ b/debug.h @@ -9,6 +9,7 @@ #define DEBUG(name, level) if (level == 0 || _debug_ ## name ## _level >= level) debug extern int _debug_ai_level; + extern int _debug_driver_level; extern int _debug_grf_level; extern int _debug_map_level; extern int _debug_misc_level; 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} +}; diff --git a/functions.h b/functions.h --- a/functions.h +++ b/functions.h @@ -273,7 +273,6 @@ void LoadFromConfig(void); void SaveToConfig(void); void CheckConfig(void); int ttd_main(int argc, char* argv[]); -byte GetOSVersion(void); void DeterminePaths(void); char * CDECL str_fmt(const char *str, ...); diff --git a/hal.h b/hal.h --- a/hal.h +++ b/hal.h @@ -41,7 +41,6 @@ typedef struct { const char *name; const char *longname; const void *drv; - uint32 flags; } DriverDesc; enum { diff --git a/os2.c b/os2.c --- a/os2.c +++ b/os2.c @@ -2,6 +2,7 @@ #include "stdafx.h" #include "openttd.h" +#include "hal.h" #include "variables.h" #include "string.h" #include "table/strings.h" @@ -28,16 +29,6 @@ #include -#include "sound/null_s.h" -#include "sound/sdl_s.h" - -#include "video/dedicated_v.h" -#include "video/null_v.h" -#include "video/sdl_v.h" - -#include "music/null_m.h" -#include "music/os2_m.h" - static inline int strcasecmp(const char* s1, const char* s2) { return stricmp(s1, s2); @@ -432,38 +423,6 @@ void FiosDelete(const char *name) unlink(path); } -const DriverDesc _video_driver_descs[] = { - { "null", "Null Video Driver", &_null_video_driver, 0}, -#if defined(WITH_SDL) - { "sdl", "SDL Video Driver", &_sdl_video_driver, 1}, -#endif -#ifdef ENABLE_NETWORK - { "dedicated", "Dedicated Video Driver", &_dedicated_video_driver, 0}, -#endif - { NULL, NULL, NULL, 0} -}; - -const DriverDesc _sound_driver_descs[] = { - { "null", "Null Sound Driver", &_null_sound_driver, 0}, -#if defined(WITH_SDL) - { "sdl", "SDL Sound Driver", &_sdl_sound_driver, 1}, -#endif - { NULL, NULL, NULL, 0} -}; - -const DriverDesc _music_driver_descs[] = { - { "os2", "OS/2 Music Driver", &_os2_music_driver, 0}, - { "null", "Null Music Driver", &_null_music_driver, 1}, - { NULL, NULL, NULL, 0} -}; - -/* GetOSVersion returns the minimal required version of OS to be able to use that driver. - Not needed for OS/2. */ -byte GetOSVersion(void) -{ - return 2; // any arbitrary number bigger then 0 -} - bool FileExists(const char *filename) { return access(filename, 0) == 0; diff --git a/unix.c b/unix.c --- a/unix.c +++ b/unix.c @@ -9,17 +9,6 @@ #include "hal.h" #include "variables.h" -#include "music/bemidi.h" -#include "music/extmidi.h" -#include "music/null_m.h" - -#include "sound/null_s.h" -#include "sound/sdl_s.h" - -#include "video/dedicated_v.h" -#include "video/null_v.h" -#include "video/sdl_v.h" - #include #include #include @@ -369,53 +358,6 @@ void FiosDelete(const char *name) unlink(path); } -const DriverDesc _video_driver_descs[] = { - {"null", "Null Video Driver", &_null_video_driver, 0}, -#if defined(WITH_SDL) - { "sdl", "SDL Video Driver", &_sdl_video_driver, 1}, -#endif -#ifdef ENABLE_NETWORK - { "dedicated", "Dedicated Video Driver", &_dedicated_video_driver, 0}, -#endif - { NULL, NULL, NULL, 0} -}; - -const DriverDesc _sound_driver_descs[] = { - {"null", "Null Sound Driver", &_null_sound_driver, 0}, -#if defined(WITH_SDL) - { "sdl", "SDL Sound Driver", &_sdl_sound_driver, 1}, -#endif - { NULL, NULL, NULL, 0} -}; - -#if defined(__APPLE__) -#define EXTMIDI_PRI 2 -#else -#define EXTMIDI_PRI 0 -#endif - -const DriverDesc _music_driver_descs[] = { -#ifndef __BEOS__ -#if !defined(__MORPHOS__) && !defined(__AMIGA__) -// MorphOS and AmigaOS have no music support - {"extmidi", "External MIDI Driver", &_extmidi_music_driver, EXTMIDI_PRI}, -#endif -#endif -#ifdef __BEOS__ - { "bemidi", "BeOS MIDI Driver", &_bemidi_music_driver, 1}, -#endif - { "null", "Null Music Driver", &_null_music_driver, 1}, - { NULL, NULL, NULL, 0} -}; - -/* GetOSVersion returns the minimal required version of OS to be able to use that driver. - Not needed for *nix. */ -byte GetOSVersion(void) -{ - return 2; // any arbitrary number bigger than 0 - // numbers lower than 2 breaks default music selection on mac -} - bool FileExists(const char *filename) { return access(filename, 0) == 0; diff --git a/video/dedicated_v.c b/video/dedicated_v.c --- a/video/dedicated_v.c +++ b/video/dedicated_v.c @@ -86,14 +86,14 @@ static void CreateWindowsConsoleThread(v if (hThread == NULL) error("Cannot create console thread!"); - DEBUG(misc, 0) ("Windows console thread started..."); + DEBUG(driver, 1) ("Windows console thread started..."); } static void CloseWindowsConsoleThread(void) { CloseHandle(hThread); CloseHandle(hEvent); - DEBUG(misc, 0) ("Windows console thread shut down..."); + DEBUG(driver, 1) ("Windows console thread shut down..."); } #endif @@ -126,7 +126,7 @@ static const char *DedicatedVideoStart(c OS2_SwitchToConsoleMode(); #endif - DEBUG(misc,0)("Loading dedicated server..."); + DEBUG(driver, 1)("Loading dedicated server..."); return NULL; } diff --git a/video/sdl_v.c b/video/sdl_v.c --- a/video/sdl_v.c +++ b/video/sdl_v.c @@ -169,7 +169,7 @@ static bool CreateMainSurface(int w, int GetAvailableVideoMode(&w, &h); - DEBUG(misc, 1) ("sdl: using mode %dx%d", w, h); + DEBUG(driver, 1) ("sdl: using mode %dx%d", w, h); // DO NOT CHANGE TO HWSURFACE, IT DOES NOT WORK newscreen = SDL_CALL SDL_SetVideoMode(w, h, 8, SDL_SWSURFACE | SDL_HWPALETTE | (_fullscreen ? SDL_FULLSCREEN : SDL_RESIZABLE)); @@ -385,7 +385,7 @@ static const char *SdlVideoStart(const c if (s != NULL) return s; SDL_CALL SDL_VideoDriverName(buf, 30); - DEBUG(misc, 1) ("sdl: using driver '%s'", buf); + DEBUG(driver, 1) ("sdl: using driver '%s'", buf); GetVideoModes(); CreateMainSurface(_cur_resolution[0], _cur_resolution[1]); diff --git a/win32.c b/win32.c --- a/win32.c +++ b/win32.c @@ -17,20 +17,6 @@ #include #include "variables.h" #include "win32.h" - -#include "driver.h" - -#include "music/dmusic.h" -#include "music/null_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" static bool _has_console; @@ -933,73 +919,6 @@ void FiosDelete(const char *name) DeleteFile(path); } -#define Windows_2000 5 -#define Windows_NT3_51 4 - -/* flags show the minimum required OS to use a given feature. Currently - only dwMajorVersion and dwMinorVersion (WindowsME) are used - MajorVersion MinorVersion - Windows Server 2003 5 2 dmusic - Windows XP 5 1 dmusic - Windows 2000 5 0 dmusic - Windows NT 4.0 4 0 win32 - Windows Me 4 90 dmusic - Windows 98 4 10 win32 - Windows 95 4 0 win32 - Windows NT 3.51 3 51 ????? -*/ - -const DriverDesc _video_driver_descs[] = { - {"null", "Null Video Driver", &_null_video_driver, 0}, -#if defined(WITH_SDL) - {"sdl", "SDL Video Driver", &_sdl_video_driver, 1}, -#endif - {"win32", "Win32 GDI Video Driver", &_win32_video_driver, Windows_NT3_51}, -#ifdef ENABLE_NETWORK - { "dedicated", "Dedicated Video Driver", &_dedicated_video_driver, 0}, -#endif - { NULL, NULL, NULL, 0 } -}; - -const DriverDesc _sound_driver_descs[] = { - {"null", "Null Sound Driver", &_null_sound_driver, 0}, -#if defined(WITH_SDL) - {"sdl", "SDL Sound Driver", &_sdl_sound_driver, 1}, -#endif - {"win32", "Win32 WaveOut Driver", &_win32_sound_driver, Windows_NT3_51}, - { NULL, NULL, NULL, 0 } -}; - -const DriverDesc _music_driver_descs[] = { - {"null", "Null Music Driver", &_null_music_driver, 0}, -#ifdef WIN32_ENABLE_DIRECTMUSIC_SUPPORT - {"dmusic", "DirectMusic MIDI Driver", &_dmusic_midi_driver, Windows_2000}, -#endif - // Win32 MIDI driver has higher priority than DMusic, so this one is chosen - {"win32", "Win32 MIDI Driver", &_win32_music_driver, Windows_NT3_51}, - { NULL, NULL, NULL, 0 } -}; - -byte GetOSVersion(void) -{ - OSVERSIONINFO osvi; - - ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - - if (GetVersionEx(&osvi)) { - DEBUG(misc, 2) ("Windows Version is %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion); - // WinME needs directmusic too (dmusic, Windows_2000 mode), all others default to OK - if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) { return Windows_2000;} // WinME - - return osvi.dwMajorVersion; - } - - // GetVersionEx failed, but we can safely assume at least Win95/WinNT3.51 is used - DEBUG(misc, 0) ("Windows version retrieval failed, defaulting to level 4"); - return Windows_NT3_51; -} - bool FileExists(const char *filename) { HANDLE hand = CreateFile(filename, 0, 0, NULL, OPEN_EXISTING, 0, NULL);