📄 mikmod_internals.h
字号:
/* MikMod sound library (c) 1998, 1999, 2000 Miodrag Vallat and others - see file AUTHORS 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.*//*============================================================================== $Id: mikmod_internals.h,v 1.4 2004/02/18 13:29:17 raph Exp $ MikMod sound library internal definitions==============================================================================*/#ifndef _MIKMOD_INTERNALS_H#define _MIKMOD_INTERNALS_H#ifdef __cplusplusextern "C" {#endif#ifdef HAVE_MALLOC_H#include <malloc.h>#endif#include <stdarg.h>#if defined(__OS2__)||defined(__EMX__)||defined(WIN32)#define strcasecmp(s,t) stricmp(s,t)#endif#include <mikmod_build.h>#ifdef WIN32#pragma warning(disable:4761)#endif/*========== More type definitions *//* SLONGLONG: 64bit, signed */#if defined (__arch64__) || defined(__alpha)typedef long SLONGLONG;#define NATIVE_64BIT_INT#elif defined(__WATCOMC__)typedef __int64 SLONGLONG;#elif defined(WIN32) && !defined(__MWERKS__)typedef LONGLONG SLONGLONG;#elif macintosh && !TYPE_LONGLONG#include <Types.h>typedef SInt64 SLONGLONG;#elsetypedef long long SLONGLONG;#endif/*========== Error handling */#define _mm_errno MikMod_errno#define _mm_critical MikMod_criticalextern MikMod_handler_t _mm_errorhandler;/*========== Memory allocation */extern void* _mm_malloc(size_t);extern void* _mm_calloc(size_t,size_t);#define _mm_free(p) do { if (p) free(p); p = NULL; } while(0)/*========== MT stuff */#ifdef HAVE_PTHREAD#include <pthread.h>#define DECLARE_MUTEX(name) \ extern pthread_mutex_t _mm_mutex_##name#define MUTEX_LOCK(name) \ pthread_mutex_lock(&_mm_mutex_##name)#define MUTEX_UNLOCK(name) \ pthread_mutex_unlock(&_mm_mutex_##name)#elif defined(__OS2__)||defined(__EMX__)#define DECLARE_MUTEX(name) \ extern HMTX _mm_mutex_##name#define MUTEX_LOCK(name) \ if(_mm_mutex_##name) \ DosRequestMutexSem(_mm_mutex_##name,SEM_INDEFINITE_WAIT)#define MUTEX_UNLOCK(name) \ if(_mm_mutex_##name) \ DosReleaseMutexSem(_mm_mutex_##name)#elif defined(WIN32)#include <windows.h>#define DECLARE_MUTEX(name) \ extern HANDLE _mm_mutex_##name#define MUTEX_LOCK(name) \ if(_mm_mutex_##name) \ WaitForSingleObject(_mm_mutex_##name,INFINITE)#define MUTEX_UNLOCK(name) \ if(_mm_mutex_##name) \ ReleaseMutex(_mm_mutex_##name)#else#define DECLARE_MUTEX(name) \ extern void *_mm_mutex_##name#define MUTEX_LOCK(name)#define MUTEX_UNLOCK(name)#endifDECLARE_MUTEX(lists);DECLARE_MUTEX(vars);/*========== Portable file I/O */extern MREADER* _mm_new_file_reader(FILE* fp);extern void _mm_delete_file_reader(MREADER*);extern MWRITER* _mm_new_file_writer(FILE *fp);extern void _mm_delete_file_writer(MWRITER*);extern BOOL _mm_FileExists(CHAR *fname);#define _mm_write_SBYTE(x,y) y->Put(y,(int)x)#define _mm_write_UBYTE(x,y) y->Put(y,(int)x)#define _mm_read_SBYTE(x) (SBYTE)x->Get(x)#define _mm_read_UBYTE(x) (UBYTE)x->Get(x)#define _mm_write_SBYTES(x,y,z) z->Write(z,(void *)x,y)#define _mm_write_UBYTES(x,y,z) z->Write(z,(void *)x,y)#define _mm_read_SBYTES(x,y,z) z->Read(z,(void *)x,y)#define _mm_read_UBYTES(x,y,z) z->Read(z,(void *)x,y)#define _mm_fseek(x,y,z) x->Seek(x,y,z)#define _mm_ftell(x) x->Tell(x)#define _mm_rewind(x) _mm_fseek(x,0,SEEK_SET)#define _mm_eof(x) x->Eof(x)extern void _mm_iobase_setcur(MREADER*);extern void _mm_iobase_revert(void);extern FILE *_mm_fopen(CHAR*,CHAR*);extern int _mm_fclose(FILE *);extern void _mm_write_string(CHAR*,MWRITER*);extern int _mm_read_string (CHAR*,int,MREADER*);extern SWORD _mm_read_M_SWORD(MREADER*);extern SWORD _mm_read_I_SWORD(MREADER*);extern UWORD _mm_read_M_UWORD(MREADER*);extern UWORD _mm_read_I_UWORD(MREADER*);extern SLONG _mm_read_M_SLONG(MREADER*);extern SLONG _mm_read_I_SLONG(MREADER*);extern ULONG _mm_read_M_ULONG(MREADER*);extern ULONG _mm_read_I_ULONG(MREADER*);extern int _mm_read_M_SWORDS(SWORD*,int,MREADER*);extern int _mm_read_I_SWORDS(SWORD*,int,MREADER*);extern int _mm_read_M_UWORDS(UWORD*,int,MREADER*);extern int _mm_read_I_UWORDS(UWORD*,int,MREADER*);extern int _mm_read_M_SLONGS(SLONG*,int,MREADER*);extern int _mm_read_I_SLONGS(SLONG*,int,MREADER*);extern int _mm_read_M_ULONGS(ULONG*,int,MREADER*);extern int _mm_read_I_ULONGS(ULONG*,int,MREADER*);extern void _mm_write_M_SWORD(SWORD,MWRITER*);extern void _mm_write_I_SWORD(SWORD,MWRITER*);extern void _mm_write_M_UWORD(UWORD,MWRITER*);extern void _mm_write_I_UWORD(UWORD,MWRITER*);extern void _mm_write_M_SLONG(SLONG,MWRITER*);extern void _mm_write_I_SLONG(SLONG,MWRITER*);extern void _mm_write_M_ULONG(ULONG,MWRITER*);extern void _mm_write_I_ULONG(ULONG,MWRITER*);extern void _mm_write_M_SWORDS(SWORD*,int,MWRITER*);extern void _mm_write_I_SWORDS(SWORD*,int,MWRITER*);extern void _mm_write_M_UWORDS(UWORD*,int,MWRITER*);extern void _mm_write_I_UWORDS(UWORD*,int,MWRITER*);extern void _mm_write_M_SLONGS(SLONG*,int,MWRITER*);extern void _mm_write_I_SLONGS(SLONG*,int,MWRITER*);extern void _mm_write_M_ULONGS(ULONG*,int,MWRITER*);extern void _mm_write_I_ULONGS(ULONG*,int,MWRITER*);/*========== Samples *//* 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; MREADER* reader;} SAMPLOAD;/*========== Sample and waves loading interface */extern void SL_HalveSample(SAMPLOAD*,int);extern void SL_Sample8to16(SAMPLOAD*);extern void SL_Sample16to8(SAMPLOAD*);extern void SL_SampleSigned(SAMPLOAD*);extern void SL_SampleUnsigned(SAMPLOAD*);extern BOOL SL_LoadSamples(void);extern SAMPLOAD* SL_RegisterSample(SAMPLE*,int,MREADER*);extern BOOL SL_Load(void*,SAMPLOAD*,ULONG);extern BOOL SL_Init(SAMPLOAD*);extern void SL_Exit(SAMPLOAD*);/*========== Internal module representation (UniMod) interface *//* number of notes in an octave */#define OCTAVE 12extern void UniSetRow(UBYTE*);extern UBYTE UniGetByte(void);extern UWORD UniGetWord(void);extern UBYTE* UniFindRow(UBYTE*,UWORD);extern void UniSkipOpcode(void);extern void UniReset(void);extern void UniWriteByte(UBYTE);extern void UniWriteWord(UWORD);extern void UniNewline(void);extern UBYTE* UniDup(void);extern BOOL UniInit(void);extern void UniCleanup(void);extern void UniEffect(UWORD,UWORD);#define UniInstrument(x) UniEffect(UNI_INSTRUMENT,x)#define UniNote(x) UniEffect(UNI_NOTE,x)extern void UniPTEffect(UBYTE,UBYTE);extern void UniVolEffect(UWORD,UBYTE);/*========== Module Commands */enum { /* Simple note */ UNI_NOTE = 1, /* Instrument change */ UNI_INSTRUMENT, /* Protracker effects */ UNI_PTEFFECT0, /* arpeggio */ UNI_PTEFFECT1, /* porta up */ UNI_PTEFFECT2, /* porta down */ UNI_PTEFFECT3, /* porta to note */ UNI_PTEFFECT4, /* vibrato */ UNI_PTEFFECT5, /* dual effect 3+A */ UNI_PTEFFECT6, /* dual effect 4+A */ UNI_PTEFFECT7, /* tremolo */ UNI_PTEFFECT8, /* pan */ UNI_PTEFFECT9, /* sample offset */ UNI_PTEFFECTA, /* volume slide */ UNI_PTEFFECTB, /* pattern jump */ UNI_PTEFFECTC, /* set volume */ UNI_PTEFFECTD, /* pattern break */ UNI_PTEFFECTE, /* extended effects */ UNI_PTEFFECTF, /* set speed */ /* Scream Tracker effects */ UNI_S3MEFFECTA, /* set speed */ UNI_S3MEFFECTD, /* volume slide */ UNI_S3MEFFECTE, /* porta down */ UNI_S3MEFFECTF, /* porta up */ UNI_S3MEFFECTI, /* tremor */ UNI_S3MEFFECTQ, /* retrig */ UNI_S3MEFFECTR, /* tremolo */ UNI_S3MEFFECTT, /* set tempo */ UNI_S3MEFFECTU, /* fine vibrato */ UNI_KEYOFF, /* note off */ /* Fast Tracker effects */ UNI_KEYFADE, /* note fade */ UNI_VOLEFFECTS, /* volume column effects */ UNI_XMEFFECT4, /* vibrato */ UNI_XMEFFECT6, /* dual effect 4+A */ UNI_XMEFFECTA, /* volume slide */ UNI_XMEFFECTE1, /* fine porta up */ UNI_XMEFFECTE2, /* fine porta down */ UNI_XMEFFECTEA, /* fine volume slide up */ UNI_XMEFFECTEB, /* fine volume slide down */ UNI_XMEFFECTG, /* set global volume */ UNI_XMEFFECTH, /* global volume slide */ UNI_XMEFFECTL, /* set envelope position */ UNI_XMEFFECTP, /* pan slide */ UNI_XMEFFECTX1, /* extra fine porta up */ UNI_XMEFFECTX2, /* extra fine porta down */ /* Impulse Tracker effects */ UNI_ITEFFECTG, /* porta to note */ UNI_ITEFFECTH, /* vibrato */ UNI_ITEFFECTI, /* tremor (xy not incremented) */ UNI_ITEFFECTM, /* set channel volume */ UNI_ITEFFECTN, /* slide / fineslide channel volume */ UNI_ITEFFECTP, /* slide / fineslide channel panning */ UNI_ITEFFECTT, /* slide tempo */ UNI_ITEFFECTU, /* fine vibrato */ UNI_ITEFFECTW, /* slide / fineslide global volume */ UNI_ITEFFECTY, /* panbrello */ UNI_ITEFFECTZ, /* resonant filters */ UNI_ITEFFECTS0, /* UltraTracker effects */ UNI_ULTEFFECT9, /* Sample fine offset */ /* OctaMED effects */ UNI_MEDSPEED, UNI_MEDEFFECTF1, /* play note twice */ UNI_MEDEFFECTF2, /* delay note */ UNI_MEDEFFECTF3, /* play note three times */ /* Oktalyzer effects */ UNI_OKTARP, /* arpeggio */ UNI_LAST};extern UWORD unioperands[UNI_LAST];/* IT / S3M Extended SS effects: */enum { SS_GLISSANDO = 1, SS_FINETUNE, SS_VIBWAVE, SS_TREMWAVE, SS_PANWAVE, SS_FRAMEDELAY, SS_S7EFFECTS, SS_PANNING, SS_SURROUND, SS_HIOFFSET, SS_PATLOOP, SS_NOTECUT, SS_NOTEDELAY, SS_PATDELAY};/* IT Volume column effects */enum {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -