changeset 13982:f709685cc624 draft

(svn r18520) -Fix [FS#3272]: allegro doesn't like to work with extmidi; it causes 'random' (looks like a racing condition in allegro) crashes when songs are stopped.
author rubidium <rubidium@openttd.org>
date Wed, 16 Dec 2009 23:49:21 +0000
parents 7d2cf017e4f5
children aaf1fd51e6ac
files src/music/allegro_m.h src/music/extmidi.cpp src/openttd.cpp
diffstat 3 files changed, 24 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/music/allegro_m.h
+++ b/src/music/allegro_m.h
@@ -32,7 +32,15 @@
 
 class FMusicDriver_Allegro: public MusicDriverFactory<FMusicDriver_Allegro> {
 public:
+#if !defined(WITH_SDL) && defined(WITH_ALLEGRO)
+	/* If SDL is not compiled in but Allegro is, chances are quite big
+	 * that Allegro is going to be used. Then favour this sound driver
+	 * over extmidi because with extmidi we get crashes. */
+	static const int priority = 9;
+#else
 	static const int priority = 2;
+#endif
+
 	/* virtual */ const char *GetName() { return "allegro"; }
 	/* virtual */ const char *GetDescription() { return "Allegro MIDI Driver"; }
 	/* virtual */ Driver *CreateInstance() { return new MusicDriver_Allegro(); }
--- a/src/music/extmidi.cpp
+++ b/src/music/extmidi.cpp
@@ -12,6 +12,8 @@
 #ifndef __MORPHOS__
 #include "../stdafx.h"
 #include "../debug.h"
+#include "../sound/sound_driver.hpp"
+#include "../video/video_driver.hpp"
 #include "extmidi.h"
 #include <fcntl.h>
 #include <sys/types.h>
@@ -29,6 +31,11 @@
 
 const char *MusicDriver_ExtMidi::Start(const char * const * parm)
 {
+	if (strcmp(_video_driver->GetName(), "allegro") == 0 ||
+			strcmp(_sound_driver->GetName(), "allegro") == 0) {
+		return "the extmidi driver does not work when Allegro is loaded.";
+	}
+
 	const char *command = GetDriverParam(parm, "cmd");
 	if (StrEmpty(command)) command = EXTERNAL_PLAYER;
 
--- a/src/openttd.cpp
+++ b/src/openttd.cpp
@@ -642,6 +642,15 @@
 	}
 	free(sounddriver);
 
+	if (videodriver == NULL && _ini_videodriver != NULL) videodriver = strdup(_ini_videodriver);
+	_video_driver = (VideoDriver*)VideoDriverFactoryBase::SelectDriver(videodriver, Driver::DT_VIDEO);
+	if (_video_driver == NULL) {
+		StrEmpty(videodriver) ?
+			usererror("Failed to autoprobe video driver") :
+			usererror("Failed to select requested video driver '%s'", videodriver);
+	}
+	free(videodriver);
+
 	if (musicdriver == NULL && _ini_musicdriver != NULL) musicdriver = strdup(_ini_musicdriver);
 	_music_driver = (MusicDriver*)MusicDriverFactoryBase::SelectDriver(musicdriver, Driver::DT_MUSIC);
 	if (_music_driver == NULL) {
@@ -651,15 +660,6 @@
 	}
 	free(musicdriver);
 
-	if (videodriver == NULL && _ini_videodriver != NULL) videodriver = strdup(_ini_videodriver);
-	_video_driver = (VideoDriver*)VideoDriverFactoryBase::SelectDriver(videodriver, Driver::DT_VIDEO);
-	if (_video_driver == NULL) {
-		StrEmpty(videodriver) ?
-			usererror("Failed to autoprobe video driver") :
-			usererror("Failed to select requested video driver '%s'", videodriver);
-	}
-	free(videodriver);
-
 	_savegame_sort_order = SORT_BY_DATE | SORT_DESCENDING;
 	/* Initialize the zoom level of the screen to normal */
 	_screen.zoom = ZOOM_LVL_NORMAL;