/*
Name:
MDRIVER.C
Description:
These routines are used to access the available soundcard drivers.
Portability:
All systems - all compilers
*/
package audio.jmikmod.MikMod.MDriver;
import java.io.*;
import persist.SimulatedRandomAccessFile;
import audio.jmikmod.MikMod.*;
public class clMDriver extends clMDriverBase
{
public clMain m_;
public clDRIVER drivers[]; //[6];
public int num_drivers;
public int md_device;
public int md_mixfreq;
public short md_mode;
public int md_dmabufsize;
public short md_numchn;
public short md_bpm;
protected SimulatedRandomAccessFile sl_fp;
protected short sl_old;
protected short sl_infmt;
protected short sl_outfmt;
protected short sl_buffer[]; //[1024];
protected boolean isplaying;
public void dummyplay()
{
}
public clMDriver(clMain theMain)
{
int i;
drivers = new clDRIVER[6];
sl_buffer = new short[1024];
m_ = theMain;
md_device = 0;
md_mixfreq = 44100;
md_mode = 0;
md_dmabufsize = 8192;
md_numchn = 0;
md_bpm = 125;
//firstdriver = NULL;
num_drivers = 0;
sl_fp = null;
sl_old = 0;
sl_infmt = 0;
sl_outfmt = 0;
//memset(sl_buffer, 0, sizeof(sl_buffer));
for(i=0;i<1024;i++)
sl_buffer[i] = 0;
isplaying = false;
}
public void tickhandler()
{
m_.MPlayer.MP_HandleTick(); /* play 1 tick of the module */
m_.MDriver.MD_SetBPM(m_.MPlayer.mp_bpm);
}
public void SL_Init(SimulatedRandomAccessFile fp,short infmt,short outfmt)
{
sl_old=0;
sl_fp=fp;
sl_infmt=infmt;
sl_outfmt=outfmt;
}
public void SL_Exit()
{
}
public void SL_Load(byte [] buffer,int offset, int length)
{
short stodo;
int t;
int out_index=offset;
/* compute number of samples to load */
if((sl_outfmt & SF_16BITS) != 0) length>>=1;
while(length != 0){
stodo=(short)((length<1024) ? length : 1024);
if((sl_infmt&SF_16BITS) != 0){
if ((sl_infmt & SF_BIG_ENDIAN) != 0)
m_.mmIO._mm_read_M_SWORDS(sl_buffer, stodo, sl_fp);
else
m_.mmIO._mm_read_I_SWORDS(sl_buffer, stodo, sl_fp);
}
else{
/*byte *s;
short *d;
fread(sl_buffer,sizeof(byte),stodo,sl_fp);
s=(byte *)sl_buffer;
d=sl_buffer;
s+=stodo;
d+=stodo;
for(t=0;t<stodo;t++){
s--;
d--;
*d=(*s)<<8;
} */
byte byte_buffer[] = new byte [stodo];
sl_fp.read(byte_buffer,0,stodo);
for(t=0;t<stodo;t++)
{
sl_buffer[t] = (short)((byte_buffer[t]<<8));
}
byte_buffer = null;
}
if((sl_infmt & SF_DELTA) != 0){
for(t=0;t<stodo;t++){
sl_buffer[t]+=sl_old;
sl_old=sl_buffer[t];
}
}
if(((sl_infmt^sl_outfmt) & SF_SIGNED) != 0){
for(t=0;t<stodo;t++){
sl_buffer[t]^=0x8000;
}
}
if((sl_outfmt & SF_16BITS) != 0){
for(t=0;t<stodo;t++)
{
buffer[out_index++] = (byte)(sl_buffer[t]&0xFF);
buffer[out_index++] = (byte)((sl_buffer[t]>>8)&0xFF);
}
}
else{
for(t=0;t<stodo;t++)
buffer[out_index++]=(byte)(sl_buffer[t]>>8);
}
length-=stodo;
}
}
public void MD_InfoDriver()
{
int t;
//clDRIVER l;
/* list all registered devicedrivers: */
for (t=0;t<num_drivers;t++)
System.out.println((t+1) + ". " + drivers[num_drivers-1-t].Version);
//printf("%d. %s\n",t+1,(const char *)(*drivers[num_drivers-1-t].Version));
//for(t=1,l=firstdriver; l!=NULL; l=l.next, t++){
// printf("%d. %s\n",t,l.Version);
}
public void MD_RegisterDriver(clDRIVER drv)
{
drivers[num_drivers] = drv;
num_drivers++;
/*if(firstdriver == NULL){
firstdriver = drv;
drv.next = NULL;
}
else{
drv.next = firstdriver;
firstdriver = drv;
}*/
}
public short MD_SampleLoad(SimulatedRandomAccessFile fp,int size,int reppos,int repend,int flags)
{
short result=drivers[num_drivers-md_device].SampleLoad(fp,size,reppos,repend,flags);
SL_Exit();
return result;
}
public void MD_SampleUnLoad(short handle)
{
drivers[num_drivers-md_device].SampleUnLoad(handle);
}
public void MD_PatternChange()
{
drivers[num_drivers-md_device].PatternChange();
}
public void MD_Mute()
{
drivers[num_drivers-md_device].Mute();
}
public void MD_UnMute()
{
drivers[num_drivers-md_device].UnMute();
}
public void MD_BlankFunction()
{
}
public boolean MD_Init()
{
int t;
/* if md_device==0, try to find a device number */
if(md_device==0){
for(t=num_drivers-1; t >= 0; t--){
//md_driver=drivers[t];
if(drivers[t].IsPresent()) break;
}
if(t == -1){
m_.mmIO.myerr="You don't have any of the supported sound-devices";
return false;
}
md_device=num_drivers-t;
}
/* if n>0 use that driver */
//md_driver = drivers[num_drivers-md_device];
if(md_device > num_drivers){
m_.mmIO.myerr="Device number out of range";
return false;
}
return (drivers[num_drivers-md_device].Init() != 0);
}
public void MD_Exit()
{
drivers[num_drivers-md_device].Exit();
}
public void MD_PlayStart()
{
/* safety valve, prevents entering
playstart twice: */
if(isplaying) return;
drivers[num_drivers-md_device].PlayStart();
isplaying=true;
}
public void MD_PlayStop()
{
/* safety valve, prevents calling playStop when playstart
hasn't been called: */
if(isplaying){
isplaying=false;
drivers[num_drivers-md_device].PlayStop();
}
}
public void MD_SetBPM(short bpm)
{
if (bpm < 0)
bpm += ((-bpm/256)+1)*256;
md_bpm=(short)(bpm%256);
}
public void MD_Update()
{
if(isplaying) drivers[num_drivers-md_device].Update();
}
public void MD_VoiceSetVolume(short voice,short vol)
{
drivers[num_drivers-md_device].VoiceSetVolume(voice,vol);
}
public void MD_VoiceSetFrequency(short voice,int frq)
{
drivers[num_drivers-md_device].VoiceSetFrequency(voice,frq);
}
public void MD_VoiceSetPanning(short voice,short pan)
{
drivers[num_drivers-md_device].VoiceSetPanning(voice,pan);
}
public void MD_VoicePlay(short voice,short handle,int start,int size,int reppos,int repend,int flags)
{
drivers[num_drivers-md_device].VoicePlay(voice,handle,start,size,reppos,repend,flags);
}
public clDRIVER GetActiveDriver()
{
return drivers[num_drivers-md_device];
}
public boolean isStereo()
{
return ((m_.MDriver.md_mode & m_.DMODE_STEREO) != 0);
}
public boolean is16Bits()
{
return ((m_.MDriver.md_mode & m_.DMODE_16BITS) != 0);
}
}