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