Mercurial > hg > openttd
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;