@ -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 }
} ;