summaryrefslogtreecommitdiff
path: root/driver.c
diff options
context:
space:
mode:
authortron <tron@openttd.org>2005-07-27 19:57:12 +0000
committertron <tron@openttd.org>2005-07-27 19:57:12 +0000
commit5821529859b84d9ba264bf8b0b9267c900ed4103 (patch)
tree2d81a3e658bac637585e76cd5f1b80266f4b05b6 /driver.c
parent6c52a8629d0b94d72e20809818cb0fd5c3097c93 (diff)
downloadopenttd-5821529859b84d9ba264bf8b0b9267c900ed4103.tar.xz
(svn r2728) -Fix/Feature: Change the driver probing algorithm
Instead of trying to start a single driver and bailing out if that fails, try to initialise one by one and use the first one which succeeds. This should fix problems on machines with no sound card, where -s null had to be specified manually.
Diffstat (limited to 'driver.c')
-rw-r--r--driver.c121
1 files changed, 95 insertions, 26 deletions
diff --git a/driver.c b/driver.c
index 81f572f8f..8fa816288 100644
--- 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(const DriverDesc* dd, const char* name)
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 *name)
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 *name)
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}
+};