view include/mikmod.h @ 16:e5529b6e3b1c

Inistal commit of the Cheesy Mod Player (tm)
author darius
date Thu, 23 Apr 1998 07:35:49 +0000
parents 55420dceb8e0
children
line wrap: on
line source


#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