# HG changeset patch # User Matti Hamalainen # Date 1560838312 -10800 # Node ID ba696835f66da201a1f77d3236f3e98c52200a6f # Parent a4c1fafd442a577430c844593a320eb4a9e3e86b Add CLI-only mode to PPL (-C option). diff -r a4c1fafd442a -r ba696835f66d tools/ppl.c --- 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();