1 /* MikMod sound library
\r
2 (c) 1998, 1999, 2000 Miodrag Vallat and others - see file AUTHORS for
\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
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
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
21 /*==============================================================================
\r
23 $Id: mikmod_internals.h,v 1.4 2004/02/18 13:29:17 raph Exp $
\r
25 MikMod sound library internal definitions
\r
27 ==============================================================================*/
\r
29 #ifndef _MIKMOD_INTERNALS_H
\r
30 #define _MIKMOD_INTERNALS_H
\r
36 #ifdef HAVE_MALLOC_H
\r
40 #if defined(__OS2__)||defined(__EMX__)||defined(WIN32)
\r
41 #define strcasecmp(s,t) stricmp(s,t)
\r
46 extern struct plugin_api *rb;
\r
48 #include <mikmod_build.h>
\r
51 #pragma warning(disable:4761)
\r
54 /*========== More type definitions */
\r
56 /* SLONGLONG: 64bit, signed */
\r
57 typedef long long SLONGLONG;
\r
59 /*========== Error handling */
\r
61 #define _mm_errno MikMod_errno
\r
62 #define _mm_critical MikMod_critical
\r
63 extern MikMod_handler_t _mm_errorhandler;
\r
65 /*========== Memory allocation */
\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
71 /*========== MT stuff */
\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
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
107 DECLARE_MUTEX(lists);
\r
108 DECLARE_MUTEX(vars);
\r
110 /*========== Portable file I/O */
\r
112 extern MREADER* _mm_new_file_reader(int fp);
\r
113 extern void _mm_delete_file_reader(MREADER*);
\r
115 extern MWRITER* _mm_new_file_writer(int fp);
\r
116 extern void _mm_delete_file_writer(MWRITER*);
\r
118 extern BOOL _mm_FileExists(CHAR *fname);
\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
123 #define _mm_read_SBYTE(x) (SBYTE)x->Get(x)
\r
124 #define _mm_read_UBYTE(x) (UBYTE)x->Get(x)
\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
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
135 #define _mm_eof(x) x->Eof(x)
\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
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
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
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
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
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
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
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
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
184 /*========== Samples */
\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
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
201 /*========== Sample and waves loading interface */
\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
214 /*========== Internal module representation (UniMod) interface */
\r
216 /* number of notes in an octave */
\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
237 /*========== Module Commands */
\r
242 /* Instrument change */
\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
301 /* UltraTracker effects */
\r
302 UNI_ULTEFFECT9, /* Sample fine offset */
\r
303 /* OctaMED effects */
\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
314 extern UWORD unioperands[UNI_LAST];
\r
316 /* IT / S3M Extended SS effects: */
\r
334 /* IT Volume column effects */
\r
345 /* IT resonant filter information */
\r
347 #define UF_MAXMACRO 0x10
\r
348 #define UF_MAXFILTER 0x100
\r
350 #define FILT_CUT 0x80
\r
351 #define FILT_RESONANT 0x81
\r
353 typedef struct FILTER {
\r
357 /*========== Instruments */
\r
359 /* Instrument format flags */
\r
360 #define IF_OWNPAN 1
\r
361 #define IF_PITCHPAN 2
\r
363 /* Envelope flags: */
\r
365 #define EF_SUSTAIN 2
\r
367 #define EF_VOLENV 8
\r
369 /* New Note Action Flags */
\r
371 #define NNA_CONTINUE 1
\r
379 #define DCT_SAMPLE 2
\r
389 #define KEY_KILL (KEY_OFF|KEY_FADE)
\r
391 #define KICK_ABSENT 0
\r
392 #define KICK_NOTE 1
\r
393 #define KICK_KEYOFF 2
\r
396 #define AV_IT 1 /* IT vs. XM vibrato info */
\r
398 /*========== Playing */
\r
400 #define POS_NONE (-2) /* no loop position defined */
\r
402 #define LAST_PATTERN (UWORD)(-1) /* special ``end of song'' pattern */
\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
417 typedef struct MP_CHANNEL {
\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
431 UBYTE volflg; /* volume envelope settings */
\r
432 UBYTE panflg; /* panning envelope settings */
\r
433 UBYTE pitflg; /* pitch envelope settings */
\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
441 typedef struct MP_CONTROL {
\r
442 struct MP_CHANNEL main;
\r
444 struct MP_VOICE *slave; /* Audio Slave of current effects control channel */
\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
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
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
464 UBYTE arpmem; /* arpeggio command memory */
\r
465 UBYTE pansspd; /* panslide speed */
\r
467 UWORD portspeed; /* noteslide speed (toneportamento) */
\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
473 UBYTE s3mrtgspeed; /* last used retrig speed */
\r
474 UBYTE s3mrtgslide; /* last used retrig slide */
\r
476 UBYTE glissando; /* glissando (0 means off) */
\r
479 SBYTE vibpos; /* current vibrato position */
\r
480 UBYTE vibspd; /* "" speed */
\r
481 UBYTE vibdepth; /* "" depth */
\r
483 SBYTE trmpos; /* current tremolo position */
\r
484 UBYTE trmspd; /* "" speed */
\r
485 UBYTE trmdepth; /* "" depth */
\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
494 ULONG hioffset; /* last used high order of sample offset */
\r
495 UWORD soffset; /* last used low order of sample-offset (effect 9) */
\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
501 UBYTE panbwave; /* current panbrello waveform */
\r
502 UBYTE panbpos; /* current panbrello position */
\r
503 SBYTE panbspd; /* "" speed */
\r
504 UBYTE panbdepth; /* "" depth */
\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
510 SWORD pat_reppos; /* patternloop position */
\r
511 UWORD pat_repcnt; /* times to loop */
\r
514 /* Used by NNA only player (audio control. AUDTMP is used for full effects
\r
516 typedef struct MP_VOICE {
\r
517 struct MP_CHANNEL main;
\r
523 UWORD avibpos; /* autovibrato pos */
\r
524 UWORD aswppos; /* autovibrato sweep pos */
\r
526 ULONG totalvol; /* total volume of channel (before global mixings) */
\r
530 UWORD masterperiod;
\r
532 MP_CONTROL* master; /* index of "master" effects channel */
\r
535 /*========== Loaders */
\r
537 typedef struct MLOADER {
\r
538 struct MLOADER* next;
\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
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
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
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
565 extern int* noteindex;
\r
567 /*========== Internal loader interface */
\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
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
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
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
594 /* loader shared data */
\r
595 #define STM_NTRACKERS 3
\r
596 extern CHAR *STM_Signatures[STM_NTRACKERS];
\r
598 /*========== Player interface */
\r
600 extern BOOL Player_Init(MODULE*);
\r
601 extern void Player_Exit(MODULE*);
\r
602 extern void Player_HandleTick(void);
\r
604 /*========== Drivers */
\r
606 /* max. number of handles a driver has to provide. (not strict) */
\r
607 #define MAXSAMPLEHANDLES 384
\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
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
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
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
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
630 /* uLaw conversion */
\r
631 extern void unsignedtoulaw(char *,int);
\r
633 /* Parameter extraction helper */
\r
634 extern CHAR *MD_GetAtom(CHAR*,CHAR*,BOOL);
\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
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
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
651 /*========== Prototypes for non-MT safe versions of some public functions */
\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
673 * Static memory management + rockboxed function calls
\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
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
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
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