# HG changeset patch # User Matti Hamalainen # Date 1350325551 -10800 # Node ID c6ec970dc3cfc2a0e5243e695d0219202c0cd9fb # Parent 9f16badc4bd39d4143be650f0c047da787c2a662 Separate some demo engine parts to two different modules. diff -r 9f16badc4bd3 -r c6ec970dc3cf dmengine.c --- /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 +#include +#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, ¤t_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 diff -r 9f16badc4bd3 -r c6ec970dc3cf dmengine.h --- /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 +#include +#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 diff -r 9f16badc4bd3 -r c6ec970dc3cf dmsimple.c --- 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 -#include "dmsimple.h" +#include "dmengine.h" #include "dmargs.h" -#include "dmimage.h" - -#ifdef DM_USE_TREMOR -#include -#include -#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, ¤t_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()) diff -r 9f16badc4bd3 -r c6ec970dc3cf dmsimple.h --- 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 -#include -#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