1 /* MikMod sound library
\r
2 (c) 1998, 1999, 2000 Miodrag Vallat and others - see file AUTHORS
\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_build.h,v 1.3 2004/02/19 14:15:22 raph Exp $
\r
25 MikMod sound library include file
\r
27 ==============================================================================*/
\r
40 * ========== Compiler magic for shared libraries
\r
43 #if defined WIN32 && defined _DLL
\r
45 #define MIKMODAPI __declspec(dllexport)
\r
47 #define MIKMODAPI __declspec(dllimport)
\r
53 #define BOOL BOOLTYPE
\r
60 * ========== Library version
\r
63 #define LIBMIKMOD_VERSION_MAJOR 3L
\r
64 #define LIBMIKMOD_VERSION_MINOR 2L
\r
65 #define LIBMIKMOD_REVISION 0L
\r
67 #define LIBMIKMOD_VERSION \
\r
68 ((LIBMIKMOD_VERSION_MAJOR<<16)| \
\r
69 (LIBMIKMOD_VERSION_MINOR<< 8)| \
\r
70 (LIBMIKMOD_REVISION))
\r
72 MIKMODAPI extern long MikMod_GetVersion(void);
\r
75 * ========== Platform independent-type definitions
\r
79 #define WIN32_LEAN_AND_MEAN
\r
80 #include <windows.h>
\r
82 #include <mmsystem.h>
\r
85 #if defined(__OS2__)||defined(__EMX__)
\r
86 #define INCL_DOSSEMAPHORES
\r
94 #if defined(__arch64__) || defined(__alpha)
\r
95 /* 64 bit architectures */
\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
106 /* 32 bit architectures */
\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
120 * ========== Error codes
\r
124 MMERR_OPENING_FILE = 1,
\r
125 MMERR_OUT_OF_MEMORY,
\r
126 MMERR_DYNAMIC_LINKING,
\r
128 MMERR_SAMPLE_TOO_BIG,
\r
129 MMERR_OUT_OF_HANDLES,
\r
130 MMERR_UNKNOWN_WAVE_TYPE,
\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
141 MMERR_DETECTING_DEVICE,
\r
142 MMERR_INVALID_DEVICE,
\r
143 MMERR_INITIALIZING_MIXER,
\r
144 MMERR_OPENING_AUDIO,
\r
151 MMERR_AF_AUDIO_PORT,
\r
153 MMERR_AIX_CONFIG_INIT,
\r
154 MMERR_AIX_CONFIG_CONTROL,
\r
155 MMERR_AIX_CONFIG_START,
\r
157 MMERR_GUS_SETTINGS,
\r
161 MMERR_HP_SETSAMPLESIZE,
\r
164 MMERR_HP_AUDIO_OUTPUT,
\r
165 MMERR_HP_AUDIO_DESC,
\r
166 MMERR_HP_BUFFERSIZE,
\r
168 MMERR_OSS_SETFRAGMENT,
\r
169 MMERR_OSS_SETSAMPLESIZE,
\r
170 MMERR_OSS_SETSTEREO,
\r
171 MMERR_OSS_SETSPEED,
\r
181 MMERR_OS2_MIXSETUP,
\r
182 MMERR_OS2_SEMAPHORE,
\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
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
212 MMERR_DOSWSS_STARTDMA,
\r
213 MMERR_DOSSB_STARTDMA,
\r
219 * ========== Error handling
\r
222 typedef void (MikMod_handler)(void);
\r
223 typedef MikMod_handler *MikMod_handler_t;
\r
225 MIKMODAPI extern int MikMod_errno;
\r
226 MIKMODAPI extern BOOL MikMod_critical;
\r
227 MIKMODAPI extern char *MikMod_strerror(int);
\r
229 MIKMODAPI extern MikMod_handler_t MikMod_RegisterErrorHandler(MikMod_handler_t);
\r
232 * ========== Library initialization and core functions
\r
237 MIKMODAPI extern void MikMod_RegisterAllDrivers(void);
\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
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
253 MIKMODAPI extern BOOL MikMod_InitThreads(void);
\r
254 MIKMODAPI extern void MikMod_Lock(void);
\r
255 MIKMODAPI extern void MikMod_Unlock(void);
\r
258 * ========== Reader, Writer
\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
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
277 * ========== Samples
\r
280 /* Sample playback should not be interrupted */
\r
281 #define SFX_CRITICAL 1
\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
291 #define SF_FORMATMASK 0x003F
\r
293 /* General Playback flags */
\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
300 #define SF_PLAYBACKMASK 0x0C00
\r
302 /* Module-only Playback Flags */
\r
304 #define SF_OWNPAN 0x1000
\r
305 #define SF_UST_LOOP 0x2000
\r
307 #define SF_EXTRAPLAYBACKMASK 0x3000
\r
309 /* Panning constants */
\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
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
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
336 CHAR* samplename; /* name of the sample */
\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
345 /* Sample functions */
\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
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
366 * ========== Internal module representation (UniMod)
\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
374 /* Instrument note count */
\r
375 #define INSTNOTES 120
\r
377 /* Envelope point */
\r
378 typedef struct ENVPT {
\r
383 /* Envelope point count */
\r
384 #define ENVPOINTS 32
\r
386 /* Instrument structure */
\r
387 typedef struct INSTRUMENT {
\r
391 UWORD samplenumber[INSTNOTES];
\r
392 UBYTE samplenote[INSTNOTES];
\r
395 UBYTE dca; /* duplicate check action */
\r
396 UBYTE dct; /* duplicate check type */
\r
399 SWORD panning; /* instrument-based panning var */
\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
406 /* volume envelope */
\r
407 UBYTE volflg; /* bit 0: on 1: sustain 2: loop */
\r
413 ENVPT volenv[ENVPOINTS];
\r
414 /* panning envelope */
\r
415 UBYTE panflg; /* bit 0: on 1: sustain 2: loop */
\r
421 ENVPT panenv[ENVPOINTS];
\r
422 /* pitch envelope */
\r
423 UBYTE pitflg; /* bit 0: on 1: sustain 2: loop */
\r
429 ENVPT pitenv[ENVPOINTS];
\r
439 /* maximum master channels supported */
\r
440 #define UF_MAXCHAN 64
\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
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
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
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
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
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
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
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
497 SWORD relspd; /* relative speed factor */
\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
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
511 struct MP_CONTROL* control; /* Effects Channel info (size pf->numchn) */
\r
512 struct MP_VOICE* voice; /* Audio Voice information (size md_numchn) */
\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
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
535 * ========== Module loaders
\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
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
565 * ========== Module player
\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
594 typedef void (MikMod_player)(void);
\r
595 typedef MikMod_player *MikMod_player_t;
\r
597 MIKMODAPI extern MikMod_player_t MikMod_RegisterPlayer(MikMod_player_t);
\r
599 #define MUTE_EXCLUSIVE 32000
\r
600 #define MUTE_INCLUSIVE 32001
\r
603 * ========== Drivers
\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
631 typedef struct MDRIVER {
\r
632 struct MDRIVER* next;
\r
636 UBYTE HardVoiceLimit; /* Limit of hardware mixer voices */
\r
637 UBYTE SoftVoiceLimit; /* Limit of software mixer voices */
\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
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
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
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
684 /* The following variable should not be changed! */
\r
685 MIKMODAPI extern MDRIVER* md_driver; /* Current driver in use. */
\r
687 /* Known drivers list */
\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
696 MIKMODAPI extern struct MDRIVER drv_ultra; /* Linux Ultrasound driver */
\r
697 MIKMODAPI extern struct MDRIVER drv_sam9407; /* Linux sam9407 driver */
\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
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
711 MIKMODAPI extern struct MDRIVER drv_ds; /* Win32 DirectSound driver */
\r
712 MIKMODAPI extern struct MDRIVER drv_win; /* Win32 multimedia API driver */
\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
717 /*========== Virtual channel mixer interface (for user-supplied drivers only) */
\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
725 MIKMODAPI extern BOOL VC_PlayStart(void);
\r
726 MIKMODAPI extern void VC_PlayStop(void);
\r
728 MIKMODAPI extern SWORD VC_SampleLoad(struct SAMPLOAD*,int);
\r
729 MIKMODAPI extern void VC_SampleUnload(SWORD);
\r
731 MIKMODAPI extern ULONG VC_WriteBytes(SBYTE*,ULONG);
\r
732 MIKMODAPI extern ULONG VC_SilenceBytes(SBYTE*,ULONG);
\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
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