/* Same as malloc, but sets error variable _mm_error when fails. Returns a 16-byte aligned pointer */ void* MikMod_malloc(size_t size) { #if defined __MACH__ || defined __QNXNTO__ void *d = malloc(size); if(!d) { _mm_errno = MMERR_OUT_OF_MEMORY; if(_mm_errorhandler) { _mm_errorhandler(); } } return d; #elif (defined _WIN32 || defined _WIN64) && !defined(_WIN32_WCE) void * d = _aligned_malloc(size, ALIGN_STRIDE); if (d) { ZeroMemory(d, size); return d; } else { _mm_errno = MMERR_OUT_OF_MEMORY; if(_mm_errorhandler) { _mm_errorhandler(); } } return 0; #else void *d = calloc(1, size + ALIGN_STRIDE + sizeof(void*)); if(!d) { _mm_errno = MMERR_OUT_OF_MEMORY; if(_mm_errorhandler) _mm_errorhandler(); } return align_pointer(d, ALIGN_STRIDE); #endif }
/* Reset the driver using the new global variable settings. If the driver has not been initialized, it will be now. */ static BOOL _mm_reset(CHAR *cmdline) { BOOL wasplaying = 0; if(!initialized) return _mm_init(cmdline); if (isplaying) { wasplaying = 1; md_driver->PlayStop(); } if((!md_driver->Reset)||(md_device != olddevice)) { /* md_driver->Reset was NULL, or md_device was changed, so do a full reset of the driver. */ md_driver->Exit(); if(_mm_init(cmdline)) { MikMod_Exit_internal(); if(_mm_errno) if(_mm_errorhandler) _mm_errorhandler(); return 1; } } else { if(md_driver->Reset()) { MikMod_Exit_internal(); if(_mm_errno) if(_mm_errorhandler) _mm_errorhandler(); return 1; } } if (wasplaying) md_driver->PlayStart(); return 0; }
BOOL MikMod_Reset(void) /* Reset the driver using the new global variable settings. */ /* If the driver has not been initialized, it will be now. */ { if(!initialized) return MikMod_Init(); if((md_driver->Reset == NULL) || (md_device != idevice)) { /* md_driver->Reset was NULL, or md_device was changed, */ /* so do a full reset of the driver. */ if(isplaying) md_driver->PlayStop(); md_driver->Exit(); if(MikMod_Init()) { MikMod_Exit(); if(_mm_errorhandler!=NULL) _mm_errorhandler(); return 1; } if(isplaying) md_driver->PlayStart(); } else { if(md_driver->Reset()) { MikMod_Exit(); if(_mm_errorhandler!=NULL) _mm_errorhandler(); return 1; } } return 0; }
static BOOL _mm_init(CHAR *cmdline) { UWORD t; _mm_critical = 1; /* if md_device==0, try to find a device number */ if(!md_device) { cmdline=NULL; for(t=1,md_driver=firstdriver;md_driver;md_driver=md_driver->next,t++) if(md_driver->Version) if(md_driver->IsPresent()) break; if(!md_driver) { _mm_errno = MMERR_DETECTING_DEVICE; if(_mm_errorhandler) _mm_errorhandler(); md_driver = &drv_nos; return 1; } md_device = t; } else { /* if n>0, use that driver */ for(t=1,md_driver=firstdriver;(md_driver)&&(t!=md_device);md_driver=md_driver->next) if(md_driver->Version) t++; if(!md_driver) { _mm_errno = MMERR_INVALID_DEVICE; if(_mm_errorhandler) _mm_errorhandler(); md_driver = &drv_nos; return 1; } /* arguments here might be necessary for the presence check to succeed */ if(cmdline&&(md_driver->CommandLine)) md_driver->CommandLine(cmdline); if(!md_driver->IsPresent()) { _mm_errno = MMERR_DETECTING_DEVICE; if(_mm_errorhandler) _mm_errorhandler(); md_driver = &drv_nos; return 1; } } if(md_driver->Init()) { md_driver->Exit(); MikMod_Exit_internal(); if(_mm_errorhandler) _mm_errorhandler(); return 1; } initialized=1; _mm_critical=0; return 0; }
BOOL MikMod_Init(void) { UWORD t; _mm_critical = 1; /* if md_device==0, try to find a device number */ if(md_device==0) { for(t=1,md_driver=firstdriver; md_driver!=NULL; md_driver=md_driver->next, t++) { if(md_driver->IsPresent()) break; } if(md_driver==NULL) { _mm_errno = MMERR_DETECTING_DEVICE; if(_mm_errorhandler!=NULL) _mm_errorhandler(); md_driver = &drv_nos; return 1; } md_device = t; } else { /* if n>0 use that driver */ for(t=1,md_driver=firstdriver; (md_driver!=NULL) && (t!=md_device); md_driver=md_driver->next, t++); if(md_driver==NULL) { _mm_errno = MMERR_INVALID_DEVICE; if(_mm_errorhandler!=NULL) _mm_errorhandler(); md_driver = &drv_nos; return 1; } if(!md_driver->IsPresent()) { _mm_errno = MMERR_DETECTING_DEVICE; if(_mm_errorhandler!=NULL) _mm_errorhandler(); md_driver = &drv_nos; return 1; } } if(md_driver->Init()) { MikMod_Exit(); if(_mm_errorhandler!=NULL) _mm_errorhandler(); return 1; } idevice = md_device; imode = md_mode; imixfreq = md_mixfreq; idmabufsize = md_dmabufsize; initialized = 1; _mm_critical = 0; return 0; }
/* Same as calloc, but sets error variable _mm_error when fails */ void* _mm_calloc(size_t nitems,size_t size) { void *d; if(!(d=calloc(nitems,size))) { _mm_errno = MMERR_OUT_OF_MEMORY; if(_mm_errorhandler) _mm_errorhandler(); } return d; }
FILE* _mm_fopen(CHAR* fname,CHAR* attrib) { FILE *fp; if(!(fp=fopen(fname,attrib))) { _mm_errno = MMERR_OPENING_FILE; if(_mm_errorhandler) _mm_errorhandler(); } return fp; }
/* Same as malloc, but sets error variable _mm_error when it failed */ void *_mm_malloc(size_t size) { void *d; if((d=malloc(size))==NULL) { _mm_errno = MMERR_OUT_OF_MEMORY; if(_mm_errorhandler!=NULL) _mm_errorhandler(); } return d; }
/* and makes a copy of it. Ruturns NULL if failed. */ CHAR *strdup(CHAR *src) { CHAR *buf; if((buf = (CHAR *)_mm_malloc(strlen(src)+1)) == NULL) { _mm_errno = MMERR_OUT_OF_MEMORY; if(_mm_errorhandler!=NULL) _mm_errorhandler(); return NULL; } strcpy(buf,src); return buf; }
/* Same as calloc, but sets error variable _mm_error when fails */ void* MikMod_calloc(size_t nitems,size_t size) { void *d; if(!(d=calloc(nitems,size))) { _mm_errno = MMERR_OUT_OF_MEMORY; if(_mm_errorhandler) _mm_errorhandler(); } return d; #if 0 #if defined __MACH__ void *d = calloc(nitems, size); if (d) { return d; } return 0; #elif (defined _WIN32 || defined _WIN64) && !defined(_WIN32_WCE) void * d = _aligned_malloc(size * nitems, ALIGN_STRIDE); if (d) { ZeroMemory(d, size * nitems); return d; } return 0; #else void *d = calloc(nitems, size + ALIGN_STRIDE + sizeof(void*)); if(!d) { _mm_errno = MMERR_OUT_OF_MEMORY; if(_mm_errorhandler) _mm_errorhandler(); } return align_pointer(d, ALIGN_STRIDE); #endif #endif }
int _mm_fopen(CHAR* fname,CHAR* attrib) { int fp; (void)attrib; //if(!(fp=fopen(fname,attrib))) { // _mm_errno = MMERR_OPENING_FILE; // if(_mm_errorhandler) _mm_errorhandler(); //} fp = open(fname, O_RDONLY); if( fp < 0 ) { _mm_errno = MMERR_OPENING_FILE; if(_mm_errorhandler) _mm_errorhandler(); } return fp; }
/* If either parameter is -1, the current set value will be retained. */ BOOL MikMod_SetNumVoices_internal(int music, int sfx) { BOOL resume = 0; int t, oldchn = 0; if((!music)&&(!sfx)) return 1; _mm_critical = 1; if(isplaying) { MikMod_DisableOutput_internal(); oldchn = md_numchn; resume = 1; } if(sfxinfo) free(sfxinfo); if(md_sample) free(md_sample); md_sample = NULL; sfxinfo = NULL; if(music!=-1) md_sngchn = music; if(sfx!=-1) md_sfxchn = sfx; md_numchn = md_sngchn + md_sfxchn; LimitHardVoices(md_driver->HardVoiceLimit); LimitSoftVoices(md_driver->SoftVoiceLimit); if(md_driver->SetNumVoices()) { MikMod_Exit_internal(); if(_mm_errno) if(_mm_errorhandler!=NULL) _mm_errorhandler(); md_numchn = md_softchn = md_hardchn = md_sfxchn = md_sngchn = 0; return 1; } if(md_sngchn+md_sfxchn) md_sample=(SAMPLE**)_mm_calloc(md_sngchn+md_sfxchn,sizeof(SAMPLE*)); if(md_sfxchn) sfxinfo = (UBYTE *)_mm_calloc(md_sfxchn,sizeof(UBYTE)); /* make sure the player doesn't start with garbage */ for(t=oldchn;t<md_numchn;t++) Voice_Stop_internal(t); sfxpool = 0; if(resume) MikMod_EnableOutput_internal(); _mm_critical = 0; return 0; }
BOOL Stream_PlayFP(VIRTUAL_FILE *fp) { BOOL ok; MSTREAM *l; stream_fp = fp; _mm_errno = 0; _mm_critical = 0; _mm_iobase_setcur(stream_fp); /* Try to find a loader that recognizes the stream */ for(l=firststream; l!=NULL; l=l->next) { _mm_rewind(stream_fp); if(l->Test()) break; } if(l==NULL) { _mm_errno = MMERR_NOT_A_STREAM; if(_mm_errorhandler!=NULL) _mm_errorhandler(); _mm_iobase_revert(); return 1; } /* init stream loader and load the header */ if(l->Init()) { _mm_rewind(stream_fp); ok = l->Load(); } /* free loader allocations */ l->Cleanup(); if(!ok) { _mm_iobase_revert(); return 1; } /*loadbuf = _mm_malloc(8192); */ _mm_iobase_revert(); active = 1; return 0; }
void* MikMod_realloc(void *data, size_t size) { if (data) { #if defined __MACH__ || defined __QNXNTO__ void *d = realloc(data, size); if(!d) { _mm_errno = MMERR_OUT_OF_MEMORY; if(_mm_errorhandler) { _mm_errorhandler(); } } return d; #elif (defined _WIN32 || defined _WIN64) && !defined(_WIN32_WCE) return _aligned_realloc(data, size, ALIGN_STRIDE); #else unsigned char *newPtr = (unsigned char *)realloc(get_pointer(data), size + ALIGN_STRIDE + sizeof(void*)); return align_pointer((char*)newPtr, ALIGN_STRIDE); #endif } return MikMod_malloc(size); }
static CHAR* Player_LoadTitle_internal(MREADER *reader) { MLOADER *l; modreader=reader; _mm_errno = 0; _mm_critical = 0; _mm_iobase_setcur(modreader); /* Try to find a loader that recognizes the module */ for(l=firstloader;l;l=l->next) { _mm_rewind(modreader); if(l->Test()) break; } if(!l) { _mm_errno = MMERR_NOT_A_MODULE; if(_mm_errorhandler) _mm_errorhandler(); return NULL; } return l->LoadTitle(); }
/* Loads a module given an reader */ MODULE* Player_LoadGeneric_internal(MREADER *reader,int maxchan,BOOL curious) { int t; MLOADER *l; BOOL ok; MODULE *mf; modreader = reader; _mm_errno = 0; _mm_critical = 0; _mm_iobase_setcur(modreader); /* Try to find a loader that recognizes the module */ for(l=firstloader;l;l=l->next) { _mm_rewind(modreader); if(l->Test()) break; } if(!l) { _mm_errno = MMERR_NOT_A_MODULE; if(_mm_errorhandler) _mm_errorhandler(); _mm_rewind(modreader);_mm_iobase_revert(); return NULL; } /* init unitrk routines */ if(!UniInit()) { if(_mm_errorhandler) _mm_errorhandler(); _mm_rewind(modreader);_mm_iobase_revert(); return NULL; } /* init the module structure with vanilla settings */ memset(&of,0,sizeof(MODULE)); of.bpmlimit = 33; of.initvolume = 128; for (t = 0; t < UF_MAXCHAN; t++) of.chanvol[t] = 64; for (t = 0; t < UF_MAXCHAN; t++) of.panning[t] = ((t + 1) & 2) ? PAN_RIGHT : PAN_LEFT; /* init module loader and load the header / patterns */ if (!l->Init || l->Init()) { _mm_rewind(modreader); ok = l->Load(curious); /* propagate inflags=flags for in-module samples */ for (t = 0; t < of.numsmp; t++) if (of.samples[t].inflags == 0) of.samples[t].inflags = of.samples[t].flags; } else ok = 0; /* free loader and unitrk allocations */ if (l->Cleanup) l->Cleanup(); UniCleanup(); if(!ok) { ML_FreeEx(&of); if(_mm_errorhandler) _mm_errorhandler(); _mm_rewind(modreader);_mm_iobase_revert(); return NULL; } if(!ML_LoadSamples()) { ML_FreeEx(&of); if(_mm_errorhandler) _mm_errorhandler(); _mm_rewind(modreader);_mm_iobase_revert(); return NULL; } if(!(mf=ML_AllocUniMod())) { ML_FreeEx(&of); _mm_rewind(modreader);_mm_iobase_revert(); if(_mm_errorhandler) _mm_errorhandler(); return NULL; } /* If the module doesn't have any specific panning, create a MOD-like panning, with the channels half-separated. */ if (!(of.flags & UF_PANNING)) for (t = 0; t < of.numchn; t++) of.panning[t] = ((t + 1) & 2) ? PAN_HALFRIGHT : PAN_HALFLEFT; /* Copy the static MODULE contents into the dynamic MODULE struct. */ memcpy(mf,&of,sizeof(MODULE)); if(maxchan>0) { if(!(mf->flags&UF_NNA)&&(mf->numchn<maxchan)) maxchan = mf->numchn; else if((mf->numvoices)&&(mf->numvoices<maxchan)) maxchan = mf->numvoices; if(maxchan<mf->numchn) mf->flags |= UF_NNA; if(MikMod_SetNumVoices_internal(maxchan,-1)) { _mm_iobase_revert(); Player_Free(mf); return NULL; } } if(SL_LoadSamples()) { _mm_iobase_revert(); Player_Free_internal(mf); return NULL; } if(Player_Init(mf)) { _mm_iobase_revert(); Player_Free_internal(mf); mf=NULL; } _mm_iobase_revert(); return mf; }
/* Loads a module given an reader */ MODULE* Player_LoadGeneric_internal(MREADER *reader,int maxchan,BOOL curious) { int t; MLOADER *l; BOOL ok; MODULE *mf; modreader = reader; _mm_errno = 0; _mm_critical = 0; _mm_iobase_setcur(modreader); /* Try to find a loader that recognizes the module */ for(l=firstloader;l;l=l->next) { _mm_rewind(modreader); if(l->Test()) break; } if(!l) { _mm_errno = MMERR_NOT_A_MODULE; if(_mm_errorhandler) _mm_errorhandler(); _mm_rewind(modreader);_mm_iobase_revert(); return NULL; } /* init unitrk routines */ if(!UniInit()) { if(_mm_errorhandler) _mm_errorhandler(); _mm_rewind(modreader);_mm_iobase_revert(); return NULL; } /* load the song using the song's loader variable */ memset(&of,0,sizeof(MODULE)); of.initvolume = 128; /* init panning array */ for(t=0; t<64; t++) of.panning[t] = ((t+1)&2) ? 255 : 0; for(t=0; t<64; t++) of.chanvol[t] = 64; /* init module loader and load the header / patterns */ if(l->Init()) { _mm_rewind(modreader); ok = l->Load(curious); } else ok = 0; /* free loader and unitrk allocations */ l->Cleanup(); UniCleanup(); if(!ok) { ML_FreeEx(&of); if(_mm_errorhandler) _mm_errorhandler(); _mm_rewind(modreader);_mm_iobase_revert(); return NULL; } if(!ML_LoadSamples()) { ML_FreeEx(&of); if(_mm_errorhandler) _mm_errorhandler(); _mm_rewind(modreader);_mm_iobase_revert(); return NULL; } if(!(mf=ML_AllocUniMod())) { ML_FreeEx(&of); _mm_rewind(modreader);_mm_iobase_revert(); if(_mm_errorhandler) _mm_errorhandler(); return NULL; } /* Copy the static MODULE contents into the dynamic MODULE struct. */ memcpy(mf,&of,sizeof(MODULE)); _mm_iobase_revert(); if(maxchan>0) { if(!(mf->flags&UF_NNA)&&(mf->numchn<maxchan)) maxchan = mf->numchn; else if((mf->numvoices)&&(mf->numvoices<maxchan)) maxchan = mf->numvoices; if(maxchan<mf->numchn) mf->flags |= UF_NNA; if(MikMod_SetNumVoices_internal(maxchan,-1)) { Player_Free(mf); return NULL; } } if(SL_LoadSamples()) { Player_Free_internal(mf); return NULL; } if(Player_Init(mf)) { Player_Free_internal(mf); mf=NULL; } return mf; }
BOOL MikMod_SetNumVoices(int music, int sfx) /* If either parameter is -1, the current set value will be retained. */ { BOOL resume = 0; int t, oldchn = 0; if((music==0) && (sfx==0)) return 0; _mm_critical = 1; if(isplaying) { MikMod_DisableOutput(); oldchn = md_numchn; resume = 1; } if(sfxinfo!=NULL) free(sfxinfo); if(md_sample!=NULL) free(md_sample); md_sample = NULL; sfxinfo = NULL; /*md_softchn = md_hardchn = 0; if(md_mode & DMODE_SOFT_SNDFX) md_softchn = sfx; else md_hardchn = sfx; if(md_mode & DMODE_SOFT_MUSIC) md_softchn += music; else md_hardchn += music; */ if(music != -1) md_sngchn = music; if(sfx != -1) md_sfxchn = sfx; md_numchn = md_sngchn + md_sfxchn; LimitHardVoices(md_driver->HardVoiceLimit); LimitSoftVoices(md_driver->SoftVoiceLimit); if(md_driver->SetNumVoices()) { MikMod_Exit(); md_numchn = md_softchn = md_hardchn = md_sfxchn = md_sngchn = 0; if(_mm_errorhandler!=NULL) _mm_errorhandler(); return 1; } if(md_sngchn || md_sfxchn) md_sample = (SAMPLE **)_mm_calloc(md_sngchn+md_sfxchn, sizeof(SAMPLE *)); if(md_sfxchn) sfxinfo = (UBYTE *)_mm_calloc(md_sfxchn, sizeof(UBYTE)); /* make sure the player doesn't start with garbage */ for(t=oldchn; t<md_numchn; t++) Voice_Stop(t); sfxpool = 0; if(resume) MikMod_EnableOutput(); _mm_critical = 0; return 0; }