/* Name: DRV_WAV.C Description: Mikmod driver for output to a file called MUSIC.WAV !! DO NOT CALL MD_UPDATE FROM A INTERRUPT IF YOU USE THIS DRIVER !! */ package audio.jmikmod.MikMod.Drivers; import java.io.IOException; import persist.SimulatedRandomAccessFile; import audio.jmikmod.MikMod.clDRIVER; import audio.jmikmod.MikMod.clMain; public class Wav_Driver extends clDRIVER { public final int BUFFERSIZE = 32768; protected SimulatedRandomAccessFile wavout; protected int dumpsize; byte audiobuffer[]; //[BUFFERSIZE]; public Wav_Driver(clMain theMain) { super(theMain); int i; Name = new String("Disk writer (wav)"); Version = new String("Wav disk writer (music.wav) v1.2"); wavout = null; audiobuffer = new byte[BUFFERSIZE]; for(i=0;i<BUFFERSIZE;i++) audiobuffer[i] = 0; } protected void PutHeader() { try { wavout.seek(0); wavout.writeBytes("RIFF"); m_.mmIO._mm_write_I_ULONG(dumpsize+36, wavout); wavout.writeBytes("WAVEfmt "); m_.mmIO._mm_write_I_ULONG(16, wavout); m_.mmIO._mm_write_I_UWORD(1, wavout); m_.mmIO._mm_write_I_UWORD(m_.MDriver.isStereo()?2:1,wavout); m_.mmIO._mm_write_I_ULONG(m_.MDriver.md_mixfreq,wavout); m_.mmIO._mm_write_I_ULONG(m_.MDriver.md_mixfreq* (m_.MDriver.isStereo()?2:1)* (m_.MDriver.is16Bits()?2:1), wavout); m_.mmIO._mm_write_I_UWORD((m_.MDriver.is16Bits()?2:1)* (m_.MDriver.isStereo()?2:1),wavout); m_.mmIO._mm_write_I_UWORD(m_.MDriver.is16Bits()?16:8, wavout); wavout.writeBytes("data"); m_.mmIO._mm_write_I_ULONG(dumpsize, wavout); } catch (IOException ioe1) { } } public boolean IsPresent() { return true; } public int Init() { //if(!(rawout=fopen("music.raw","wb"))){ try { if ((wavout = new SimulatedRandomAccessFile("music.wav")) == null) { m_.mmIO.myerr="Couldn't open output file 'music.wav'"; return 0; } if(!m_.Virtch.VC_Init()){ wavout.close(); wavout = null; return 0; } dumpsize = 0; PutHeader(); return 1; } catch (IOException ioe1) { return 0; } } public void Exit() { try { m_.Virtch.VC_Exit(); if (wavout != null) { PutHeader(); wavout.close(); wavout = null; } } catch (IOException ioe1) { } } public void Update() { try { int num_bytes_written = m_.Virtch.VC_WriteBytes(audiobuffer,BUFFERSIZE); //fwrite(RAW_DMABUF,BUFFERSIZE,1,rawout); wavout.write(audiobuffer,0,num_bytes_written); dumpsize += num_bytes_written; } catch (IOException ioe1) { } } public short SampleLoad(SimulatedRandomAccessFile fp,int length,int reppos,int repend,int flags) { return m_.Virtch.VC_SampleLoad(fp,length,reppos,repend,flags); } public void SampleUnLoad (short handle) { m_.Virtch.VC_SampleUnload(handle); } public void PlayStart() { m_.Virtch.VC_PlayStart(); } public void PlayStop() { m_.Virtch.VC_PlayStop(); } public void VoiceSetVolume(short voice,short vol) { m_.Virtch.VC_VoiceSetVolume(voice, vol); } public void VoiceSetFrequency(short voice,int frq) { m_.Virtch.VC_VoiceSetFrequency(voice,frq); } public void VoiceSetPanning(short voice,short pan) { m_.Virtch.VC_VoiceSetPanning(voice,pan); } public void VoicePlay(short voice,short handle,int start,int size,int reppos,int repend,int flags) { m_.Virtch.VC_VoicePlay(voice,handle,start,size,reppos,repend,flags); } }