/*
Name:
LOAD_UNI.C
Description:
UNIMOD (mikmod's internal format) module loader.
Portability:
All systems - all compilers (hopefully)
*/
package audio.jmikmod.MikMod.Loaders;
import java.io.IOException;
import audio.jmikmod.MikMod.clLOADER;
import audio.jmikmod.MikMod.clMainBase;
public class UNI_Loader extends clLOADER
{
public UNI_Loader(clMainBase theMain)
{
super(theMain);
type = new String("UNI");
version = new String("Portable UNI loader v0.3");
}
public boolean Test()
{
byte id[] = new byte[4];
//if(!fread(id,4,1,m_.MLoader.modfp)) return 0;
if (m_.MLoader.modfp.read(id,0,4) != 4) return false;
//if(!memcmp(id,"UN05",4)) return 1;
if ( ((char)id[0] == 'U') && ((char)id[1] == 'N') &&
((char)id[2] == '0') && ((char)id[3] == '5') )
return true;
return false;
}
public boolean Init()
{
return true;
}
public void Cleanup()
{
;
}
public String StrRead()
{
byte [] s;
int len;
String ret;
len=m_.mmIO._mm_read_I_UWORD(m_.MLoader.modfp);
if(len == 0) return null;
s= new byte[len+1];
//fread(s,len,1,m_.MLoader.modfp);
m_.MLoader.modfp.read(s,0,len);
s[len]=0;
ret = new String(s, 0, 0, len);
s = null;
return ret;
}
public short [] TrkRead()
{
byte [] t;
short [] wordTrk;
int i;
int len;
len=m_.mmIO._mm_read_I_UWORD(m_.MLoader.modfp);
t= new byte[len];
//fread(t,len,1,m_.MLoader.modfp);
m_.MLoader.modfp.read(t,0,len);
wordTrk = new short[len];
for(i=0;i<len;i++)
{
wordTrk[i] = t[i];
if (wordTrk[i] < 0)
wordTrk[i] += 256;
}
t = null;
return wordTrk;
}
public boolean Load()
{
try {
int t,u;
m_.mmIO._mm_fseek(m_.MLoader.modfp,4,m_.mmIO.SEEK_SET);
/* try to read module header */
m_.MLoader.of.numchn =m_.mmIO._mm_read_UBYTE(m_.MLoader.modfp);
m_.MLoader.of.numpos =(short)m_.mmIO._mm_read_I_UWORD(m_.MLoader.modfp);
m_.MLoader.of.reppos =(short)m_.mmIO._mm_read_I_UWORD(m_.MLoader.modfp);
m_.MLoader.of.numpat =(short)m_.mmIO._mm_read_I_UWORD(m_.MLoader.modfp);
m_.MLoader.of.numtrk =(short)m_.mmIO._mm_read_I_UWORD(m_.MLoader.modfp);
m_.MLoader.of.numins =(short)m_.mmIO._mm_read_I_UWORD(m_.MLoader.modfp);
m_.MLoader.of.initspeed=m_.mmIO._mm_read_UBYTE(m_.MLoader.modfp);
m_.MLoader.of.inittempo=m_.mmIO._mm_read_UBYTE(m_.MLoader.modfp);
m_.mmIO._mm_read_UBYTES2(m_.MLoader.of.positions,256,m_.MLoader.modfp);
m_.mmIO._mm_read_UBYTES2(m_.MLoader.of.panning,32,m_.MLoader.modfp);
m_.MLoader.of.flags =m_.mmIO._mm_read_UBYTE(m_.MLoader.modfp);
//if(feof(m_.MLoader.modfp)){
if (m_.MLoader.modfp.getFilePointer() >= m_.MLoader.modfp.length()) {
m_.mmIO.myerr=m_.ERROR_LOADING_HEADER;
return false;
}
m_.MLoader.of.songname=StrRead();
m_.MLoader.of.modtype=StrRead();
m_.MLoader.of.comment=StrRead(); /* <- new since UN01 */
/* printf("Song: %s\nModty: %s\n",m_.MLoader.of.songname,m_.MLoader.of.modtype);
*/
if(!m_.MLoader.AllocInstruments()) return false;
if(!m_.MLoader.AllocTracks()) return false;
if(!m_.MLoader.AllocPatterns()) return false;
/* Read sampleinfos */
for(t=0;t<m_.MLoader.of.numins;t++){
//INSTRUMENT *i=&m_.MLoader.of.instruments[t];
m_.MLoader.of.instruments[t].numsmp=m_.mmIO._mm_read_UBYTE(m_.MLoader.modfp);
m_.mmIO._mm_read_UBYTES2(m_.MLoader.of.instruments[t].samplenumber,96,m_.MLoader.modfp);
m_.MLoader.of.instruments[t].volflg=m_.mmIO._mm_read_UBYTE(m_.MLoader.modfp);
m_.MLoader.of.instruments[t].volpts=m_.mmIO._mm_read_UBYTE(m_.MLoader.modfp);
m_.MLoader.of.instruments[t].volsus=m_.mmIO._mm_read_UBYTE(m_.MLoader.modfp);
m_.MLoader.of.instruments[t].volbeg=m_.mmIO._mm_read_UBYTE(m_.MLoader.modfp);
m_.MLoader.of.instruments[t].volend=m_.mmIO._mm_read_UBYTE(m_.MLoader.modfp);
for(u=0;u<12;u++){
m_.MLoader.of.instruments[t].volenv[u].pos=m_.mmIO._mm_read_I_SWORD(m_.MLoader.modfp);
m_.MLoader.of.instruments[t].volenv[u].val=m_.mmIO._mm_read_I_SWORD(m_.MLoader.modfp);
}
m_.MLoader.of.instruments[t].panflg=m_.mmIO._mm_read_UBYTE(m_.MLoader.modfp);
m_.MLoader.of.instruments[t].panpts=m_.mmIO._mm_read_UBYTE(m_.MLoader.modfp);
m_.MLoader.of.instruments[t].pansus=m_.mmIO._mm_read_UBYTE(m_.MLoader.modfp);
m_.MLoader.of.instruments[t].panbeg=m_.mmIO._mm_read_UBYTE(m_.MLoader.modfp);
m_.MLoader.of.instruments[t].panend=m_.mmIO._mm_read_UBYTE(m_.MLoader.modfp);
for(u=0;u<12;u++){
m_.MLoader.of.instruments[t].panenv[u].pos=m_.mmIO._mm_read_I_SWORD(m_.MLoader.modfp);
m_.MLoader.of.instruments[t].panenv[u].val=m_.mmIO._mm_read_I_SWORD(m_.MLoader.modfp);
}
m_.MLoader.of.instruments[t].vibtype =m_.mmIO._mm_read_UBYTE(m_.MLoader.modfp);
m_.MLoader.of.instruments[t].vibsweep =m_.mmIO._mm_read_UBYTE(m_.MLoader.modfp);
m_.MLoader.of.instruments[t].vibdepth =m_.mmIO._mm_read_UBYTE(m_.MLoader.modfp);
m_.MLoader.of.instruments[t].vibrate =m_.mmIO._mm_read_UBYTE(m_.MLoader.modfp);
m_.MLoader.of.instruments[t].volfade =m_.mmIO._mm_read_I_UWORD(m_.MLoader.modfp);
m_.MLoader.of.instruments[t].insname =StrRead();
/* printf("Ins: %s\n",m_.MLoader.of.instruments[t].insname);
*/
if(!m_.MLoader.AllocSamples((m_.MLoader.of.instruments[t])))
return false;
for(u=0;u<m_.MLoader.of.instruments[t].numsmp;u++){
//SAMPLE *s=&m_.MLoader.of.instruments[t].samples[u];
m_.MLoader.of.instruments[t].samples[u].c2spd = m_.mmIO._mm_read_I_UWORD(m_.MLoader.modfp);
m_.MLoader.of.instruments[t].samples[u].transpose= m_.mmIO._mm_read_SBYTE(m_.MLoader.modfp);
m_.MLoader.of.instruments[t].samples[u].volume = m_.mmIO._mm_read_UBYTE(m_.MLoader.modfp);
m_.MLoader.of.instruments[t].samples[u].panning = m_.mmIO._mm_read_UBYTE(m_.MLoader.modfp);
m_.MLoader.of.instruments[t].samples[u].length = m_.mmIO._mm_read_I_ULONG(m_.MLoader.modfp);
m_.MLoader.of.instruments[t].samples[u].loopstart= m_.mmIO._mm_read_I_ULONG(m_.MLoader.modfp);
m_.MLoader.of.instruments[t].samples[u].loopend = m_.mmIO._mm_read_I_ULONG(m_.MLoader.modfp);
m_.MLoader.of.instruments[t].samples[u].flags = m_.mmIO._mm_read_I_UWORD(m_.MLoader.modfp);
m_.MLoader.of.instruments[t].samples[u].seekpos = 0;
m_.MLoader.of.instruments[t].samples[u].samplename=StrRead();
}
}
/* Read patterns */
m_.mmIO._mm_read_I_UWORDS2(m_.MLoader.of.pattrows,m_.MLoader.of.numpat,m_.MLoader.modfp);
m_.mmIO._mm_read_I_SWORDS(m_.MLoader.of.patterns,m_.MLoader.of.numpat*m_.MLoader.of.numchn,m_.MLoader.modfp);
/* Read tracks */
for(t=0;t<m_.MLoader.of.numtrk;t++){
m_.MLoader.of.tracks[t]=TrkRead();
}
return true;
}
catch (IOException ioe1)
{
return false;
}
}
}