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