changeset 366:38e10b5f4e09

Work towards base engine re-entrancy.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 16 Oct 2012 23:16:42 +0300
parents 5a003246a735
children 9875c65029af
files dmengine.c dmengine.h dmsimple.c
diffstat 3 files changed, 44 insertions(+), 48 deletions(-) [+]
line wrap: on
line diff
--- a/dmengine.c	Tue Oct 16 22:44:41 2012 +0300
+++ b/dmengine.c	Tue Oct 16 23:16:42 2012 +0300
@@ -9,7 +9,6 @@
 
 
 DMEngineData engine;
-DMFrameData frame;
 
 
 static int engineResImageLoad(DMResource *res)
@@ -196,10 +195,12 @@
 }
 
 
-void *engineGetResource(const char *name)
+void *engineGetResource(DMEngineData *eng, const char *name)
 {
-    DMResource *res = dmres_find(engine.resources, name);
-    if (res != NULL && res->rdata != NULL)
+    DMResource *res;
+    if (eng != NULL &&
+        (res = dmres_find(eng->resources, name)) != NULL &&
+        res->rdata != NULL)
         return res->rdata;
     else
     {
@@ -210,27 +211,27 @@
 
 
 #ifdef DM_USE_JSS
-void engineGetJSSInfo(BOOL *playing, int *order, JSSPattern **pat, int *npattern, int *row)
+void engineGetJSSInfo(DMEngineData *eng, BOOL *playing, int *order, JSSPattern **pat, int *npattern, int *row)
 {
-    JSS_LOCK(engine.plr);
+    JSS_LOCK(eng->plr);
 
-    *playing = engine.plr->isPlaying;
-    *row = engine.plr->row;
-    *pat = engine.plr->pattern;
-    *npattern = engine.plr->npattern;
-    *order = engine.plr->order;
+    *playing = eng->plr->isPlaying;
+    *row = eng->plr->row;
+    *pat = eng->plr->pattern;
+    *npattern = eng->plr->npattern;
+    *order = eng->plr->order;
 
-    JSS_UNLOCK(engine.plr);
+    JSS_UNLOCK(eng->plr);
 }
 
-void engineGetJSSChannelInfo(const int channel, int *ninst, int *nextInst, int *freq, int *note)
+void engineGetJSSChannelInfo(DMEngineData *eng, const int channel, int *ninst, int *nextInst, int *freq, int *note)
 {
-    JSS_LOCK(engine.plr);
-    JSSPlayerChannel *chn = &(engine.plr->channels[channel]);
+    JSS_LOCK(eng->plr);
+    JSSPlayerChannel *chn = &(eng->plr->channels[channel]);
     *ninst = chn->ninstrument;
     *nextInst = chn->nextInstrument;
     *freq = chn->freq;
     *note = chn->note;
-    JSS_UNLOCK(engine.plr);
+    JSS_UNLOCK(eng->plr);
 }
 #endif
--- a/dmengine.h	Tue Oct 16 22:44:41 2012 +0300
+++ b/dmengine.h	Tue Oct 16 23:16:42 2012 +0300
@@ -20,10 +20,7 @@
 #endif
 
 
-typedef struct
-{
-    int time, number;
-} DMFrameData;
+struct DMEngineData;
 
 
 typedef struct
@@ -57,40 +54,36 @@
     size_t audioPos;
 #endif
 
-    int    (*demoInit)();
-    int    (*demoInitPreVideo)();
-    int    (*demoInitPostVideo)();
-    int    (*demoRender)();
-    void   (*demoShutdown)();
-    void   (*demoQuit)();
+    int    (*demoInit)(struct DMEngineData *);
+    int    (*demoInitPreVideo)(struct DMEngineData *);
+    int    (*demoInitPostVideo)(struct DMEngineData *);
+    int    (*demoRender)(struct DMEngineData *);
+    void   (*demoShutdown)(struct DMEngineData *);
+    void   (*demoQuit)(struct DMEngineData *);
 
 } DMEngineData;
 
 
-extern DMEngineData engine;
-
-
-#define engineGetResImage(x, name) \
+#define engineGetResImage(eng, x, name) \
     do { \
-        if ((x = (SDL_Surface *) engineGetResource(name)) == NULL) \
+        if ((x = (SDL_Surface *) engineGetResource(eng, name)) == NULL) \
             return DMERR_INIT_FAIL; \
     } while (0)
 
-#define engineGetResModule(x, name) \
+#define engineGetResModule(eng, x, name) \
     do { \
-        if ((x = (JSSModule *) engineGetResource(name)) == NULL) \
+        if ((x = (JSSModule *) engineGetResource(eng, name)) == NULL) \
             return DMERR_INIT_FAIL; \
     } while (0)
 
 
 int    engineClassifier(DMResource *res);
-void * engineGetResource(const char *name);
-int    engineGetTime(int t);
-int    engineGetTimeDTi();
-int    engineGetTick();
-float  engineGetTimeDT();
-
-int    demoPreInit();
+void * engineGetResource(DMEngineData *eng, const char *name);
+int    engineGetTime(DMEngineData *eng, int t);
+int    engineGetTimeDTi(DMEngineData *eng);
+int    engineGetTick(DMEngineData *eng);
+float  engineGetTimeDT(DMEngineData *eng);
+int    demoPreInit(DMEngineData *eng);
 
 
 #ifdef __cplusplus
--- a/dmsimple.c	Tue Oct 16 22:44:41 2012 +0300
+++ b/dmsimple.c	Tue Oct 16 23:16:42 2012 +0300
@@ -2,6 +2,8 @@
 #include "dmengine.h"
 #include "dmargs.h"
 
+static DMEngineData engine;
+
 static DMOptArg optList[] =
 {
     { 0, '?', "help",       "Show this help", OPT_NONE },
@@ -185,7 +187,7 @@
     memset(&engine, 0, sizeof(engine));
 
     // Pre-initialization
-    if ((err = demoPreInit()) != DMERR_OK)
+    if ((err = demoPreInit(&engine)) != DMERR_OK)
         goto error_exit;
 
     if (!dmArgsProcess(argc, argv, optList, optListN,
@@ -278,7 +280,7 @@
 
     // Initialize SDL video
     if (engine.demoInitPreVideo != NULL &&
-       (err = engine.demoInitPreVideo()) != DMERR_OK)
+       (err = engine.demoInitPreVideo(&engine)) != DMERR_OK)
     {
         dmError("demoInitPreVideo() failed, %d: %s\n", err, dmErrorStr(err));
         goto error_exit;
@@ -291,7 +293,7 @@
     SDL_WM_SetCaption(dmProgDesc, dmProgName);
 
     if (engine.demoInitPostVideo != NULL &&
-       (err = engine.demoInitPostVideo()) != DMERR_OK)
+       (err = engine.demoInitPostVideo(&engine)) != DMERR_OK)
     {
         dmError("demoInitPostVideo() failed, %d: %s\n", err, dmErrorStr(err));
         goto error_exit;
@@ -307,7 +309,7 @@
     }
 
     // Final initializations
-    if ((err = engine.demoInit()) != DMERR_OK)
+    if ((err = engine.demoInit(&engine)) != DMERR_OK)
     {
         dmError("Failure in demoInit(), %d: %s\n",
             err, dmErrorStr(err));
@@ -415,12 +417,12 @@
         // Call main tick
         if (engine.demoRender != NULL)
         {
-            if ((err = engine.demoRender()) != DMERR_OK)
+            if ((err = engine.demoRender(&engine)) != DMERR_OK)
                 goto error_exit;
         }
         else
         {
-            if ((err = dmExecuteTimeline(engine.ptl, engine.screen, engineGetTick())) != DMERR_OK)
+            if ((err = dmExecuteTimeline(engine.ptl, engine.screen, engineGetTick(&engine))) != DMERR_OK)
                 goto error_exit;
         }
 
@@ -464,13 +466,13 @@
     dmres_close(engine.resources);
 
     if (engine.demoShutdown != NULL)
-        engine.demoShutdown();
+        engine.demoShutdown(&engine);
 
     if (initSDL)
         SDL_Quit();
 
     if (engine.demoQuit != NULL)
-        engine.demoQuit();
+        engine.demoQuit(&engine);
     
     return 0;
 }