changeset 2275:ba696835f66d

Add CLI-only mode to PPL (-C option).
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 18 Jun 2019 09:11:52 +0300
parents a4c1fafd442a
children b613715bb57a
files tools/ppl.c
diffstat 1 files changed, 148 insertions(+), 127 deletions(-) [+]
line wrap: on
line diff
--- a/tools/ppl.c	Mon Jun 17 12:54:33 2019 +0300
+++ b/tools/ppl.c	Tue Jun 18 09:11:52 2019 +0300
@@ -61,7 +61,8 @@
         optOutFreq = 48000,
         optMuteOChannels = -1,
         optStartOrder = 0;
-BOOL    optUsePlayTime = FALSE;
+BOOL    optUsePlayTime = FALSE,
+        optUseGUI = TRUE;
 size_t  optPlayTime;
 
 
@@ -70,6 +71,7 @@
     {  0, '?', "help",     "Show this help", OPT_NONE },
     {  1, 'v', "verbose",  "Be more verbose", OPT_NONE },
     {  2,   0, "fs",       "Fullscreen", OPT_NONE },
+    { 12, 'C', "cli",      "Do not open GUI window", OPT_NONE },
     {  3, 'w', "window",   "Initial window size/resolution -w 640x480", OPT_ARGREQ },
 
     {  4, '1', "16bit",    "16-bit output", OPT_NONE },
@@ -163,6 +165,10 @@
             optUsePlayTime = TRUE;
             break;
 
+        case 12:
+            optUseGUI = FALSE;
+            break;
+
         default:
             dmErrorMsg("Unimplemented option argument '%s'.\n", currArg);
             return FALSE;
@@ -597,7 +603,7 @@
     {
         dmErrorMsg("Error loading module file, %d: %s\n",
             result, dmErrorStr(result));
-        goto error_exit;
+        goto exit;
     }
 
     // Try to convert it
@@ -605,39 +611,15 @@
     {
         dmErrorMsg("Could not convert module for playing, %d: %s\n",
             result, dmErrorStr(result));
-        goto error_exit;
+        goto exit;
     }
 
-    // Get font
-    result = dmf_open_memio(NULL, "pplfont.fnt", engineSetupFont, sizeof(engineSetupFont), &file);
-    if (result != DMERR_OK)
-    {
-        dmErrorMsg("Error opening font file 'pplfont.fnt', #%d: %s\n",
-            result, dmErrorStr(result));
-        goto error_exit;
-    }
-    result = dmLoadBitmapFont(file, &font);
-    dmf_close(file);
-    if (result != DMERR_OK)
-    {
-        dmErrorMsg("Could not load font from file, %d: %s\n",
-            result, dmErrorStr(result));
-        goto error_exit;
-    }
-
-    SDL_Color pal[DMFONT_NPALETTE];
-    for (int n = 0; n < DMFONT_NPALETTE; n++)
-    {
-        pal[n].r = pal[n].g = pal[n].b = 0;
-        pal[n].a = n > 0 ? 255 : 0;
-    }
-    dmSetBitmapFontPalette(font, pal, 0, DMFONT_NPALETTE);
 
     // Initialize SDL components
     if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER) != 0)
     {
         dmErrorMsg("Could not initialize SDL: %s\n", SDL_GetError());
-        goto error_exit;
+        goto exit;
     }
     initSDL = TRUE;
 
@@ -650,7 +632,7 @@
     if (eng.dev == NULL)
     {
         dmErrorMsg("jvmInit() returned NULL\n");
-        goto error_exit;
+        goto exit;
     }
 
     switch (optOutFormat)
@@ -662,7 +644,7 @@
         default:
             dmErrorMsg("Unsupported audio format %d (could not set matching SDL format)\n",
                 optOutFormat);
-            goto error_exit;
+            goto exit;
     }
 
     eng.afmt.freq     = optOutFreq;
@@ -676,7 +658,7 @@
     {
         dmErrorMsg("Couldn't open SDL audio: %s\n",
             SDL_GetError());
-        goto error_exit;
+        goto exit;
     }
     audioInit = TRUE;
 
@@ -684,7 +666,7 @@
     if ((eng.plr = jmpInit(eng.dev)) == NULL)
     {
         dmErrorMsg("jmpInit() returned NULL\n");
-        goto error_exit;
+        goto exit;
     }
 
     jvmSetCallback(eng.dev, jmpExec, eng.plr);
@@ -700,32 +682,60 @@
         muteState = TRUE;
     }
 
-    // Open window
-    if ((eng.window = SDL_CreateWindow(dmProgName,
-        SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
-        eng.optScrWidth, eng.optScrHeight,
-        eng.optVFlags | SDL_WINDOW_RESIZABLE
-        //| SDL_WINDOW_HIDDEN
-        )) == NULL)
+    if (optUseGUI)
     {
-        dmErrorMsg("Can't create an SDL window: %s\n", SDL_GetError());
-        goto error_exit;
-    }
+        // Get font
+        result = dmf_open_memio(NULL, "pplfont.fnt", engineSetupFont, sizeof(engineSetupFont), &file);
+        if (result != DMERR_OK)
+        {
+            dmErrorMsg("Error opening font file 'pplfont.fnt', #%d: %s\n",
+                result, dmErrorStr(result));
+            goto exit;
+        }
+        result = dmLoadBitmapFont(file, &font);
+        dmf_close(file);
+        if (result != DMERR_OK)
+        {
+            dmErrorMsg("Could not load font from file, %d: %s\n",
+                result, dmErrorStr(result));
+            goto exit;
+        }
+
+        SDL_Color pal[DMFONT_NPALETTE];
+        for (int n = 0; n < DMFONT_NPALETTE; n++)
+        {
+            pal[n].r = pal[n].g = pal[n].b = 0;
+            pal[n].a = n > 0 ? 255 : 0;
+        }
+        dmSetBitmapFontPalette(font, pal, 0, DMFONT_NPALETTE);
 
-    SDL_SetWindowTitle(eng.window, dmProgDesc);
+        // Open window
+        if ((eng.window = SDL_CreateWindow(dmProgName,
+            SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
+            eng.optScrWidth, eng.optScrHeight,
+            eng.optVFlags | SDL_WINDOW_RESIZABLE
+            //| SDL_WINDOW_HIDDEN
+            )) == NULL)
+        {
+            dmErrorMsg("Can't create an SDL window: %s\n", SDL_GetError());
+            goto exit;
+        }
 
-    if ((eng.renderer = SDL_CreateRenderer(eng.window, -1, SDL_RENDERER_PRESENTVSYNC)) == NULL)
-    {
-        dmErrorMsg("Can't create an SDL renderer: %s\n", SDL_GetError());
-        goto error_exit;
+        SDL_SetWindowTitle(eng.window, dmProgDesc);
+
+        if ((eng.renderer = SDL_CreateRenderer(eng.window, -1, SDL_RENDERER_PRESENTVSYNC)) == NULL)
+        {
+            dmErrorMsg("Can't create an SDL renderer: %s\n", SDL_GetError());
+            goto exit;
+        }
+
+        if (!dmInitializeVideo())
+            goto exit;
+
+        //SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "best");
+        //SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
     }
 
-    if (!dmInitializeVideo())
-        goto error_exit;
-
-//    SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "best");
-//    SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
-
     // okay, main loop here ... "play" module and print out info
     SDL_LockAudio();
     SDL_PauseAudio(0);
@@ -809,7 +819,7 @@
                     case SDLK_f:
                         eng.optVFlags ^= SDL_WINDOW_FULLSCREEN_DESKTOP;
                         if (SDL_SetWindowFullscreen(eng.window, eng.optVFlags) != 0)
-                            goto error_exit;
+                            goto exit;
                         needUpdate = TRUE;
                         break;
 
@@ -830,7 +840,7 @@
                         eng.optScrWidth  = eng.event.window.data1;
                         eng.optScrHeight = eng.event.window.data2;
                         if (!dmInitializeVideo())
-                            goto error_exit;
+                            goto exit;
 
                         needUpdate = TRUE;
                         break;
@@ -842,98 +852,110 @@
                 break;
         }
 
-
-#if 1
+        // Check for end of song
         JSS_LOCK(eng.plr);
-        JSSPattern *currPattern = eng.plr->pattern;
-        int currRow = eng.plr->row;
         if (!eng.plr->isPlaying)
             eng.exitFlag = TRUE;
         JSS_UNLOCK(eng.plr);
 
-        if (currRow != prevRow || needUpdate)
-        {
-            prevRow = currRow;
-            needUpdate = TRUE;
-        }
-
-        // Draw frame
-        if (needUpdate)
+        if (optUseGUI)
         {
-            dmClearSurface(eng.screen, col.boxBg);
-
-            dmDrawBMTextQ(eng.screen, font, DMD_TRANSPARENT, 5, 5,
-                "%s v%s by ccr/TNSP - (c) Copyright 2012-2018 TNSP",
-                dmProgDesc, dmProgVersion);
-
-            dmDrawBMTextQ(eng.screen, font, DMD_TRANSPARENT, 5, 5 + (font->height + 2),
-                "Song: '%s'",
-                eng.mod->moduleName);
-
-            dmDisplayPattern(eng.screen, 5, 5 + (font->height + 2) * 3 + 4,
-                eng.screen->w - 6,
-                eng.screen->h * 0.8,
-                currPattern, currRow);
-
+            // Check if we need to update screen
             JSS_LOCK(eng.plr);
-            dmDrawBMTextQ(eng.screen, font, DMD_TRANSPARENT, 5, 5 + (font->height + 2) * 2,
-            "Tempo: %3d | Speed: %3d | Row: %3d/%-3d | Order: %3d/%-3d | Pattern: %3d/%-3d",
-            eng.plr->tempo, eng.plr->speed,
-            eng.plr->row, (eng.plr->pattern != NULL) ? eng.plr->pattern->nrows : 0,
-            eng.plr->order + 1, eng.mod->norders,
-            eng.plr->npattern, eng.mod->npatterns);
+            JSSPattern *currPattern = eng.plr->pattern;
+            int currRow = eng.plr->row;
             JSS_UNLOCK(eng.plr);
-            needRender = TRUE;
-        }
+
+            if (currRow != prevRow || needUpdate)
+            {
+                prevRow = currRow;
+                needUpdate = TRUE;
+            }
+
+            // Draw frame
+            if (needUpdate)
+            {
+                dmClearSurface(eng.screen, col.boxBg);
 
-        if (needUpdate || currTick - prevTick >= (eng.pauseFlag ? 100 : 20))
-        {
-            JSS_LOCK(eng.dev);
-            dmDisplayChannels(eng.screen, 5, eng.screen->h * 0.8 + 5,
-                eng.screen->w - 5, eng.screen->h - 5, eng.dev);
-            JSS_UNLOCK(eng.dev);
-            needRender = TRUE;
-        }
+                dmDrawBMTextQ(eng.screen, font, DMD_TRANSPARENT, 5, 5,
+                    "%s v%s by ccr/TNSP - (c) Copyright 2012-2018 TNSP",
+                    dmProgDesc, dmProgVersion);
 
-        if (needUpdate)
-            prevTick = currTick;
+                dmDrawBMTextQ(eng.screen, font, DMD_TRANSPARENT, 5, 5 + (font->height + 2),
+                    "Song: '%s'",
+                    eng.mod->moduleName);
+
+                dmDisplayPattern(eng.screen, 5, 5 + (font->height + 2) * 3 + 4,
+                    eng.screen->w - 6,
+                    eng.screen->h * 0.8,
+                    currPattern, currRow);
 
-#endif
-        // Flip screen
-        if (needRender)
-        {
-            SDL_Surface dst;
-            SDL_LockTexture(eng.texture, NULL, &dst.pixels, &dst.pitch);
+                JSS_LOCK(eng.plr);
+                dmDrawBMTextQ(eng.screen, font, DMD_TRANSPARENT, 5, 5 + (font->height + 2) * 2,
+                "Tempo: %3d | Speed: %3d | Row: %3d/%-3d | Order: %3d/%-3d | Pattern: %3d/%-3d",
+                eng.plr->tempo, eng.plr->speed,
+                eng.plr->row, (eng.plr->pattern != NULL) ? eng.plr->pattern->nrows : 0,
+                eng.plr->order + 1, eng.mod->norders,
+                eng.plr->npattern, eng.mod->npatterns);
+                JSS_UNLOCK(eng.plr);
+                needRender = TRUE;
+            }
+
+            if (needUpdate || currTick - prevTick >= (eng.pauseFlag ? 100 : 20))
+            {
+                JSS_LOCK(eng.dev);
+                dmDisplayChannels(eng.screen, 5, eng.screen->h * 0.8 + 5,
+                    eng.screen->w - 5, eng.screen->h - 5, eng.dev);
+                JSS_UNLOCK(eng.dev);
+                needRender = TRUE;
+            }
 
-            if (dst.pitch != eng.screen->pitch)
-                eng.exitFlag = TRUE;
-            else
-                memcpy(dst.pixels, eng.screen->pixels, eng.screen->h * dst.pitch);
+            if (needUpdate)
+                prevTick = currTick;
+
+            // Flip screen
+            if (needRender)
+            {
+                SDL_Surface dst;
+                SDL_LockTexture(eng.texture, NULL, &dst.pixels, &dst.pitch);
 
-            SDL_UnlockTexture(eng.texture);
+                if (dst.pitch != eng.screen->pitch)
+                    eng.exitFlag = TRUE;
+                else
+                    memcpy(dst.pixels, eng.screen->pixels, eng.screen->h * dst.pitch);
 
-            //SDL_RenderClear(eng.renderer);
-            SDL_RenderCopy(eng.renderer, eng.texture, NULL, NULL);
-            SDL_RenderPresent(eng.renderer);
-        }
+                SDL_UnlockTexture(eng.texture);
+
+                //SDL_RenderClear(eng.renderer);
+                SDL_RenderCopy(eng.renderer, eng.texture, NULL, NULL);
+                SDL_RenderPresent(eng.renderer);
+            }
+        } // optUseGUI
 
         SDL_Delay(eng.pauseFlag ? 100 : 30);
     }
 
-error_exit:
-    if (eng.texture != NULL)
-        SDL_DestroyTexture(eng.texture);
+exit:
+    // Cleanup
+    if (optUseGUI)
+    {
+        dmMsg(1, "GUI shutdown.\n");
+        if (eng.texture != NULL)
+            SDL_DestroyTexture(eng.texture);
 
-    if (eng.renderer != NULL)
-        SDL_DestroyRenderer(eng.renderer);
+        if (eng.renderer != NULL)
+            SDL_DestroyRenderer(eng.renderer);
 
-    if (eng.window != NULL)
-        SDL_DestroyWindow(eng.window);
+        if (eng.window != NULL)
+            SDL_DestroyWindow(eng.window);
 
-    if (eng.screen != NULL)
-        SDL_FreeSurface(eng.screen);
+        if (eng.screen != NULL)
+            SDL_FreeSurface(eng.screen);
 
-    dmMsg(0, "Audio shutdown.\n");
+        dmFreeBitmapFont(font);
+    }
+
+    dmMsg(1, "Audio shutdown.\n");
     if (audioInit)
     {
         SDL_LockAudio();
@@ -946,8 +968,7 @@
     jvmClose(eng.dev);
     jssFreeModule(eng.mod);
 
-    dmFreeBitmapFont(font);
-
+    dmMsg(1, "Shut down SDL.\n");
     if (initSDL)
         SDL_Quit();