SWORD VC1_SampleLoad(struct SAMPLOAD* sload,int type)
{
	SAMPLE *s = sload->sample;
	int handle;
	ULONG t, length,loopstart,loopend;

	if(type==MD_HARDWARE) return -1;

	/* Find empty slot to put sample address in */
	for(handle=0;handle<MAXSAMPLEHANDLES;handle++)
		if(!Samples[handle]) break;

	if(handle==MAXSAMPLEHANDLES) {
		_mm_errno = MMERR_OUT_OF_HANDLES;
		return -1;
	}

	length    = s->length;
	loopstart = s->loopstart;
	loopend   = s->loopend;
        
        /* Fix loops */
        if (((loopend-loopstart)>2) && (loopstart > loopend) && (loopstart>length))
        {
            loopstart /= 2;
        }

	SL_SampleSigned(sload);
	SL_Sample8to16(sload);

	if(!(Samples[handle]=(SWORD*)_mm_malloc((length+20)<<1))) {
		_mm_errno = MMERR_SAMPLE_TOO_BIG;
		return -1;
	}

	/* read sample into buffer */
	if (SL_Load(Samples[handle],sload,length))
		return -1;

	/* Unclick sample */
	if(s->flags & SF_LOOP) {
		if(s->flags & SF_BIDI)
			for(t=0;t<16;t++)
				Samples[handle][loopend+t]=Samples[handle][(loopend-t)-1];
		else
			for(t=0;t<16;t++)
				Samples[handle][loopend+t]=Samples[handle][t+loopstart];
	} else
		for(t=0;t<16;t++)
			Samples[handle][t+length]=0;

	return handle;
}
Beispiel #2
0
SWORD UltraSampleLoad(FILE * fp, ULONG length, ULONG loopstart, ULONG loopend, UWORD flags)
{
    struct SAMPLE_DATA *smp;
    char *p;
    long l;

    smp = &instrs[nr_instrs];
    smp->length = length;
    smp->loopstart = loopstart;
    if (!loopend)		/* by Perex */
	smp->loopend = length - 1;
    else
	smp->loopend = loopend;
    smp->flags = flags;		// SF_16BITS

    if ((smp->flags & SF_16BITS)) {
	length <<= 1;
	loopstart <<= 1;
	loopend <<= 1;
    }
    if ((smp->sample = (char *) malloc(length)) == NULL) {
	myerr = "not enough memory to load sample.";
	return -1;
    }
    SL_Init(fp, flags, flags | SF_SIGNED);	// SF_16BITS

    l = length;
    p = smp->sample;

    while (l > 0) {
	static UBYTE buffer[8192];
	long todo;
	todo = (l > 8192) ? 8192 : l;
	SL_Load(p, todo);
	p += todo;
	l -= todo;
    }

    smp->active = 1;

    return nr_instrs++;
}
Beispiel #3
0
static SWORD NDS_HW_SampleLoad(struct SAMPLOAD* sload, int type)
{
	ASSERT(sload != NULL);

	SAMPLE *s = sload->sample;
	int handle;

	/* Find empty slot to put sample address in */
	for(handle = 0; handle < NDS_HW_MAXSAMPLES; handle++) {
		if(ipc->samples[handle] == 0) {
			break;
		}
	}

	if(handle == MAXSAMPLEHANDLES) {
		_mm_errno = MMERR_OUT_OF_HANDLES;
		return -1;
	}
	
	/* Reality check for loop settings */
	if (s->loopend > s->length)
		s->loopend = s->length;
	if (s->loopstart >= s->loopend)
		s->flags &= ~SF_LOOP;

	/* TODO difference between 8 and 16 bits? */
	SL_SampleSigned(sload);

	ipc->samples[handle] = _mm_malloc(s->length * ((s->flags & SF_16BITS) ? 2 : 1));
	if(ipc->samples[handle] == NULL) {
		_mm_errno = MMERR_SAMPLE_TOO_BIG;
		return -1;
	}

	/* read sample into buffer */
	if (SL_Load(ipc->samples[handle], sload, s->length))
		return -1;

	DC_FlushRange(ipc->samples[handle], s->length * ((s->flags & SF_16BITS) ? 2 : 1));

	return handle;
}
Beispiel #4
0
BOOL LargeRead(char *buffer,ULONG size)
{
	int t;
	ULONG todo;

	while(size){
		/* how many bytes to load (in chunks of 8000) ? */

		todo=(size>8000)?8000:size;

		/* read data */

		SL_Load(buffer,todo);
		/* and update pointers.. */

		size-=todo;
		buffer+=todo;
	}
	return 1;
}
Beispiel #5
0
static SWORD sampleLoad(SAMPLOAD *s, int type)
{
	Bank *bankP;
	SamModSamples modSamples;
	SWORD handle;
	SWORD *samples;
int rc;

	for(handle=0; handle<SAM_NUM_BANKS; handle++)
		if(!banks[handle].inUse)
			break;
	if(handle>=SAM_NUM_BANKS) {
		_mm_errno=MMERR_OUT_OF_HANDLES;
		return -1;
	}

	bankP=banks+handle;

	bankP->inUse=1;

	SL_SampleSigned(s);
	SL_Sample8to16(s);

	bankP->length=s->sample->length;
	bankP->loopstart=s->sample->loopstart;
	bankP->loopend=s->sample->loopend ? s->sample->loopend : s->sample->length;
	bankP->flags=s->sample->flags;

	if(!(samples=(SWORD *)MikMod_malloc((bankP->length+NO_LOOP_SAMPLES)<<1))) {
		bankP->inUse=0;
		_mm_errno=MMERR_SAMPLE_TOO_BIG;
		return -1;
	}

	if(SL_Load(samples, s, bankP->length)) {
		MikMod_free(samples);
		bankP->inUse=0;
		_mm_errno=MMERR_SAMPLE_TOO_BIG;
		return -1;
	}

	if(!(bankP->flags & SF_LOOP)) {
		memset(samples+bankP->length, 0, NO_LOOP_SAMPLES);
		bankP->loopstart=bankP->length;
		bankP->length+=NO_LOOP_SAMPLES;
		bankP->loopend=bankP->length-1;
	}

	modSamples.handle=handle;
	modSamples.data=samples;
	modSamples.size=bankP->length;
	if((rc=ioctl(modfd, SAM_IOC_MOD_SAMPLES_LOAD, &modSamples))<0) {
		MikMod_free(samples);
		bankP->inUse=0;
		_mm_errno=MMERR_SAMPLE_TOO_BIG;
		return -1;
	}

	MikMod_free(samples);

	return handle;
}