Add "MikMod for Rockbox 0.1" from 2007-06-29
[mikmod-rockbox.git] / apps / plugins / mikmod / include / mikmod_build.h
1 /*      MikMod sound library\r
2         (c) 1998, 1999, 2000 Miodrag Vallat and others - see file AUTHORS\r
3         for 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_build.h,v 1.3 2004/02/19 14:15:22 raph Exp $\r
24 \r
25   MikMod sound library include file\r
26 \r
27 ==============================================================================*/\r
28 \r
29 #ifndef _MIKMOD_H_\r
30 #define _MIKMOD_H_\r
31 \r
32 #include <stdio.h>\r
33 #include <stdlib.h>\r
34 \r
35 #ifdef __cplusplus\r
36 extern "C" {\r
37 #endif\r
38 \r
39 /*\r
40  * ========== Compiler magic for shared libraries\r
41  */\r
42 \r
43 #if defined WIN32 && defined _DLL\r
44 #ifdef DLL_EXPORTS\r
45 #define MIKMODAPI __declspec(dllexport)\r
46 #else\r
47 #define MIKMODAPI __declspec(dllimport)\r
48 #endif\r
49 #else\r
50 #define MIKMODAPI\r
51 #endif\r
52 \r
53 #define BOOL BOOLTYPE\r
54 \r
55 #ifdef WIN32\r
56         #undef WIN32\r
57 #endif\r
58 \r
59 /*\r
60  *      ========== Library version\r
61  */\r
62 \r
63 #define LIBMIKMOD_VERSION_MAJOR 3L\r
64 #define LIBMIKMOD_VERSION_MINOR 2L\r
65 #define LIBMIKMOD_REVISION      0L\r
66 \r
67 #define LIBMIKMOD_VERSION \\r
68         ((LIBMIKMOD_VERSION_MAJOR<<16)| \\r
69          (LIBMIKMOD_VERSION_MINOR<< 8)| \\r
70          (LIBMIKMOD_REVISION))\r
71 \r
72 MIKMODAPI extern long MikMod_GetVersion(void);\r
73 \r
74 /*\r
75  *      ========== Platform independent-type definitions\r
76  */\r
77 \r
78 #ifdef WIN32\r
79 #define WIN32_LEAN_AND_MEAN\r
80 #include <windows.h>\r
81 #include <io.h>\r
82 #include <mmsystem.h>\r
83 #endif\r
84 \r
85 #if defined(__OS2__)||defined(__EMX__)\r
86 #define INCL_DOSSEMAPHORES\r
87 #include <os2.h>\r
88 #else\r
89 typedef char CHAR;\r
90 #endif\r
91 \r
92 \r
93 \r
94 #if defined(__arch64__) || defined(__alpha)\r
95 /* 64 bit architectures */\r
96 \r
97 typedef signed char     SBYTE;      /* 1 byte, signed */\r
98 typedef unsigned char   UBYTE;      /* 1 byte, unsigned */\r
99 typedef signed short    SWORD;      /* 2 bytes, signed */\r
100 typedef unsigned short  UWORD;      /* 2 bytes, unsigned */\r
101 typedef signed int      SLONG;      /* 4 bytes, signed */\r
102 typedef unsigned int    ULONG;      /* 4 bytes, unsigned */\r
103 typedef int             BOOL;       /* 0=false, <>0 true */\r
104 \r
105 #else\r
106 /* 32 bit architectures */\r
107 \r
108 typedef signed char     SBYTE;      /* 1 byte, signed */\r
109 typedef unsigned char   UBYTE;      /* 1 byte, unsigned */\r
110 typedef signed short    SWORD;      /* 2 bytes, signed */\r
111 typedef unsigned short  UWORD;      /* 2 bytes, unsigned */\r
112 typedef signed long     SLONG;      /* 4 bytes, signed */\r
113 #if !defined(__OS2__)&&!defined(__EMX__)&&!defined(WIN32)\r
114 typedef unsigned long   ULONG;      /* 4 bytes, unsigned */\r
115 typedef int             BOOL;       /* 0=false, <>0 true */\r
116 #endif\r
117 #endif\r
118 \r
119 /*\r
120  *      ========== Error codes\r
121  */\r
122 \r
123 enum {\r
124         MMERR_OPENING_FILE = 1,\r
125         MMERR_OUT_OF_MEMORY,\r
126         MMERR_DYNAMIC_LINKING,\r
127 \r
128         MMERR_SAMPLE_TOO_BIG,\r
129         MMERR_OUT_OF_HANDLES,\r
130         MMERR_UNKNOWN_WAVE_TYPE,\r
131 \r
132         MMERR_LOADING_PATTERN,\r
133         MMERR_LOADING_TRACK,\r
134         MMERR_LOADING_HEADER,\r
135         MMERR_LOADING_SAMPLEINFO,\r
136         MMERR_NOT_A_MODULE,\r
137         MMERR_NOT_A_STREAM,\r
138         MMERR_MED_SYNTHSAMPLES,\r
139         MMERR_ITPACK_INVALID_DATA,\r
140 \r
141         MMERR_DETECTING_DEVICE,\r
142         MMERR_INVALID_DEVICE,\r
143         MMERR_INITIALIZING_MIXER,\r
144         MMERR_OPENING_AUDIO,\r
145         MMERR_8BIT_ONLY,\r
146         MMERR_16BIT_ONLY,\r
147         MMERR_STEREO_ONLY,\r
148         MMERR_ULAW,\r
149         MMERR_NON_BLOCK,\r
150 \r
151         MMERR_AF_AUDIO_PORT,\r
152 \r
153         MMERR_AIX_CONFIG_INIT,\r
154         MMERR_AIX_CONFIG_CONTROL,\r
155         MMERR_AIX_CONFIG_START,\r
156 \r
157         MMERR_GUS_SETTINGS,\r
158         MMERR_GUS_RESET,\r
159         MMERR_GUS_TIMER,\r
160 \r
161         MMERR_HP_SETSAMPLESIZE,\r
162         MMERR_HP_SETSPEED,\r
163         MMERR_HP_CHANNELS,\r
164         MMERR_HP_AUDIO_OUTPUT,\r
165         MMERR_HP_AUDIO_DESC,\r
166         MMERR_HP_BUFFERSIZE,\r
167 \r
168         MMERR_OSS_SETFRAGMENT,\r
169         MMERR_OSS_SETSAMPLESIZE,\r
170         MMERR_OSS_SETSTEREO,\r
171         MMERR_OSS_SETSPEED,\r
172 \r
173         MMERR_SGI_SPEED,\r
174         MMERR_SGI_16BIT,\r
175         MMERR_SGI_8BIT,\r
176         MMERR_SGI_STEREO,\r
177         MMERR_SGI_MONO,\r
178 \r
179         MMERR_SUN_INIT,\r
180 \r
181         MMERR_OS2_MIXSETUP,\r
182         MMERR_OS2_SEMAPHORE,\r
183         MMERR_OS2_TIMER,\r
184         MMERR_OS2_THREAD,\r
185 \r
186         MMERR_DS_PRIORITY,\r
187         MMERR_DS_BUFFER,\r
188         MMERR_DS_FORMAT,\r
189         MMERR_DS_NOTIFY,\r
190         MMERR_DS_EVENT,\r
191         MMERR_DS_THREAD,\r
192         MMERR_DS_UPDATE,\r
193 \r
194         MMERR_WINMM_HANDLE,\r
195         MMERR_WINMM_ALLOCATED,\r
196         MMERR_WINMM_DEVICEID,\r
197         MMERR_WINMM_FORMAT,\r
198         MMERR_WINMM_UNKNOWN,\r
199 \r
200         MMERR_MAC_SPEED,\r
201         MMERR_MAC_START,\r
202 \r
203     MMERR_OSX_UNKNOWN_DEVICE,\r
204     MMERR_OSX_BAD_PROPERTY,\r
205     MMERR_OSX_UNSUPPORTED_FORMAT,\r
206     MMERR_OSX_SET_STEREO,\r
207     MMERR_OSX_BUFFER_ALLOC,\r
208     MMERR_OSX_ADD_IO_PROC,\r
209     MMERR_OSX_DEVICE_START,\r
210         MMERR_OSX_PTHREAD,\r
211 \r
212         MMERR_DOSWSS_STARTDMA,\r
213         MMERR_DOSSB_STARTDMA,\r
214         \r
215         MMERR_MAX\r
216 };\r
217 \r
218 /*\r
219  *      ========== Error handling\r
220  */\r
221 \r
222 typedef void (MikMod_handler)(void);\r
223 typedef MikMod_handler *MikMod_handler_t;\r
224 \r
225 MIKMODAPI extern int  MikMod_errno;\r
226 MIKMODAPI extern BOOL MikMod_critical;\r
227 MIKMODAPI extern char *MikMod_strerror(int);\r
228 \r
229 MIKMODAPI extern MikMod_handler_t MikMod_RegisterErrorHandler(MikMod_handler_t);\r
230 \r
231 /*\r
232  *      ========== Library initialization and core functions\r
233  */\r
234 \r
235 struct MDRIVER;\r
236 \r
237 MIKMODAPI extern void   MikMod_RegisterAllDrivers(void);\r
238 \r
239 MIKMODAPI extern CHAR*  MikMod_InfoDriver(void);\r
240 MIKMODAPI extern void   MikMod_RegisterDriver(struct MDRIVER*);\r
241 MIKMODAPI extern int    MikMod_DriverFromAlias(CHAR*);\r
242 MIKMODAPI extern struct MDRIVER *MikMod_DriverByOrdinal(int);\r
243 \r
244 MIKMODAPI extern BOOL   MikMod_Init(CHAR*);\r
245 MIKMODAPI extern void   MikMod_Exit(void);\r
246 MIKMODAPI extern BOOL   MikMod_Reset(CHAR*);\r
247 MIKMODAPI extern BOOL   MikMod_SetNumVoices(int,int);\r
248 MIKMODAPI extern BOOL   MikMod_Active(void);\r
249 MIKMODAPI extern BOOL   MikMod_EnableOutput(void);\r
250 MIKMODAPI extern void   MikMod_DisableOutput(void);\r
251 MIKMODAPI extern void   MikMod_Update(void);\r
252 \r
253 MIKMODAPI extern BOOL   MikMod_InitThreads(void);\r
254 MIKMODAPI extern void   MikMod_Lock(void);\r
255 MIKMODAPI extern void   MikMod_Unlock(void);\r
256 \r
257 /*\r
258  *      ========== Reader, Writer\r
259  */\r
260 \r
261 typedef struct MREADER {\r
262         BOOL (*Seek)(struct MREADER*,long,int);\r
263         long (*Tell)(struct MREADER*);\r
264         BOOL (*Read)(struct MREADER*,void*,size_t);\r
265         int  (*Get)(struct MREADER*);\r
266         BOOL (*Eof)(struct MREADER*);\r
267 } MREADER;\r
268 \r
269 typedef struct MWRITER {\r
270         BOOL (*Seek)(struct MWRITER*,long,int);\r
271         long (*Tell)(struct MWRITER*);\r
272         BOOL (*Write)(struct MWRITER*,void*,size_t);\r
273         BOOL (*Put)(struct MWRITER*,int);\r
274 } MWRITER;\r
275 \r
276 /*\r
277  *      ========== Samples\r
278  */\r
279 \r
280 /* Sample playback should not be interrupted */\r
281 #define SFX_CRITICAL 1\r
282 \r
283 /* Sample format [loading and in-memory] flags: */\r
284 #define SF_16BITS       0x0001\r
285 #define SF_STEREO       0x0002\r
286 #define SF_SIGNED       0x0004\r
287 #define SF_BIG_ENDIAN   0x0008\r
288 #define SF_DELTA        0x0010\r
289 #define SF_ITPACKED             0x0020\r
290 \r
291 #define SF_FORMATMASK   0x003F\r
292 \r
293 /* General Playback flags */\r
294 \r
295 #define SF_LOOP         0x0100\r
296 #define SF_BIDI         0x0200\r
297 #define SF_REVERSE      0x0400\r
298 #define SF_SUSTAIN      0x0800\r
299 \r
300 #define SF_PLAYBACKMASK 0x0C00\r
301 \r
302 /* Module-only Playback Flags */\r
303 \r
304 #define SF_OWNPAN               0x1000\r
305 #define SF_UST_LOOP     0x2000\r
306 \r
307 #define SF_EXTRAPLAYBACKMASK    0x3000\r
308 \r
309 /* Panning constants */\r
310 #define PAN_LEFT                0\r
311 #define PAN_HALFLEFT    64\r
312 #define PAN_CENTER              128\r
313 #define PAN_HALFRIGHT   192\r
314 #define PAN_RIGHT               255\r
315 #define PAN_SURROUND    512 /* panning value for Dolby Surround */\r
316 \r
317 typedef struct SAMPLE {\r
318         SWORD  panning;     /* panning (0-255 or PAN_SURROUND) */\r
319         ULONG  speed;       /* Base playing speed/frequency of note */\r
320         UBYTE  volume;      /* volume 0-64 */\r
321         UWORD  inflags;         /* sample format on disk */\r
322         UWORD  flags;       /* sample format in memory */\r
323         ULONG  length;      /* length of sample (in samples!) */\r
324         ULONG  loopstart;   /* repeat position (relative to start, in samples) */\r
325         ULONG  loopend;     /* repeat end */\r
326         ULONG  susbegin;    /* sustain loop begin (in samples) \  Not Supported */\r
327         ULONG  susend;      /* sustain loop end                /      Yet! */\r
328 \r
329         /* Variables used by the module player only! (ignored for sound effects) */\r
330         UBYTE  globvol;     /* global volume */\r
331         UBYTE  vibflags;    /* autovibrato flag stuffs */\r
332         UBYTE  vibtype;     /* Vibratos moved from INSTRUMENT to SAMPLE */\r
333         UBYTE  vibsweep;\r
334         UBYTE  vibdepth;\r
335         UBYTE  vibrate;\r
336         CHAR*  samplename;  /* name of the sample */\r
337 \r
338         /* Values used internally only */\r
339         UWORD  avibpos;     /* autovibrato pos [player use] */\r
340         UBYTE  divfactor;   /* for sample scaling, maintains proper period slides */\r
341         ULONG  seekpos;     /* seek position in file */\r
342         SWORD  handle;      /* sample handle used by individual drivers */\r
343 } SAMPLE;\r
344 \r
345 /* Sample functions */\r
346 \r
347 MIKMODAPI extern SAMPLE *Sample_Load(CHAR*);\r
348 MIKMODAPI extern SAMPLE *Sample_LoadFP(int);\r
349 MIKMODAPI extern SAMPLE *Sample_LoadGeneric(MREADER*);\r
350 MIKMODAPI extern void   Sample_Free(SAMPLE*);\r
351 MIKMODAPI extern SBYTE  Sample_Play(SAMPLE*,ULONG,UBYTE);\r
352 \r
353 MIKMODAPI extern void   Voice_SetVolume(SBYTE,UWORD);\r
354 MIKMODAPI extern UWORD  Voice_GetVolume(SBYTE);\r
355 MIKMODAPI extern void   Voice_SetFrequency(SBYTE,ULONG);\r
356 MIKMODAPI extern ULONG  Voice_GetFrequency(SBYTE);\r
357 MIKMODAPI extern void   Voice_SetPanning(SBYTE,ULONG);\r
358 MIKMODAPI extern ULONG  Voice_GetPanning(SBYTE);\r
359 MIKMODAPI extern void   Voice_Play(SBYTE,SAMPLE*,ULONG);\r
360 MIKMODAPI extern void   Voice_Stop(SBYTE);\r
361 MIKMODAPI extern BOOL   Voice_Stopped(SBYTE);\r
362 MIKMODAPI extern SLONG  Voice_GetPosition(SBYTE);\r
363 MIKMODAPI extern ULONG  Voice_RealVolume(SBYTE);\r
364 \r
365 /*\r
366  *      ========== Internal module representation (UniMod)\r
367  */\r
368 \r
369 /*\r
370         Instrument definition - for information only, the only field which may be\r
371         of use in user programs is the name field\r
372 */\r
373 \r
374 /* Instrument note count */\r
375 #define INSTNOTES 120\r
376 \r
377 /* Envelope point */\r
378 typedef struct ENVPT {\r
379         SWORD pos;\r
380         SWORD val;\r
381 } ENVPT;\r
382 \r
383 /* Envelope point count */\r
384 #define ENVPOINTS 32\r
385 \r
386 /* Instrument structure */\r
387 typedef struct INSTRUMENT {\r
388         CHAR* insname;\r
389 \r
390         UBYTE flags;\r
391         UWORD samplenumber[INSTNOTES];\r
392         UBYTE samplenote[INSTNOTES];\r
393 \r
394         UBYTE nnatype;\r
395         UBYTE dca;              /* duplicate check action */\r
396         UBYTE dct;              /* duplicate check type */\r
397         UBYTE globvol;\r
398         UWORD volfade;\r
399         SWORD panning;          /* instrument-based panning var */\r
400 \r
401         UBYTE pitpansep;        /* pitch pan separation (0 to 255) */\r
402         UBYTE pitpancenter;     /* pitch pan center (0 to 119) */\r
403         UBYTE rvolvar;          /* random volume varations (0 - 100%) */\r
404         UBYTE rpanvar;          /* random panning varations (0 - 100%) */\r
405 \r
406         /* volume envelope */\r
407         UBYTE volflg;           /* bit 0: on 1: sustain 2: loop */\r
408         UBYTE volpts;\r
409         UBYTE volsusbeg;\r
410         UBYTE volsusend;\r
411         UBYTE volbeg;\r
412         UBYTE volend;\r
413         ENVPT volenv[ENVPOINTS];\r
414         /* panning envelope */\r
415         UBYTE panflg;           /* bit 0: on 1: sustain 2: loop */\r
416         UBYTE panpts;\r
417         UBYTE pansusbeg;\r
418         UBYTE pansusend;\r
419         UBYTE panbeg;\r
420         UBYTE panend;\r
421         ENVPT panenv[ENVPOINTS];\r
422         /* pitch envelope */\r
423         UBYTE pitflg;           /* bit 0: on 1: sustain 2: loop */\r
424         UBYTE pitpts;\r
425         UBYTE pitsusbeg;\r
426         UBYTE pitsusend;\r
427         UBYTE pitbeg;\r
428         UBYTE pitend;\r
429         ENVPT pitenv[ENVPOINTS];\r
430 } INSTRUMENT;\r
431 \r
432 struct MP_CONTROL;\r
433 struct MP_VOICE;\r
434 \r
435 /*\r
436         Module definition\r
437 */\r
438 \r
439 /* maximum master channels supported */\r
440 #define UF_MAXCHAN      64\r
441 \r
442 /* Module flags */\r
443 #define UF_XMPERIODS    0x0001 /* XM periods / finetuning */\r
444 #define UF_LINEAR               0x0002 /* LINEAR periods (UF_XMPERIODS must be set) */\r
445 #define UF_INST                 0x0004 /* Instruments are used */\r
446 #define UF_NNA                  0x0008 /* IT: NNA used, set numvoices rather\r
447                                                                   than numchn */\r
448 #define UF_S3MSLIDES    0x0010 /* uses old S3M volume slides */\r
449 #define UF_BGSLIDES             0x0020 /* continue volume slides in the background */\r
450 #define UF_HIGHBPM              0x0040 /* MED: can use >255 bpm */\r
451 #define UF_NOWRAP               0x0080 /* XM-type (i.e. illogical) pattern break\r
452                                                                   semantics */\r
453 #define UF_ARPMEM               0x0100 /* IT: need arpeggio memory */\r
454 #define UF_FT2QUIRKS    0x0200 /* emulate some FT2 replay quirks */\r
455 #define UF_PANNING              0x0400 /* module uses panning effects or have\r
456                                                                   non-tracker default initial panning */\r
457 \r
458 typedef struct MODULE {\r
459         /* general module information */\r
460                 CHAR*       songname;    /* name of the song */\r
461                 CHAR*       modtype;     /* string type of module loaded */\r
462                 CHAR*       comment;     /* module comments */\r
463 \r
464                 UWORD       flags;       /* See module flags above */\r
465                 UBYTE       numchn;      /* number of module channels */\r
466                 UBYTE       numvoices;   /* max # voices used for full NNA playback */\r
467                 UWORD       numpos;      /* number of positions in this song */\r
468                 UWORD       numpat;      /* number of patterns in this song */\r
469                 UWORD       numins;      /* number of instruments */\r
470                 UWORD       numsmp;      /* number of samples */\r
471 struct  INSTRUMENT* instruments; /* all instruments */\r
472 struct  SAMPLE*     samples;     /* all samples */\r
473                 UBYTE       realchn;     /* real number of channels used */\r
474                 UBYTE       totalchn;    /* total number of channels used (incl NNAs) */\r
475 \r
476         /* playback settings */\r
477                 UWORD       reppos;      /* restart position */\r
478                 UBYTE       initspeed;   /* initial song speed */\r
479                 UWORD       inittempo;   /* initial song tempo */\r
480                 UBYTE       initvolume;  /* initial global volume (0 - 128) */\r
481                 UWORD       panning[UF_MAXCHAN]; /* panning positions */\r
482                 UBYTE       chanvol[UF_MAXCHAN]; /* channel positions */\r
483                 UWORD       bpm;         /* current beats-per-minute speed */\r
484                 UWORD       sngspd;      /* current song speed */\r
485                 SWORD       volume;      /* song volume (0-128) (or user volume) */\r
486 \r
487                 BOOL        extspd;      /* extended speed flag (default enabled) */\r
488                 BOOL        panflag;     /* panning flag (default enabled) */\r
489                 BOOL        wrap;        /* wrap module ? (default disabled) */\r
490                 BOOL        loop;                /* allow module to loop ? (default enabled) */\r
491                 BOOL        fadeout;     /* volume fade out during last pattern */\r
492 \r
493                 UWORD       patpos;      /* current row number */\r
494                 SWORD       sngpos;      /* current song position */\r
495                 ULONG       sngtime;     /* current song time in 2^-10 seconds */\r
496 \r
497                 SWORD       relspd;      /* relative speed factor */\r
498 \r
499         /* internal module representation */\r
500                 UWORD       numtrk;      /* number of tracks */\r
501                 UBYTE**     tracks;      /* array of numtrk pointers to tracks */\r
502                 UWORD*      patterns;    /* array of Patterns */\r
503                 UWORD*      pattrows;    /* array of number of rows for each pattern */\r
504                 UWORD*      positions;   /* all positions */\r
505 \r
506                 BOOL        forbid;      /* if true, no player update! */\r
507                 UWORD       numrow;      /* number of rows on current pattern */\r
508                 UWORD       vbtick;      /* tick counter (counts from 0 to sngspd) */\r
509                 UWORD       sngremainder;/* used for song time computation */\r
510 \r
511 struct MP_CONTROL*  control;     /* Effects Channel info (size pf->numchn) */\r
512 struct MP_VOICE*    voice;       /* Audio Voice information (size md_numchn) */\r
513 \r
514                 UBYTE       globalslide; /* global volume slide rate */\r
515                 UBYTE       pat_repcrazy;/* module has just looped to position -1 */\r
516                 UWORD       patbrk;      /* position where to start a new pattern */\r
517                 UBYTE       patdly;      /* patterndelay counter (command memory) */\r
518                 UBYTE       patdly2;     /* patterndelay counter (real one) */\r
519                 SWORD       posjmp;      /* flag to indicate a jump is needed... */\r
520                 UWORD           bpmlimit;        /* threshold to detect bpm or speed values */\r
521 } MODULE;\r
522 \r
523 \r
524 /* This structure is used to query current playing voices status */\r
525 typedef struct VOICEINFO {\r
526                 INSTRUMENT* i;            /* Current channel instrument */\r
527                 SAMPLE*     s;            /* Current channel sample */\r
528                 SWORD       panning;      /* panning position */\r
529                 SBYTE       volume;       /* channel's "global" volume (0..64) */\r
530                 UWORD       period;       /* period to play the sample at */\r
531                 UBYTE       kick;         /* if true = sample has been restarted */\r
532 } VOICEINFO;\r
533 \r
534 /*\r
535  *      ========== Module loaders\r
536  */\r
537 \r
538 struct MLOADER;\r
539 \r
540 MIKMODAPI extern CHAR*   MikMod_InfoLoader(void);\r
541 MIKMODAPI extern void    MikMod_RegisterAllLoaders(void);\r
542 MIKMODAPI extern void    MikMod_RegisterLoader(struct MLOADER*);\r
543 \r
544 MIKMODAPI extern struct MLOADER load_669; /* 669 and Extended-669 (by Tran/Renaissance) */\r
545 MIKMODAPI extern struct MLOADER load_amf; /* DMP Advanced Module Format (by Otto Chrons) */\r
546 MIKMODAPI extern struct MLOADER load_asy; /* ASYLUM Music Format 1.0 */\r
547 MIKMODAPI extern struct MLOADER load_dsm; /* DSIK internal module format */\r
548 MIKMODAPI extern struct MLOADER load_far; /* Farandole Composer (by Daniel Potter) */\r
549 MIKMODAPI extern struct MLOADER load_gdm; /* General DigiMusic (by Edward Schlunder) */\r
550 MIKMODAPI extern struct MLOADER load_it;  /* Impulse Tracker (by Jeffrey Lim) */\r
551 MIKMODAPI extern struct MLOADER load_imf; /* Imago Orpheus (by Lutz Roeder) */\r
552 MIKMODAPI extern struct MLOADER load_med; /* Amiga MED modules (by Teijo Kinnunen) */\r
553 MIKMODAPI extern struct MLOADER load_m15; /* Soundtracker 15-instrument */\r
554 MIKMODAPI extern struct MLOADER load_mod; /* Standard 31-instrument Module loader */\r
555 MIKMODAPI extern struct MLOADER load_mtm; /* Multi-Tracker Module (by Renaissance) */\r
556 MIKMODAPI extern struct MLOADER load_okt; /* Amiga Oktalyzer */\r
557 MIKMODAPI extern struct MLOADER load_stm; /* ScreamTracker 2 (by Future Crew) */\r
558 MIKMODAPI extern struct MLOADER load_stx; /* STMIK 0.2 (by Future Crew) */\r
559 MIKMODAPI extern struct MLOADER load_s3m; /* ScreamTracker 3 (by Future Crew) */\r
560 MIKMODAPI extern struct MLOADER load_ult; /* UltraTracker (by MAS) */\r
561 MIKMODAPI extern struct MLOADER load_uni; /* MikMod and APlayer internal module format */\r
562 MIKMODAPI extern struct MLOADER load_xm;  /* FastTracker 2 (by Triton) */\r
563 \r
564 /*\r
565  *      ========== Module player\r
566  */\r
567 \r
568 MIKMODAPI extern MODULE* Player_Load(CHAR*,int,BOOL);\r
569 MIKMODAPI extern MODULE* Player_LoadFP(int,int,BOOL);\r
570 MIKMODAPI extern MODULE* Player_LoadGeneric(MREADER*,int,BOOL);\r
571 MIKMODAPI extern CHAR*   Player_LoadTitle(CHAR*);\r
572 MIKMODAPI extern CHAR*   Player_LoadTitleFP(int);\r
573 MIKMODAPI extern void    Player_Free(MODULE*);\r
574 MIKMODAPI extern void    Player_Start(MODULE*);\r
575 MIKMODAPI extern BOOL    Player_Active(void);\r
576 MIKMODAPI extern void    Player_Stop(void);\r
577 MIKMODAPI extern void    Player_TogglePause(void);\r
578 MIKMODAPI extern BOOL    Player_Paused(void);\r
579 MIKMODAPI extern void    Player_NextPosition(void);\r
580 MIKMODAPI extern void    Player_PrevPosition(void);\r
581 MIKMODAPI extern void    Player_SetPosition(UWORD);\r
582 MIKMODAPI extern BOOL    Player_Muted(UBYTE);\r
583 MIKMODAPI extern void    Player_SetVolume(SWORD);\r
584 MIKMODAPI extern MODULE* Player_GetModule(void);\r
585 MIKMODAPI extern void    Player_SetSpeed(UWORD);\r
586 MIKMODAPI extern void    Player_SetTempo(UWORD);\r
587 MIKMODAPI extern void    Player_Unmute(SLONG,...);\r
588 MIKMODAPI extern void    Player_Mute(SLONG,...);\r
589 MIKMODAPI extern void    Player_ToggleMute(SLONG,...);\r
590 MIKMODAPI extern int     Player_GetChannelVoice(UBYTE);\r
591 MIKMODAPI extern UWORD   Player_GetChannelPeriod(UBYTE);\r
592 MIKMODAPI extern int     Player_QueryVoices(UWORD numvoices, VOICEINFO *vinfo); \r
593 \r
594 typedef void (MikMod_player)(void);\r
595 typedef MikMod_player *MikMod_player_t;\r
596 \r
597 MIKMODAPI extern MikMod_player_t MikMod_RegisterPlayer(MikMod_player_t);\r
598 \r
599 #define MUTE_EXCLUSIVE  32000\r
600 #define MUTE_INCLUSIVE  32001\r
601 \r
602 /*\r
603  *      ========== Drivers\r
604  */\r
605 \r
606 enum {\r
607         MD_MUSIC = 0,\r
608         MD_SNDFX\r
609 };\r
610 \r
611 enum {\r
612         MD_HARDWARE = 0,\r
613         MD_SOFTWARE\r
614 };\r
615 \r
616 /* Mixing flags */\r
617 \r
618 /* These ones take effect only after MikMod_Init or MikMod_Reset */\r
619 #define DMODE_16BITS     0x0001 /* enable 16 bit output */\r
620 #define DMODE_STEREO     0x0002 /* enable stereo output */\r
621 #define DMODE_SOFT_SNDFX 0x0004 /* Process sound effects via software mixer */\r
622 #define DMODE_SOFT_MUSIC 0x0008 /* Process music via software mixer */\r
623 #define DMODE_HQMIXER    0x0010 /* Use high-quality (slower) software mixer */\r
624 #define DMODE_FLOAT      0x0020 /* enable float output */\r
625 /* These take effect immediately. */\r
626 #define DMODE_SURROUND   0x0100 /* enable surround sound */\r
627 #define DMODE_INTERP     0x0200 /* enable interpolation */\r
628 #define DMODE_REVERSE    0x0400 /* reverse stereo */\r
629 \r
630 struct SAMPLOAD;\r
631 typedef struct MDRIVER {\r
632 struct MDRIVER* next;\r
633         CHAR*       Name;\r
634         CHAR*       Version;\r
635 \r
636         UBYTE       HardVoiceLimit; /* Limit of hardware mixer voices */\r
637         UBYTE       SoftVoiceLimit; /* Limit of software mixer voices */\r
638 \r
639         CHAR        *Alias;\r
640         CHAR        *CmdLineHelp;\r
641 \r
642         void        (*CommandLine)      (CHAR*);\r
643         BOOL        (*IsPresent)        (void);\r
644         SWORD       (*SampleLoad)       (struct SAMPLOAD*,int);\r
645         void        (*SampleUnload)     (SWORD);\r
646         ULONG       (*FreeSampleSpace)  (int);\r
647         ULONG       (*RealSampleLength) (int,struct SAMPLE*);\r
648         BOOL        (*Init)             (void);\r
649         void        (*Exit)             (void);\r
650         BOOL        (*Reset)            (void);\r
651         BOOL        (*SetNumVoices)     (void);\r
652         BOOL        (*PlayStart)        (void);\r
653         void        (*PlayStop)         (void);\r
654         void        (*Update)           (void);\r
655         void            (*Pause)                        (void);\r
656         void        (*VoiceSetVolume)   (UBYTE,UWORD);\r
657         UWORD       (*VoiceGetVolume)   (UBYTE);\r
658         void        (*VoiceSetFrequency)(UBYTE,ULONG);\r
659         ULONG       (*VoiceGetFrequency)(UBYTE);\r
660         void        (*VoiceSetPanning)  (UBYTE,ULONG);\r
661         ULONG       (*VoiceGetPanning)  (UBYTE);\r
662         void        (*VoicePlay)        (UBYTE,SWORD,ULONG,ULONG,ULONG,ULONG,UWORD);\r
663         void        (*VoiceStop)        (UBYTE);\r
664         BOOL        (*VoiceStopped)     (UBYTE);\r
665         SLONG       (*VoiceGetPosition) (UBYTE);\r
666         ULONG       (*VoiceRealVolume)  (UBYTE);\r
667 } MDRIVER;\r
668 \r
669 /* These variables can be changed at ANY time and results will be immediate */\r
670 MIKMODAPI extern UBYTE md_volume;      /* global sound volume (0-128) */\r
671 MIKMODAPI extern UBYTE md_musicvolume; /* volume of song */\r
672 MIKMODAPI extern UBYTE md_sndfxvolume; /* volume of sound effects */\r
673 MIKMODAPI extern UBYTE md_reverb;      /* 0 = none;  15 = chaos */\r
674 MIKMODAPI extern UBYTE md_pansep;      /* 0 = mono;  128 == 100% (full left/right) */\r
675 \r
676 /* The variables below can be changed at any time, but changes will not be\r
677    implemented until MikMod_Reset is called. A call to MikMod_Reset may result\r
678    in a skip or pop in audio (depending on the soundcard driver and the settings\r
679    changed). */\r
680 MIKMODAPI extern UWORD md_device;      /* device */\r
681 MIKMODAPI extern UWORD md_mixfreq;     /* mixing frequency */\r
682 MIKMODAPI extern UWORD md_mode;        /* mode. See DMODE_? flags above */\r
683 \r
684 /* The following variable should not be changed! */\r
685 MIKMODAPI extern MDRIVER* md_driver;   /* Current driver in use. */\r
686 \r
687 /* Known drivers list */\r
688 \r
689 MIKMODAPI extern struct MDRIVER drv_nos;    /* no sound */\r
690 MIKMODAPI extern struct MDRIVER drv_pipe;   /* piped output */\r
691 MIKMODAPI extern struct MDRIVER drv_raw;    /* raw file disk writer [music.raw] */\r
692 MIKMODAPI extern struct MDRIVER drv_stdout; /* output to stdout */\r
693 MIKMODAPI extern struct MDRIVER drv_wav;    /* RIFF WAVE file disk writer [music.wav] */\r
694 MIKMODAPI extern struct MDRIVER drv_aiff;   /* AIFF file disk writer [music.aiff] */\r
695 \r
696 MIKMODAPI extern struct MDRIVER drv_ultra;  /* Linux Ultrasound driver */\r
697 MIKMODAPI extern struct MDRIVER drv_sam9407;    /* Linux sam9407 driver */\r
698 \r
699 MIKMODAPI extern struct MDRIVER drv_AF;     /* Dec Alpha AudioFile */\r
700 MIKMODAPI extern struct MDRIVER drv_aix;    /* AIX audio device */\r
701 MIKMODAPI extern struct MDRIVER drv_alsa;   /* Advanced Linux Sound Architecture (ALSA) */\r
702 MIKMODAPI extern struct MDRIVER drv_esd;    /* Enlightened sound daemon (EsounD) */\r
703 MIKMODAPI extern struct MDRIVER drv_hp;     /* HP-UX audio device */\r
704 MIKMODAPI extern struct MDRIVER drv_oss;    /* OpenSound System (Linux,FreeBSD...) */\r
705 MIKMODAPI extern struct MDRIVER drv_sgi;    /* SGI audio library */\r
706 MIKMODAPI extern struct MDRIVER drv_sun;    /* Sun/NetBSD/OpenBSD audio device */\r
707 \r
708 MIKMODAPI extern struct MDRIVER drv_dart;   /* OS/2 Direct Audio RealTime */\r
709 MIKMODAPI extern struct MDRIVER drv_os2;    /* OS/2 MMPM/2 */\r
710 \r
711 MIKMODAPI extern struct MDRIVER drv_ds;     /* Win32 DirectSound driver */\r
712 MIKMODAPI extern struct MDRIVER drv_win;    /* Win32 multimedia API driver */\r
713 \r
714 MIKMODAPI extern struct MDRIVER drv_mac;    /* Macintosh Sound Manager driver */\r
715 MIKMODAPI extern struct MDRIVER drv_osx;        /* MacOS X CoreAudio Driver */\r
716 \r
717 /*========== Virtual channel mixer interface (for user-supplied drivers only) */\r
718 \r
719 MIKMODAPI extern BOOL  VC_Init(void);\r
720 MIKMODAPI extern void  VC_Exit(void);\r
721 MIKMODAPI extern BOOL  VC_SetNumVoices(void);\r
722 MIKMODAPI extern ULONG VC_SampleSpace(int);\r
723 MIKMODAPI extern ULONG VC_SampleLength(int,SAMPLE*);\r
724 \r
725 MIKMODAPI extern BOOL  VC_PlayStart(void);\r
726 MIKMODAPI extern void  VC_PlayStop(void);\r
727 \r
728 MIKMODAPI extern SWORD VC_SampleLoad(struct SAMPLOAD*,int);\r
729 MIKMODAPI extern void  VC_SampleUnload(SWORD);\r
730 \r
731 MIKMODAPI extern ULONG VC_WriteBytes(SBYTE*,ULONG);\r
732 MIKMODAPI extern ULONG VC_SilenceBytes(SBYTE*,ULONG);\r
733 \r
734 MIKMODAPI extern void  VC_VoiceSetVolume(UBYTE,UWORD);\r
735 MIKMODAPI extern UWORD VC_VoiceGetVolume(UBYTE);\r
736 MIKMODAPI extern void  VC_VoiceSetFrequency(UBYTE,ULONG);\r
737 MIKMODAPI extern ULONG VC_VoiceGetFrequency(UBYTE);\r
738 MIKMODAPI extern void  VC_VoiceSetPanning(UBYTE,ULONG);\r
739 MIKMODAPI extern ULONG VC_VoiceGetPanning(UBYTE);\r
740 MIKMODAPI extern void  VC_VoicePlay(UBYTE,SWORD,ULONG,ULONG,ULONG,ULONG,UWORD);\r
741 \r
742 MIKMODAPI extern void  VC_VoiceStop(UBYTE);\r
743 MIKMODAPI extern BOOL  VC_VoiceStopped(UBYTE);\r
744 MIKMODAPI extern SLONG VC_VoiceGetPosition(UBYTE);\r
745 MIKMODAPI extern ULONG VC_VoiceRealVolume(UBYTE);\r
746 \r
747 #ifdef __cplusplus\r
748 }\r
749 #endif\r
750 \r
751 #endif\r
752 \r
753 /* ex:set ts=4: */\r