tAll modules should now be dlclose'd on exit; -h option now lists all available plugin modules. - vaccinewars - be a doctor and try to vaccinate the world
git clone git://src.adamsgaard.dk/vaccinewars
Log
Files
Refs
README
LICENSE
---
commit f9def420f9357daa57e9bbc7b3e53898410d0793
parent 6d6fff2c9e53aa3a184d9d323e89f6806cee345b
Author: Ben Webb 
Date:   Tue, 14 May 2002 13:00:57 +0000

All modules should now be dlclose'd on exit; -h option now lists all
available plugin modules.


Diffstat:
  M src/sound.c                         |      48 +++++++++++++++++++++++++------

1 file changed, 39 insertions(+), 9 deletions(-)
---
diff --git a/src/sound.c b/src/sound.c
t@@ -40,15 +40,34 @@
 #include "sound.h"
 
 static SoundDriver *driver = NULL;
+static GSList *driverlist = NULL;
 typedef SoundDriver *(*InitFunc)(void);
-static void *soundmodule = NULL;
 static gboolean module_open = FALSE;
 
-static void AddPlugin(InitFunc ifunc)
+const gchar *GetPluginName(GSList **listpt)
+{
+  if (!*listpt) {
+    *listpt = driverlist;
+  } else {
+    *listpt = g_slist_next(*listpt);
+  }
+  if (*listpt) {
+    SoundDriver *drivpt = (SoundDriver *)(*listpt)->data;
+
+    if (drivpt) {
+      return drivpt->name;
+    }
+  }
+  return NULL;
+}
+
+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);
   }
 }
 
t@@ -57,6 +76,7 @@ static void OpenModule(const gchar *modname, const gchar *fullname)
 {
   InitFunc ifunc;
   gint len = strlen(modname);
+  void *soundmodule;
 
   if (len > 6 && strncmp(modname, "lib", 3) == 0
       && strcmp(modname + len - 3, ".so") == 0) {
t@@ -68,7 +88,6 @@ static void OpenModule(const gchar *modname, const gchar *fullname)
       g_print("dlopen of %s failed: %s\n", fullname, dlerror());
       return;
     }
-    g_print("%s opened OK\n", fullname);
 
     funcname = g_string_new(modname);
     g_string_truncate(funcname, len - 3);
t@@ -76,9 +95,10 @@ static void OpenModule(const gchar *modname, const gchar *fullname)
     g_string_append(funcname, "_init");
     ifunc = dlsym(soundmodule, funcname->str);
     if (ifunc) {
-      AddPlugin(ifunc);
+      AddPlugin(ifunc, soundmodule);
     } else {
       g_print("dlsym (%s) failed: %s\n", funcname->str, dlerror());
+      dlclose(soundmodule);
     }
     g_string_free(funcname, TRUE);
   }
t@@ -119,13 +139,13 @@ void SoundInit(void)
   ScanPluginDir("plugins/.libs");
 #else
 #ifdef HAVE_ESD
-  AddPlugin(sound_esd_init);
+  AddPlugin(sound_esd_init, NULL);
 #endif
 #ifdef HAVE_SDL_MIXER
-  AddPlugin(sound_sdl_init);
+  AddPlugin(sound_sdl_init, NULL);
 #endif
 #ifdef HAVE_WINMM
-  AddPlugin(sound_winmm_init);
+  AddPlugin(sound_winmm_init, NULL);
 #endif
 #endif
   module_open = FALSE;
t@@ -141,15 +161,25 @@ void SoundOpen(gchar *drivername)
 
 void SoundClose(void)
 {
+#ifdef PLUGINS
+  GSList *listpt;
+  SoundDriver *listdriv;
+#endif
+
   if (driver && driver->close && module_open) {
     driver->close();
     module_open = FALSE;
   }
 #ifdef PLUGINS
-  if (soundmodule) {
-    dlclose(soundmodule);
+  for (listpt = driverlist; listpt; listpt = g_slist_next(listpt)) {
+    listdriv = (SoundDriver *)listpt->data;
+    if (listdriv && listdriv->module) {
+      dlclose(listdriv->module);
+    }
   }
 #endif
+  g_slist_free(driverlist);
+  driverlist = NULL;
 }
 
 void SoundPlay(const gchar *snd)