changeset 93:15fdd5573344

Add simple (and buggy / not really working) debug mode.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 02 Oct 2012 18:13:05 +0300
parents e5796ffce131
children 4bbfc0274b29
files Makefile.gen dmsimple.c dmsimple.h
diffstat 3 files changed, 118 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile.gen	Tue Oct 02 18:12:07 2012 +0300
+++ b/Makefile.gen	Tue Oct 02 18:13:05 2012 +0300
@@ -4,7 +4,7 @@
 include config.mak
 
 ifeq ($(EXTRA_CFLAGS),)
-EXTRA_CFLAGS=-march=core2
+EXTRA_CFLAGS=-march=core2 -DDM_DEBUG
 endif
 
 ifneq ($(DMLIB),)
--- a/dmsimple.c	Tue Oct 02 18:12:07 2012 +0300
+++ b/dmsimple.c	Tue Oct 02 18:13:05 2012 +0300
@@ -60,7 +60,7 @@
 
 int engineGetTick()
 {
-    return (frame.startTime - engine.startTime) + engine.debugTime * 1000;
+    return (frame.startTime - engine.startTime) + engine.adjustTime;
 }
 
 
@@ -165,13 +165,58 @@
 }
 
 
+#ifdef DM_DEBUG
+static void engineAudioCallbackStream(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;
+        }
+    }
+}
+
+void engineAdjustTime(int adj)
+{
+    if (engine.optDebug)
+    {
+        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)
 {
-    JSSMixer *d = (JSSMixer *) userdata;
-
-    if (d != NULL)
+    if (engine.paused)
     {
-        jvmRenderAudio(d, stream, len / jvmGetSampleSize(d));
+        memset(stream, 0, len);
+    }
+    else
+    {
+        JSSMixer *d = (JSSMixer *) userdata;
+        if (d != NULL)
+            jvmRenderAudio(d, stream, len / jvmGetSampleSize(d));
     }
 }
 
@@ -233,8 +278,18 @@
     dmPrint(1, "Trying to init SDL audio with: %d, %d, %d\n",
         afmt.format, afmt.channels, afmt.freq);
 
-    afmt.callback = engineAudioCallback;
-    afmt.userdata = (void *) engine.dev;
+#ifdef DM_DEBUG
+    if (engine.optDebug)
+    {
+        afmt.callback = engineAudioCallbackStream;
+        afmt.userdata = (void *) engine.dev;
+    }
+    else
+#endif
+    {
+        afmt.callback = engineAudioCallback;
+        afmt.userdata = (void *) engine.dev;
+    }
     
     if (SDL_OpenAudio(&afmt, NULL) < 0)
     {
@@ -269,6 +324,33 @@
     if ((err = demoGlobalInit()) != DMERR_OK)
         goto error_exit;
 
+#ifdef DM_DEBUG
+    if (engine.optDebug)
+    {
+        Uint8 *ptr;
+        int left = engine.dev->outFreq * engine.demoDuration;
+        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
+
     SDL_PauseAudio(0);
     engine.startTime = SDL_GetTicks();
 
@@ -288,6 +370,13 @@
                         engine.pauseFlag = !engine.pauseFlag;
                         break;
 
+#ifdef DM_DEBUG
+                    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
+
                     default:
                         break;
                 }
@@ -304,6 +393,16 @@
 
         // Draw frame
         frame.startTime = SDL_GetTicks();
+        if (engine.pauseFlag != engine.paused)
+        {
+            engine.paused = engine.pauseFlag;
+            engine.pauseTime = engineGetTick();
+        }
+        
+        if (engine.paused)
+        {
+            engine.startTime = frame.startTime - engine.pauseTime;
+        }
 
         if (SDL_MUSTLOCK(engine.screen) != 0 && SDL_LockSurface(engine.screen) != 0)
         {
--- a/dmsimple.h	Tue Oct 02 18:12:07 2012 +0300
+++ b/dmsimple.h	Tue Oct 02 18:13:05 2012 +0300
@@ -14,8 +14,10 @@
 
 typedef struct
 {
-    int currFrame, endTime, startTime, totalFrameTime, debugTime;
-    BOOL pauseFlag, exitFlag;
+    int currFrame, endTime, startTime,
+        totalFrameTime, adjustTime, pauseTime;
+
+    BOOL pauseFlag, paused, exitFlag;
     SDL_Surface *screen;
     SDL_Event event;
 
@@ -24,6 +26,13 @@
     JSSMixer *dev;
     JSSPlayer *plr;
 
+#ifdef DM_DEBUG
+    BOOL optDebug;
+    Uint8 *audioBuf;
+    int audioBufSize;
+    int audioSamples;
+    int demoDuration;
+#endif
 } DMEngineData;