10
|
1
|
|
2 #ifndef MIKMOD_H
|
|
3 #define MIKMOD_H
|
|
4
|
|
5 #include "mmio.h"
|
|
6
|
|
7 #ifdef __cplusplus
|
|
8 extern "C" {
|
|
9 #endif
|
|
10
|
|
11
|
|
12 #define MUTE_EXCLUSIVE 32000
|
|
13 #define MUTE_INCLUSIVE 32001
|
|
14
|
|
15 #define PAN_LEFT 0
|
|
16 #define PAN_CENTER 128
|
|
17 #define PAN_RIGHT 255
|
|
18 #define PAN_SURROUND 512 // panning value for Dolby Surround
|
|
19
|
|
20
|
|
21 #define MikMod_RegisterDriver(x) MD_RegisterDriver(&x)
|
|
22 #define MikMod_RegisterLoader(x) ML_RegisterLoader(&x)
|
|
23 #define MikMod_RegisterErrorHandler(x) _mm_RegisterErrorHandler(x)
|
|
24
|
|
25
|
|
26 // The following #define macros are for retaining API compatiability
|
|
27 // with the beta version of MikMod 3.0, and are TEMPORARY! They WILL
|
|
28 // be removed in the future!
|
|
29
|
|
30 #define MD_RegisterPlayer(x) MikMod_RegisterPlayer(x)
|
|
31 #define MD_Init MikMod_Init
|
|
32 #define MD_Exit MikMod_Exit
|
|
33 #define MD_Update MikMod_Update
|
|
34 #define ML_Free(x) MikMod_FreeSong(x)
|
|
35 #define MD_SetNumChannels(x,y) MikMod_SetNumVoices(x,y)
|
|
36 #define MD_SetNumVoices(x,y) MikMod_SetNumVoices(x,y)
|
|
37 #define MD_PlayStart MikMod_EnableOutput
|
|
38 #define MD_PlayStop MikMod_DisableOutput
|
|
39
|
|
40 #define MD_VoiceSetVolume(x,y) Voice_SetVolume(x,y)
|
|
41 #define MD_VoiceSetFrequency(x,y) Voice_SetFrequency(x,y)
|
|
42 #define MD_VoiceSetPanning(x,y) Voice_SetPanning(x,y)
|
|
43 #define MD_VoicePlay(x,y,z) Voice_Play(x,y,z)
|
|
44 #define MD_VoiceStop(x) Voice_Stop(x)
|
|
45 #define MD_VoiceReleaseSustain(x) Voice_ReleaseSustain(x)
|
|
46 #define MD_VoiceStopped(x) Voice_Stopped(x)
|
|
47 #define MD_VoiceGetPosition(x) Voice_GetPosition(x)
|
|
48 #define MD_VoiceRealVolume(x) Voice_RealVolume(x)
|
|
49
|
|
50
|
|
51 #define SFX_CRITICAL 1
|
|
52
|
|
53
|
|
54 /**************************************************************************
|
|
55 ****** mikmod types: ******************************************************
|
|
56 **************************************************************************/
|
|
57
|
|
58 // Sample format [loading and in-memory] flags:
|
|
59 #define SF_16BITS 1
|
|
60 #define SF_SIGNED 2
|
|
61 #define SF_STEREO 4
|
|
62 #define SF_DELTA 8
|
|
63 #define SF_BIG_ENDIAN 16
|
|
64
|
|
65 // General Playback flags
|
|
66
|
|
67 #define SF_LOOP 32
|
|
68 #define SF_BIDI 64
|
|
69 #define SF_SUSTAIN 128
|
|
70 #define SF_REVERSE 256
|
|
71
|
|
72 // Module-only Playback Flags
|
|
73
|
|
74 #define SF_OWNPAN 512
|
|
75 #define SF_UST_LOOP 1024
|
|
76
|
|
77
|
|
78 typedef struct SAMPLE
|
|
79 { ULONG speed; // Base playing speed/frequency of note (Middle C in player)
|
|
80 UBYTE volume; // volume 0-64
|
|
81 UWORD panning; // panning (0-255 or PAN_SURROUND)
|
|
82 ULONG length; // length of sample (in samples!)
|
|
83 ULONG loopstart; // repeat position (relative to start, in samples)
|
|
84 ULONG loopend; // repeat end
|
|
85 ULONG susbegin; // sustain loop begin (in samples) \ Not Supported
|
|
86 ULONG susend; // sustain loop end / Yet!
|
|
87
|
|
88 UWORD flags; // sample format in memory
|
|
89
|
|
90 // Variables used by the module player only! (ignored for sound effects)
|
|
91
|
|
92 UBYTE globvol; // global volume
|
|
93 UBYTE vibflags; // autovibrato flag stuffs
|
|
94 UBYTE vibtype; // Vibratos moved from INSTRUMENT to SAMPLE
|
|
95 UBYTE vibsweep;
|
|
96 UBYTE vibdepth;
|
|
97 UBYTE vibrate;
|
|
98
|
|
99 CHAR *samplename; // name of the sample
|
|
100
|
|
101 // Values used internally only (not saved in disk formats)
|
|
102
|
|
103 UWORD avibpos; // autovibrato pos [player use]
|
|
104 UBYTE divfactor; // for sample scaling (maintains proper period slides)
|
|
105 ULONG seekpos; // seek position in file
|
|
106 SWORD handle; // sample handle used by individual drivers
|
|
107 } SAMPLE;
|
|
108
|
|
109
|
|
110
|
|
111 // --> Struct : SAMPLOAD
|
|
112 // This is a handle of sorts attached to any sample registered with
|
|
113 // SL_RegisterSample. Generally, this only need be used or changed by the
|
|
114 // loaders and drivers of mikmod.
|
|
115
|
|
116 typedef struct SAMPLOAD
|
|
117 { struct SAMPLOAD *next;
|
|
118
|
|
119 ULONG length; // length of sample (in samples!)
|
|
120 ULONG loopstart; // repeat position (relative to start, in samples)
|
|
121 ULONG loopend; // repeat end
|
|
122
|
|
123 UWORD infmt, outfmt;
|
|
124 int scalefactor;
|
|
125 SAMPLE *sample;
|
|
126 FILE *fp;
|
|
127 } SAMPLOAD;
|
|
128
|
|
129 extern void SL_HalveSample(SAMPLOAD *s);
|
|
130 extern void SL_Sample8to16(SAMPLOAD *s);
|
|
131 extern void SL_Sample16to8(SAMPLOAD *s);
|
|
132 extern void SL_SampleSigned(SAMPLOAD *s);
|
|
133 extern void SL_SampleUnsigned(SAMPLOAD *s);
|
|
134 extern BOOL SL_LoadSamples(void); // Returns 1 on error!
|
|
135 extern SAMPLOAD *SL_RegisterSample(SAMPLE *s, int type, FILE *fp); // Returns 1 on error!
|
|
136 extern void SL_Load(void *buffer, SAMPLOAD *smp, int length);
|
|
137 extern BOOL SL_Init(SAMPLOAD *s);
|
|
138 extern void SL_Exit(SAMPLOAD *s);
|
|
139
|
|
140
|
|
141 /**************************************************************************
|
|
142 ****** Wavload stuff: *****************************************************
|
|
143 **************************************************************************/
|
|
144
|
|
145 SAMPLE *WAV_LoadFP(FILE *fp);
|
|
146 SAMPLE *WAV_LoadFN(CHAR *filename);
|
|
147 void WAV_Free(SAMPLE *si);
|
|
148
|
|
149
|
|
150 #include "ptform.h"
|
|
151
|
|
152
|
|
153 /**************************************************************************
|
|
154 ****** Driver stuff: ******************************************************
|
|
155 **************************************************************************/
|
|
156
|
|
157 // max. number of handles a driver has to provide. (not strict)
|
|
158
|
|
159 #define MAXSAMPLEHANDLES 384
|
|
160
|
|
161
|
|
162 enum
|
|
163 { MD_MUSIC = 0,
|
|
164 MD_SNDFX
|
|
165 };
|
|
166
|
|
167 enum
|
|
168 { MD_HARDWARE = 0,
|
|
169 MD_SOFTWARE
|
|
170 };
|
|
171
|
|
172
|
|
173 // possible mixing mode bits:
|
|
174 // --------------------------
|
|
175 // These take effect only after MikMod_Init or MikMod_Reset.
|
|
176
|
|
177 #define DMODE_16BITS 1 // enable 16 bit output
|
|
178 #define DMODE_SURROUND 2 // enable Dolby surround sound (not yet supported)
|
|
179 #define DMODE_SOFT_SNDFX 4 // Process sound effects via software mixer (not yet supported)
|
|
180 #define DMODE_SOFT_MUSIC 8 // Process music via software mixer (not yet supported)
|
|
181
|
|
182 // These take effect immidiately.
|
|
183
|
|
184 #define DMODE_STEREO 16 // enable stereo output
|
|
185 #define DMODE_REVERSE 32 // reverse stereo
|
|
186 #define DMODE_INTERP 64 // enable interpolation (not yet supported)
|
|
187
|
|
188
|
|
189 // driver structure:
|
|
190
|
|
191 typedef struct MDRIVER
|
|
192 { struct MDRIVER *next;
|
|
193 CHAR *Name;
|
|
194 CHAR *Version;
|
|
195 UBYTE HardVoiceLimit, // Limit of hardware mixer voices for this driver
|
|
196 SoftVoiceLimit; // Limit of software mixer voices for this driver
|
|
197
|
|
198 BOOL (*IsPresent) (void);
|
|
199 SWORD (*SampleLoad) (SAMPLOAD *s, int type, FILE *fp);
|
|
200 void (*SampleUnLoad) (SWORD handle);
|
|
201 ULONG (*FreeSampleSpace) (int type);
|
|
202 ULONG (*RealSampleLength) (int type, SAMPLE *s);
|
|
203 BOOL (*Init) (void);
|
|
204 void (*Exit) (void);
|
|
205 BOOL (*Reset) (void);
|
|
206 BOOL (*SetNumVoices) (void);
|
|
207 BOOL (*PlayStart) (void);
|
|
208 void (*PlayStop) (void);
|
|
209 void (*Update) (void);
|
|
210 void (*VoiceSetVolume) (UBYTE voice, UWORD vol);
|
|
211 void (*VoiceSetFrequency) (UBYTE voice, ULONG frq);
|
|
212 void (*VoiceSetPanning) (UBYTE voice, ULONG pan);
|
|
213 void (*VoicePlay) (UBYTE voice, SWORD handle, ULONG start, ULONG size, ULONG reppos, ULONG repend, UWORD flags);
|
|
214 void (*VoiceStop) (UBYTE voice);
|
|
215 BOOL (*VoiceStopped) (UBYTE voice);
|
|
216 void (*VoiceReleaseSustain)(UBYTE voice);
|
|
217 SLONG (*VoiceGetPosition) (UBYTE voice);
|
|
218 ULONG (*VoiceRealVolume) (UBYTE voice);
|
|
219
|
|
220 BOOL (*StreamInit) (ULONG speed, UWORD flags);
|
|
221 void (*StreamExit) (void);
|
|
222 void (*StreamSetSpeed) (ULONG speed);
|
|
223 SLONG (*StreamGetPosition) (void);
|
|
224 void (*StreamLoadFP) (FILE *fp);
|
|
225 } MDRIVER;
|
|
226
|
|
227
|
|
228 // These variables can be changed at ANY time and results
|
|
229 // will be immidiate:
|
|
230
|
|
231 extern UBYTE md_bpm; // current song / hardware BPM rate
|
|
232 extern UBYTE md_volume; // Global sound volume (0-128)
|
|
233 extern UBYTE md_musicvolume; // volume of song
|
|
234 extern UBYTE md_sndfxvolume; // volume of sound effects
|
|
235 extern UBYTE md_reverb; // 0 = none; 15 = chaos
|
|
236 extern UBYTE md_pansep; // 0 = mono; 128 == 100% (full left/right)
|
|
237
|
|
238
|
|
239 // The variables below can be changed at any time, but changes will
|
|
240 // not be implimented until MikMod_Reset is called. A call to
|
|
241 // MikMod_Reset may result in a skip or pop in audio (depending on
|
|
242 // the soundcard driver and the settings changed).
|
|
243
|
|
244 extern UWORD md_device; // Device. 0 = autodetect, other # depend on driver register order.
|
|
245 extern UWORD md_mixfreq; // mixing frequency. Valid 5000 -> 44100
|
|
246 extern UWORD md_dmabufsize; // DMA buffer size. Valid 512 -> 32000
|
|
247 extern UWORD md_mode; // Mode. See DMODE_? flags above
|
|
248
|
|
249
|
|
250 // Variables below can be changed via MD_SetNumVoices at any time.
|
|
251 // However, a call to MD_SetNumVoicess while the driver
|
|
252 // is active will cause the sound to skip slightly.
|
|
253
|
|
254 extern UBYTE md_numchn, // number of song + sound effects voices
|
|
255 md_sngchn, // number of song voices
|
|
256 md_sfxchn, // number of sound effects voices
|
|
257 md_hardchn, // number of hardware mixed voices
|
|
258 md_softchn; // number of software mixed voices
|
|
259
|
|
260
|
|
261 // Following variables should not be changed!
|
|
262 extern MDRIVER *md_driver; // Current driver in use. See MDRIVER struct
|
|
263 // above for structure info contents.
|
|
264
|
|
265 // This is for use by the hardware drivers only. It points to the
|
|
266 // registered tickhandler function.
|
|
267 extern void (*md_player)(void);
|
|
268
|
|
269
|
|
270 // main driver prototypes:
|
|
271
|
|
272 extern void MikMod_RegisterAllDrivers(void);
|
|
273 extern void MikMod_RegisterAllLoaders(void);
|
|
274
|
|
275 extern BOOL MikMod_Init(void);
|
|
276 extern void MikMod_Exit(void);
|
|
277 extern BOOL MikMod_Reset(void);
|
|
278 extern int MikMod_PlaySample(SAMPLE *s, ULONG start, UBYTE flags);
|
|
279 extern BOOL MikMod_SetNumVoices(int music, int sndfx);
|
|
280 extern BOOL MikMod_Active(void);
|
|
281 extern BOOL MikMod_EnableOutput(void);
|
|
282 extern void MikMod_DisableOutput(void);
|
|
283 extern void MikMod_RegisterPlayer(void (*plr)(void));
|
|
284 extern void MikMod_Update(void);
|
|
285
|
|
286 extern void Voice_SetVolume(int voice, UWORD ivol);
|
|
287 extern void Voice_SetFrequency(int voice, ULONG frq);
|
|
288 extern void Voice_SetPanning(int voice, ULONG pan);
|
|
289 extern void Voice_Play(int voice,SAMPLE *s, ULONG start);
|
|
290 extern void Voice_Stop(int voice);
|
|
291 extern void Voice_ReleaseSustain(int voice);
|
|
292 extern BOOL Voice_Stopped(int voice);
|
|
293 extern SLONG Voice_GetPosition(int voice);
|
|
294 extern ULONG Voice_RealVolume(int voice);
|
|
295
|
|
296 extern void MD_InfoDriver(void);
|
|
297 extern void MD_RegisterDriver(MDRIVER *drv);
|
|
298 extern SWORD MD_SampleLoad(SAMPLOAD *s, int type, FILE *fp);
|
|
299 extern void MD_SampleUnLoad(SWORD handle);
|
|
300 extern void MD_SetBPM(UBYTE bpm);
|
|
301 extern ULONG MD_SampleSpace(int type);
|
|
302 extern ULONG MD_SampleLength(int type, SAMPLE *s);
|
|
303
|
|
304 // Declare external drivers:
|
|
305
|
|
306 extern MDRIVER drv_awe; // experimental SB-AWE driver
|
|
307 extern MDRIVER drv_gus; // gravis ultrasound driver [hardware / software mixing]
|
|
308 extern MDRIVER drv_gus2; // gravis ultrasound driver [hardware mixing only]
|
|
309 extern MDRIVER drv_sb; // soundblaster 1.5 / 2.0 DSP driver
|
|
310 extern MDRIVER drv_sbpro; // soundblaster Pro DSP driver
|
|
311 extern MDRIVER drv_sb16; // soundblaster 16 DSP driver
|
|
312 extern MDRIVER drv_ss; // ensoniq soundscape driver
|
|
313 extern MDRIVER drv_pas; // PAS16 driver
|
|
314 extern MDRIVER drv_wss; // Windows Sound System driver
|
|
315 extern MDRIVER drv_nos; // nosound driver
|
|
316 extern MDRIVER drv_raw; // raw file output driver [music.raw]
|
|
317 extern MDRIVER drv_wav; // RIFF WAVE file output driver [music.wav]
|
|
318
|
|
319 extern MDRIVER drv_w95; // win95 driver
|
|
320 extern MDRIVER drv_oss; // linux voxware driver
|
|
321 extern MDRIVER drv_AF; // Dec Alpha AudioFile driver
|
|
322 extern MDRIVER drv_sun; // Sun driver
|
|
323 extern MDRIVER drv_os2; // Os2 driver
|
|
324 extern MDRIVER drv_hp; // HP-UX /dev/audio driver
|
|
325 extern MDRIVER drv_aix; // AIX audio-device driver
|
|
326 extern MDRIVER drv_sgi; // SGI audio-device driver
|
|
327 extern MDRIVER drv_tim; // timing driver
|
|
328 extern MDRIVER drv_ultra; // ultra driver for linux
|
|
329
|
|
330
|
|
331 /**************************************************************************
|
|
332 ****** Streaming Audio stuff: *********************************************
|
|
333 **************************************************************************/
|
|
334
|
|
335
|
|
336 typedef struct MSTREAM
|
|
337 { struct MSTREAM *next;
|
|
338 CHAR *type;
|
|
339 CHAR *version;
|
|
340 BOOL (*Init)(void);
|
|
341 BOOL (*Test)(void);
|
|
342 BOOL (*Load)(void);
|
|
343 void (*Cleanup)(void);
|
|
344 } MSTREAM;
|
|
345
|
|
346
|
|
347 extern int stream_bufsize;
|
|
348 extern FILE *stream_fp;
|
|
349 extern SLONG stream_seekpos;
|
|
350 extern SLONG stream_reppos;
|
|
351
|
|
352
|
|
353 /**************************************************************************
|
|
354 ****** Virtual channel stuff: *********************************************
|
|
355 **************************************************************************/
|
|
356
|
|
357 extern BOOL VC_Init(void);
|
|
358 extern void VC_Exit(void);
|
|
359 extern BOOL VC_SetNumVoices(void);
|
|
360 extern ULONG VC_SampleSpace(int type);
|
|
361 extern ULONG VC_SampleLength(int type, SAMPLE *s);
|
|
362
|
|
363 extern BOOL VC_PlayStart(void);
|
|
364 extern void VC_PlayStop(void);
|
|
365
|
|
366 extern SWORD VC_SampleLoad(SAMPLOAD *sload, int type, FILE *fp);
|
|
367 extern void VC_SampleUnload(SWORD handle);
|
|
368
|
|
369 extern void VC_WriteSamples(SBYTE *buf,ULONG todo);
|
|
370 extern ULONG VC_WriteBytes(SBYTE *buf,ULONG todo);
|
|
371 extern void VC_SilenceBytes(SBYTE *buf,ULONG todo);
|
|
372
|
|
373 extern void VC_VoiceSetVolume(UBYTE voice, UWORD vol);
|
|
374 extern void VC_VoiceSetFrequency(UBYTE voice, ULONG frq);
|
|
375 extern void VC_VoiceSetPanning(UBYTE voice, ULONG pan);
|
|
376 extern void VC_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);
|
|
377
|
|
378 extern void VC_VoiceStop(UBYTE voice);
|
|
379 extern BOOL VC_VoiceStopped(UBYTE voice);
|
|
380 extern void VC_VoiceReleaseSustain(UBYTE voice);
|
|
381 extern SLONG VC_VoiceGetPosition(UBYTE voice);
|
|
382 extern ULONG VC_VoiceRealVolume(UBYTE voice);
|
|
383
|
|
384
|
|
385 extern BOOL VC2_Init(void);
|
|
386 extern void VC2_Exit(void);
|
|
387 extern BOOL VC2_SetNumVoices(void);
|
|
388 extern ULONG VC2_SampleSpace(int type);
|
|
389 extern ULONG VC2_SampleLength(int type, SAMPLE *s);
|
|
390
|
|
391 extern BOOL VC2_PlayStart(void);
|
|
392 extern void VC2_PlayStop(void);
|
|
393
|
|
394 extern SWORD VC2_SampleLoad(SAMPLOAD *sload, int type, FILE *fp);
|
|
395 extern void VC2_SampleUnload(SWORD handle);
|
|
396
|
|
397 extern void VC2_WriteSamples(SBYTE *buf,ULONG todo);
|
|
398 extern ULONG VC2_WriteBytes(SBYTE *buf,ULONG todo);
|
|
399 extern void VC2_SilenceBytes(SBYTE *buf,ULONG todo);
|
|
400
|
|
401 extern void VC2_VoiceSetVolume(UBYTE voice, UWORD vol);
|
|
402 extern void VC2_VoiceSetFrequency(UBYTE voice, ULONG frq);
|
|
403 extern void VC2_VoiceSetPanning(UBYTE voice, ULONG pan);
|
|
404 extern void VC2_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);
|
|
405
|
|
406 extern void VC2_VoiceStop(UBYTE voice);
|
|
407 extern BOOL VC2_VoiceStopped(UBYTE voice);
|
|
408 extern void VC2_VoiceReleaseSustain(UBYTE voice);
|
|
409 extern SLONG VC2_VoiceGetPosition(UBYTE voice);
|
|
410
|
|
411 #ifdef __cplusplus
|
|
412 }
|
|
413 #endif
|
|
414
|
|
415 #endif
|