diff include/mikmod.h @ 10:55420dceb8e0

Initial entry of mikmod into the CVS tree.
author darius
date Fri, 23 Jan 1998 16:05:11 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mikmod.h	Fri Jan 23 16:05:11 1998 +0000
@@ -0,0 +1,415 @@
+
+#ifndef MIKMOD_H
+#define MIKMOD_H
+
+#include "mmio.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#define MUTE_EXCLUSIVE  32000
+#define MUTE_INCLUSIVE  32001
+
+#define PAN_LEFT           0
+#define PAN_CENTER       128
+#define PAN_RIGHT        255
+#define PAN_SURROUND     512         // panning value for Dolby Surround
+
+
+#define MikMod_RegisterDriver(x) MD_RegisterDriver(&x)
+#define MikMod_RegisterLoader(x) ML_RegisterLoader(&x)
+#define MikMod_RegisterErrorHandler(x) _mm_RegisterErrorHandler(x)
+
+
+// The following #define macros are for retaining API compatiability
+// with the beta version of MikMod 3.0, and are TEMPORARY!  They WILL
+// be removed in the future!
+
+#define MD_RegisterPlayer(x)      MikMod_RegisterPlayer(x)
+#define MD_Init                   MikMod_Init
+#define MD_Exit                   MikMod_Exit
+#define MD_Update                 MikMod_Update
+#define ML_Free(x)                MikMod_FreeSong(x)
+#define MD_SetNumChannels(x,y)    MikMod_SetNumVoices(x,y)
+#define MD_SetNumVoices(x,y)      MikMod_SetNumVoices(x,y)
+#define MD_PlayStart              MikMod_EnableOutput
+#define MD_PlayStop               MikMod_DisableOutput
+
+#define MD_VoiceSetVolume(x,y)    Voice_SetVolume(x,y)
+#define MD_VoiceSetFrequency(x,y) Voice_SetFrequency(x,y)
+#define MD_VoiceSetPanning(x,y)   Voice_SetPanning(x,y)
+#define MD_VoicePlay(x,y,z)       Voice_Play(x,y,z)
+#define MD_VoiceStop(x)           Voice_Stop(x)
+#define MD_VoiceReleaseSustain(x) Voice_ReleaseSustain(x)
+#define MD_VoiceStopped(x)        Voice_Stopped(x)
+#define MD_VoiceGetPosition(x)    Voice_GetPosition(x)
+#define MD_VoiceRealVolume(x)     Voice_RealVolume(x)
+
+
+#define SFX_CRITICAL  1
+
+
+/**************************************************************************
+****** mikmod types: ******************************************************
+**************************************************************************/
+
+// Sample format [loading and in-memory] flags:
+#define SF_16BITS       1
+#define SF_SIGNED       2
+#define SF_STEREO       4
+#define SF_DELTA        8
+#define SF_BIG_ENDIAN   16
+
+// General Playback flags
+
+#define SF_LOOP         32
+#define SF_BIDI         64
+#define SF_SUSTAIN      128
+#define SF_REVERSE      256
+
+// Module-only Playback Flags
+
+#define SF_OWNPAN       512
+#define SF_UST_LOOP     1024
+
+
+typedef struct SAMPLE
+{   ULONG  speed;            // Base playing speed/frequency of note (Middle C in player)
+    UBYTE  volume;           // volume 0-64
+    UWORD  panning;          // panning (0-255 or PAN_SURROUND)
+    ULONG  length;           // length of sample (in samples!)
+    ULONG  loopstart;        // repeat position (relative to start, in samples)
+    ULONG  loopend;          // repeat end
+    ULONG  susbegin;         // sustain loop begin (in samples) \  Not Supported
+    ULONG  susend;           // sustain loop end                /      Yet!
+
+    UWORD  flags;            // sample format in memory
+
+// Variables used by the module player only! (ignored for sound effects)
+
+    UBYTE  globvol;          // global volume
+    UBYTE  vibflags;         // autovibrato flag stuffs
+    UBYTE  vibtype;          // Vibratos moved from INSTRUMENT to SAMPLE
+    UBYTE  vibsweep;
+    UBYTE  vibdepth;
+    UBYTE  vibrate;
+
+    CHAR   *samplename;      // name of the sample
+
+// Values used internally only (not saved in disk formats)
+
+    UWORD  avibpos;          // autovibrato pos [player use]
+    UBYTE  divfactor;        // for sample scaling (maintains proper period slides)
+    ULONG  seekpos;          // seek position in file
+    SWORD  handle;           // sample handle used by individual drivers
+} SAMPLE;
+
+
+
+// --> Struct : SAMPLOAD
+// This is a handle of sorts attached to any sample registered with
+// SL_RegisterSample.  Generally, this only need be used or changed by the
+// loaders and drivers of mikmod.
+
+typedef struct SAMPLOAD
+{   struct SAMPLOAD *next;
+
+    ULONG  length;           // length of sample (in samples!)
+    ULONG  loopstart;        // repeat position (relative to start, in samples)
+    ULONG  loopend;          // repeat end
+
+    UWORD   infmt, outfmt;
+    int     scalefactor;
+    SAMPLE  *sample;
+    FILE    *fp;
+} SAMPLOAD;
+
+extern void SL_HalveSample(SAMPLOAD *s);
+extern void SL_Sample8to16(SAMPLOAD *s);
+extern void SL_Sample16to8(SAMPLOAD *s);
+extern void SL_SampleSigned(SAMPLOAD *s);
+extern void SL_SampleUnsigned(SAMPLOAD *s);
+extern BOOL SL_LoadSamples(void);                      // Returns 1 on error!
+extern SAMPLOAD *SL_RegisterSample(SAMPLE *s, int type, FILE *fp);    // Returns 1 on error!
+extern void SL_Load(void *buffer, SAMPLOAD *smp, int length);
+extern BOOL SL_Init(SAMPLOAD *s);
+extern void SL_Exit(SAMPLOAD *s);
+
+
+/**************************************************************************
+****** Wavload stuff: *****************************************************
+**************************************************************************/
+
+SAMPLE *WAV_LoadFP(FILE *fp);
+SAMPLE *WAV_LoadFN(CHAR *filename);
+void WAV_Free(SAMPLE *si);
+
+
+#include "ptform.h"
+
+
+/**************************************************************************
+****** Driver stuff: ******************************************************
+**************************************************************************/
+
+// max. number of handles a driver has to provide. (not strict)
+
+#define MAXSAMPLEHANDLES 384
+
+
+enum
+{   MD_MUSIC = 0,
+    MD_SNDFX
+};
+
+enum
+{   MD_HARDWARE = 0,
+    MD_SOFTWARE
+};
+
+
+// possible mixing mode bits:
+// --------------------------
+// These take effect only after MikMod_Init or MikMod_Reset.
+
+#define DMODE_16BITS       1         // enable 16 bit output
+#define DMODE_SURROUND     2         // enable Dolby surround sound (not yet supported)
+#define DMODE_SOFT_SNDFX   4         // Process sound effects via software mixer (not yet supported)
+#define DMODE_SOFT_MUSIC   8         // Process music via software mixer (not yet supported)
+
+// These take effect immidiately.
+
+#define DMODE_STEREO      16         // enable stereo output
+#define DMODE_REVERSE     32         // reverse stereo
+#define DMODE_INTERP      64         // enable interpolation (not yet supported)
+
+
+// driver structure:
+
+typedef struct MDRIVER
+{   struct MDRIVER *next;
+    CHAR    *Name;
+    CHAR    *Version;
+    UBYTE   HardVoiceLimit,       // Limit of hardware mixer voices for this driver
+            SoftVoiceLimit;       // Limit of software mixer voices for this driver
+
+    BOOL    (*IsPresent)          (void);
+    SWORD   (*SampleLoad)         (SAMPLOAD *s, int type, FILE *fp);
+    void    (*SampleUnLoad)       (SWORD handle);
+    ULONG   (*FreeSampleSpace)    (int type);
+    ULONG   (*RealSampleLength)   (int type, SAMPLE *s);
+    BOOL    (*Init)               (void);
+    void    (*Exit)               (void);
+    BOOL    (*Reset)              (void);
+    BOOL    (*SetNumVoices)       (void);
+    BOOL    (*PlayStart)          (void);
+    void    (*PlayStop)           (void);
+    void    (*Update)             (void);
+    void    (*VoiceSetVolume)     (UBYTE voice, UWORD vol);
+    void    (*VoiceSetFrequency)  (UBYTE voice, ULONG frq);
+    void    (*VoiceSetPanning)    (UBYTE voice, ULONG pan);
+    void    (*VoicePlay)          (UBYTE voice, SWORD handle, ULONG start, ULONG size, ULONG reppos, ULONG repend, UWORD flags);
+    void    (*VoiceStop)          (UBYTE voice);
+    BOOL    (*VoiceStopped)       (UBYTE voice);
+    void    (*VoiceReleaseSustain)(UBYTE voice);
+    SLONG   (*VoiceGetPosition)   (UBYTE voice);
+    ULONG   (*VoiceRealVolume)    (UBYTE voice);
+
+    BOOL    (*StreamInit)         (ULONG speed, UWORD flags);
+    void    (*StreamExit)         (void);
+    void    (*StreamSetSpeed)     (ULONG speed);
+    SLONG   (*StreamGetPosition)  (void);
+    void    (*StreamLoadFP)       (FILE *fp);
+} MDRIVER;
+
+
+// These variables can be changed at ANY time and results
+// will be immidiate:
+
+extern UBYTE md_bpm;            // current song / hardware BPM rate
+extern UBYTE md_volume;         // Global sound volume (0-128)
+extern UBYTE md_musicvolume;    // volume of song
+extern UBYTE md_sndfxvolume;    // volume of sound effects
+extern UBYTE md_reverb;         // 0 = none;  15 = chaos
+extern UBYTE md_pansep;         // 0 = mono;  128 == 100% (full left/right)
+
+
+// The variables below can be changed at any time, but changes will
+// not be implimented until MikMod_Reset is called.  A call to
+// MikMod_Reset may result in a skip or pop in audio (depending on
+// the soundcard driver and the settings changed).
+
+extern UWORD md_device;         // Device.  0 = autodetect, other # depend on driver register order.
+extern UWORD md_mixfreq;        // mixing frequency.  Valid 5000 -> 44100
+extern UWORD md_dmabufsize;     // DMA buffer size.  Valid 512 -> 32000
+extern UWORD md_mode;           // Mode.  See DMODE_? flags above
+
+
+// Variables below can be changed via MD_SetNumVoices at any time.
+//  However, a call to MD_SetNumVoicess while the driver
+// is active will cause the sound to skip slightly.
+
+extern UBYTE md_numchn,         // number of song + sound effects voices
+             md_sngchn,         // number of song voices
+             md_sfxchn,         // number of sound effects voices
+             md_hardchn,        // number of hardware mixed voices
+             md_softchn;        // number of software mixed voices
+
+
+// Following variables should not be changed!
+extern MDRIVER *md_driver;      // Current driver in use.  See MDRIVER struct
+                                // above for structure info contents.
+
+// This is for use by the hardware drivers only.  It points to the
+// registered tickhandler function.
+extern void (*md_player)(void);
+
+
+// main driver prototypes:
+
+extern void   MikMod_RegisterAllDrivers(void);
+extern void   MikMod_RegisterAllLoaders(void);
+
+extern BOOL   MikMod_Init(void);
+extern void   MikMod_Exit(void);
+extern BOOL   MikMod_Reset(void);
+extern int    MikMod_PlaySample(SAMPLE *s, ULONG start, UBYTE flags);
+extern BOOL   MikMod_SetNumVoices(int music, int sndfx);
+extern BOOL   MikMod_Active(void);
+extern BOOL   MikMod_EnableOutput(void);
+extern void   MikMod_DisableOutput(void);
+extern void   MikMod_RegisterPlayer(void (*plr)(void));
+extern void   MikMod_Update(void);
+
+extern void   Voice_SetVolume(int voice, UWORD ivol);
+extern void   Voice_SetFrequency(int voice, ULONG frq);
+extern void   Voice_SetPanning(int voice, ULONG pan);
+extern void   Voice_Play(int voice,SAMPLE *s, ULONG start);
+extern void   Voice_Stop(int voice);
+extern void   Voice_ReleaseSustain(int voice);
+extern BOOL   Voice_Stopped(int voice);
+extern SLONG  Voice_GetPosition(int voice);
+extern ULONG  Voice_RealVolume(int voice);
+
+extern void   MD_InfoDriver(void);
+extern void   MD_RegisterDriver(MDRIVER *drv);
+extern SWORD  MD_SampleLoad(SAMPLOAD *s, int type, FILE *fp);
+extern void   MD_SampleUnLoad(SWORD handle);
+extern void   MD_SetBPM(UBYTE bpm);
+extern ULONG  MD_SampleSpace(int type);
+extern ULONG  MD_SampleLength(int type, SAMPLE *s);
+
+// Declare external drivers:
+
+extern MDRIVER drv_awe;      // experimental SB-AWE driver
+extern MDRIVER drv_gus;      // gravis ultrasound driver [hardware / software mixing]
+extern MDRIVER drv_gus2;     // gravis ultrasound driver [hardware mixing only]
+extern MDRIVER drv_sb;       // soundblaster 1.5 / 2.0 DSP driver
+extern MDRIVER drv_sbpro;    // soundblaster Pro DSP driver
+extern MDRIVER drv_sb16;     // soundblaster 16 DSP driver
+extern MDRIVER drv_ss;       // ensoniq soundscape driver
+extern MDRIVER drv_pas;      // PAS16 driver
+extern MDRIVER drv_wss;      // Windows Sound System driver
+extern MDRIVER drv_nos;      // nosound driver
+extern MDRIVER drv_raw;      // raw file output driver [music.raw]
+extern MDRIVER drv_wav;      // RIFF WAVE file output driver [music.wav]
+
+extern MDRIVER drv_w95;      // win95 driver
+extern MDRIVER drv_oss;      // linux voxware driver
+extern MDRIVER drv_AF;       // Dec Alpha AudioFile driver
+extern MDRIVER drv_sun;      // Sun driver
+extern MDRIVER drv_os2;      // Os2 driver
+extern MDRIVER drv_hp;       // HP-UX /dev/audio driver
+extern MDRIVER drv_aix;      // AIX audio-device driver
+extern MDRIVER drv_sgi;      // SGI audio-device driver
+extern MDRIVER drv_tim;      // timing driver
+extern MDRIVER drv_ultra;    // ultra driver for linux
+
+
+/**************************************************************************
+****** Streaming Audio stuff: *********************************************
+**************************************************************************/
+
+
+typedef struct MSTREAM
+{   struct MSTREAM *next;
+    CHAR    *type;
+    CHAR    *version;
+    BOOL    (*Init)(void);
+    BOOL    (*Test)(void);
+    BOOL    (*Load)(void);
+    void    (*Cleanup)(void);
+} MSTREAM;
+
+
+extern int   stream_bufsize;
+extern FILE  *stream_fp;
+extern SLONG stream_seekpos;
+extern SLONG stream_reppos;
+
+
+/**************************************************************************
+****** Virtual channel stuff: *********************************************
+**************************************************************************/
+
+extern BOOL    VC_Init(void);
+extern void    VC_Exit(void);
+extern BOOL    VC_SetNumVoices(void);
+extern ULONG   VC_SampleSpace(int type);
+extern ULONG   VC_SampleLength(int type, SAMPLE *s);
+
+extern BOOL    VC_PlayStart(void);
+extern void    VC_PlayStop(void);
+
+extern SWORD   VC_SampleLoad(SAMPLOAD *sload, int type, FILE *fp);
+extern void    VC_SampleUnload(SWORD handle);
+
+extern void    VC_WriteSamples(SBYTE *buf,ULONG todo);
+extern ULONG   VC_WriteBytes(SBYTE *buf,ULONG todo);
+extern void    VC_SilenceBytes(SBYTE *buf,ULONG todo);
+
+extern void    VC_VoiceSetVolume(UBYTE voice, UWORD vol);
+extern void    VC_VoiceSetFrequency(UBYTE voice, ULONG frq);
+extern void    VC_VoiceSetPanning(UBYTE voice, ULONG pan);
+extern void    VC_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);
+
+extern void    VC_VoiceStop(UBYTE voice);
+extern BOOL    VC_VoiceStopped(UBYTE voice);
+extern void    VC_VoiceReleaseSustain(UBYTE voice);
+extern SLONG   VC_VoiceGetPosition(UBYTE voice);
+extern ULONG   VC_VoiceRealVolume(UBYTE voice);
+
+
+extern BOOL    VC2_Init(void);
+extern void    VC2_Exit(void);
+extern BOOL    VC2_SetNumVoices(void);
+extern ULONG   VC2_SampleSpace(int type);
+extern ULONG   VC2_SampleLength(int type, SAMPLE *s);
+
+extern BOOL    VC2_PlayStart(void);
+extern void    VC2_PlayStop(void);
+
+extern SWORD   VC2_SampleLoad(SAMPLOAD *sload, int type, FILE *fp);
+extern void    VC2_SampleUnload(SWORD handle);
+
+extern void    VC2_WriteSamples(SBYTE *buf,ULONG todo);
+extern ULONG   VC2_WriteBytes(SBYTE *buf,ULONG todo);
+extern void    VC2_SilenceBytes(SBYTE *buf,ULONG todo);
+
+extern void    VC2_VoiceSetVolume(UBYTE voice, UWORD vol);
+extern void    VC2_VoiceSetFrequency(UBYTE voice, ULONG frq);
+extern void    VC2_VoiceSetPanning(UBYTE voice, ULONG pan);
+extern void    VC2_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);
+
+extern void    VC2_VoiceStop(UBYTE voice);
+extern BOOL    VC2_VoiceStopped(UBYTE voice);
+extern void    VC2_VoiceReleaseSustain(UBYTE voice);
+extern SLONG   VC2_VoiceGetPosition(UBYTE voice);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif