--- /dev/null
+/* MikMod sound library\r
+ (c) 1998, 1999, 2000 Miodrag Vallat and others - see file AUTHORS\r
+ for complete list.\r
+\r
+ This library is free software; you can redistribute it and/or modify\r
+ it under the terms of the GNU Library General Public License as\r
+ published by the Free Software Foundation; either version 2 of\r
+ the License, or (at your option) any later version.\r
+ \r
+ This program is distributed in the hope that it will be useful,\r
+ but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ GNU Library General Public License for more details.\r
+ \r
+ You should have received a copy of the GNU Library General Public\r
+ License along with this library; if not, write to the Free Software\r
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\r
+ 02111-1307, USA.\r
+*/\r
+\r
+/*==============================================================================\r
+\r
+ $Id: mikmod_build.h,v 1.3 2004/02/19 14:15:22 raph Exp $\r
+\r
+ MikMod sound library include file\r
+\r
+==============================================================================*/\r
+\r
+#ifndef _MIKMOD_H_\r
+#define _MIKMOD_H_\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+/*\r
+ * ========== Compiler magic for shared libraries\r
+ */\r
+\r
+#if defined WIN32 && defined _DLL\r
+#ifdef DLL_EXPORTS\r
+#define MIKMODAPI __declspec(dllexport)\r
+#else\r
+#define MIKMODAPI __declspec(dllimport)\r
+#endif\r
+#else\r
+#define MIKMODAPI\r
+#endif\r
+\r
+#define BOOL BOOLTYPE\r
+\r
+#ifdef WIN32\r
+ #undef WIN32\r
+#endif\r
+\r
+/*\r
+ * ========== Library version\r
+ */\r
+\r
+#define LIBMIKMOD_VERSION_MAJOR 3L\r
+#define LIBMIKMOD_VERSION_MINOR 2L\r
+#define LIBMIKMOD_REVISION 0L\r
+\r
+#define LIBMIKMOD_VERSION \\r
+ ((LIBMIKMOD_VERSION_MAJOR<<16)| \\r
+ (LIBMIKMOD_VERSION_MINOR<< 8)| \\r
+ (LIBMIKMOD_REVISION))\r
+\r
+MIKMODAPI extern long MikMod_GetVersion(void);\r
+\r
+/*\r
+ * ========== Platform independent-type definitions\r
+ */\r
+\r
+#ifdef WIN32\r
+#define WIN32_LEAN_AND_MEAN\r
+#include <windows.h>\r
+#include <io.h>\r
+#include <mmsystem.h>\r
+#endif\r
+\r
+#if defined(__OS2__)||defined(__EMX__)\r
+#define INCL_DOSSEMAPHORES\r
+#include <os2.h>\r
+#else\r
+typedef char CHAR;\r
+#endif\r
+\r
+\r
+\r
+#if defined(__arch64__) || defined(__alpha)\r
+/* 64 bit architectures */\r
+\r
+typedef signed char SBYTE; /* 1 byte, signed */\r
+typedef unsigned char UBYTE; /* 1 byte, unsigned */\r
+typedef signed short SWORD; /* 2 bytes, signed */\r
+typedef unsigned short UWORD; /* 2 bytes, unsigned */\r
+typedef signed int SLONG; /* 4 bytes, signed */\r
+typedef unsigned int ULONG; /* 4 bytes, unsigned */\r
+typedef int BOOL; /* 0=false, <>0 true */\r
+\r
+#else\r
+/* 32 bit architectures */\r
+\r
+typedef signed char SBYTE; /* 1 byte, signed */\r
+typedef unsigned char UBYTE; /* 1 byte, unsigned */\r
+typedef signed short SWORD; /* 2 bytes, signed */\r
+typedef unsigned short UWORD; /* 2 bytes, unsigned */\r
+typedef signed long SLONG; /* 4 bytes, signed */\r
+#if !defined(__OS2__)&&!defined(__EMX__)&&!defined(WIN32)\r
+typedef unsigned long ULONG; /* 4 bytes, unsigned */\r
+typedef int BOOL; /* 0=false, <>0 true */\r
+#endif\r
+#endif\r
+\r
+/*\r
+ * ========== Error codes\r
+ */\r
+\r
+enum {\r
+ MMERR_OPENING_FILE = 1,\r
+ MMERR_OUT_OF_MEMORY,\r
+ MMERR_DYNAMIC_LINKING,\r
+\r
+ MMERR_SAMPLE_TOO_BIG,\r
+ MMERR_OUT_OF_HANDLES,\r
+ MMERR_UNKNOWN_WAVE_TYPE,\r
+\r
+ MMERR_LOADING_PATTERN,\r
+ MMERR_LOADING_TRACK,\r
+ MMERR_LOADING_HEADER,\r
+ MMERR_LOADING_SAMPLEINFO,\r
+ MMERR_NOT_A_MODULE,\r
+ MMERR_NOT_A_STREAM,\r
+ MMERR_MED_SYNTHSAMPLES,\r
+ MMERR_ITPACK_INVALID_DATA,\r
+\r
+ MMERR_DETECTING_DEVICE,\r
+ MMERR_INVALID_DEVICE,\r
+ MMERR_INITIALIZING_MIXER,\r
+ MMERR_OPENING_AUDIO,\r
+ MMERR_8BIT_ONLY,\r
+ MMERR_16BIT_ONLY,\r
+ MMERR_STEREO_ONLY,\r
+ MMERR_ULAW,\r
+ MMERR_NON_BLOCK,\r
+\r
+ MMERR_AF_AUDIO_PORT,\r
+\r
+ MMERR_AIX_CONFIG_INIT,\r
+ MMERR_AIX_CONFIG_CONTROL,\r
+ MMERR_AIX_CONFIG_START,\r
+\r
+ MMERR_GUS_SETTINGS,\r
+ MMERR_GUS_RESET,\r
+ MMERR_GUS_TIMER,\r
+\r
+ MMERR_HP_SETSAMPLESIZE,\r
+ MMERR_HP_SETSPEED,\r
+ MMERR_HP_CHANNELS,\r
+ MMERR_HP_AUDIO_OUTPUT,\r
+ MMERR_HP_AUDIO_DESC,\r
+ MMERR_HP_BUFFERSIZE,\r
+\r
+ MMERR_OSS_SETFRAGMENT,\r
+ MMERR_OSS_SETSAMPLESIZE,\r
+ MMERR_OSS_SETSTEREO,\r
+ MMERR_OSS_SETSPEED,\r
+\r
+ MMERR_SGI_SPEED,\r
+ MMERR_SGI_16BIT,\r
+ MMERR_SGI_8BIT,\r
+ MMERR_SGI_STEREO,\r
+ MMERR_SGI_MONO,\r
+\r
+ MMERR_SUN_INIT,\r
+\r
+ MMERR_OS2_MIXSETUP,\r
+ MMERR_OS2_SEMAPHORE,\r
+ MMERR_OS2_TIMER,\r
+ MMERR_OS2_THREAD,\r
+\r
+ MMERR_DS_PRIORITY,\r
+ MMERR_DS_BUFFER,\r
+ MMERR_DS_FORMAT,\r
+ MMERR_DS_NOTIFY,\r
+ MMERR_DS_EVENT,\r
+ MMERR_DS_THREAD,\r
+ MMERR_DS_UPDATE,\r
+\r
+ MMERR_WINMM_HANDLE,\r
+ MMERR_WINMM_ALLOCATED,\r
+ MMERR_WINMM_DEVICEID,\r
+ MMERR_WINMM_FORMAT,\r
+ MMERR_WINMM_UNKNOWN,\r
+\r
+ MMERR_MAC_SPEED,\r
+ MMERR_MAC_START,\r
+\r
+ MMERR_OSX_UNKNOWN_DEVICE,\r
+ MMERR_OSX_BAD_PROPERTY,\r
+ MMERR_OSX_UNSUPPORTED_FORMAT,\r
+ MMERR_OSX_SET_STEREO,\r
+ MMERR_OSX_BUFFER_ALLOC,\r
+ MMERR_OSX_ADD_IO_PROC,\r
+ MMERR_OSX_DEVICE_START,\r
+ MMERR_OSX_PTHREAD,\r
+\r
+ MMERR_DOSWSS_STARTDMA,\r
+ MMERR_DOSSB_STARTDMA,\r
+ \r
+ MMERR_MAX\r
+};\r
+\r
+/*\r
+ * ========== Error handling\r
+ */\r
+\r
+typedef void (MikMod_handler)(void);\r
+typedef MikMod_handler *MikMod_handler_t;\r
+\r
+MIKMODAPI extern int MikMod_errno;\r
+MIKMODAPI extern BOOL MikMod_critical;\r
+MIKMODAPI extern char *MikMod_strerror(int);\r
+\r
+MIKMODAPI extern MikMod_handler_t MikMod_RegisterErrorHandler(MikMod_handler_t);\r
+\r
+/*\r
+ * ========== Library initialization and core functions\r
+ */\r
+\r
+struct MDRIVER;\r
+\r
+MIKMODAPI extern void MikMod_RegisterAllDrivers(void);\r
+\r
+MIKMODAPI extern CHAR* MikMod_InfoDriver(void);\r
+MIKMODAPI extern void MikMod_RegisterDriver(struct MDRIVER*);\r
+MIKMODAPI extern int MikMod_DriverFromAlias(CHAR*);\r
+MIKMODAPI extern struct MDRIVER *MikMod_DriverByOrdinal(int);\r
+\r
+MIKMODAPI extern BOOL MikMod_Init(CHAR*);\r
+MIKMODAPI extern void MikMod_Exit(void);\r
+MIKMODAPI extern BOOL MikMod_Reset(CHAR*);\r
+MIKMODAPI extern BOOL MikMod_SetNumVoices(int,int);\r
+MIKMODAPI extern BOOL MikMod_Active(void);\r
+MIKMODAPI extern BOOL MikMod_EnableOutput(void);\r
+MIKMODAPI extern void MikMod_DisableOutput(void);\r
+MIKMODAPI extern void MikMod_Update(void);\r
+\r
+MIKMODAPI extern BOOL MikMod_InitThreads(void);\r
+MIKMODAPI extern void MikMod_Lock(void);\r
+MIKMODAPI extern void MikMod_Unlock(void);\r
+\r
+/*\r
+ * ========== Reader, Writer\r
+ */\r
+\r
+typedef struct MREADER {\r
+ BOOL (*Seek)(struct MREADER*,long,int);\r
+ long (*Tell)(struct MREADER*);\r
+ BOOL (*Read)(struct MREADER*,void*,size_t);\r
+ int (*Get)(struct MREADER*);\r
+ BOOL (*Eof)(struct MREADER*);\r
+} MREADER;\r
+\r
+typedef struct MWRITER {\r
+ BOOL (*Seek)(struct MWRITER*,long,int);\r
+ long (*Tell)(struct MWRITER*);\r
+ BOOL (*Write)(struct MWRITER*,void*,size_t);\r
+ BOOL (*Put)(struct MWRITER*,int);\r
+} MWRITER;\r
+\r
+/*\r
+ * ========== Samples\r
+ */\r
+\r
+/* Sample playback should not be interrupted */\r
+#define SFX_CRITICAL 1\r
+\r
+/* Sample format [loading and in-memory] flags: */\r
+#define SF_16BITS 0x0001\r
+#define SF_STEREO 0x0002\r
+#define SF_SIGNED 0x0004\r
+#define SF_BIG_ENDIAN 0x0008\r
+#define SF_DELTA 0x0010\r
+#define SF_ITPACKED 0x0020\r
+\r
+#define SF_FORMATMASK 0x003F\r
+\r
+/* General Playback flags */\r
+\r
+#define SF_LOOP 0x0100\r
+#define SF_BIDI 0x0200\r
+#define SF_REVERSE 0x0400\r
+#define SF_SUSTAIN 0x0800\r
+\r
+#define SF_PLAYBACKMASK 0x0C00\r
+\r
+/* Module-only Playback Flags */\r
+\r
+#define SF_OWNPAN 0x1000\r
+#define SF_UST_LOOP 0x2000\r
+\r
+#define SF_EXTRAPLAYBACKMASK 0x3000\r
+\r
+/* Panning constants */\r
+#define PAN_LEFT 0\r
+#define PAN_HALFLEFT 64\r
+#define PAN_CENTER 128\r
+#define PAN_HALFRIGHT 192\r
+#define PAN_RIGHT 255\r
+#define PAN_SURROUND 512 /* panning value for Dolby Surround */\r
+\r
+typedef struct SAMPLE {\r
+ SWORD panning; /* panning (0-255 or PAN_SURROUND) */\r
+ ULONG speed; /* Base playing speed/frequency of note */\r
+ UBYTE volume; /* volume 0-64 */\r
+ UWORD inflags; /* sample format on disk */\r
+ UWORD flags; /* sample format in memory */\r
+ ULONG length; /* length of sample (in samples!) */\r
+ ULONG loopstart; /* repeat position (relative to start, in samples) */\r
+ ULONG loopend; /* repeat end */\r
+ ULONG susbegin; /* sustain loop begin (in samples) \ Not Supported */\r
+ ULONG susend; /* sustain loop end / Yet! */\r
+\r
+ /* Variables used by the module player only! (ignored for sound effects) */\r
+ UBYTE globvol; /* global volume */\r
+ UBYTE vibflags; /* autovibrato flag stuffs */\r
+ UBYTE vibtype; /* Vibratos moved from INSTRUMENT to SAMPLE */\r
+ UBYTE vibsweep;\r
+ UBYTE vibdepth;\r
+ UBYTE vibrate;\r
+ CHAR* samplename; /* name of the sample */\r
+\r
+ /* Values used internally only */\r
+ UWORD avibpos; /* autovibrato pos [player use] */\r
+ UBYTE divfactor; /* for sample scaling, maintains proper period slides */\r
+ ULONG seekpos; /* seek position in file */\r
+ SWORD handle; /* sample handle used by individual drivers */\r
+} SAMPLE;\r
+\r
+/* Sample functions */\r
+\r
+MIKMODAPI extern SAMPLE *Sample_Load(CHAR*);\r
+MIKMODAPI extern SAMPLE *Sample_LoadFP(int);\r
+MIKMODAPI extern SAMPLE *Sample_LoadGeneric(MREADER*);\r
+MIKMODAPI extern void Sample_Free(SAMPLE*);\r
+MIKMODAPI extern SBYTE Sample_Play(SAMPLE*,ULONG,UBYTE);\r
+\r
+MIKMODAPI extern void Voice_SetVolume(SBYTE,UWORD);\r
+MIKMODAPI extern UWORD Voice_GetVolume(SBYTE);\r
+MIKMODAPI extern void Voice_SetFrequency(SBYTE,ULONG);\r
+MIKMODAPI extern ULONG Voice_GetFrequency(SBYTE);\r
+MIKMODAPI extern void Voice_SetPanning(SBYTE,ULONG);\r
+MIKMODAPI extern ULONG Voice_GetPanning(SBYTE);\r
+MIKMODAPI extern void Voice_Play(SBYTE,SAMPLE*,ULONG);\r
+MIKMODAPI extern void Voice_Stop(SBYTE);\r
+MIKMODAPI extern BOOL Voice_Stopped(SBYTE);\r
+MIKMODAPI extern SLONG Voice_GetPosition(SBYTE);\r
+MIKMODAPI extern ULONG Voice_RealVolume(SBYTE);\r
+\r
+/*\r
+ * ========== Internal module representation (UniMod)\r
+ */\r
+\r
+/*\r
+ Instrument definition - for information only, the only field which may be\r
+ of use in user programs is the name field\r
+*/\r
+\r
+/* Instrument note count */\r
+#define INSTNOTES 120\r
+\r
+/* Envelope point */\r
+typedef struct ENVPT {\r
+ SWORD pos;\r
+ SWORD val;\r
+} ENVPT;\r
+\r
+/* Envelope point count */\r
+#define ENVPOINTS 32\r
+\r
+/* Instrument structure */\r
+typedef struct INSTRUMENT {\r
+ CHAR* insname;\r
+\r
+ UBYTE flags;\r
+ UWORD samplenumber[INSTNOTES];\r
+ UBYTE samplenote[INSTNOTES];\r
+\r
+ UBYTE nnatype;\r
+ UBYTE dca; /* duplicate check action */\r
+ UBYTE dct; /* duplicate check type */\r
+ UBYTE globvol;\r
+ UWORD volfade;\r
+ SWORD panning; /* instrument-based panning var */\r
+\r
+ UBYTE pitpansep; /* pitch pan separation (0 to 255) */\r
+ UBYTE pitpancenter; /* pitch pan center (0 to 119) */\r
+ UBYTE rvolvar; /* random volume varations (0 - 100%) */\r
+ UBYTE rpanvar; /* random panning varations (0 - 100%) */\r
+\r
+ /* volume envelope */\r
+ UBYTE volflg; /* bit 0: on 1: sustain 2: loop */\r
+ UBYTE volpts;\r
+ UBYTE volsusbeg;\r
+ UBYTE volsusend;\r
+ UBYTE volbeg;\r
+ UBYTE volend;\r
+ ENVPT volenv[ENVPOINTS];\r
+ /* panning envelope */\r
+ UBYTE panflg; /* bit 0: on 1: sustain 2: loop */\r
+ UBYTE panpts;\r
+ UBYTE pansusbeg;\r
+ UBYTE pansusend;\r
+ UBYTE panbeg;\r
+ UBYTE panend;\r
+ ENVPT panenv[ENVPOINTS];\r
+ /* pitch envelope */\r
+ UBYTE pitflg; /* bit 0: on 1: sustain 2: loop */\r
+ UBYTE pitpts;\r
+ UBYTE pitsusbeg;\r
+ UBYTE pitsusend;\r
+ UBYTE pitbeg;\r
+ UBYTE pitend;\r
+ ENVPT pitenv[ENVPOINTS];\r
+} INSTRUMENT;\r
+\r
+struct MP_CONTROL;\r
+struct MP_VOICE;\r
+\r
+/*\r
+ Module definition\r
+*/\r
+\r
+/* maximum master channels supported */\r
+#define UF_MAXCHAN 64\r
+\r
+/* Module flags */\r
+#define UF_XMPERIODS 0x0001 /* XM periods / finetuning */\r
+#define UF_LINEAR 0x0002 /* LINEAR periods (UF_XMPERIODS must be set) */\r
+#define UF_INST 0x0004 /* Instruments are used */\r
+#define UF_NNA 0x0008 /* IT: NNA used, set numvoices rather\r
+ than numchn */\r
+#define UF_S3MSLIDES 0x0010 /* uses old S3M volume slides */\r
+#define UF_BGSLIDES 0x0020 /* continue volume slides in the background */\r
+#define UF_HIGHBPM 0x0040 /* MED: can use >255 bpm */\r
+#define UF_NOWRAP 0x0080 /* XM-type (i.e. illogical) pattern break\r
+ semantics */\r
+#define UF_ARPMEM 0x0100 /* IT: need arpeggio memory */\r
+#define UF_FT2QUIRKS 0x0200 /* emulate some FT2 replay quirks */\r
+#define UF_PANNING 0x0400 /* module uses panning effects or have\r
+ non-tracker default initial panning */\r
+\r
+typedef struct MODULE {\r
+ /* general module information */\r
+ CHAR* songname; /* name of the song */\r
+ CHAR* modtype; /* string type of module loaded */\r
+ CHAR* comment; /* module comments */\r
+\r
+ UWORD flags; /* See module flags above */\r
+ UBYTE numchn; /* number of module channels */\r
+ UBYTE numvoices; /* max # voices used for full NNA playback */\r
+ UWORD numpos; /* number of positions in this song */\r
+ UWORD numpat; /* number of patterns in this song */\r
+ UWORD numins; /* number of instruments */\r
+ UWORD numsmp; /* number of samples */\r
+struct INSTRUMENT* instruments; /* all instruments */\r
+struct SAMPLE* samples; /* all samples */\r
+ UBYTE realchn; /* real number of channels used */\r
+ UBYTE totalchn; /* total number of channels used (incl NNAs) */\r
+\r
+ /* playback settings */\r
+ UWORD reppos; /* restart position */\r
+ UBYTE initspeed; /* initial song speed */\r
+ UWORD inittempo; /* initial song tempo */\r
+ UBYTE initvolume; /* initial global volume (0 - 128) */\r
+ UWORD panning[UF_MAXCHAN]; /* panning positions */\r
+ UBYTE chanvol[UF_MAXCHAN]; /* channel positions */\r
+ UWORD bpm; /* current beats-per-minute speed */\r
+ UWORD sngspd; /* current song speed */\r
+ SWORD volume; /* song volume (0-128) (or user volume) */\r
+\r
+ BOOL extspd; /* extended speed flag (default enabled) */\r
+ BOOL panflag; /* panning flag (default enabled) */\r
+ BOOL wrap; /* wrap module ? (default disabled) */\r
+ BOOL loop; /* allow module to loop ? (default enabled) */\r
+ BOOL fadeout; /* volume fade out during last pattern */\r
+\r
+ UWORD patpos; /* current row number */\r
+ SWORD sngpos; /* current song position */\r
+ ULONG sngtime; /* current song time in 2^-10 seconds */\r
+\r
+ SWORD relspd; /* relative speed factor */\r
+\r
+ /* internal module representation */\r
+ UWORD numtrk; /* number of tracks */\r
+ UBYTE** tracks; /* array of numtrk pointers to tracks */\r
+ UWORD* patterns; /* array of Patterns */\r
+ UWORD* pattrows; /* array of number of rows for each pattern */\r
+ UWORD* positions; /* all positions */\r
+\r
+ BOOL forbid; /* if true, no player update! */\r
+ UWORD numrow; /* number of rows on current pattern */\r
+ UWORD vbtick; /* tick counter (counts from 0 to sngspd) */\r
+ UWORD sngremainder;/* used for song time computation */\r
+\r
+struct MP_CONTROL* control; /* Effects Channel info (size pf->numchn) */\r
+struct MP_VOICE* voice; /* Audio Voice information (size md_numchn) */\r
+\r
+ UBYTE globalslide; /* global volume slide rate */\r
+ UBYTE pat_repcrazy;/* module has just looped to position -1 */\r
+ UWORD patbrk; /* position where to start a new pattern */\r
+ UBYTE patdly; /* patterndelay counter (command memory) */\r
+ UBYTE patdly2; /* patterndelay counter (real one) */\r
+ SWORD posjmp; /* flag to indicate a jump is needed... */\r
+ UWORD bpmlimit; /* threshold to detect bpm or speed values */\r
+} MODULE;\r
+\r
+\r
+/* This structure is used to query current playing voices status */\r
+typedef struct VOICEINFO {\r
+ INSTRUMENT* i; /* Current channel instrument */\r
+ SAMPLE* s; /* Current channel sample */\r
+ SWORD panning; /* panning position */\r
+ SBYTE volume; /* channel's "global" volume (0..64) */\r
+ UWORD period; /* period to play the sample at */\r
+ UBYTE kick; /* if true = sample has been restarted */\r
+} VOICEINFO;\r
+\r
+/*\r
+ * ========== Module loaders\r
+ */\r
+\r
+struct MLOADER;\r
+\r
+MIKMODAPI extern CHAR* MikMod_InfoLoader(void);\r
+MIKMODAPI extern void MikMod_RegisterAllLoaders(void);\r
+MIKMODAPI extern void MikMod_RegisterLoader(struct MLOADER*);\r
+\r
+MIKMODAPI extern struct MLOADER load_669; /* 669 and Extended-669 (by Tran/Renaissance) */\r
+MIKMODAPI extern struct MLOADER load_amf; /* DMP Advanced Module Format (by Otto Chrons) */\r
+MIKMODAPI extern struct MLOADER load_asy; /* ASYLUM Music Format 1.0 */\r
+MIKMODAPI extern struct MLOADER load_dsm; /* DSIK internal module format */\r
+MIKMODAPI extern struct MLOADER load_far; /* Farandole Composer (by Daniel Potter) */\r
+MIKMODAPI extern struct MLOADER load_gdm; /* General DigiMusic (by Edward Schlunder) */\r
+MIKMODAPI extern struct MLOADER load_it; /* Impulse Tracker (by Jeffrey Lim) */\r
+MIKMODAPI extern struct MLOADER load_imf; /* Imago Orpheus (by Lutz Roeder) */\r
+MIKMODAPI extern struct MLOADER load_med; /* Amiga MED modules (by Teijo Kinnunen) */\r
+MIKMODAPI extern struct MLOADER load_m15; /* Soundtracker 15-instrument */\r
+MIKMODAPI extern struct MLOADER load_mod; /* Standard 31-instrument Module loader */\r
+MIKMODAPI extern struct MLOADER load_mtm; /* Multi-Tracker Module (by Renaissance) */\r
+MIKMODAPI extern struct MLOADER load_okt; /* Amiga Oktalyzer */\r
+MIKMODAPI extern struct MLOADER load_stm; /* ScreamTracker 2 (by Future Crew) */\r
+MIKMODAPI extern struct MLOADER load_stx; /* STMIK 0.2 (by Future Crew) */\r
+MIKMODAPI extern struct MLOADER load_s3m; /* ScreamTracker 3 (by Future Crew) */\r
+MIKMODAPI extern struct MLOADER load_ult; /* UltraTracker (by MAS) */\r
+MIKMODAPI extern struct MLOADER load_uni; /* MikMod and APlayer internal module format */\r
+MIKMODAPI extern struct MLOADER load_xm; /* FastTracker 2 (by Triton) */\r
+\r
+/*\r
+ * ========== Module player\r
+ */\r
+\r
+MIKMODAPI extern MODULE* Player_Load(CHAR*,int,BOOL);\r
+MIKMODAPI extern MODULE* Player_LoadFP(int,int,BOOL);\r
+MIKMODAPI extern MODULE* Player_LoadGeneric(MREADER*,int,BOOL);\r
+MIKMODAPI extern CHAR* Player_LoadTitle(CHAR*);\r
+MIKMODAPI extern CHAR* Player_LoadTitleFP(int);\r
+MIKMODAPI extern void Player_Free(MODULE*);\r
+MIKMODAPI extern void Player_Start(MODULE*);\r
+MIKMODAPI extern BOOL Player_Active(void);\r
+MIKMODAPI extern void Player_Stop(void);\r
+MIKMODAPI extern void Player_TogglePause(void);\r
+MIKMODAPI extern BOOL Player_Paused(void);\r
+MIKMODAPI extern void Player_NextPosition(void);\r
+MIKMODAPI extern void Player_PrevPosition(void);\r
+MIKMODAPI extern void Player_SetPosition(UWORD);\r
+MIKMODAPI extern BOOL Player_Muted(UBYTE);\r
+MIKMODAPI extern void Player_SetVolume(SWORD);\r
+MIKMODAPI extern MODULE* Player_GetModule(void);\r
+MIKMODAPI extern void Player_SetSpeed(UWORD);\r
+MIKMODAPI extern void Player_SetTempo(UWORD);\r
+MIKMODAPI extern void Player_Unmute(SLONG,...);\r
+MIKMODAPI extern void Player_Mute(SLONG,...);\r
+MIKMODAPI extern void Player_ToggleMute(SLONG,...);\r
+MIKMODAPI extern int Player_GetChannelVoice(UBYTE);\r
+MIKMODAPI extern UWORD Player_GetChannelPeriod(UBYTE);\r
+MIKMODAPI extern int Player_QueryVoices(UWORD numvoices, VOICEINFO *vinfo); \r
+\r
+typedef void (MikMod_player)(void);\r
+typedef MikMod_player *MikMod_player_t;\r
+\r
+MIKMODAPI extern MikMod_player_t MikMod_RegisterPlayer(MikMod_player_t);\r
+\r
+#define MUTE_EXCLUSIVE 32000\r
+#define MUTE_INCLUSIVE 32001\r
+\r
+/*\r
+ * ========== Drivers\r
+ */\r
+\r
+enum {\r
+ MD_MUSIC = 0,\r
+ MD_SNDFX\r
+};\r
+\r
+enum {\r
+ MD_HARDWARE = 0,\r
+ MD_SOFTWARE\r
+};\r
+\r
+/* Mixing flags */\r
+\r
+/* These ones take effect only after MikMod_Init or MikMod_Reset */\r
+#define DMODE_16BITS 0x0001 /* enable 16 bit output */\r
+#define DMODE_STEREO 0x0002 /* enable stereo output */\r
+#define DMODE_SOFT_SNDFX 0x0004 /* Process sound effects via software mixer */\r
+#define DMODE_SOFT_MUSIC 0x0008 /* Process music via software mixer */\r
+#define DMODE_HQMIXER 0x0010 /* Use high-quality (slower) software mixer */\r
+#define DMODE_FLOAT 0x0020 /* enable float output */\r
+/* These take effect immediately. */\r
+#define DMODE_SURROUND 0x0100 /* enable surround sound */\r
+#define DMODE_INTERP 0x0200 /* enable interpolation */\r
+#define DMODE_REVERSE 0x0400 /* reverse stereo */\r
+\r
+struct SAMPLOAD;\r
+typedef struct MDRIVER {\r
+struct MDRIVER* next;\r
+ CHAR* Name;\r
+ CHAR* Version;\r
+\r
+ UBYTE HardVoiceLimit; /* Limit of hardware mixer voices */\r
+ UBYTE SoftVoiceLimit; /* Limit of software mixer voices */\r
+\r
+ CHAR *Alias;\r
+ CHAR *CmdLineHelp;\r
+\r
+ void (*CommandLine) (CHAR*);\r
+ BOOL (*IsPresent) (void);\r
+ SWORD (*SampleLoad) (struct SAMPLOAD*,int);\r
+ void (*SampleUnload) (SWORD);\r
+ ULONG (*FreeSampleSpace) (int);\r
+ ULONG (*RealSampleLength) (int,struct SAMPLE*);\r
+ BOOL (*Init) (void);\r
+ void (*Exit) (void);\r
+ BOOL (*Reset) (void);\r
+ BOOL (*SetNumVoices) (void);\r
+ BOOL (*PlayStart) (void);\r
+ void (*PlayStop) (void);\r
+ void (*Update) (void);\r
+ void (*Pause) (void);\r
+ void (*VoiceSetVolume) (UBYTE,UWORD);\r
+ UWORD (*VoiceGetVolume) (UBYTE);\r
+ void (*VoiceSetFrequency)(UBYTE,ULONG);\r
+ ULONG (*VoiceGetFrequency)(UBYTE);\r
+ void (*VoiceSetPanning) (UBYTE,ULONG);\r
+ ULONG (*VoiceGetPanning) (UBYTE);\r
+ void (*VoicePlay) (UBYTE,SWORD,ULONG,ULONG,ULONG,ULONG,UWORD);\r
+ void (*VoiceStop) (UBYTE);\r
+ BOOL (*VoiceStopped) (UBYTE);\r
+ SLONG (*VoiceGetPosition) (UBYTE);\r
+ ULONG (*VoiceRealVolume) (UBYTE);\r
+} MDRIVER;\r
+\r
+/* These variables can be changed at ANY time and results will be immediate */\r
+MIKMODAPI extern UBYTE md_volume; /* global sound volume (0-128) */\r
+MIKMODAPI extern UBYTE md_musicvolume; /* volume of song */\r
+MIKMODAPI extern UBYTE md_sndfxvolume; /* volume of sound effects */\r
+MIKMODAPI extern UBYTE md_reverb; /* 0 = none; 15 = chaos */\r
+MIKMODAPI extern UBYTE md_pansep; /* 0 = mono; 128 == 100% (full left/right) */\r
+\r
+/* The variables below can be changed at any time, but changes will not be\r
+ implemented until MikMod_Reset is called. A call to MikMod_Reset may result\r
+ in a skip or pop in audio (depending on the soundcard driver and the settings\r
+ changed). */\r
+MIKMODAPI extern UWORD md_device; /* device */\r
+MIKMODAPI extern UWORD md_mixfreq; /* mixing frequency */\r
+MIKMODAPI extern UWORD md_mode; /* mode. See DMODE_? flags above */\r
+\r
+/* The following variable should not be changed! */\r
+MIKMODAPI extern MDRIVER* md_driver; /* Current driver in use. */\r
+\r
+/* Known drivers list */\r
+\r
+MIKMODAPI extern struct MDRIVER drv_nos; /* no sound */\r
+MIKMODAPI extern struct MDRIVER drv_pipe; /* piped output */\r
+MIKMODAPI extern struct MDRIVER drv_raw; /* raw file disk writer [music.raw] */\r
+MIKMODAPI extern struct MDRIVER drv_stdout; /* output to stdout */\r
+MIKMODAPI extern struct MDRIVER drv_wav; /* RIFF WAVE file disk writer [music.wav] */\r
+MIKMODAPI extern struct MDRIVER drv_aiff; /* AIFF file disk writer [music.aiff] */\r
+\r
+MIKMODAPI extern struct MDRIVER drv_ultra; /* Linux Ultrasound driver */\r
+MIKMODAPI extern struct MDRIVER drv_sam9407; /* Linux sam9407 driver */\r
+\r
+MIKMODAPI extern struct MDRIVER drv_AF; /* Dec Alpha AudioFile */\r
+MIKMODAPI extern struct MDRIVER drv_aix; /* AIX audio device */\r
+MIKMODAPI extern struct MDRIVER drv_alsa; /* Advanced Linux Sound Architecture (ALSA) */\r
+MIKMODAPI extern struct MDRIVER drv_esd; /* Enlightened sound daemon (EsounD) */\r
+MIKMODAPI extern struct MDRIVER drv_hp; /* HP-UX audio device */\r
+MIKMODAPI extern struct MDRIVER drv_oss; /* OpenSound System (Linux,FreeBSD...) */\r
+MIKMODAPI extern struct MDRIVER drv_sgi; /* SGI audio library */\r
+MIKMODAPI extern struct MDRIVER drv_sun; /* Sun/NetBSD/OpenBSD audio device */\r
+\r
+MIKMODAPI extern struct MDRIVER drv_dart; /* OS/2 Direct Audio RealTime */\r
+MIKMODAPI extern struct MDRIVER drv_os2; /* OS/2 MMPM/2 */\r
+\r
+MIKMODAPI extern struct MDRIVER drv_ds; /* Win32 DirectSound driver */\r
+MIKMODAPI extern struct MDRIVER drv_win; /* Win32 multimedia API driver */\r
+\r
+MIKMODAPI extern struct MDRIVER drv_mac; /* Macintosh Sound Manager driver */\r
+MIKMODAPI extern struct MDRIVER drv_osx; /* MacOS X CoreAudio Driver */\r
+\r
+/*========== Virtual channel mixer interface (for user-supplied drivers only) */\r
+\r
+MIKMODAPI extern BOOL VC_Init(void);\r
+MIKMODAPI extern void VC_Exit(void);\r
+MIKMODAPI extern BOOL VC_SetNumVoices(void);\r
+MIKMODAPI extern ULONG VC_SampleSpace(int);\r
+MIKMODAPI extern ULONG VC_SampleLength(int,SAMPLE*);\r
+\r
+MIKMODAPI extern BOOL VC_PlayStart(void);\r
+MIKMODAPI extern void VC_PlayStop(void);\r
+\r
+MIKMODAPI extern SWORD VC_SampleLoad(struct SAMPLOAD*,int);\r
+MIKMODAPI extern void VC_SampleUnload(SWORD);\r
+\r
+MIKMODAPI extern ULONG VC_WriteBytes(SBYTE*,ULONG);\r
+MIKMODAPI extern ULONG VC_SilenceBytes(SBYTE*,ULONG);\r
+\r
+MIKMODAPI extern void VC_VoiceSetVolume(UBYTE,UWORD);\r
+MIKMODAPI extern UWORD VC_VoiceGetVolume(UBYTE);\r
+MIKMODAPI extern void VC_VoiceSetFrequency(UBYTE,ULONG);\r
+MIKMODAPI extern ULONG VC_VoiceGetFrequency(UBYTE);\r
+MIKMODAPI extern void VC_VoiceSetPanning(UBYTE,ULONG);\r
+MIKMODAPI extern ULONG VC_VoiceGetPanning(UBYTE);\r
+MIKMODAPI extern void VC_VoicePlay(UBYTE,SWORD,ULONG,ULONG,ULONG,ULONG,UWORD);\r
+\r
+MIKMODAPI extern void VC_VoiceStop(UBYTE);\r
+MIKMODAPI extern BOOL VC_VoiceStopped(UBYTE);\r
+MIKMODAPI extern SLONG VC_VoiceGetPosition(UBYTE);\r
+MIKMODAPI extern ULONG VC_VoiceRealVolume(UBYTE);\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif\r
+\r
+/* ex:set ts=4: */\r