Mercurial > hg > dmlib
diff dmsimple.c @ 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 | 13dba73cf28e |
children | cac13f180169 |
line wrap: on
line diff
--- 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, ¤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())