Beispiel #1
0
/* 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
}
Beispiel #2
0
/* 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;
}
Beispiel #3
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;
}
Beispiel #4
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;
}
Beispiel #5
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;
}
Beispiel #6
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;
}
Beispiel #7
0
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;
}
Beispiel #8
0
/* 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;
}
Beispiel #9
0
/* 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;
}
Beispiel #10
0
/* 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
}
Beispiel #11
0
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;
}
Beispiel #12
0
/* 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;
}
Beispiel #13
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;
}
Beispiel #14
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);
}
Beispiel #15
0
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();
}
Beispiel #16
0
/* 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;
}
Beispiel #17
0
/* 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;
}
Beispiel #18
0
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;
}