/* MikMod sound library (c) 1998-2014 Miodrag Vallat and others - see the AUTHORS file for complete list. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /*============================================================================== MikMod sound library include file ==============================================================================*/ #ifndef _MIKMOD_H_ #define _MIKMOD_H_ #include #include #ifdef __cplusplus extern "C" { #endif /* * ========== Compiler magic for shared libraries * * ========== NOTE TO WINDOWS DEVELOPERS: * If you are compiling for Windows and will link to the static library * (libmikmod.a with MinGW, or mikmod_static.lib with MSVC or LCC, etc), * you must define MIKMOD_STATIC in your project. Otherwise, dllimport * will be assumed. */ #if defined(_WIN32) || defined(__CYGWIN__) # if defined(MIKMOD_BUILD) && defined(DLL_EXPORT) /* building libmikmod as a dll for windows */ # define MIKMODAPI __declspec(dllexport) # elif defined(MIKMOD_BUILD) || defined(MIKMOD_STATIC) /* building or using static libmikmod for windows */ # define MIKMODAPI # else # define MIKMODAPI __declspec(dllimport) /* using libmikmod dll for windows */ # endif #elif defined(__OS2__) && defined(__WATCOMC__) # if defined(MIKMOD_BUILD) && defined(__SW_BD) /* building libmikmod as a dll for os/2 */ # define MIKMODAPI __declspec(dllexport) # else # define MIKMODAPI /* using dll or static libmikmod for os/2 */ # endif /* SYM_VISIBILITY should be defined if both the compiler * and the target support the visibility attributes. the * configury does that automatically. for the standalone * makefiles, etc, the developer should add the required * flags, i.e.: -DSYM_VISIBILITY -fvisibility=hidden */ #elif defined(MIKMOD_BUILD) && defined(SYM_VISIBILITY) # define MIKMODAPI __attribute__((visibility("default"))) #else # define MIKMODAPI #endif /* * ========== Library version */ #define LIBMIKMOD_VERSION_MAJOR 3L #define LIBMIKMOD_VERSION_MINOR 3L #define LIBMIKMOD_REVISION 11L #define LIBMIKMOD_VERSION \ ((LIBMIKMOD_VERSION_MAJOR<<16)| \ (LIBMIKMOD_VERSION_MINOR<< 8)| \ (LIBMIKMOD_REVISION)) MIKMODAPI extern long MikMod_GetVersion(void); /* * ========== Dependency platform headers */ #ifdef _WIN32 #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #include #include #include #define _MIKMOD_WIN32 #endif #if defined(__DJGPP__) || defined(MSDOS) || defined(__MSDOS__) || defined(__DOS__) #define _MIKMOD_DOS #endif #if defined(__OS2__) || defined(__EMX__) #define INCL_DOSSEMAPHORES #include #include #define _MIKMOD_OS2 #endif #if defined(__MORPHOS__) || defined(__AROS__) || defined(_AMIGA) || defined(__AMIGA__) || defined(__amigaos__) || defined(AMIGAOS) #include #define _MIKMOD_AMIGA #endif /* * ========== Platform independent-type definitions * (pain when it comes to cross-platform maintenance..) */ #if !(defined(_MIKMOD_OS2) || defined(_MIKMOD_WIN32)) typedef char CHAR; #endif /* BOOL: 0=false, <>0 true -- 16 bits on Amiga, int-wide on others. */ #if !(defined(_MIKMOD_OS2) || defined(_MIKMOD_WIN32) || defined(_MIKMOD_AMIGA)) typedef int BOOL; #endif /* 1 byte, signed and unsigned: */ typedef signed char SBYTE; #ifndef _MIKMOD_AMIGA typedef unsigned char UBYTE; #endif /* 2 bytes, signed and unsigned: */ #ifndef __LCC__ typedef signed short int SWORD; #endif #if !(defined(__LCC__) || defined(_MIKMOD_AMIGA)) typedef unsigned short int UWORD; #endif /* 4 bytes, signed and unsigned: */ #if defined(_LP64) || defined(__LP64__) || defined(__arch64__) || defined(__alpha) || defined(__x86_64) || defined(__powerpc64__) /* 64 bit architectures: */ typedef signed int SLONG; #if !(defined(_WIN32) || defined(_MIKMOD_AMIGA)) typedef unsigned int ULONG; #endif #else /* 32 bit architectures: */ typedef signed long int SLONG; #if !(defined(_MIKMOD_OS2) || defined(_MIKMOD_WIN32) || defined(_MIKMOD_AMIGA)) typedef unsigned long int ULONG; #endif #endif /* make sure types are of correct sizes: */ typedef int __mikmod_typetest [ ( (sizeof(SBYTE)==1) && (sizeof(UBYTE)==1) && (sizeof(SWORD)==2) && (sizeof(UWORD)==2) && (sizeof(SLONG)==4) && (sizeof(ULONG)==4) #ifndef _MIKMOD_AMIGA && (sizeof(BOOL) == sizeof(int)) #endif && (sizeof(CHAR) == sizeof(char)) ) * 2 - 1 ]; /* * ========== Error codes */ enum { MMERR_OPENING_FILE = 1, MMERR_OUT_OF_MEMORY, MMERR_DYNAMIC_LINKING, MMERR_SAMPLE_TOO_BIG, MMERR_OUT_OF_HANDLES, MMERR_UNKNOWN_WAVE_TYPE, MMERR_LOADING_PATTERN, MMERR_LOADING_TRACK, MMERR_LOADING_HEADER, MMERR_LOADING_SAMPLEINFO, MMERR_NOT_A_MODULE, MMERR_NOT_A_STREAM, MMERR_MED_SYNTHSAMPLES, MMERR_ITPACK_INVALID_DATA, MMERR_DETECTING_DEVICE, MMERR_INVALID_DEVICE, MMERR_INITIALIZING_MIXER, MMERR_OPENING_AUDIO, MMERR_8BIT_ONLY, MMERR_16BIT_ONLY, MMERR_STEREO_ONLY, MMERR_ULAW, MMERR_NON_BLOCK, MMERR_AF_AUDIO_PORT, MMERR_AIX_CONFIG_INIT, MMERR_AIX_CONFIG_CONTROL, MMERR_AIX_CONFIG_START, MMERR_GUS_SETTINGS, MMERR_GUS_RESET, MMERR_GUS_TIMER, MMERR_HP_SETSAMPLESIZE, MMERR_HP_SETSPEED, MMERR_HP_CHANNELS, MMERR_HP_AUDIO_OUTPUT, MMERR_HP_AUDIO_DESC, MMERR_HP_BUFFERSIZE, MMERR_OSS_SETFRAGMENT, MMERR_OSS_SETSAMPLESIZE, MMERR_OSS_SETSTEREO, MMERR_OSS_SETSPEED, MMERR_SGI_SPEED, MMERR_SGI_16BIT, MMERR_SGI_8BIT, MMERR_SGI_STEREO, MMERR_SGI_MONO, MMERR_SUN_INIT, MMERR_OS2_MIXSETUP, MMERR_OS2_SEMAPHORE, MMERR_OS2_TIMER, MMERR_OS2_THREAD, MMERR_DS_PRIORITY, MMERR_DS_BUFFER, MMERR_DS_FORMAT, MMERR_DS_NOTIFY, MMERR_DS_EVENT, MMERR_DS_THREAD, MMERR_DS_UPDATE, MMERR_WINMM_HANDLE, MMERR_WINMM_ALLOCATED, MMERR_WINMM_DEVICEID, MMERR_WINMM_FORMAT, MMERR_WINMM_UNKNOWN, MMERR_MAC_SPEED, MMERR_MAC_START, MMERR_OSX_UNKNOWN_DEVICE, MMERR_OSX_BAD_PROPERTY, MMERR_OSX_UNSUPPORTED_FORMAT, MMERR_OSX_SET_STEREO, MMERR_OSX_BUFFER_ALLOC, MMERR_OSX_ADD_IO_PROC, MMERR_OSX_DEVICE_START, MMERR_OSX_PTHREAD, MMERR_DOSWSS_STARTDMA, MMERR_DOSSB_STARTDMA, MMERR_NO_FLOAT32,/* should actually be after MMERR_ULAW or something */ MMERR_OPENAL_CREATECTX, MMERR_OPENAL_CTXCURRENT, MMERR_OPENAL_GENBUFFERS, MMERR_OPENAL_GENSOURCES, MMERR_OPENAL_SOURCE, MMERR_OPENAL_QUEUEBUFFERS, MMERR_OPENAL_UNQUEUEBUFFERS, MMERR_OPENAL_BUFFERDATA, MMERR_OPENAL_GETSOURCE, MMERR_OPENAL_SOURCEPLAY, MMERR_OPENAL_SOURCESTOP, MMERR_ALSA_NOCONFIG, MMERR_ALSA_SETPARAMS, MMERR_ALSA_SETFORMAT, MMERR_ALSA_SETRATE, MMERR_ALSA_SETCHANNELS, MMERR_ALSA_BUFFERSIZE, MMERR_ALSA_PCM_START, MMERR_ALSA_PCM_WRITE, MMERR_ALSA_PCM_RECOVER, MMERR_SNDIO_SETPARAMS, MMERR_SNDIO_BADPARAMS, MMERR_MAX }; /* * ========== Error handling */ typedef void (MikMod_handler)(void); typedef MikMod_handler *MikMod_handler_t; MIKMODAPI extern int MikMod_errno; MIKMODAPI extern BOOL MikMod_critical; MIKMODAPI extern const char *MikMod_strerror(int); MIKMODAPI extern MikMod_handler_t MikMod_RegisterErrorHandler(MikMod_handler_t); /* * ========== Library initialization and core functions */ struct MDRIVER; MIKMODAPI extern void MikMod_RegisterAllDrivers(void); MIKMODAPI extern CHAR* MikMod_InfoDriver(void); MIKMODAPI extern void MikMod_RegisterDriver(struct MDRIVER*); MIKMODAPI extern int MikMod_DriverFromAlias(const CHAR*); MIKMODAPI extern struct MDRIVER *MikMod_DriverByOrdinal(int); MIKMODAPI extern int MikMod_Init(const CHAR*); MIKMODAPI extern void MikMod_Exit(void); MIKMODAPI extern int MikMod_Reset(const CHAR*); MIKMODAPI extern int MikMod_SetNumVoices(int,int); MIKMODAPI extern BOOL MikMod_Active(void); MIKMODAPI extern int MikMod_EnableOutput(void); MIKMODAPI extern void MikMod_DisableOutput(void); MIKMODAPI extern void MikMod_Update(void); MIKMODAPI extern BOOL MikMod_InitThreads(void); MIKMODAPI extern void MikMod_Lock(void); MIKMODAPI extern void MikMod_Unlock(void); MIKMODAPI extern void* MikMod_malloc(size_t); MIKMODAPI extern void* MikMod_calloc(size_t,size_t); MIKMODAPI extern void* MikMod_realloc(void*,size_t); MIKMODAPI extern CHAR* MikMod_strdup(const CHAR*); MIKMODAPI extern void MikMod_free(void*); /* frees if ptr != NULL */ /* * ========== Reader, Writer */ typedef struct MREADER { int (*Seek)(struct MREADER*,long,int); long (*Tell)(struct MREADER*); BOOL (*Read)(struct MREADER*,void*,size_t); int (*Get)(struct MREADER*); BOOL (*Eof)(struct MREADER*); long iobase; long prev_iobase; } MREADER; typedef struct MWRITER { int (*Seek)(struct MWRITER*, long, int); long (*Tell)(struct MWRITER*); BOOL (*Write)(struct MWRITER*, const void*, size_t); int (*Put)(struct MWRITER*, int); } MWRITER; /* * ========== Samples */ /* Sample playback should not be interrupted */ #define SFX_CRITICAL 1 /* Sample format [loading and in-memory] flags: */ #define SF_16BITS 0x0001 #define SF_STEREO 0x0002 #define SF_SIGNED 0x0004 #define SF_BIG_ENDIAN 0x0008 #define SF_DELTA 0x0010 #define SF_ITPACKED 0x0020 #define SF_FORMATMASK 0x003F /* General Playback flags */ #define SF_LOOP 0x0100 #define SF_BIDI 0x0200 #define SF_REVERSE 0x0400 #define SF_SUSTAIN 0x0800 #define SF_PLAYBACKMASK 0x0C00 /* Module-only Playback Flags */ #define SF_OWNPAN 0x1000 #define SF_UST_LOOP 0x2000 #define SF_EXTRAPLAYBACKMASK 0x3000 /* Panning constants */ #define PAN_LEFT 0 #define PAN_HALFLEFT 64 #define PAN_CENTER 128 #define PAN_HALFRIGHT 192 #define PAN_RIGHT 255 #define PAN_SURROUND 512 /* panning value for Dolby Surround */ typedef struct SAMPLE { SWORD panning; /* panning (0-255 or PAN_SURROUND) */ ULONG speed; /* Base playing speed/frequency of note */ UBYTE volume; /* volume 0-64 */ UWORD inflags; /* sample format on disk */ UWORD flags; /* sample format in memory */ 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! */ /* 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 */ 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 */ void (*onfree)(void *ctx); /* called from Sample_Free if not NULL */ void *ctx; /* context passed to previous function*/ } SAMPLE; /* Sample functions */ MIKMODAPI extern SAMPLE *Sample_LoadRaw(const CHAR *,ULONG rate, ULONG channel, ULONG flags); MIKMODAPI extern SAMPLE *Sample_LoadRawFP(FILE *fp,ULONG rate,ULONG channel, ULONG flags); MIKMODAPI extern SAMPLE *Sample_LoadRawMem(const char *buf, int len, ULONG rate, ULONG channel, ULONG flags); MIKMODAPI extern SAMPLE *Sample_LoadRawGeneric(MREADER*reader,ULONG rate, ULONG channel, ULONG flags); MIKMODAPI extern SAMPLE *Sample_Load(const CHAR*); MIKMODAPI extern SAMPLE *Sample_LoadFP(FILE*); MIKMODAPI extern SAMPLE *Sample_LoadMem(const char *buf, int len); MIKMODAPI extern SAMPLE *Sample_LoadGeneric(MREADER*); MIKMODAPI extern void Sample_Free(SAMPLE*); MIKMODAPI extern SBYTE Sample_Play(SAMPLE*,ULONG,UBYTE); MIKMODAPI extern void Voice_SetVolume(SBYTE,UWORD); MIKMODAPI extern UWORD Voice_GetVolume(SBYTE); MIKMODAPI extern void Voice_SetFrequency(SBYTE,ULONG); MIKMODAPI extern ULONG Voice_GetFrequency(SBYTE); MIKMODAPI extern void Voice_SetPanning(SBYTE,ULONG); MIKMODAPI extern ULONG Voice_GetPanning(SBYTE); MIKMODAPI extern void Voice_Play(SBYTE,SAMPLE*,ULONG); MIKMODAPI extern void Voice_Stop(SBYTE); MIKMODAPI extern BOOL Voice_Stopped(SBYTE); MIKMODAPI extern SLONG Voice_GetPosition(SBYTE); MIKMODAPI extern ULONG Voice_RealVolume(SBYTE); /* * ========== Internal module representation (UniMod) */ /* Instrument definition - for information only, the only field which may be of use in user programs is the name field */ /* Instrument note count */ #define INSTNOTES 120 /* Envelope point */ typedef struct ENVPT { SWORD pos; SWORD val; } ENVPT; /* Envelope point count */ #define ENVPOINTS 32 /* Instrument structure */ typedef struct INSTRUMENT { CHAR* insname; UBYTE flags; UWORD samplenumber[INSTNOTES]; UBYTE samplenote[INSTNOTES]; UBYTE nnatype; UBYTE dca; /* duplicate check action */ UBYTE dct; /* duplicate check type */ UBYTE globvol; UWORD volfade; SWORD panning; /* instrument-based panning var */ UBYTE pitpansep; /* pitch pan separation (0 to 255) */ UBYTE pitpancenter; /* pitch pan center (0 to 119) */ UBYTE rvolvar; /* random volume varations (0 - 100%) */ UBYTE rpanvar; /* random panning varations (0 - 100%) */ /* volume envelope */ UBYTE volflg; /* bit 0: on 1: sustain 2: loop */ UBYTE volpts; UBYTE volsusbeg; UBYTE volsusend; UBYTE volbeg; UBYTE volend; ENVPT volenv[ENVPOINTS]; /* panning envelope */ UBYTE panflg; /* bit 0: on 1: sustain 2: loop */ UBYTE panpts; UBYTE pansusbeg; UBYTE pansusend; UBYTE panbeg; UBYTE panend; ENVPT panenv[ENVPOINTS]; /* pitch envelope */ UBYTE pitflg; /* bit 0: on 1: sustain 2: loop */ UBYTE pitpts; UBYTE pitsusbeg; UBYTE pitsusend; UBYTE pitbeg; UBYTE pitend; ENVPT pitenv[ENVPOINTS]; } INSTRUMENT; struct MP_CONTROL; struct MP_VOICE; /* Module definition */ /* maximum master channels supported */ #define UF_MAXCHAN 64 /* Module flags */ #define UF_XMPERIODS 0x0001 /* XM periods / finetuning */ #define UF_LINEAR 0x0002 /* LINEAR periods (UF_XMPERIODS must be set) */ #define UF_INST 0x0004 /* Instruments are used */ #define UF_NNA 0x0008 /* IT: NNA used, set numvoices rather than numchn */ #define UF_S3MSLIDES 0x0010 /* uses old S3M volume slides */ #define UF_BGSLIDES 0x0020 /* continue volume slides in the background */ #define UF_HIGHBPM 0x0040 /* MED: can use >255 bpm */ #define UF_NOWRAP 0x0080 /* XM-type (i.e. illogical) pattern break semantics */ #define UF_ARPMEM 0x0100 /* IT: need arpeggio memory */ #define UF_FT2QUIRKS 0x0200 /* emulate some FT2 replay quirks */ #define UF_PANNING 0x0400 /* module uses panning effects or have non-tracker default initial panning */ typedef struct MODULE { /* general module information */ CHAR* songname; /* name of the song */ CHAR* modtype; /* string type of module loaded */ CHAR* comment; /* module comments */ UWORD flags; /* See module flags above */ UBYTE numchn; /* number of module channels */ UBYTE numvoices; /* max # voices used for full NNA playback */ UWORD numpos; /* number of positions in this song */ UWORD numpat; /* number of patterns in this song */ UWORD numins; /* number of instruments */ UWORD numsmp; /* number of samples */ struct INSTRUMENT* instruments; /* all instruments */ struct SAMPLE* samples; /* all samples */ UBYTE realchn; /* real number of channels used */ UBYTE totalchn; /* total number of channels used (incl NNAs) */ /* playback settings */ UWORD reppos; /* restart position */ UBYTE initspeed; /* initial song speed */ UWORD inittempo; /* initial song tempo */ UBYTE initvolume; /* initial global volume (0 - 128) */ UWORD panning[UF_MAXCHAN]; /* panning positions */ UBYTE chanvol[UF_MAXCHAN]; /* channel positions */ UWORD bpm; /* current beats-per-minute speed */ UWORD sngspd; /* current song speed */ SWORD volume; /* song volume (0-128) (or user volume) */ BOOL extspd; /* extended speed flag (default enabled) */ BOOL panflag; /* panning flag (default enabled) */ BOOL wrap; /* wrap module ? (default disabled) */ BOOL loop; /* allow module to loop ? (default enabled) */ BOOL fadeout; /* volume fade out during last pattern */ UWORD patpos; /* current row number */ SWORD sngpos; /* current song position */ ULONG sngtime; /* current song time in 2^-10 seconds */ SWORD relspd; /* relative speed factor */ /* internal module representation */ UWORD numtrk; /* number of tracks */ UBYTE** tracks; /* array of numtrk pointers to tracks */ UWORD* patterns; /* array of Patterns */ UWORD* pattrows; /* array of number of rows for each pattern */ UWORD* positions; /* all positions */ BOOL forbid; /* if true, no player update! */ UWORD numrow; /* number of rows on current pattern */ UWORD vbtick; /* tick counter (counts from 0 to sngspd) */ UWORD sngremainder;/* used for song time computation */ struct MP_CONTROL* control; /* Effects Channel info (size pf->numchn) */ struct MP_VOICE* voice; /* Audio Voice information (size md_numchn) */ UBYTE globalslide; /* global volume slide rate */ UBYTE pat_repcrazy;/* module has just looped to position -1 */ UWORD patbrk; /* position where to start a new pattern */ UBYTE patdly; /* patterndelay counter (command memory) */ UBYTE patdly2; /* patterndelay counter (real one) */ SWORD posjmp; /* flag to indicate a jump is needed... */ UWORD bpmlimit; /* threshold to detect bpm or speed values */ } MODULE; /* This structure is used to query current playing voices status */ typedef struct VOICEINFO { INSTRUMENT* i; /* Current channel instrument */ SAMPLE* s; /* Current channel sample */ SWORD panning; /* panning position */ SBYTE volume; /* channel's "global" volume (0..64) */ UWORD period; /* period to play the sample at */ UBYTE kick; /* if true = sample has been restarted */ } VOICEINFO; /* * ========== Module loaders */ struct MLOADER; MIKMODAPI extern CHAR* MikMod_InfoLoader(void); MIKMODAPI extern void MikMod_RegisterAllLoaders(void); MIKMODAPI extern void MikMod_RegisterLoader(struct MLOADER*); MIKMODAPI extern struct MLOADER load_669; /* 669 and Extended-669 (by Tran/Renaissance) */ MIKMODAPI extern struct MLOADER load_amf; /* DMP Advanced Module Format (by Otto Chrons) */ MIKMODAPI extern struct MLOADER load_asy; /* ASYLUM Music Format 1.0 */ MIKMODAPI extern struct MLOADER load_dsm; /* DSIK internal module format */ MIKMODAPI extern struct MLOADER load_far; /* Farandole Composer (by Daniel Potter) */ MIKMODAPI extern struct MLOADER load_gdm; /* General DigiMusic (by Edward Schlunder) */ MIKMODAPI extern struct MLOADER load_gt2; /* Graoumf tracker */ MIKMODAPI extern struct MLOADER load_it; /* Impulse Tracker (by Jeffrey Lim) */ MIKMODAPI extern struct MLOADER load_imf; /* Imago Orpheus (by Lutz Roeder) */ MIKMODAPI extern struct MLOADER load_med; /* Amiga MED modules (by Teijo Kinnunen) */ MIKMODAPI extern struct MLOADER load_m15; /* Soundtracker 15-instrument */ MIKMODAPI extern struct MLOADER load_mod; /* Standard 31-instrument Module loader */ MIKMODAPI extern struct MLOADER load_mtm; /* Multi-Tracker Module (by Renaissance) */ MIKMODAPI extern struct MLOADER load_okt; /* Amiga Oktalyzer */ MIKMODAPI extern struct MLOADER load_stm; /* ScreamTracker 2 (by Future Crew) */ MIKMODAPI extern struct MLOADER load_stx; /* STMIK 0.2 (by Future Crew) */ MIKMODAPI extern struct MLOADER load_s3m; /* ScreamTracker 3 (by Future Crew) */ MIKMODAPI extern struct MLOADER load_ult; /* UltraTracker (by MAS) */ MIKMODAPI extern struct MLOADER load_umx; /* Unreal UMX container of Epic Games */ MIKMODAPI extern struct MLOADER load_uni; /* MikMod and APlayer internal module format */ MIKMODAPI extern struct MLOADER load_xm; /* FastTracker 2 (by Triton) */ /* * ========== Module player */ MIKMODAPI extern MODULE* Player_Load(const CHAR*,int,BOOL); MIKMODAPI extern MODULE* Player_LoadFP(FILE*,int,BOOL); MIKMODAPI extern MODULE* Player_LoadMem(const char *buffer,int len,int maxchan,BOOL curious); MIKMODAPI extern MODULE* Player_LoadGeneric(MREADER*,int,BOOL); MIKMODAPI extern CHAR* Player_LoadTitle(const CHAR*); MIKMODAPI extern CHAR* Player_LoadTitleFP(FILE*); MIKMODAPI extern CHAR* Player_LoadTitleMem(const char *buffer,int len); MIKMODAPI extern CHAR* Player_LoadTitleGeneric(MREADER*); MIKMODAPI extern void Player_Free(MODULE*); MIKMODAPI extern void Player_Start(MODULE*); MIKMODAPI extern BOOL Player_Active(void); MIKMODAPI extern void Player_Stop(void); MIKMODAPI extern void Player_TogglePause(void); MIKMODAPI extern BOOL Player_Paused(void); MIKMODAPI extern void Player_NextPosition(void); MIKMODAPI extern void Player_PrevPosition(void); MIKMODAPI extern void Player_SetPosition(UWORD); MIKMODAPI extern BOOL Player_Muted(UBYTE); MIKMODAPI extern void Player_SetVolume(SWORD); MIKMODAPI extern MODULE* Player_GetModule(void); MIKMODAPI extern void Player_SetSpeed(UWORD); MIKMODAPI extern void Player_SetTempo(UWORD); MIKMODAPI extern void Player_Unmute(SLONG,...); MIKMODAPI extern void Player_Mute(SLONG,...); MIKMODAPI extern void Player_ToggleMute(SLONG,...); MIKMODAPI extern int Player_GetChannelVoice(UBYTE); MIKMODAPI extern UWORD Player_GetChannelPeriod(UBYTE); MIKMODAPI extern int Player_QueryVoices(UWORD numvoices, VOICEINFO *vinfo); MIKMODAPI extern int Player_GetRow(void); MIKMODAPI extern int Player_GetOrder(void); typedef void (*MikMod_player_t)(void); typedef void (*MikMod_callback_t)(unsigned char *data, size_t len); MIKMODAPI extern MikMod_player_t MikMod_RegisterPlayer(MikMod_player_t); #define MUTE_EXCLUSIVE 32000 #define MUTE_INCLUSIVE 32001 /* * ========== Drivers */ enum { MD_MUSIC = 0, MD_SNDFX }; enum { MD_HARDWARE = 0, MD_SOFTWARE }; /* Mixing flags */ /* These ones take effect only after MikMod_Init or MikMod_Reset */ #define DMODE_16BITS 0x0001 /* enable 16 bit output */ #define DMODE_STEREO 0x0002 /* enable stereo output */ #define DMODE_SOFT_SNDFX 0x0004 /* Process sound effects via software mixer */ #define DMODE_SOFT_MUSIC 0x0008 /* Process music via software mixer */ #define DMODE_HQMIXER 0x0010 /* Use high-quality (slower) software mixer */ #define DMODE_FLOAT 0x0020 /* enable float output */ /* These take effect immediately. */ #define DMODE_SURROUND 0x0100 /* enable surround sound */ #define DMODE_INTERP 0x0200 /* enable interpolation */ #define DMODE_REVERSE 0x0400 /* reverse stereo */ #define DMODE_SIMDMIXER 0x0800 /* enable SIMD mixing */ #define DMODE_NOISEREDUCTION 0x1000 /* Low pass filtering */ struct SAMPLOAD; typedef struct MDRIVER { struct MDRIVER* next; const CHAR* Name; const CHAR* Version; UBYTE HardVoiceLimit; /* Limit of hardware mixer voices */ UBYTE SoftVoiceLimit; /* Limit of software mixer voices */ const CHAR* Alias; const CHAR* CmdLineHelp; void (*CommandLine) (const CHAR*); BOOL (*IsPresent) (void); SWORD (*SampleLoad) (struct SAMPLOAD*,int); void (*SampleUnload) (SWORD); ULONG (*FreeSampleSpace) (int); ULONG (*RealSampleLength) (int,struct SAMPLE*); int (*Init) (void); void (*Exit) (void); int (*Reset) (void); int (*SetNumVoices) (void); int (*PlayStart) (void); void (*PlayStop) (void); void (*Update) (void); void (*Pause) (void); void (*VoiceSetVolume) (UBYTE,UWORD); UWORD (*VoiceGetVolume) (UBYTE); void (*VoiceSetFrequency)(UBYTE,ULONG); ULONG (*VoiceGetFrequency)(UBYTE); void (*VoiceSetPanning) (UBYTE,ULONG); ULONG (*VoiceGetPanning) (UBYTE); void (*VoicePlay) (UBYTE,SWORD,ULONG,ULONG,ULONG,ULONG,UWORD); void (*VoiceStop) (UBYTE); BOOL (*VoiceStopped) (UBYTE); SLONG (*VoiceGetPosition) (UBYTE); ULONG (*VoiceRealVolume) (UBYTE); } MDRIVER; /* These variables can be changed at ANY time and results will be immediate */ MIKMODAPI extern UBYTE md_volume; /* global sound volume (0-128) */ MIKMODAPI extern UBYTE md_musicvolume; /* volume of song */ MIKMODAPI extern UBYTE md_sndfxvolume; /* volume of sound effects */ MIKMODAPI extern UBYTE md_reverb; /* 0 = none; 15 = chaos */ MIKMODAPI 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 implemented 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). */ MIKMODAPI extern UWORD md_device; /* device */ MIKMODAPI extern UWORD md_mixfreq; /* mixing frequency */ MIKMODAPI extern UWORD md_mode; /* mode. See DMODE_? flags above */ /* The following variable should not be changed! */ MIKMODAPI extern MDRIVER* md_driver; /* Current driver in use. */ /* Known drivers list */ MIKMODAPI extern struct MDRIVER drv_nos; /* no sound */ MIKMODAPI extern struct MDRIVER drv_pipe; /* piped output */ MIKMODAPI extern struct MDRIVER drv_raw; /* raw file disk writer [music.raw] */ MIKMODAPI extern struct MDRIVER drv_stdout; /* output to stdout */ MIKMODAPI extern struct MDRIVER drv_wav; /* RIFF WAVE file disk writer [music.wav] */ MIKMODAPI extern struct MDRIVER drv_aiff; /* AIFF file disk writer [music.aiff] */ MIKMODAPI extern struct MDRIVER drv_ultra; /* Linux Ultrasound driver */ MIKMODAPI extern struct MDRIVER drv_sam9407;/* Linux sam9407 driver */ MIKMODAPI extern struct MDRIVER drv_AF; /* Dec Alpha AudioFile */ MIKMODAPI extern struct MDRIVER drv_ahi; /* Amiga AHI */ MIKMODAPI extern struct MDRIVER drv_aix; /* AIX audio device */ MIKMODAPI extern struct MDRIVER drv_alsa; /* Advanced Linux Sound Architecture (ALSA) */ MIKMODAPI extern struct MDRIVER drv_esd; /* Enlightened sound daemon (EsounD) */ MIKMODAPI extern struct MDRIVER drv_pulseaudio; /* PulseAudio */ MIKMODAPI extern struct MDRIVER drv_hp; /* HP-UX audio device */ MIKMODAPI extern struct MDRIVER drv_nas; /* Network Audio System (NAS) */ MIKMODAPI extern struct MDRIVER drv_oss; /* OpenSound System (Linux,FreeBSD...) */ MIKMODAPI extern struct MDRIVER drv_openal; /* OpenAL driver */ MIKMODAPI extern struct MDRIVER drv_sdl; /* SDL audio driver */ MIKMODAPI extern struct MDRIVER drv_sgi; /* SGI audio library */ MIKMODAPI extern struct MDRIVER drv_sndio; /* OpenBSD sndio */ MIKMODAPI extern struct MDRIVER drv_sun; /* Sun/NetBSD/OpenBSD audio device */ MIKMODAPI extern struct MDRIVER drv_dart; /* OS/2 Direct Audio RealTime */ MIKMODAPI extern struct MDRIVER drv_os2; /* OS/2 MMPM/2 */ MIKMODAPI extern struct MDRIVER drv_ds; /* Win32 DirectSound driver */ MIKMODAPI extern struct MDRIVER drv_xaudio2;/* Win32 XAudio2 driver */ MIKMODAPI extern struct MDRIVER drv_win; /* Win32 multimedia API driver */ MIKMODAPI extern struct MDRIVER drv_mac; /* Macintosh Sound Manager driver */ MIKMODAPI extern struct MDRIVER drv_osx; /* MacOS X CoreAudio Driver */ MIKMODAPI extern struct MDRIVER drv_dc; /* Dreamcast driver */ MIKMODAPI extern struct MDRIVER drv_gp32; /* GP32 Sound driver */ MIKMODAPI extern struct MDRIVER drv_psp; /* PlayStation Portable driver */ MIKMODAPI extern struct MDRIVER drv_wss; /* DOS WSS driver */ MIKMODAPI extern struct MDRIVER drv_sb; /* DOS S/B driver */ MIKMODAPI extern struct MDRIVER drv_osles; /* OpenSL ES driver for android */ /*========== Virtual channel mixer interface (for user-supplied drivers only) */ MIKMODAPI extern int VC_Init(void); MIKMODAPI extern void VC_Exit(void); MIKMODAPI extern void VC_SetCallback(MikMod_callback_t callback); MIKMODAPI extern int VC_SetNumVoices(void); MIKMODAPI extern ULONG VC_SampleSpace(int); MIKMODAPI extern ULONG VC_SampleLength(int,SAMPLE*); MIKMODAPI extern int VC_PlayStart(void); MIKMODAPI extern void VC_PlayStop(void); MIKMODAPI extern SWORD VC_SampleLoad(struct SAMPLOAD*,int); MIKMODAPI extern void VC_SampleUnload(SWORD); MIKMODAPI extern ULONG VC_WriteBytes(SBYTE*,ULONG); MIKMODAPI extern ULONG VC_SilenceBytes(SBYTE*,ULONG); MIKMODAPI extern void VC_VoiceSetVolume(UBYTE,UWORD); MIKMODAPI extern UWORD VC_VoiceGetVolume(UBYTE); MIKMODAPI extern void VC_VoiceSetFrequency(UBYTE,ULONG); MIKMODAPI extern ULONG VC_VoiceGetFrequency(UBYTE); MIKMODAPI extern void VC_VoiceSetPanning(UBYTE,ULONG); MIKMODAPI extern ULONG VC_VoiceGetPanning(UBYTE); MIKMODAPI extern void VC_VoicePlay(UBYTE,SWORD,ULONG,ULONG,ULONG,ULONG,UWORD); MIKMODAPI extern void VC_VoiceStop(UBYTE); MIKMODAPI extern BOOL VC_VoiceStopped(UBYTE); MIKMODAPI extern SLONG VC_VoiceGetPosition(UBYTE); MIKMODAPI extern ULONG VC_VoiceRealVolume(UBYTE); #ifdef __cplusplus } #endif #endif /* ex:set ts=4: */