changeset 342:c6ec970dc3cf

Separate some demo engine parts to two different modules.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 15 Oct 2012 21:25:51 +0300
parents 9f16badc4bd3
children 6ecc7eb6d158
files dmengine.c dmengine.h dmsimple.c dmsimple.h
diffstat 4 files changed, 393 insertions(+), 490 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmengine.c	Mon Oct 15 21:25:51 2012 +0300
@@ -0,0 +1,266 @@
+#include "dmengine.h"
+#include "dmimage.h"
+
+
+#ifdef DM_USE_TREMOR
+#include <tremor/ivorbiscodec.h>
+#include <tremor/ivorbisfile.h>
+#endif
+
+
+DMEngineData engine;
+DMFrameData frame;
+
+
+int engineGetTick()
+{
+    return (frame.startTime - engine.startTime) + engine.adjustTime;
+}
+
+
+float engineGetTimeDT()
+{
+    return (float) engineGetTick() / 1000.0f;
+}
+
+
+int engineGetTimeDTi()
+{
+    return (float) engineGetTick() / 1000;
+}
+
+
+int engineGetTime(int t)
+{
+    return engineGetTick() - (1000 * t);
+}
+
+
+int engineGetDT(int t)
+{
+    return engineGetTime(t) / 1000;
+}
+
+
+static int engineResImageLoad(DMResource *res)
+{
+    SDL_Surface *img = dmLoadImage(res);
+    if (res != NULL)
+    {
+        res->rdata = img;
+        return DMERR_OK;
+    }
+    else
+        return dmferror(res);
+}
+
+
+static void engineResImageFree(DMResource *res)
+{
+    SDL_FreeSurface((SDL_Surface *)res->rdata);
+}
+
+static BOOL engineResImageProbe(DMResource *res, const char *fext)
+{
+    (void) res;
+    return fext != NULL && (strcasecmp(fext, ".jpg") == 0 || strcasecmp(fext, ".png") == 0);
+}
+
+
+#ifdef JSS_SUP_XM
+static int engineResModuleLoad(DMResource *res)
+{
+    return jssLoadXM(res, (JSSModule **) &(res->rdata));
+}
+
+static void engineResModuleFree(DMResource *res)
+{
+    jssFreeModule((JSSModule *) res->rdata);
+}
+
+static BOOL engineResModuleProbe(DMResource *res, const char *fext)
+{
+    (void) res;
+    return fext != NULL && (strcasecmp(fext, ".xm") == 0 || strcasecmp(fext, ".jmod") == 0);
+}
+#endif
+
+
+#ifdef DM_USE_TREMOR
+static size_t vorbisFileRead(void *ptr, size_t size, size_t nmemb, void *datasource)
+{
+    return dmfread(ptr, size, nmemb, (DMResource *) datasource);
+}
+
+static int vorbisFileSeek(void *datasource, ogg_int64_t offset, int whence)
+{
+    return dmfseek((DMResource *) datasource, offset, whence);
+}
+
+static int vorbisFileClose(void *datasource)
+{
+    (void) datasource;
+    return 0;
+}
+
+static long vorbisFileTell(void *datasource)
+{
+    return dmftell((DMResource *) datasource);
+}
+      
+
+static ov_callbacks vorbisFileCBS =
+{
+    vorbisFileRead,
+    vorbisFileSeek,
+    vorbisFileClose,
+    vorbisFileTell
+};
+
+static int engineResVorbisLoad(DMResource *res)
+{
+    OggVorbis_File vf;
+
+    dmMsg(1, "vorbisfile '%s', %d bytes resource loading\n",
+        res->filename, res->dataSize);
+
+    if (ov_open_callbacks(res, &vf, NULL, 0, vorbisFileCBS) < 0)
+        return DMERR_FOPEN;
+
+    res->rdataSize = ov_pcm_total(&vf, -1) * 2 * 2;
+    if ((res->rdata = dmMalloc(res->rdataSize + 16)) == NULL)
+    {
+        ov_clear(&vf);
+        return DMERR_MALLOC;
+    }
+
+    dmMsg(1, "rdataSize=%d bytes?\n", res->rdataSize);
+
+    BOOL eof = FALSE;
+    int left = res->rdataSize;
+    char *ptr = res->rdata;
+    int current_section;
+    while (!eof && left > 0)
+    {
+        int ret = ov_read(&vf, ptr, left > 4096 ? 4096 : left, &current_section);
+        if (ret == 0)
+            eof = TRUE;
+        else
+        if (ret < 0)
+        {
+            ov_clear(&vf);
+            return DMERR_INVALID_DATA;
+        }
+        else
+        {
+            left -= ret;
+            ptr += ret;
+        }
+    }
+
+    ov_clear(&vf);
+    return DMERR_OK;
+}
+
+static void engineResVorbisFree(DMResource *res)
+{
+    dmFree(res->rdata);
+}
+
+static BOOL engineResVorbisProbe(DMResource *res, const char *fext)
+{
+    (void) res;
+    return fext != NULL && (strcasecmp(fext, ".ogg") == 0);
+}
+#endif
+
+
+static DMResourceDataOps engineResOps[] =
+{
+    {
+        engineResImageProbe,
+        engineResImageLoad,
+        engineResImageFree
+    },
+
+#ifdef JSS_SUP_XM
+    {
+        engineResModuleProbe,
+        engineResModuleLoad,
+        engineResModuleFree
+    },
+#endif
+
+#ifdef DM_USE_TREMOR
+    {
+        engineResVorbisProbe,
+        engineResVorbisLoad,
+        engineResVorbisFree
+    },
+#endif
+};
+
+static const int nengineResOps = sizeof(engineResOps) / sizeof(engineResOps[0]);
+
+
+int engineClassifier(DMResource *res)
+{
+    int i;
+    char *fext;
+
+    if (res == NULL)
+        return DMERR_NULLPTR;
+    
+    fext = strrchr(res->filename, '.');
+    for (i = 0; i < nengineResOps; i++)
+    {
+        DMResourceDataOps *rops = &engineResOps[i];
+        if (rops->probe != NULL && rops->probe(res, fext))
+        {
+            res->rops = rops;
+            return DMERR_OK;
+        }
+    }
+    
+    return DMERR_OK;
+}
+
+
+void *engineGetResource(const char *name)
+{
+    DMResource *res = dmres_find(name);
+    if (res != NULL && res->rdata != NULL)
+        return res->rdata;
+    else
+    {
+        dmError("Could not find resource '%s'.\n", name);
+        return NULL;
+    }
+}
+
+
+#ifdef DM_USE_JSS
+void engineGetJSSInfo(BOOL *playing, int *order, JSSPattern **pat, int *npattern, int *row)
+{
+    JSS_LOCK(engine.plr);
+
+    *playing = engine.plr->isPlaying;
+    *row = engine.plr->row;
+    *pat = engine.plr->pattern;
+    *npattern = engine.plr->npattern;
+    *order = engine.plr->order;
+
+    JSS_UNLOCK(engine.plr);
+}
+
+void engineGetJSSChannelInfo(const int channel, int *ninst, int *nextInst, int *freq, int *note)
+{
+    JSS_LOCK(engine.plr);
+    JSSPlayerChannel *chn = &(engine.plr->channels[channel]);
+    *ninst = chn->ninstrument;
+    *nextInst = chn->nextInstrument;
+    *freq = chn->freq;
+    *note = chn->note;
+    JSS_UNLOCK(engine.plr);
+}
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmengine.h	Mon Oct 15 21:25:51 2012 +0300
@@ -0,0 +1,93 @@
+#ifndef DMSIMPLE_H
+#define DMSIMPLE_H
+
+#include "dmlib.h"
+#include <SDL_events.h>
+#include <SDL_audio.h>
+#include "dmres.h"
+
+#ifdef DM_USE_JSS
+#include "jss.h"
+#include "jssmod.h"
+#include "jssmix.h"
+#include "jssplr.h"
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+typedef struct
+{
+    int currFrame, endTime, startTime,
+        totalFrameTime, adjustTime, pauseTime;
+
+    BOOL pauseFlag, paused, exitFlag;
+    SDL_Surface *screen;
+    SDL_Event event;
+
+    SDL_AudioSpec optAfmt;
+    int optScrWidth, optScrHeight, optVFlags, optBitDepth, optResFlags;
+    char *optDataPath, *optPackFilename;
+
+#ifdef DM_USE_JSS
+    JSSMixer *dev;
+    JSSPlayer *plr;
+    int jss_format;
+#endif
+
+#ifdef DM_USE_TREMOR
+    DMResource *audio;
+    size_t audioPos;
+#endif
+
+    int    (*demoInit)();
+    int    (*demoInitPreVideo)();
+    int    (*demoInitPostVideo)();
+    int    (*demoRender)();
+    void   (*demoShutdown)();
+    void   (*demoQuit)();
+
+} DMEngineData;
+
+
+typedef struct
+{
+    int currFrame, endTime, startTime;
+} DMFrameData;
+
+
+extern DMEngineData engine;
+extern DMFrameData frame;
+
+
+#define engineGetResImage(x, name) \
+    do { \
+        if ((x = (SDL_Surface *) engineGetResource(name)) == NULL) \
+            return DMERR_INIT_FAIL; \
+    } while (0)
+
+#define engineGetResModule(x, name) \
+    do { \
+        if ((x = (JSSModule *) engineGetResource(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();
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // DMSIMPLE_H
--- a/dmsimple.c	Mon Oct 15 18:12:37 2012 +0300
+++ b/dmsimple.c	Mon Oct 15 21:25:51 2012 +0300
@@ -1,26 +1,12 @@
 #include <SDL.h>
-#include "dmsimple.h"
+#include "dmengine.h"
 #include "dmargs.h"
-#include "dmimage.h"
-
-#ifdef DM_USE_TREMOR
-#include <tremor/ivorbiscodec.h>
-#include <tremor/ivorbisfile.h>
-#endif
-
-
-DMEngineData engine;
-DMFrameData frame;
-
 
 static DMOptArg optList[] =
 {
     { 0, '?', "help",       "Show this help", OPT_NONE },
     { 1, 'v', "verbose",    "Be more verbose", OPT_NONE },
     { 2, 'f', "fs",         "Fullscreen", OPT_NONE },
-#ifdef DM_DEVEL
-    { 3, 'd', "devel",      "Development mode", OPT_NONE },
-#endif
 };
 
 const int optListN = sizeof(optList) / sizeof(optList[0]);
@@ -53,12 +39,6 @@
             engine.optVFlags |= SDL_FULLSCREEN;
             break;
 
-#ifdef DM_DEVEL
-        case 3:
-            engine.optDevel = TRUE;
-            break;
-#endif
-
         default:
             dmError("Unknown option '%s'.\n", currArg);
             return FALSE;
@@ -68,7 +48,36 @@
 }
 
 
-int engineShowProgress(int loaded, int total)
+static void engineAudioCallback(void *userdata, Uint8 *stream, int len)
+{
+    (void) userdata;
+
+    if (engine.paused)
+    {
+        memset(stream, 0, len);
+    }
+    else
+#ifdef DM_USE_JSS
+    {
+        if (engine.dev != NULL)
+            jvmRenderAudio(engine.dev, stream, len / jvmGetSampleSize(engine.dev));
+    }
+#endif
+#ifdef DM_USE_TREMOR
+    if (engine.audioPos + len >= engine.audio->rdataSize)
+    {
+        engine.exitFlag = TRUE;
+    }
+    else
+    {
+        memcpy(stream, engine.audio->rdata + engine.audioPos, len);
+        engine.audioPos += len;
+    }
+#endif
+}
+
+
+static int engineShowProgress(int loaded, int total)
 {
     int dx = 60,
         dh = 20,
@@ -101,7 +110,7 @@
 }
 
 
-int engineLoadResources()
+static int engineLoadResources()
 {
     int err, loaded, total;
     
@@ -121,333 +130,7 @@
 }
 
 
-int engineGetTick()
-{
-    return (frame.startTime - engine.startTime) + engine.adjustTime;
-}
-
-
-float engineGetTimeDT()
-{
-    return (float) engineGetTick() / 1000.0f;
-}
-
-
-int engineGetTimeDTi()
-{
-    return (float) engineGetTick() / 1000;
-}
-
-
-int engineGetTime(int t)
-{
-    return engineGetTick() - (1000 * t);
-}
-
-
-int engineGetDT(int t)
-{
-    return engineGetTime(t) / 1000;
-}
-
-
-static int engineResImageLoad(DMResource *res)
-{
-    SDL_Surface *img = dmLoadImage(res);
-    if (res != NULL)
-    {
-        res->rdata = img;
-        return DMERR_OK;
-    }
-    else
-        return dmferror(res);
-}
-
-
-static void engineResImageFree(DMResource *res)
-{
-    SDL_FreeSurface((SDL_Surface *)res->rdata);
-}
-
-static BOOL engineResImageProbe(DMResource *res, const char *fext)
-{
-    (void) res;
-    return fext != NULL && (strcasecmp(fext, ".jpg") == 0 || strcasecmp(fext, ".png") == 0);
-}
-
-
-#ifdef JSS_SUP_XM
-static int engineResModuleLoad(DMResource *res)
-{
-    return jssLoadXM(res, (JSSModule **) &(res->rdata));
-}
-
-static void engineResModuleFree(DMResource *res)
-{
-    jssFreeModule((JSSModule *) res->rdata);
-}
-
-static BOOL engineResModuleProbe(DMResource *res, const char *fext)
-{
-    (void) res;
-    return fext != NULL && (strcasecmp(fext, ".xm") == 0 || strcasecmp(fext, ".jmod") == 0);
-}
-#endif
-
-
-#ifdef DM_USE_TREMOR
-static size_t vorbisFileRead(void *ptr, size_t size, size_t nmemb, void *datasource)
-{
-    return dmfread(ptr, size, nmemb, (DMResource *) datasource);
-}
-
-static int vorbisFileSeek(void *datasource, ogg_int64_t offset, int whence)
-{
-    return dmfseek((DMResource *) datasource, offset, whence);
-}
-
-static int vorbisFileClose(void *datasource)
-{
-    (void) datasource;
-    return 0;
-}
-
-static long vorbisFileTell(void *datasource)
-{
-    return dmftell((DMResource *) datasource);
-}
-      
-
-static ov_callbacks vorbisFileCBS =
-{
-    vorbisFileRead,
-    vorbisFileSeek,
-    vorbisFileClose,
-    vorbisFileTell
-};
-
-static int engineResVorbisLoad(DMResource *res)
-{
-    OggVorbis_File vf;
-
-    dmMsg(1, "vorbisfile '%s', %d bytes resource loading\n",
-        res->filename, res->dataSize);
-
-    if (ov_open_callbacks(res, &vf, NULL, 0, vorbisFileCBS) < 0)
-        return DMERR_FOPEN;
-
-    res->rdataSize = ov_pcm_total(&vf, -1) * 2 * 2;
-    if ((res->rdata = dmMalloc(res->rdataSize + 16)) == NULL)
-    {
-        ov_clear(&vf);
-        return DMERR_MALLOC;
-    }
-
-    dmMsg(1, "rdataSize=%d bytes?\n", res->rdataSize);
-
-    BOOL eof = FALSE;
-    int left = res->rdataSize;
-    char *ptr = res->rdata;
-    int current_section;
-    while (!eof && left > 0)
-    {
-        int ret = ov_read(&vf, ptr, left > 4096 ? 4096 : left, &current_section);
-        if (ret == 0)
-            eof = TRUE;
-        else
-        if (ret < 0)
-        {
-            ov_clear(&vf);
-            return DMERR_INVALID_DATA;
-        }
-        else
-        {
-            left -= ret;
-            ptr += ret;
-        }
-    }
-
-    ov_clear(&vf);
-    return DMERR_OK;
-}
-
-static void engineResVorbisFree(DMResource *res)
-{
-    dmFree(res->rdata);
-}
-
-static BOOL engineResVorbisProbe(DMResource *res, const char *fext)
-{
-    (void) res;
-    return fext != NULL && (strcasecmp(fext, ".ogg") == 0);
-}
-#endif
-
-
-static DMResourceDataOps engineResOps[] =
-{
-    {
-        engineResImageProbe,
-        engineResImageLoad,
-        engineResImageFree
-    },
-
-#ifdef JSS_SUP_XM
-    {
-        engineResModuleProbe,
-        engineResModuleLoad,
-        engineResModuleFree
-    },
-#endif
-
-#ifdef DM_USE_TREMOR
-    {
-        engineResVorbisProbe,
-        engineResVorbisLoad,
-        engineResVorbisFree
-    },
-#endif
-};
-
-static const int nengineResOps = sizeof(engineResOps) / sizeof(engineResOps[0]);
-
-
-static int engineClassifier(DMResource *res)
-{
-    int i;
-    char *fext;
-
-    if (res == NULL)
-        return DMERR_NULLPTR;
-    
-    fext = strrchr(res->filename, '.');
-    for (i = 0; i < nengineResOps; i++)
-    {
-        DMResourceDataOps *rops = &engineResOps[i];
-        if (rops->probe != NULL && rops->probe(res, fext))
-        {
-            res->rops = rops;
-            return DMERR_OK;
-        }
-    }
-    
-    return DMERR_OK;
-}
-
-
-void *engineGetResource(const char *name)
-{
-    DMResource *res = dmres_find(name);
-    if (res != NULL && res->rdata != NULL)
-        return res->rdata;
-    else
-    {
-        dmError("Could not find resource '%s'.\n", name);
-        return NULL;
-    }
-}
-
-
-#if defined(DM_DEVEL) && defined(DM_USE_JSS)
-static void engineAudioCallbackDebug(void *userdata, Uint8 *stream, int len)
-{
-    if (engine.paused)
-    {
-        memset(stream, 0, len);
-    }
-    else
-    {
-        JSSMixer *d = (JSSMixer *) userdata;
-        if (d != NULL)
-        {
-            int pos = ((engine.adjustTime * d->outFreq) / 1000) * jvmGetSampleSize(d) +
-                engine.audioSamples;
-            
-            memcpy(stream, engine.audioBuf + pos, len);
-
-            engine.audioSamples += len;
-        }
-    }
-}
-
-#endif
-
-void engineAdjustTime(int adj)
-{
-#ifdef DM_DEVEL
-    if (engine.optDevel)
-    {
-        int tmp = engine.adjustTime + adj;
-        if (tmp < 0)
-            tmp = 0;
-        else
-        if (tmp >= engine.demoDuration * 1000)
-            tmp = engine.demoDuration * 1000;
-
-        engine.pauseFlag = TRUE;
-        engine.adjustTime = tmp;
-        dmPrint(0, "adj=%d, adjtime=%d\n", adj, engine.adjustTime);
-    }
-#endif
-}
-
-static void engineAudioCallback(void *userdata, Uint8 *stream, int len)
-{
-    (void) userdata;
-
-    if (engine.paused)
-    {
-        memset(stream, 0, len);
-    }
-    else
-#ifdef DM_USE_JSS
-    {
-        if (engine.dev != NULL)
-            jvmRenderAudio(engine.dev, stream, len / jvmGetSampleSize(engine.dev));
-    }
-#endif
-#ifdef DM_USE_TREMOR
-    if (engine.audioPos + len >= engine.audio->rdataSize)
-    {
-        engine.exitFlag = TRUE;
-    }
-    else
-    {
-        memcpy(stream, engine.audio->rdata + engine.audioPos, len);
-        engine.audioPos += len;
-    }
-#endif
-}
-
-
-#ifdef DM_USE_JSS
-void engineGetJSSInfo(BOOL *playing, int *order, JSSPattern **pat, int *npattern, int *row)
-{
-    JSS_LOCK(engine.plr);
-
-    *playing = engine.plr->isPlaying;
-    *row = engine.plr->row;
-    *pat = engine.plr->pattern;
-    *npattern = engine.plr->npattern;
-    *order = engine.plr->order;
-
-    JSS_UNLOCK(engine.plr);
-}
-
-void engineGetJSSChannelInfo(const int channel, int *ninst, int *nextInst, int *freq, int *note)
-{
-    JSS_LOCK(engine.plr);
-    JSSPlayerChannel *chn = &(engine.plr->channels[channel]);
-    *ninst = chn->ninstrument;
-    *nextInst = chn->nextInstrument;
-    *freq = chn->freq;
-    *note = chn->note;
-    JSS_UNLOCK(engine.plr);
-}
-#endif
-
-
-BOOL engineInitializeVideo()
+static BOOL engineInitializeVideo()
 {
     dmPrint(1, "Initializing SDL video %d x %d x %dbpp, flags=0x%08x\n",
         engine.optScrWidth, engine.optScrHeight, engine.optBitDepth, engine.optVFlags);
@@ -556,12 +239,7 @@
     dmPrint(1, "Trying to init SDL audio with: fmt=%d, chn=%d, freq=%d\n",
         engine.optAfmt.format, engine.optAfmt.channels, engine.optAfmt.freq);
 
-#if defined(DM_DEVEL) && defined(DM_USE_JSS)
-    if (engine.optDevel)
-        engine.optAfmt.callback = engineAudioCallbackDebug;
-    else
-#endif
-        engine.optAfmt.callback = engineAudioCallback;
+    engine.optAfmt.callback = engineAudioCallback;
     
     if (SDL_OpenAudio(&engine.optAfmt, NULL) < 0)
     {
@@ -604,34 +282,6 @@
     if ((err = engine.demoInit()) != DMERR_OK)
         goto error_exit;
 
-#if defined(DM_DEVEL) && defined(DM_USE_JSS)
-    if (engine.optDevel)
-    {
-        Uint8 *ptr;
-        int left = engine.dev->outFreq * engine.demoDuration;
-        dmPrint(1, "Development mode enabled, pre-rendering audio.");
-        engine.audioBufSize = jvmGetSampleSize(engine.dev) * engine.dev->outFreq * engine.demoDuration;
-        if ((engine.audioBuf = dmMalloc(engine.audioBufSize)) == NULL)
-        {
-            dmError("Could not allocate audio stream buffer of %d bytes.\n",
-                engine.audioBufSize);
-            goto error_exit;
-        }
-        
-        ptr = engine.audioBuf;
-        while (left > 0)
-        {
-            int length = left;
-            if (length > 16*1024)
-                length = 16*1024;
-
-            jvmRenderAudio(engine.dev, ptr, length);
-            ptr += jvmGetSampleSize(engine.dev) * length;
-            left -= length;
-        }
-    }
-#endif
-
     dmPrint(1, "Starting up.\n");
 
     SDL_LockAudio();
@@ -656,12 +306,6 @@
                         engine.pauseFlag = !engine.pauseFlag;
                         break;
 
-#ifdef DM_DEVEL
-                    case SDLK_LEFT:  engineAdjustTime(-500); break;
-                    case SDLK_RIGHT: engineAdjustTime( 500); break;
-                    case SDLK_UP:    engineAdjustTime( 1000); break;
-                    case SDLK_DOWN:  engineAdjustTime(-1000); break;
-#endif
                     case SDLK_f:
                         engine.optVFlags ^= SDL_FULLSCREEN;
                         if (!engineInitializeVideo())
--- a/dmsimple.h	Mon Oct 15 18:12:37 2012 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-#ifndef DMSIMPLE_H
-#define DMSIMPLE_H
-
-#include "dmlib.h"
-#include <SDL_events.h>
-#include <SDL_audio.h>
-#include "dmres.h"
-
-#ifdef DM_USE_JSS
-#include "jss.h"
-#include "jssmod.h"
-#include "jssmix.h"
-#include "jssplr.h"
-#endif
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-typedef struct
-{
-    int currFrame, endTime, startTime,
-        totalFrameTime, adjustTime, pauseTime;
-
-    BOOL pauseFlag, paused, exitFlag;
-    SDL_Surface *screen;
-    SDL_Event event;
-
-    SDL_AudioSpec optAfmt;
-    int optScrWidth, optScrHeight, optVFlags, optBitDepth, optResFlags;
-    char *optDataPath, *optPackFilename;
-
-#ifdef DM_USE_JSS
-    JSSMixer *dev;
-    JSSPlayer *plr;
-    int jss_format;
-#endif
-
-#ifdef DM_USE_TREMOR
-    DMResource *audio;
-    size_t audioPos;
-#endif
-
-#ifdef DM_DEVEL
-    BOOL optDevel;
-    Uint8 *audioBuf;
-    int audioBufSize;
-    int audioSamples;
-    int demoDuration;
-#endif
-
-    int    (*demoInit)();
-    int    (*demoInitPreVideo)();
-    int    (*demoInitPostVideo)();
-    int    (*demoRender)();
-    void   (*demoShutdown)();
-    void   (*demoQuit)();
-
-} DMEngineData;
-
-
-typedef struct
-{
-    int currFrame, endTime, startTime;
-} DMFrameData;
-
-
-extern DMEngineData engine;
-extern DMFrameData frame;
-
-
-#define engineGetResImage(x, name) \
-    do { \
-        if ((x = (SDL_Surface *) engineGetResource(name)) == NULL) \
-            return DMERR_INIT_FAIL; \
-    } while (0)
-
-#define engineGetResModule(x, name) \
-    do { \
-        if ((x = (JSSModule *) engineGetResource(name)) == NULL) \
-            return DMERR_INIT_FAIL; \
-    } while (0)
-
-
-void * engineGetResource(const char *name);
-int    engineGetTime(int t);
-int    engineGetTimeDTi();
-int    engineGetTick();
-float  engineGetTimeDT();
-
-int    demoPreInit();
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // DMSIMPLE_H