# HG changeset patch # User nkeynes # Date 1195462059 0 # Node ID f0fee3ba71d11bc915d7ebc5d82fefcc248c11b5 # Parent 28bdc62e642a04396a76a4da7b4aa0a752b337c6 Move name-to-driver mappings to display.c and audio.c respectively Move responsibility for invoking texcache_gl_init() to the driver --- a/src/aica/audio.c Mon Nov 19 08:46:30 2007 +0000 +++ b/src/aica/audio.c Mon Nov 19 08:47:39 2007 +0000 @@ -24,6 +24,13 @@ #include #include +audio_driver_t audio_driver_list[] = { +#ifdef HAVE_ESOUND + &audio_esd_driver, +#endif + &audio_null_driver, + NULL }; + #define NUM_BUFFERS 3 #define MS_PER_BUFFER 100 @@ -61,6 +68,21 @@ return (read == AUDIO_CHANNEL_COUNT ? 0 : -1 ); } +audio_driver_t get_audio_driver_by_name( const char *name ) +{ + int i; + if( name == NULL ) { + return audio_driver_list[0]; + } + for( i=0; audio_driver_list[i] != NULL; i++ ) { + if( strcasecmp( audio_driver_list[i]->name, name ) == 0 ) { + return audio_driver_list[i]; + } + } + + return NULL; +} + /** * Set the output driver, sample rate and format. Also initializes the * output buffers, flushing any current data and reallocating as --- a/src/aica/audio.h Mon Nov 19 08:46:30 2007 +0000 +++ b/src/aica/audio.h Mon Nov 19 08:47:39 2007 +0000 @@ -75,6 +75,8 @@ extern struct audio_driver audio_null_driver; extern struct audio_driver audio_esd_driver; +audio_driver_t get_audio_driver_by_name( const char *name ); + /** * Set the output driver, sample rate and format. Also initializes the * output buffers, flushing any current data and reallocating as --- a/src/display.c Mon Nov 19 08:46:30 2007 +0000 +++ b/src/display.c Mon Nov 19 08:47:39 2007 +0000 @@ -24,6 +24,11 @@ #include "display.h" #include "pvr2/pvr2.h" +display_driver_t display_driver_list[] = { + &display_gtk_driver, + &display_null_driver, + NULL }; + typedef struct keymap_entry { uint16_t keycode; input_key_callback_t callback; @@ -148,6 +153,20 @@ } } +display_driver_t get_display_driver_by_name( const char *name ) +{ + int i; + if( name == NULL ) { + return display_driver_list[0]; + } + for( i=0; display_driver_list[i] != NULL; i++ ) { + if( strcasecmp( display_driver_list[i]->name, name ) == 0 ) { + return display_driver_list[i]; + } + } + + return NULL; +} gboolean display_set_driver( display_driver_t driver ) @@ -159,8 +178,8 @@ display_driver = driver; if( driver->init_driver != NULL ) rv = driver->init_driver(); - if( rv ) { - texcache_gl_init(); + if( !rv ) { + display_driver = NULL; } return rv; } --- a/src/display.h Mon Nov 19 08:46:30 2007 +0000 +++ b/src/display.h Mon Nov 19 08:47:39 2007 +0000 @@ -159,6 +159,7 @@ } *display_driver_t; +display_driver_t get_display_driver_by_name( const char *name ); gboolean display_set_driver( display_driver_t driver ); extern uint32_t pvr2_frame_counter; --- a/src/drivers/video_x11.c Mon Nov 19 08:46:30 2007 +0000 +++ b/src/drivers/video_x11.c Mon Nov 19 08:47:39 2007 +0000 @@ -19,6 +19,7 @@ #include #include #include "dream.h" +#include "pvr2/pvr2.h" #include "drivers/video_x11.h" #include "drivers/gl_common.h" @@ -167,6 +168,8 @@ return FALSE; } XFree(visual); + + texcache_gl_init(); return TRUE; } --- a/src/main.c Mon Nov 19 08:46:30 2007 +0000 +++ b/src/main.c Mon Nov 19 08:47:39 2007 +0000 @@ -4,8 +4,6 @@ * Main program, initializes dreamcast and gui, then passes control off to * the gtk main loop (currently). * - * FIXME: Remove explicit GTK/Gnome references from this file - * * Copyright (c) 2005 Nathan Keynes. * * This program is free software; you can redistribute it and/or modify @@ -41,8 +39,8 @@ char *aica_program = NULL; char *s3m_file = NULL; const char *disc_file = NULL; -char *display_driver_name = "gtk"; -char *audio_driver_name = "esd"; +char *display_driver_name = NULL; +char *audio_driver_name = NULL; gboolean start_immediately = FALSE; gboolean headless = FALSE; gboolean without_bios = FALSE; @@ -52,25 +50,18 @@ uint32_t time_nanos = 0; extern uint32_t sh4_cpu_multiplier; -audio_driver_t audio_driver_list[] = { &audio_null_driver, - &audio_esd_driver, - NULL }; - -display_driver_t display_driver_list[] = { &display_null_driver, - &display_gtk_driver, - NULL }; - int main (int argc, char *argv[]) { int opt, i; double t; + gboolean display_ok; install_crash_handler(); #ifdef ENABLE_NLS bindtextdomain (PACKAGE, PACKAGE_LOCALE_DIR); textdomain (PACKAGE); #endif - gui_parse_cmdline(&argc, &argv); + display_ok = gui_parse_cmdline(&argc, &argv); while( (opt = getopt_long( argc, argv, option_list, longopts, NULL )) != -1 ) { switch( opt ) { @@ -140,17 +131,13 @@ dcload_install(); } - for( i=0; audio_driver_list[i] != NULL; i++ ) { - if( strcasecmp( audio_driver_list[i]->name, audio_driver_name ) == 0 ) { - if( audio_set_driver( audio_driver_list[i], 44100, AUDIO_FMT_16ST ) == FALSE ) { - audio_set_driver( &audio_null_driver, 44100, AUDIO_FMT_16ST ); - } - break; - } - - } - if( audio_driver_list[i] == NULL ) { - ERROR( "Audio driver '%s' not found, using null driver", audio_driver_name ); + audio_driver_t audio_driver = get_audio_driver_by_name(audio_driver_name); + if( audio_driver == NULL ) { + ERROR( "Audio driver '%s' not found, aborting.", audio_driver_name ); + exit(2); + } else if( audio_set_driver( audio_driver, 44100, AUDIO_FMT_16ST ) == FALSE ) { + ERROR( "Failed to initialize audio driver '%s', using null driver", + audio_driver->name ); audio_set_driver( &audio_null_driver, 44100, AUDIO_FMT_16ST ); } @@ -159,20 +146,14 @@ } else { gui_init(show_debugger); - gboolean initialized = FALSE; - for( i=0; display_driver_list[i] != NULL; i++ ) { - if( strcasecmp( display_driver_list[i]->name, display_driver_name ) == 0 ) { - initialized = display_set_driver( display_driver_list[i] ); - break; - } - } - if( !initialized ) { - if( display_driver_list[i] == NULL ) { - ERROR( "Video driver '%s' not found, using null driver", display_driver_name ); - } else { - ERROR( "Video driver '%s' failed to initialize, falling back to null driver", display_driver_name ); - } - display_set_driver( &display_null_driver ); + display_driver_t display_driver = get_display_driver_by_name(display_driver_name); + if( display_driver == NULL ) { + ERROR( "Video driver '%s' not found, aborting.", display_driver_name ); + exit(2); + } else if( display_set_driver( display_driver ) == FALSE ) { + ERROR( "Video driver '%s' failed to initialize (could not connect to display?)", + display_driver->name ); + exit(2); } }