tPlugins are now selectable at runtime with the -u, --plugin command line option. - vaccinewars - be a doctor and try to vaccinate the world (HTM) git clone git://src.adamsgaard.dk/vaccinewars (DIR) Log (DIR) Files (DIR) Refs (DIR) README (DIR) LICENSE --- (DIR) commit 064d97cc35949782635605a9d9caf3b648ed8f52 (DIR) parent 4a84c637bacdf71335f0040279538efc8a403ad8 (HTM) Author: Ben Webb <ben@salilab.org> Date: Tue, 14 May 2002 13:03:43 +0000 Plugins are now selectable at runtime with the -u, --plugin command line option. Diffstat: M src/curses_client/curses_client.c | 2 +- M src/dopewars.c | 22 ++++++++++------------ M src/dopewars.h | 3 ++- M src/gui_client/gtk_client.c | 2 +- M src/sound.c | 81 ++++++++++++++++++++++--------- M src/sound.h | 2 +- 6 files changed, 73 insertions(+), 39 deletions(-) --- (DIR) diff --git a/src/curses_client/curses_client.c b/src/curses_client/curses_client.c t@@ -2410,7 +2410,7 @@ void CursesLoop(void) LogMask() | G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_WARNING, LogMessage, NULL); - SoundOpen(NULL); + SoundOpen(WantedPlugin); display_intro(); (DIR) diff --git a/src/dopewars.c b/src/dopewars.c t@@ -78,7 +78,7 @@ gboolean Network, Client, Server, NotifyMetaServer, AIPlayer; unsigned Port = 7902; gboolean Sanitized, ConfigVerbose, DrugValue; gchar *HiScoreFile = NULL, *ServerName = NULL, *ConvertFile = NULL; -gchar *ServerMOTD = NULL; +gchar *ServerMOTD = NULL, *WantedPlugin = NULL; gboolean WantHelp, WantVersion, WantAntique, WantColour, WantNetwork; gboolean WantConvert, WantAdmin; t@@ -2515,8 +2515,7 @@ void SetupParameters(void) static void PluginHelp(void) { - GSList *listpt = NULL; - const gchar *plugname; + gchar *plugins; #ifdef HAVE_GETOPT_LONG g_print(_(" -u, --plugin=FILE use sound plugin \"FILE\"\n" " ")); t@@ -2524,14 +2523,9 @@ static void PluginHelp(void) g_print(_(" -u file use sound plugin \"file\"\n" " ")); #endif - g_print("(\"none\""); - do { - plugname = GetPluginName(&listpt); - if (plugname) { - g_print(", \"%s\"", plugname); - } - } while(plugname); - g_print(_(" available)\n")); + plugins = GetPluginList(); + g_print(_("(%s available)\n"), plugins); + g_free(plugins); } void HandleHelpTexts(void) t@@ -2616,7 +2610,7 @@ Report bugs to the author at ben@bellatrix.pcl.ox.ac.uk\n"), DATADIR); void HandleCmdLine(int argc, char *argv[]) { int c; - static const gchar *options = "anbchvf:o:sSp:g:r:wtC:l:NA"; + static const gchar *options = "anbchvf:o:sSp:g:r:wtC:l:NAu:"; #ifdef HAVE_GETOPT_LONG static const struct option long_options[] = { t@@ -2637,6 +2631,7 @@ void HandleCmdLine(int argc, char *argv[]) {"convert", required_argument, NULL, 'C'}, {"logfile", required_argument, NULL, 'l'}, {"admin", no_argument, NULL, 'A'}, + {"plugin", required_argument, NULL, 'u'}, {"help", no_argument, NULL, 'h'}, {"version", no_argument, NULL, 'v'}, {0, 0, 0, 0} t@@ -2697,6 +2692,9 @@ void HandleCmdLine(int argc, char *argv[]) case 'l': AssignName(&Log.File, optarg); break; + case 'u': + AssignName(&WantedPlugin, optarg); + break; case 'w': WantedClient = CLIENT_WINDOW; break; (DIR) diff --git a/src/dopewars.h b/src/dopewars.h t@@ -167,7 +167,8 @@ extern unsigned Port; extern gboolean Sanitized, ConfigVerbose, DrugValue; extern int NumLocation, NumGun, NumCop, NumDrug, NumSubway, NumPlaying, NumStoppedTo; -extern gchar *HiScoreFile, *ServerName, *ConvertFile, *ServerMOTD; +extern gchar *HiScoreFile, *ServerName, *ConvertFile, *ServerMOTD, + *WantedPlugin; extern gboolean WantHelp, WantVersion, WantAntique, WantColour, WantNetwork, WantConvert, WantAdmin; #ifdef CYGWIN (DIR) diff --git a/src/gui_client/gtk_client.c b/src/gui_client/gtk_client.c t@@ -2220,7 +2220,7 @@ gboolean GtkLoop(int *argc, char **argv[], gboolean ReturnOnFail) if (!CheckHighScoreFileConfig()) return TRUE; - SoundOpen(NULL); + SoundOpen(WantedPlugin); /* Create the main player */ ClientData.Play = g_new(Player, 1); (DIR) diff --git a/src/sound.c b/src/sound.c t@@ -37,37 +37,42 @@ #include "plugins/sound_winmm.h" #endif +#include "nls.h" #include "sound.h" +#define NOPLUGIN "none" + static SoundDriver *driver = NULL; static GSList *driverlist = NULL; typedef SoundDriver *(*InitFunc)(void); -static gboolean module_open = FALSE; -const gchar *GetPluginName(GSList **listpt) +gchar *GetPluginList(void) { - if (!*listpt) { - *listpt = driverlist; - } else { - *listpt = g_slist_next(*listpt); - } - if (*listpt) { - SoundDriver *drivpt = (SoundDriver *)(*listpt)->data; + GSList *listpt; + GString *plugins; + gchar *retstr; + + plugins = g_string_new("\""NOPLUGIN"\""); + for (listpt = driverlist; listpt; listpt = g_slist_next(listpt)) { + SoundDriver *drivpt = (SoundDriver *)listpt->data; - if (drivpt) { - return drivpt->name; + if (drivpt && drivpt->name) { + g_string_sprintfa(plugins, ", \"%s\"", drivpt->name); } } - return NULL; + retstr = plugins->str; + g_string_free(plugins, FALSE); + return retstr; } static void AddPlugin(InitFunc ifunc, void *module) { - driver = (*ifunc)(); - if (driver) { - g_print("%s sound plugin init OK\n", driver->name); - driver->module = module; - driverlist = g_slist_append(driverlist, driver); + SoundDriver *newdriver = (*ifunc)(); + + if (newdriver) { + g_print("%s sound plugin init OK\n", newdriver->name); + newdriver->module = module; + driverlist = g_slist_append(driverlist, newdriver); } } t@@ -148,14 +153,44 @@ void SoundInit(void) AddPlugin(sound_winmm_init, NULL); #endif #endif - module_open = FALSE; + driver = NULL; +} + +static SoundDriver *GetPlugin(gchar *drivername) +{ + GSList *listpt; + + for (listpt = driverlist; listpt; listpt = g_slist_next(listpt)) { + SoundDriver *drivpt = (SoundDriver *)listpt->data; + + if (drivpt && drivpt->name + && (!drivername || strcmp(drivpt->name, drivername) == 0)) { + return drivpt; + } + } + return NULL; } void SoundOpen(gchar *drivername) { - if (driver && driver->open && !module_open) { - driver->open(); - module_open = TRUE; + if (!drivername || strcmp(drivername, NOPLUGIN) != 0) { + driver = GetPlugin(drivername); + if (driver) { + if (driver->open) { + g_print("Using plugin %s\n", driver->name); + driver->open(); + } + } else if (drivername) { + gchar *plugins, *err; + + plugins = GetPluginList(); + err = g_strdup_printf(_("Invalid plugin \"%s\" selected.\n" + "(%s available; now using \"%s\".)"), + drivername, plugins, NOPLUGIN); + g_log(NULL, G_LOG_LEVEL_CRITICAL, err); + g_free(plugins); + g_free(err); + } } } t@@ -166,9 +201,9 @@ void SoundClose(void) SoundDriver *listdriv; #endif - if (driver && driver->close && module_open) { + if (driver && driver->close) { driver->close(); - module_open = FALSE; + driver = NULL; } #ifdef PLUGINS for (listpt = driverlist; listpt; listpt = g_slist_next(listpt)) { (DIR) diff --git a/src/sound.h b/src/sound.h t@@ -37,7 +37,7 @@ struct _SoundDriver { }; typedef struct _SoundDriver SoundDriver; -const gchar *GetPluginName(GSList **listpt); +gchar *GetPluginList(void); void SoundInit(void); void SoundOpen(gchar *drivername); void SoundClose(void);