Mercurial > ~darius > hgwebdir.cgi > mikmod
diff playercode/drv_wav.c @ 4:5d614bcc4287
Initial entry of mikmod into the CVS tree.
author | darius |
---|---|
date | Fri, 23 Jan 1998 16:05:08 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/playercode/drv_wav.c Fri Jan 23 16:05:08 1998 +0000 @@ -0,0 +1,116 @@ + +#include "mikmod.h" + +#ifdef __GNUC__ +#include <sys/types.h> +#else +#include <io.h> +#endif +#include <sys/stat.h> +#include <fcntl.h> + +#define WAVBUFFERSIZE 65536 + +static FILE *wavout; + +static SBYTE *WAV_DMABUF; +static ULONG dumpsize; + +static BOOL WAV_IsThere(void) +{ + return 1; +} + + +static BOOL WAV_Init(void) +{ + if(NULL == (wavout = fopen("music.wav", "wb"))) return 1; + if(NULL == (WAV_DMABUF = _mm_malloc(WAVBUFFERSIZE))) return 1; + + md_mode |= DMODE_SOFT_MUSIC | DMODE_SOFT_SNDFX; + + if(VC_Init()) return 1; + + _mm_write_string("RIFF WAVEfmt ",wavout); + _mm_write_I_ULONG(16,wavout); // length of this RIFF block crap + + _mm_write_I_UWORD(1, wavout); // microsoft format type + _mm_write_I_UWORD((md_mode & DMODE_STEREO) ? 2 : 1, wavout); + _mm_write_I_ULONG(md_mixfreq, wavout); + _mm_write_I_ULONG(md_mixfreq * ((md_mode & DMODE_STEREO) ? 2 : 1) * + ((md_mode & DMODE_16BITS) ? 2 : 1), wavout); + + _mm_write_I_UWORD(((md_mode & DMODE_16BITS) ? 2 : 1) * + ((md_mode & DMODE_STEREO) ? 2 : 1), wavout); // block alignment (8/16 bit) + + _mm_write_I_UWORD((md_mode & DMODE_16BITS) ? 16 : 8,wavout); + + _mm_write_string("data",wavout); + + dumpsize = 0; + + return 0; +} + + +static void WAV_Exit(void) +{ + VC_Exit(); + + // write in the actual sizes now + + if(wavout!=NULL) + { _mm_fseek(wavout,4,SEEK_SET); + _mm_write_I_ULONG(dumpsize + 32, wavout); + _mm_fseek(wavout,40,SEEK_SET); + _mm_write_I_ULONG(dumpsize, wavout); + + fclose(wavout); + + if(WAV_DMABUF != NULL) free(WAV_DMABUF); + } +} + + +static void WAV_Update(void) +{ + VC_WriteBytes(WAV_DMABUF, WAVBUFFERSIZE); + fwrite(WAV_DMABUF, 1, WAVBUFFERSIZE, wavout); + dumpsize += WAVBUFFERSIZE; +} + + +static BOOL WAV_Reset(void) +{ + return 0; +} + + +MDRIVER drv_wav = +{ NULL, + "music.wav file", + "WAV [music.wav] file output driver v1.0", + 0,255, + WAV_IsThere, + VC_SampleLoad, + VC_SampleUnload, + VC_SampleSpace, + VC_SampleLength, + WAV_Init, + WAV_Exit, + WAV_Reset, + VC_SetNumVoices, + VC_PlayStart, + VC_PlayStop, + WAV_Update, + VC_VoiceSetVolume, + VC_VoiceSetFrequency, + VC_VoiceSetPanning, + VC_VoicePlay, + VC_VoiceStop, + VC_VoiceStopped, + VC_VoiceReleaseSustain, + VC_VoiceGetPosition, + NULL +}; +