mikmod_internals.h
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:22k
源码类别:

Windows CE

开发平台:

C/C++

  1. /* MikMod sound library
  2. (c) 1998, 1999, 2000 Miodrag Vallat and others - see file AUTHORS for
  3. complete list.
  4. This library is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU Library General Public License as
  6. published by the Free Software Foundation; either version 2 of
  7. the License, or (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. GNU Library General Public License for more details.
  12. You should have received a copy of the GNU Library General Public
  13. License along with this library; if not, write to the Free Software
  14. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  15. 02111-1307, USA.
  16. */
  17. /*==============================================================================
  18.   $Id: mikmod_internals.h,v 1.4 2004/02/18 13:29:17 raph Exp $
  19.   MikMod sound library internal definitions
  20. ==============================================================================*/
  21. #ifndef _MIKMOD_INTERNALS_H
  22. #define _MIKMOD_INTERNALS_H
  23. #ifdef __cplusplus
  24. extern "C" {
  25. #endif
  26. #ifdef HAVE_MALLOC_H
  27. #include <malloc.h>
  28. #endif
  29. #include <stdarg.h>
  30. #if defined(__OS2__)||defined(__EMX__)||defined(WIN32)
  31. #define strcasecmp(s,t) stricmp(s,t)
  32. #endif
  33. #include <mikmod_build.h>
  34. #ifdef WIN32
  35. #pragma warning(disable:4761)
  36. #endif
  37. /*========== More type definitions */
  38. /* SLONGLONG: 64bit, signed */
  39. #if defined (__arch64__) || defined(__alpha)
  40. typedef long SLONGLONG;
  41. #define NATIVE_64BIT_INT
  42. #elif defined(__WATCOMC__)
  43. typedef __int64 SLONGLONG;
  44. #elif defined(WIN32) && !defined(__MWERKS__)
  45. typedef LONGLONG SLONGLONG;
  46. #elif macintosh && !TYPE_LONGLONG
  47. #include <Types.h>
  48. typedef SInt64     SLONGLONG;
  49. #else
  50. typedef long long SLONGLONG;
  51. #endif
  52. /*========== Error handling */
  53. #define _mm_errno MikMod_errno
  54. #define _mm_critical MikMod_critical
  55. extern MikMod_handler_t _mm_errorhandler;
  56. /*========== Memory allocation */
  57. extern void* _mm_malloc(size_t);
  58. extern void* _mm_calloc(size_t,size_t);
  59. #define _mm_free(p) do { if (p) free(p); p = NULL; } while(0)
  60. /*========== MT stuff */
  61. #ifdef HAVE_PTHREAD
  62. #include <pthread.h>
  63. #define DECLARE_MUTEX(name) 
  64. extern pthread_mutex_t _mm_mutex_##name
  65. #define MUTEX_LOCK(name)
  66.   pthread_mutex_lock(&_mm_mutex_##name)
  67. #define MUTEX_UNLOCK(name)
  68. pthread_mutex_unlock(&_mm_mutex_##name)
  69. #elif defined(__OS2__)||defined(__EMX__)
  70. #define DECLARE_MUTEX(name)
  71. extern HMTX _mm_mutex_##name
  72. #define MUTEX_LOCK(name)
  73. if(_mm_mutex_##name)
  74. DosRequestMutexSem(_mm_mutex_##name,SEM_INDEFINITE_WAIT)
  75. #define MUTEX_UNLOCK(name)
  76. if(_mm_mutex_##name)
  77. DosReleaseMutexSem(_mm_mutex_##name)
  78. #elif defined(WIN32)
  79. #include <windows.h>
  80. #define DECLARE_MUTEX(name)
  81. extern HANDLE _mm_mutex_##name
  82. #define MUTEX_LOCK(name)
  83. if(_mm_mutex_##name)
  84. WaitForSingleObject(_mm_mutex_##name,INFINITE)
  85. #define MUTEX_UNLOCK(name)
  86. if(_mm_mutex_##name)
  87. ReleaseMutex(_mm_mutex_##name)
  88. #else
  89. #define DECLARE_MUTEX(name)
  90. extern void *_mm_mutex_##name
  91. #define MUTEX_LOCK(name)
  92. #define MUTEX_UNLOCK(name)
  93. #endif
  94. DECLARE_MUTEX(lists);
  95. DECLARE_MUTEX(vars);
  96. /*========== Portable file I/O */
  97. extern MREADER* _mm_new_file_reader(FILE* fp);
  98. extern void _mm_delete_file_reader(MREADER*);
  99. extern MWRITER* _mm_new_file_writer(FILE *fp);
  100. extern void _mm_delete_file_writer(MWRITER*);
  101. extern BOOL _mm_FileExists(CHAR *fname);
  102. #define _mm_write_SBYTE(x,y) y->Put(y,(int)x)
  103. #define _mm_write_UBYTE(x,y) y->Put(y,(int)x)
  104. #define _mm_read_SBYTE(x) (SBYTE)x->Get(x)
  105. #define _mm_read_UBYTE(x) (UBYTE)x->Get(x)
  106. #define _mm_write_SBYTES(x,y,z) z->Write(z,(void *)x,y)
  107. #define _mm_write_UBYTES(x,y,z) z->Write(z,(void *)x,y)
  108. #define _mm_read_SBYTES(x,y,z)  z->Read(z,(void *)x,y)
  109. #define _mm_read_UBYTES(x,y,z)  z->Read(z,(void *)x,y)
  110. #define _mm_fseek(x,y,z) x->Seek(x,y,z)
  111. #define _mm_ftell(x) x->Tell(x)
  112. #define _mm_rewind(x) _mm_fseek(x,0,SEEK_SET)
  113. #define _mm_eof(x) x->Eof(x)
  114. extern void _mm_iobase_setcur(MREADER*);
  115. extern void _mm_iobase_revert(void);
  116. extern FILE *_mm_fopen(CHAR*,CHAR*);
  117. extern int _mm_fclose(FILE *);
  118. extern void _mm_write_string(CHAR*,MWRITER*);
  119. extern int  _mm_read_string (CHAR*,int,MREADER*);
  120. extern SWORD _mm_read_M_SWORD(MREADER*);
  121. extern SWORD _mm_read_I_SWORD(MREADER*);
  122. extern UWORD _mm_read_M_UWORD(MREADER*);
  123. extern UWORD _mm_read_I_UWORD(MREADER*);
  124. extern SLONG _mm_read_M_SLONG(MREADER*);
  125. extern SLONG _mm_read_I_SLONG(MREADER*);
  126. extern ULONG _mm_read_M_ULONG(MREADER*);
  127. extern ULONG _mm_read_I_ULONG(MREADER*);
  128. extern int _mm_read_M_SWORDS(SWORD*,int,MREADER*);
  129. extern int _mm_read_I_SWORDS(SWORD*,int,MREADER*);
  130. extern int _mm_read_M_UWORDS(UWORD*,int,MREADER*);
  131. extern int _mm_read_I_UWORDS(UWORD*,int,MREADER*);
  132. extern int _mm_read_M_SLONGS(SLONG*,int,MREADER*);
  133. extern int _mm_read_I_SLONGS(SLONG*,int,MREADER*);
  134. extern int _mm_read_M_ULONGS(ULONG*,int,MREADER*);
  135. extern int _mm_read_I_ULONGS(ULONG*,int,MREADER*);
  136. extern void _mm_write_M_SWORD(SWORD,MWRITER*);
  137. extern void _mm_write_I_SWORD(SWORD,MWRITER*);
  138. extern void _mm_write_M_UWORD(UWORD,MWRITER*);
  139. extern void _mm_write_I_UWORD(UWORD,MWRITER*);
  140. extern void _mm_write_M_SLONG(SLONG,MWRITER*);
  141. extern void _mm_write_I_SLONG(SLONG,MWRITER*);
  142. extern void _mm_write_M_ULONG(ULONG,MWRITER*);
  143. extern void _mm_write_I_ULONG(ULONG,MWRITER*);
  144. extern void _mm_write_M_SWORDS(SWORD*,int,MWRITER*);
  145. extern void _mm_write_I_SWORDS(SWORD*,int,MWRITER*);
  146. extern void _mm_write_M_UWORDS(UWORD*,int,MWRITER*);
  147. extern void _mm_write_I_UWORDS(UWORD*,int,MWRITER*);
  148. extern void _mm_write_M_SLONGS(SLONG*,int,MWRITER*);
  149. extern void _mm_write_I_SLONGS(SLONG*,int,MWRITER*);
  150. extern void _mm_write_M_ULONGS(ULONG*,int,MWRITER*);
  151. extern void _mm_write_I_ULONGS(ULONG*,int,MWRITER*);
  152. /*========== Samples */
  153. /* This is a handle of sorts attached to any sample registered with
  154.    SL_RegisterSample.  Generally, this only need be used or changed by the
  155.    loaders and drivers of mikmod. */
  156. typedef struct SAMPLOAD {
  157. struct SAMPLOAD *next;
  158. ULONG    length;       /* length of sample (in samples!) */
  159. ULONG    loopstart;    /* repeat position (relative to start, in samples) */
  160. ULONG    loopend;      /* repeat end */
  161. UWORD    infmt,outfmt;
  162. int      scalefactor;
  163. SAMPLE*  sample;
  164. MREADER* reader;
  165. } SAMPLOAD;
  166. /*========== Sample and waves loading interface */
  167. extern void      SL_HalveSample(SAMPLOAD*,int);
  168. extern void      SL_Sample8to16(SAMPLOAD*);
  169. extern void      SL_Sample16to8(SAMPLOAD*);
  170. extern void      SL_SampleSigned(SAMPLOAD*);
  171. extern void      SL_SampleUnsigned(SAMPLOAD*);
  172. extern BOOL      SL_LoadSamples(void);
  173. extern SAMPLOAD* SL_RegisterSample(SAMPLE*,int,MREADER*);
  174. extern BOOL      SL_Load(void*,SAMPLOAD*,ULONG);
  175. extern BOOL      SL_Init(SAMPLOAD*);
  176. extern void      SL_Exit(SAMPLOAD*);
  177. /*========== Internal module representation (UniMod) interface */
  178. /* number of notes in an octave */
  179. #define OCTAVE 12
  180. extern void   UniSetRow(UBYTE*);
  181. extern UBYTE  UniGetByte(void);
  182. extern UWORD  UniGetWord(void);
  183. extern UBYTE* UniFindRow(UBYTE*,UWORD);
  184. extern void   UniSkipOpcode(void);
  185. extern void   UniReset(void);
  186. extern void   UniWriteByte(UBYTE);
  187. extern void   UniWriteWord(UWORD);
  188. extern void   UniNewline(void);
  189. extern UBYTE* UniDup(void);
  190. extern BOOL   UniInit(void);
  191. extern void   UniCleanup(void);
  192. extern void   UniEffect(UWORD,UWORD);
  193. #define UniInstrument(x) UniEffect(UNI_INSTRUMENT,x)
  194. #define UniNote(x)       UniEffect(UNI_NOTE,x)
  195. extern void   UniPTEffect(UBYTE,UBYTE);
  196. extern void   UniVolEffect(UWORD,UBYTE);
  197. /*========== Module Commands */
  198. enum {
  199. /* Simple note */
  200. UNI_NOTE = 1,
  201. /* Instrument change */
  202. UNI_INSTRUMENT,
  203. /* Protracker effects */
  204. UNI_PTEFFECT0,     /* arpeggio */
  205. UNI_PTEFFECT1,     /* porta up */
  206. UNI_PTEFFECT2,     /* porta down */
  207. UNI_PTEFFECT3,     /* porta to note */
  208. UNI_PTEFFECT4,     /* vibrato */
  209. UNI_PTEFFECT5,     /* dual effect 3+A */
  210. UNI_PTEFFECT6,     /* dual effect 4+A */
  211. UNI_PTEFFECT7,     /* tremolo */
  212. UNI_PTEFFECT8,     /* pan */
  213. UNI_PTEFFECT9,     /* sample offset */
  214. UNI_PTEFFECTA,     /* volume slide */
  215. UNI_PTEFFECTB,     /* pattern jump */
  216. UNI_PTEFFECTC,     /* set volume */
  217. UNI_PTEFFECTD,     /* pattern break */
  218. UNI_PTEFFECTE,     /* extended effects */
  219. UNI_PTEFFECTF,     /* set speed */
  220. /* Scream Tracker effects */
  221. UNI_S3MEFFECTA,    /* set speed */
  222. UNI_S3MEFFECTD,    /* volume slide */
  223. UNI_S3MEFFECTE,    /* porta down */
  224. UNI_S3MEFFECTF,    /* porta up */
  225. UNI_S3MEFFECTI,    /* tremor */
  226. UNI_S3MEFFECTQ,    /* retrig */
  227. UNI_S3MEFFECTR,    /* tremolo */
  228. UNI_S3MEFFECTT,    /* set tempo */
  229. UNI_S3MEFFECTU,    /* fine vibrato */
  230. UNI_KEYOFF,        /* note off */
  231. /* Fast Tracker effects */
  232. UNI_KEYFADE,       /* note fade */
  233. UNI_VOLEFFECTS,    /* volume column effects */
  234. UNI_XMEFFECT4,     /* vibrato */
  235. UNI_XMEFFECT6,     /* dual effect 4+A */
  236. UNI_XMEFFECTA,     /* volume slide */
  237. UNI_XMEFFECTE1,    /* fine porta up */
  238. UNI_XMEFFECTE2,    /* fine porta down */
  239. UNI_XMEFFECTEA,    /* fine volume slide up */
  240. UNI_XMEFFECTEB,    /* fine volume slide down */
  241. UNI_XMEFFECTG,     /* set global volume */
  242. UNI_XMEFFECTH,     /* global volume slide */
  243. UNI_XMEFFECTL,     /* set envelope position */
  244. UNI_XMEFFECTP,     /* pan slide */
  245. UNI_XMEFFECTX1,    /* extra fine porta up */
  246. UNI_XMEFFECTX2,    /* extra fine porta down */
  247. /* Impulse Tracker effects */
  248. UNI_ITEFFECTG,     /* porta to note */
  249. UNI_ITEFFECTH,     /* vibrato */
  250. UNI_ITEFFECTI,     /* tremor (xy not incremented) */
  251. UNI_ITEFFECTM,     /* set channel volume */
  252. UNI_ITEFFECTN,     /* slide / fineslide channel volume */
  253. UNI_ITEFFECTP,     /* slide / fineslide channel panning */
  254. UNI_ITEFFECTT,     /* slide tempo */
  255. UNI_ITEFFECTU,     /* fine vibrato */
  256. UNI_ITEFFECTW,     /* slide / fineslide global volume */
  257. UNI_ITEFFECTY,     /* panbrello */
  258. UNI_ITEFFECTZ,     /* resonant filters */
  259. UNI_ITEFFECTS0,
  260. /* UltraTracker effects */
  261. UNI_ULTEFFECT9,    /* Sample fine offset */
  262. /* OctaMED effects */
  263. UNI_MEDSPEED,
  264. UNI_MEDEFFECTF1,   /* play note twice */
  265. UNI_MEDEFFECTF2,   /* delay note */
  266. UNI_MEDEFFECTF3,   /* play note three times */
  267. /* Oktalyzer effects */
  268. UNI_OKTARP,    /* arpeggio */
  269. UNI_LAST
  270. };
  271. extern UWORD unioperands[UNI_LAST];
  272. /* IT / S3M Extended SS effects: */
  273. enum {
  274. SS_GLISSANDO = 1,
  275. SS_FINETUNE,
  276. SS_VIBWAVE,
  277. SS_TREMWAVE,
  278. SS_PANWAVE,
  279. SS_FRAMEDELAY,
  280. SS_S7EFFECTS,
  281. SS_PANNING,
  282. SS_SURROUND,
  283. SS_HIOFFSET,
  284. SS_PATLOOP,
  285. SS_NOTECUT,
  286. SS_NOTEDELAY,
  287. SS_PATDELAY
  288. };
  289. /* IT Volume column effects */
  290. enum {
  291. VOL_VOLUME = 1,
  292. VOL_PANNING,
  293. VOL_VOLSLIDE,
  294. VOL_PITCHSLIDEDN,
  295. VOL_PITCHSLIDEUP,
  296. VOL_PORTAMENTO,
  297. VOL_VIBRATO
  298. };
  299. /* IT resonant filter information */
  300. #define UF_MAXMACRO 0x10
  301. #define UF_MAXFILTER 0x100
  302. #define FILT_CUT 0x80
  303. #define FILT_RESONANT 0x81
  304. typedef struct FILTER {
  305.     UBYTE filter,inf;
  306. } FILTER;
  307. /*========== Instruments */
  308. /* Instrument format flags */
  309. #define IF_OWNPAN       1
  310. #define IF_PITCHPAN     2
  311. /* Envelope flags: */
  312. #define EF_ON           1
  313. #define EF_SUSTAIN      2
  314. #define EF_LOOP         4
  315. #define EF_VOLENV       8
  316. /* New Note Action Flags */
  317. #define NNA_CUT         0
  318. #define NNA_CONTINUE    1
  319. #define NNA_OFF         2
  320. #define NNA_FADE        3
  321. #define NNA_MASK        3
  322. #define DCT_OFF         0
  323. #define DCT_NOTE        1
  324. #define DCT_SAMPLE      2
  325. #define DCT_INST        3
  326. #define DCA_CUT         0
  327. #define DCA_OFF         1
  328. #define DCA_FADE        2
  329. #define KEY_KICK        0
  330. #define KEY_OFF         1
  331. #define KEY_FADE        2
  332. #define KEY_KILL        (KEY_OFF|KEY_FADE)
  333. #define KICK_ABSENT     0
  334. #define KICK_NOTE       1
  335. #define KICK_KEYOFF     2
  336. #define KICK_ENV        4
  337. #define AV_IT           1   /* IT vs. XM vibrato info */
  338. /*========== Playing */
  339. #define POS_NONE        (-2) /* no loop position defined */
  340. #define LAST_PATTERN (UWORD)(-1) /* special ``end of song'' pattern */
  341. typedef struct ENVPR {
  342. UBYTE  flg;          /* envelope flag */
  343. UBYTE  pts;          /* number of envelope points */
  344. UBYTE  susbeg;       /* envelope sustain index begin */
  345. UBYTE  susend;       /* envelope sustain index end */
  346. UBYTE  beg;          /* envelope loop begin */
  347. UBYTE  end;          /* envelope loop end */
  348. SWORD  p;            /* current envelope counter */
  349. UWORD  a;            /* envelope index a */
  350. UWORD  b;            /* envelope index b */
  351. ENVPT* env;          /* envelope points */
  352. } ENVPR;
  353. typedef struct MP_CHANNEL {
  354. INSTRUMENT* i;
  355. SAMPLE*     s;
  356. UBYTE       sample;       /* which sample number */
  357. UBYTE       note;         /* the audible note as heard, direct rep of period */
  358. SWORD       outvolume;    /* output volume (vol + sampcol + instvol) */
  359. SBYTE       chanvol;      /* channel's "global" volume */
  360. UWORD       fadevol;      /* fading volume rate */
  361. SWORD       panning;      /* panning position */
  362. UBYTE       kick;         /* if true = sample has to be restarted */
  363. UBYTE       kick_flag;    /* kick has been true */
  364. UWORD       period;       /* period to play the sample at */
  365. UBYTE       nna;          /* New note action type + master/slave flags */
  366. UBYTE       volflg;       /* volume envelope settings */
  367. UBYTE       panflg;       /* panning envelope settings */
  368. UBYTE       pitflg;       /* pitch envelope settings */
  369. UBYTE       keyoff;       /* if true = fade out and stuff */
  370. SWORD       handle;       /* which sample-handle */
  371. UBYTE       notedelay;    /* (used for note delay) */
  372. SLONG       start;        /* The starting byte index in the sample */
  373. } MP_CHANNEL;
  374. typedef struct MP_CONTROL {
  375. struct MP_CHANNEL main;
  376. struct MP_VOICE *slave;   /* Audio Slave of current effects control channel */
  377. UBYTE       slavechn;     /* Audio Slave of current effects control channel */
  378. UBYTE       muted;        /* if set, channel not played */
  379. UWORD ultoffset;    /* fine sample offset memory */
  380. UBYTE       anote;        /* the note that indexes the audible */
  381. UBYTE oldnote;
  382. SWORD       ownper;
  383. SWORD       ownvol;
  384. UBYTE       dca;          /* duplicate check action */
  385. UBYTE       dct;          /* duplicate check type */
  386. UBYTE*      row;          /* row currently playing on this channel */
  387. SBYTE       retrig;       /* retrig value (0 means don't retrig) */
  388. ULONG       speed;        /* what finetune to use */
  389. SWORD       volume;       /* amiga volume (0 t/m 64) to play the sample at */
  390. SWORD       tmpvolume;    /* tmp volume */
  391. UWORD       tmpperiod;    /* tmp period */
  392. UWORD       wantedperiod; /* period to slide to (with effect 3 or 5) */
  393. UBYTE       arpmem;       /* arpeggio command memory */
  394. UBYTE       pansspd;      /* panslide speed */
  395. UWORD       slidespeed;
  396. UWORD       portspeed;    /* noteslide speed (toneportamento) */
  397. UBYTE       s3mtremor;    /* s3m tremor (effect I) counter */
  398. UBYTE       s3mtronof;    /* s3m tremor ontime/offtime */
  399. UBYTE       s3mvolslide;  /* last used volslide */
  400. SBYTE       sliding;
  401. UBYTE       s3mrtgspeed;  /* last used retrig speed */
  402. UBYTE       s3mrtgslide;  /* last used retrig slide */
  403. UBYTE       glissando;    /* glissando (0 means off) */
  404. UBYTE       wavecontrol;
  405. SBYTE       vibpos;       /* current vibrato position */
  406. UBYTE       vibspd;       /* "" speed */
  407. UBYTE       vibdepth;     /* "" depth */
  408. SBYTE       trmpos;       /* current tremolo position */
  409. UBYTE       trmspd;       /* "" speed */
  410. UBYTE       trmdepth;     /* "" depth */
  411. UBYTE       fslideupspd;
  412. UBYTE       fslidednspd;
  413. UBYTE       fportupspd;   /* fx E1 (extra fine portamento up) data */
  414. UBYTE       fportdnspd;   /* fx E2 (extra fine portamento dn) data */
  415. UBYTE       ffportupspd;  /* fx X1 (extra fine portamento up) data */
  416. UBYTE       ffportdnspd;  /* fx X2 (extra fine portamento dn) data */
  417. ULONG       hioffset;     /* last used high order of sample offset */
  418. UWORD       soffset;      /* last used low order of sample-offset (effect 9) */
  419. UBYTE       sseffect;     /* last used Sxx effect */
  420. UBYTE       ssdata;       /* last used Sxx data info */
  421. UBYTE       chanvolslide; /* last used channel volume slide */
  422. UBYTE       panbwave;     /* current panbrello waveform */
  423. UBYTE       panbpos;      /* current panbrello position */
  424. SBYTE       panbspd;      /* "" speed */
  425. UBYTE       panbdepth;    /* "" depth */
  426. UWORD       newsamp;      /* set to 1 upon a sample / inst change */
  427. UBYTE       voleffect;    /* Volume Column Effect Memory as used by IT */
  428. UBYTE       voldata;      /* Volume Column Data Memory */
  429. SWORD       pat_reppos;   /* patternloop position */
  430. UWORD       pat_repcnt;   /* times to loop */
  431. } MP_CONTROL;
  432. /* Used by NNA only player (audio control.  AUDTMP is used for full effects
  433.    control). */
  434. typedef struct MP_VOICE {
  435. struct MP_CHANNEL main;
  436. ENVPR       venv;
  437. ENVPR       penv;
  438. ENVPR       cenv;
  439. UWORD       avibpos;      /* autovibrato pos */
  440. UWORD       aswppos;      /* autovibrato sweep pos */
  441. ULONG       totalvol;     /* total volume of channel (before global mixings) */
  442. BOOL        mflag;
  443. SWORD       masterchn;
  444. UWORD       masterperiod;
  445. MP_CONTROL* master;       /* index of "master" effects channel */
  446. } MP_VOICE;
  447. /*========== Loaders */
  448. typedef struct MLOADER {
  449. struct MLOADER* next;
  450. CHAR*       type;
  451. CHAR*       version;
  452. BOOL        (*Init)(void);
  453. BOOL        (*Test)(void);
  454. BOOL        (*Load)(BOOL);
  455. void        (*Cleanup)(void);
  456. CHAR*       (*LoadTitle)(void);
  457. } MLOADER;
  458. /* internal loader variables */
  459. extern MREADER* modreader;
  460. extern UWORD   finetune[16];
  461. extern MODULE  of;                  /* static unimod loading space */
  462. extern UWORD   npertab[7*OCTAVE];   /* used by the original MOD loaders */
  463. extern SBYTE   remap[UF_MAXCHAN];   /* for removing empty channels */
  464. extern UBYTE*  poslookup;           /* lookup table for pattern jumps after
  465.                                       blank pattern removal */
  466. extern UBYTE   poslookupcnt;
  467. extern UWORD*  origpositions;
  468. extern BOOL    filters;             /* resonant filters in use */
  469. extern UBYTE   activemacro;         /* active midi macro number for Sxx */
  470. extern UBYTE   filtermacros[UF_MAXMACRO];    /* midi macro settings */
  471. extern FILTER  filtersettings[UF_MAXFILTER]; /* computed filter settings */
  472. extern int*    noteindex;
  473. /*========== Internal loader interface */
  474. extern BOOL   ReadComment(UWORD);
  475. extern BOOL   ReadLinedComment(UWORD,UWORD);
  476. extern BOOL   AllocPositions(int);
  477. extern BOOL   AllocPatterns(void);
  478. extern BOOL   AllocTracks(void);
  479. extern BOOL   AllocInstruments(void);
  480. extern BOOL   AllocSamples(void);
  481. extern CHAR*  DupStr(CHAR*,UWORD,BOOL);
  482. /* loader utility functions */
  483. extern int*   AllocLinear(void);
  484. extern void   FreeLinear(void);
  485. extern int    speed_to_finetune(ULONG,int);
  486. extern void   S3MIT_ProcessCmd(UBYTE,UBYTE,unsigned int);
  487. extern void   S3MIT_CreateOrders(BOOL);
  488. /* flags for S3MIT_ProcessCmd */
  489. #define S3MIT_OLDSTYLE 1 /* behave as old scream tracker */
  490. #define S3MIT_IT 2 /* behave as impulse tracker */
  491. #define S3MIT_SCREAM 4 /* enforce scream tracker specific limits */
  492. /* used to convert c4spd to linear XM periods (IT and IMF loaders). */
  493. extern UWORD  getlinearperiod(UWORD,ULONG);
  494. extern ULONG  getfrequency(UWORD,ULONG);
  495. /* loader shared data */
  496. #define STM_NTRACKERS 3
  497. extern CHAR *STM_Signatures[STM_NTRACKERS];
  498. /*========== Player interface */
  499. extern BOOL   Player_Init(MODULE*);
  500. extern void   Player_Exit(MODULE*);
  501. extern void   Player_HandleTick(void);
  502. /*========== Drivers */
  503. /* max. number of handles a driver has to provide. (not strict) */
  504. #define MAXSAMPLEHANDLES 384
  505. /* These variables can be changed at ANY time and results will be immediate */
  506. extern UWORD md_bpm;         /* current song / hardware BPM rate */
  507. /* Variables below can be changed via MD_SetNumVoices at any time. However, a
  508.    call to MD_SetNumVoicess while the driver is active will cause the sound to
  509.    skip slightly. */
  510. extern UBYTE md_numchn;      /* number of song + sound effects voices */
  511. extern UBYTE md_sngchn;      /* number of song voices */
  512. extern UBYTE md_sfxchn;      /* number of sound effects voices */
  513. extern UBYTE md_hardchn;     /* number of hardware mixed voices */
  514. extern UBYTE md_softchn;     /* number of software mixed voices */
  515. /* This is for use by the hardware drivers only.  It points to the registered
  516.    tickhandler function. */
  517. extern void (*md_player)(void);
  518. extern SWORD  MD_SampleLoad(SAMPLOAD*,int);
  519. extern void   MD_SampleUnload(SWORD);
  520. extern ULONG  MD_SampleSpace(int);
  521. extern ULONG  MD_SampleLength(int,SAMPLE*);
  522. /* uLaw conversion */
  523. extern void unsignedtoulaw(char *,int);
  524. /* Parameter extraction helper */
  525. extern CHAR  *MD_GetAtom(CHAR*,CHAR*,BOOL);
  526. /* Internal software mixer stuff */
  527. extern void VC_SetupPointers(void);
  528. extern BOOL VC1_Init(void);
  529. extern BOOL VC2_Init(void);
  530. #if defined(unix) || defined(__APPLE__) && defined(__MACH__)
  531. /* POSIX helper functions */
  532. extern BOOL MD_Access(CHAR *);
  533. extern BOOL MD_DropPrivileges(void);
  534. #endif
  535. /* Macro to define a missing driver, yet allowing binaries to dynamically link
  536.    with the library without missing symbol errors */
  537. #define MISSING(a) MDRIVER a = { NULL, NULL, NULL, 0, 0 }
  538. /*========== Prototypes for non-MT safe versions of some public functions */
  539. extern void _mm_registerdriver(struct MDRIVER*);
  540. extern void _mm_registerloader(struct MLOADER*);
  541. extern BOOL MikMod_Active_internal(void);
  542. extern void MikMod_DisableOutput_internal(void);
  543. extern BOOL MikMod_EnableOutput_internal(void);
  544. extern void MikMod_Exit_internal(void);
  545. extern BOOL MikMod_SetNumVoices_internal(int,int);
  546. extern void Player_Exit_internal(MODULE*);
  547. extern void Player_Stop_internal(void);
  548. extern BOOL Player_Paused_internal(void);
  549. extern void Sample_Free_internal(SAMPLE*);
  550. extern void Voice_Play_internal(SBYTE,SAMPLE*,ULONG);
  551. extern void Voice_SetFrequency_internal(SBYTE,ULONG);
  552. extern void Voice_SetPanning_internal(SBYTE,ULONG);
  553. extern void Voice_SetVolume_internal(SBYTE,UWORD);
  554. extern void Voice_Stop_internal(SBYTE);
  555. extern BOOL Voice_Stopped_internal(SBYTE);
  556. #ifdef __cplusplus
  557. }
  558. #endif
  559. #endif
  560. /* ex:set ts=4: */