author | llornkcor <llornkcor> | 2002-07-20 22:07:31 (UTC) |
---|---|---|
committer | llornkcor <llornkcor> | 2002-07-20 22:07:31 (UTC) |
commit | 2342d48be31847e7ead9d1cc682452e8f0122351 (patch) (unidiff) | |
tree | 8329bb94e9d429c905a0ef6b881cf1c0f775bf14 /core/multimedia/opieplayer/modplug/sndfile.h | |
parent | 0f24c1fb86d3bb58d8696358b824c0e01752b10d (diff) | |
download | opie-2342d48be31847e7ead9d1cc682452e8f0122351.zip opie-2342d48be31847e7ead9d1cc682452e8f0122351.tar.gz opie-2342d48be31847e7ead9d1cc682452e8f0122351.tar.bz2 |
initial commit of modplugin
Diffstat (limited to 'core/multimedia/opieplayer/modplug/sndfile.h') (more/less context) (ignore whitespace changes)
-rw-r--r-- | core/multimedia/opieplayer/modplug/sndfile.h | 984 |
1 files changed, 984 insertions, 0 deletions
diff --git a/core/multimedia/opieplayer/modplug/sndfile.h b/core/multimedia/opieplayer/modplug/sndfile.h new file mode 100644 index 0000000..8017116 --- a/dev/null +++ b/core/multimedia/opieplayer/modplug/sndfile.h | |||
@@ -0,0 +1,984 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and modify it | ||
3 | * under the terms of the GNU General Public License as published by the | ||
4 | * Free Software Foundation; either version 2 of the license or (at your | ||
5 | * option) any later version. | ||
6 | * | ||
7 | * Authors: Olivier Lapicque <olivierl@jps.net>, | ||
8 | * Adam Goode <adam@evdebs.org> (endian and char fixes for PPC) | ||
9 | */ | ||
10 | |||
11 | #ifdef HAVE_CONFIG_H | ||
12 | #include "config.h" | ||
13 | #endif | ||
14 | |||
15 | #ifndef __SNDFILE_H | ||
16 | #define __SNDFILE_H | ||
17 | |||
18 | #ifndef LPCBYTE | ||
19 | typedef const BYTE * LPCBYTE; | ||
20 | #endif | ||
21 | |||
22 | #define MOD_AMIGAC2 0x1AB | ||
23 | #define MAX_SAMPLE_LENGTH16000000 | ||
24 | #define MAX_SAMPLE_RATE 50000 | ||
25 | #define MAX_ORDERS 256 | ||
26 | #define MAX_PATTERNS 240 | ||
27 | #define MAX_SAMPLES 240 | ||
28 | #define MAX_INSTRUMENTS MAX_SAMPLES | ||
29 | #ifdef FASTSOUNDLIB | ||
30 | #define MAX_CHANNELS 80 | ||
31 | #else | ||
32 | #define MAX_CHANNELS 128 | ||
33 | #endif | ||
34 | #define MAX_BASECHANNELS64 | ||
35 | #define MAX_ENVPOINTS 32 | ||
36 | #define MIN_PERIOD 0x0020 | ||
37 | #define MAX_PERIOD 0xFFFF | ||
38 | #define MAX_PATTERNNAME 32 | ||
39 | #define MAX_CHANNELNAME 20 | ||
40 | #define MAX_INFONAME 80 | ||
41 | #define MAX_EQ_BANDS 6 | ||
42 | #define MAX_MIXPLUGINS 8 | ||
43 | |||
44 | |||
45 | #define MOD_TYPE_NONE 0x00 | ||
46 | #define MOD_TYPE_MOD 0x01 | ||
47 | #define MOD_TYPE_S3M 0x02 | ||
48 | #define MOD_TYPE_XM 0x04 | ||
49 | #define MOD_TYPE_MED 0x08 | ||
50 | #define MOD_TYPE_MTM 0x10 | ||
51 | #define MOD_TYPE_IT 0x20 | ||
52 | #define MOD_TYPE_669 0x40 | ||
53 | #define MOD_TYPE_ULT 0x80 | ||
54 | #define MOD_TYPE_STM 0x100 | ||
55 | #define MOD_TYPE_FAR 0x200 | ||
56 | #define MOD_TYPE_WAV 0x400 | ||
57 | #define MOD_TYPE_AMF 0x800 | ||
58 | #define MOD_TYPE_AMS 0x1000 | ||
59 | #define MOD_TYPE_DSM 0x2000 | ||
60 | #define MOD_TYPE_MDL 0x4000 | ||
61 | #define MOD_TYPE_OKT 0x8000 | ||
62 | #define MOD_TYPE_MID 0x10000 | ||
63 | #define MOD_TYPE_DMF 0x20000 | ||
64 | #define MOD_TYPE_PTM 0x40000 | ||
65 | #define MOD_TYPE_DBM 0x80000 | ||
66 | #define MOD_TYPE_MT2 0x100000 | ||
67 | #define MOD_TYPE_AMF0 0x200000 | ||
68 | #define MOD_TYPE_PSM 0x400000 | ||
69 | #define MOD_TYPE_J2B 0x800000 | ||
70 | #define MOD_TYPE_UMX 0x80000000 // Fake type | ||
71 | #define MAX_MODTYPE 23 | ||
72 | |||
73 | |||
74 | |||
75 | // Channel flags: | ||
76 | // Bits 0-7:Sample Flags | ||
77 | #define CHN_16BIT 0x01 | ||
78 | #define CHN_LOOP 0x02 | ||
79 | #define CHN_PINGPONGLOOP0x04 | ||
80 | #define CHN_SUSTAINLOOP 0x08 | ||
81 | #define CHN_PINGPONGSUSTAIN0x10 | ||
82 | #define CHN_PANNING 0x20 | ||
83 | #define CHN_STEREO 0x40 | ||
84 | #define CHN_PINGPONGFLAG0x80 | ||
85 | // Bits 8-31:Channel Flags | ||
86 | #define CHN_MUTE 0x100 | ||
87 | #define CHN_KEYOFF 0x200 | ||
88 | #define CHN_NOTEFADE 0x400 | ||
89 | #define CHN_SURROUND 0x800 | ||
90 | #define CHN_NOIDO 0x1000 | ||
91 | #define CHN_HQSRC 0x2000 | ||
92 | #define CHN_FILTER 0x4000 | ||
93 | #define CHN_VOLUMERAMP 0x8000 | ||
94 | #define CHN_VIBRATO 0x10000 | ||
95 | #define CHN_TREMOLO 0x20000 | ||
96 | #define CHN_PANBRELLO 0x40000 | ||
97 | #define CHN_PORTAMENTO 0x80000 | ||
98 | #define CHN_GLISSANDO 0x100000 | ||
99 | #define CHN_VOLENV 0x200000 | ||
100 | #define CHN_PANENV 0x400000 | ||
101 | #define CHN_PITCHENV 0x800000 | ||
102 | #define CHN_FASTVOLRAMP 0x1000000 | ||
103 | #define CHN_EXTRALOUD 0x2000000 | ||
104 | #define CHN_REVERB 0x4000000 | ||
105 | #define CHN_NOREVERB 0x8000000 | ||
106 | |||
107 | |||
108 | #define ENV_VOLUME 0x0001 | ||
109 | #define ENV_VOLSUSTAIN 0x0002 | ||
110 | #define ENV_VOLLOOP 0x0004 | ||
111 | #define ENV_PANNING 0x0008 | ||
112 | #define ENV_PANSUSTAIN 0x0010 | ||
113 | #define ENV_PANLOOP 0x0020 | ||
114 | #define ENV_PITCH 0x0040 | ||
115 | #define ENV_PITCHSUSTAIN0x0080 | ||
116 | #define ENV_PITCHLOOP 0x0100 | ||
117 | #define ENV_SETPANNING 0x0200 | ||
118 | #define ENV_FILTER 0x0400 | ||
119 | #define ENV_VOLCARRY 0x0800 | ||
120 | #define ENV_PANCARRY 0x1000 | ||
121 | #define ENV_PITCHCARRY 0x2000 | ||
122 | |||
123 | #define CMD_NONE 0 | ||
124 | #define CMD_ARPEGGIO 1 | ||
125 | #define CMD_PORTAMENTOUP 2 | ||
126 | #define CMD_PORTAMENTODOWN 3 | ||
127 | #define CMD_TONEPORTAMENTO 4 | ||
128 | #define CMD_VIBRATO 5 | ||
129 | #define CMD_TONEPORTAVOL 6 | ||
130 | #define CMD_VIBRATOVOL 7 | ||
131 | #define CMD_TREMOLO 8 | ||
132 | #define CMD_PANNING8 9 | ||
133 | #define CMD_OFFSET 10 | ||
134 | #define CMD_VOLUMESLIDE 11 | ||
135 | #define CMD_POSITIONJUMP 12 | ||
136 | #define CMD_VOLUME 13 | ||
137 | #define CMD_PATTERNBREAK 14 | ||
138 | #define CMD_RETRIG 15 | ||
139 | #define CMD_SPEED 16 | ||
140 | #define CMD_TEMPO 17 | ||
141 | #define CMD_TREMOR 18 | ||
142 | #define CMD_MODCMDEX 19 | ||
143 | #define CMD_S3MCMDEX 20 | ||
144 | #define CMD_CHANNELVOLUME 21 | ||
145 | #define CMD_CHANNELVOLSLIDE 22 | ||
146 | #define CMD_GLOBALVOLUME 23 | ||
147 | #define CMD_GLOBALVOLSLIDE 24 | ||
148 | #define CMD_KEYOFF 25 | ||
149 | #define CMD_FINEVIBRATO 26 | ||
150 | #define CMD_PANBRELLO 27 | ||
151 | #define CMD_XFINEPORTAUPDOWN28 | ||
152 | #define CMD_PANNINGSLIDE 29 | ||
153 | #define CMD_SETENVPOSITION 30 | ||
154 | #define CMD_MIDI 31 | ||
155 | |||
156 | |||
157 | // Volume Column commands | ||
158 | #define VOLCMD_VOLUME 1 | ||
159 | #define VOLCMD_PANNING 2 | ||
160 | #define VOLCMD_VOLSLIDEUP 3 | ||
161 | #define VOLCMD_VOLSLIDEDOWN 4 | ||
162 | #define VOLCMD_FINEVOLUP 5 | ||
163 | #define VOLCMD_FINEVOLDOWN 6 | ||
164 | #define VOLCMD_VIBRATOSPEED 7 | ||
165 | #define VOLCMD_VIBRATO 8 | ||
166 | #define VOLCMD_PANSLIDELEFT 9 | ||
167 | #define VOLCMD_PANSLIDERIGHT10 | ||
168 | #define VOLCMD_TONEPORTAMENTO11 | ||
169 | #define VOLCMD_PORTAUP 12 | ||
170 | #define VOLCMD_PORTADOWN 13 | ||
171 | |||
172 | #define RSF_16BIT 0x04 | ||
173 | #define RSF_STEREO 0x08 | ||
174 | |||
175 | #define RS_PCM8S 0// 8-bit signed | ||
176 | #define RS_PCM8U 1// 8-bit unsigned | ||
177 | #define RS_PCM8D 2// 8-bit delta values | ||
178 | #define RS_ADPCM4 3// 4-bit ADPCM-packed | ||
179 | #define RS_PCM16D 4// 16-bit delta values | ||
180 | #define RS_PCM16S 5// 16-bit signed | ||
181 | #define RS_PCM16U 6// 16-bit unsigned | ||
182 | #define RS_PCM16M 7// 16-bit motorola order | ||
183 | #define RS_STPCM8S (RS_PCM8S|RSF_STEREO)// stereo 8-bit signed | ||
184 | #define RS_STPCM8U (RS_PCM8U|RSF_STEREO)// stereo 8-bit unsigned | ||
185 | #define RS_STPCM8D (RS_PCM8D|RSF_STEREO)// stereo 8-bit delta values | ||
186 | #define RS_STPCM16S (RS_PCM16S|RSF_STEREO)// stereo 16-bit signed | ||
187 | #define RS_STPCM16U (RS_PCM16U|RSF_STEREO)// stereo 16-bit unsigned | ||
188 | #define RS_STPCM16D (RS_PCM16D|RSF_STEREO)// stereo 16-bit delta values | ||
189 | #define RS_STPCM16M (RS_PCM16M|RSF_STEREO)// stereo 16-bit signed big endian | ||
190 | // IT 2.14 compressed samples | ||
191 | #define RS_IT2148 0x10 | ||
192 | #define RS_IT21416 0x14 | ||
193 | #define RS_IT2158 0x12 | ||
194 | #define RS_IT21516 0x16 | ||
195 | // AMS Packed Samples | ||
196 | #define RS_AMS8 0x11 | ||
197 | #define RS_AMS16 0x15 | ||
198 | // DMF Huffman compression | ||
199 | #define RS_DMF8 0x13 | ||
200 | #define RS_DMF16 0x17 | ||
201 | // MDL Huffman compression | ||
202 | #define RS_MDL8 0x20 | ||
203 | #define RS_MDL16 0x24 | ||
204 | #define RS_PTM8DTO160x25 | ||
205 | // Stereo Interleaved Samples | ||
206 | #define RS_STIPCM8S (RS_PCM8S|0x40|RSF_STEREO)// stereo 8-bit signed | ||
207 | #define RS_STIPCM8U (RS_PCM8U|0x40|RSF_STEREO)// stereo 8-bit unsigned | ||
208 | #define RS_STIPCM16S (RS_PCM16S|0x40|RSF_STEREO)// stereo 16-bit signed | ||
209 | #define RS_STIPCM16U (RS_PCM16U|0x40|RSF_STEREO)// stereo 16-bit unsigned | ||
210 | #define RS_STIPCM16M (RS_PCM16M|0x40|RSF_STEREO)// stereo 16-bit signed big endian | ||
211 | // 24-bit signed | ||
212 | #define RS_PCM24S (RS_PCM16S|0x80) // mono 24-bit signed | ||
213 | #define RS_STIPCM24S (RS_PCM16S|0x80|RSF_STEREO)// stereo 24-bit signed | ||
214 | #define RS_PCM32S (RS_PCM16S|0xC0) // mono 24-bit signed | ||
215 | #define RS_STIPCM32S (RS_PCM16S|0xC0|RSF_STEREO)// stereo 24-bit signed | ||
216 | |||
217 | // NNA types | ||
218 | #define NNA_NOTECUT 0 | ||
219 | #define NNA_CONTINUE1 | ||
220 | #define NNA_NOTEOFF 2 | ||
221 | #define NNA_NOTEFADE3 | ||
222 | |||
223 | // DCT types | ||
224 | #define DCT_NONE 0 | ||
225 | #define DCT_NOTE 1 | ||
226 | #define DCT_SAMPLE 2 | ||
227 | #define DCT_INSTRUMENT3 | ||
228 | |||
229 | // DNA types | ||
230 | #define DNA_NOTECUT 0 | ||
231 | #define DNA_NOTEOFF 1 | ||
232 | #define DNA_NOTEFADE2 | ||
233 | |||
234 | // Mixer Hardware-Dependent features | ||
235 | #define SYSMIX_ENABLEMMX0x01 | ||
236 | #define SYSMIX_WINDOWSNT0x02 | ||
237 | #define SYSMIX_SLOWCPU 0x04 | ||
238 | #define SYSMIX_FASTCPU 0x08 | ||
239 | |||
240 | // Module flags | ||
241 | #define SONG_EMBEDMIDICFG0x0001 | ||
242 | #define SONG_FASTVOLSLIDES0x0002 | ||
243 | #define SONG_ITOLDEFFECTS0x0004 | ||
244 | #define SONG_ITCOMPATMODE0x0008 | ||
245 | #define SONG_LINEARSLIDES0x0010 | ||
246 | #define SONG_PATTERNLOOP0x0020 | ||
247 | #define SONG_STEP 0x0040 | ||
248 | #define SONG_PAUSED 0x0080 | ||
249 | #define SONG_FADINGSONG 0x0100 | ||
250 | #define SONG_ENDREACHED 0x0200 | ||
251 | #define SONG_GLOBALFADE 0x0400 | ||
252 | #define SONG_CPUVERYHIGH0x0800 | ||
253 | #define SONG_FIRSTTICK 0x1000 | ||
254 | #define SONG_MPTFILTERMODE0x2000 | ||
255 | #define SONG_SURROUNDPAN0x4000 | ||
256 | #define SONG_EXFILTERRANGE0x8000 | ||
257 | #define SONG_AMIGALIMITS0x10000 | ||
258 | |||
259 | // Global Options (Renderer) | ||
260 | #define SNDMIX_REVERSESTEREO0x0001 | ||
261 | #define SNDMIX_NOISEREDUCTION0x0002 | ||
262 | #define SNDMIX_AGC 0x0004 | ||
263 | #define SNDMIX_NORESAMPLING 0x0008 | ||
264 | #define SNDMIX_HQRESAMPLER 0x0010 | ||
265 | #define SNDMIX_MEGABASS 0x0020 | ||
266 | #define SNDMIX_SURROUND 0x0040 | ||
267 | #define SNDMIX_REVERB 0x0080 | ||
268 | #define SNDMIX_EQ 0x0100 | ||
269 | #define SNDMIX_SOFTPANNING 0x0200 | ||
270 | #define SNDMIX_ULTRAHQSRCMODE0x0400 | ||
271 | // Misc Flags (can safely be turned on or off) | ||
272 | #define SNDMIX_DIRECTTODISK 0x10000 | ||
273 | #define SNDMIX_ENABLEMMX 0x20000 | ||
274 | #define SNDMIX_NOBACKWARDJUMPS0x40000 | ||
275 | #define SNDMIX_MAXDEFAULTPAN 0x80000// Used by the MOD loader | ||
276 | |||
277 | |||
278 | // Reverb Types (GM2 Presets) | ||
279 | enum { | ||
280 | REVERBTYPE_SMALLROOM, | ||
281 | REVERBTYPE_MEDIUMROOM, | ||
282 | REVERBTYPE_LARGEROOM, | ||
283 | REVERBTYPE_SMALLHALL, | ||
284 | REVERBTYPE_MEDIUMHALL, | ||
285 | REVERBTYPE_LARGEHALL, | ||
286 | NUM_REVERBTYPES | ||
287 | }; | ||
288 | |||
289 | |||
290 | enum { | ||
291 | SRCMODE_NEAREST, | ||
292 | SRCMODE_LINEAR, | ||
293 | SRCMODE_SPLINE, | ||
294 | SRCMODE_POLYPHASE, | ||
295 | NUM_SRC_MODES | ||
296 | }; | ||
297 | |||
298 | |||
299 | // Sample Struct | ||
300 | typedef struct _MODINSTRUMENT | ||
301 | { | ||
302 | UINT nLength,nLoopStart,nLoopEnd; | ||
303 | UINT nSustainStart, nSustainEnd; | ||
304 | signed char *pSample; | ||
305 | UINT nC4Speed; | ||
306 | WORD nPan; | ||
307 | WORD nVolume; | ||
308 | WORD nGlobalVol; | ||
309 | WORD uFlags; | ||
310 | signed char RelativeTone; | ||
311 | signed char nFineTune; | ||
312 | BYTE nVibType; | ||
313 | BYTE nVibSweep; | ||
314 | BYTE nVibDepth; | ||
315 | BYTE nVibRate; | ||
316 | CHAR name[22]; | ||
317 | } MODINSTRUMENT; | ||
318 | |||
319 | |||
320 | // Instrument Struct | ||
321 | typedef struct _INSTRUMENTHEADER | ||
322 | { | ||
323 | UINT nFadeOut; | ||
324 | DWORD dwFlags; | ||
325 | WORD nGlobalVol; | ||
326 | WORD nPan; | ||
327 | WORD VolPoints[MAX_ENVPOINTS]; | ||
328 | WORD PanPoints[MAX_ENVPOINTS]; | ||
329 | WORD PitchPoints[MAX_ENVPOINTS]; | ||
330 | BYTE VolEnv[MAX_ENVPOINTS]; | ||
331 | BYTE PanEnv[MAX_ENVPOINTS]; | ||
332 | BYTE PitchEnv[MAX_ENVPOINTS]; | ||
333 | BYTE Keyboard[128]; | ||
334 | BYTE NoteMap[128]; | ||
335 | |||
336 | BYTE nVolEnv; | ||
337 | BYTE nPanEnv; | ||
338 | BYTE nPitchEnv; | ||
339 | BYTE nVolLoopStart; | ||
340 | BYTE nVolLoopEnd; | ||
341 | BYTE nVolSustainBegin; | ||
342 | BYTE nVolSustainEnd; | ||
343 | BYTE nPanLoopStart; | ||
344 | BYTE nPanLoopEnd; | ||
345 | BYTE nPanSustainBegin; | ||
346 | BYTE nPanSustainEnd; | ||
347 | BYTE nPitchLoopStart; | ||
348 | BYTE nPitchLoopEnd; | ||
349 | BYTE nPitchSustainBegin; | ||
350 | BYTE nPitchSustainEnd; | ||
351 | BYTE nNNA; | ||
352 | BYTE nDCT; | ||
353 | BYTE nDNA; | ||
354 | BYTE nPanSwing; | ||
355 | BYTE nVolSwing; | ||
356 | BYTE nIFC; | ||
357 | BYTE nIFR; | ||
358 | WORD wMidiBank; | ||
359 | BYTE nMidiProgram; | ||
360 | BYTE nMidiChannel; | ||
361 | BYTE nMidiDrumKey; | ||
362 | signed char nPPS; | ||
363 | unsigned char nPPC; | ||
364 | CHAR name[32]; | ||
365 | CHAR filename[12]; | ||
366 | } INSTRUMENTHEADER; | ||
367 | |||
368 | |||
369 | // Channel Struct | ||
370 | typedef struct _MODCHANNEL | ||
371 | { | ||
372 | // First 32-bytes: Most used mixing information: don't change it | ||
373 | signed char * pCurrentSample; | ||
374 | DWORD nPos; | ||
375 | DWORD nPosLo;// actually 16-bit | ||
376 | LONG nInc; // 16.16 | ||
377 | LONG nRightVol; | ||
378 | LONG nLeftVol; | ||
379 | LONG nRightRamp; | ||
380 | LONG nLeftRamp; | ||
381 | // 2nd cache line | ||
382 | DWORD nLength; | ||
383 | DWORD dwFlags; | ||
384 | DWORD nLoopStart; | ||
385 | DWORD nLoopEnd; | ||
386 | LONG nRampRightVol; | ||
387 | LONG nRampLeftVol; | ||
388 | LONG nFilter_Y1, nFilter_Y2, nFilter_Y3, nFilter_Y4; | ||
389 | LONG nFilter_A0, nFilter_B0, nFilter_B1; | ||
390 | LONG nROfs, nLOfs; | ||
391 | LONG nRampLength; | ||
392 | // Information not used in the mixer | ||
393 | signed char * pSample; | ||
394 | LONG nNewRightVol, nNewLeftVol; | ||
395 | LONG nRealVolume, nRealPan; | ||
396 | LONG nVolume, nPan, nFadeOutVol; | ||
397 | LONG nPeriod, nC4Speed, nPortamentoDest; | ||
398 | INSTRUMENTHEADER *pHeader; | ||
399 | MODINSTRUMENT *pInstrument; | ||
400 | DWORD nVolEnvPosition, nPanEnvPosition, nPitchEnvPosition; | ||
401 | DWORD nMasterChn, nVUMeter; | ||
402 | LONG nGlobalVol, nInsVol; | ||
403 | LONG nFineTune, nTranspose; | ||
404 | LONG nPortamentoSlide, nAutoVibDepth; | ||
405 | UINT nAutoVibPos, nVibratoPos, nTremoloPos, nPanbrelloPos; | ||
406 | // 16-bit members | ||
407 | signed short nVolSwing, nPanSwing; | ||
408 | // 8-bit members | ||
409 | BYTE nNote, nNNA; | ||
410 | BYTE nNewNote, nNewIns, nCommand, nArpeggio; | ||
411 | BYTE nOldVolumeSlide, nOldFineVolUpDown; | ||
412 | BYTE nOldPortaUpDown, nOldFinePortaUpDown; | ||
413 | BYTE nOldPanSlide, nOldChnVolSlide; | ||
414 | BYTE nVibratoType, nVibratoSpeed, nVibratoDepth; | ||
415 | BYTE nTremoloType, nTremoloSpeed, nTremoloDepth; | ||
416 | BYTE nPanbrelloType, nPanbrelloSpeed, nPanbrelloDepth; | ||
417 | BYTE nOldCmdEx, nOldVolParam, nOldTempo; | ||
418 | BYTE nOldOffset, nOldHiOffset; | ||
419 | BYTE nCutOff, nResonance; | ||
420 | BYTE nRetrigCount, nRetrigParam; | ||
421 | BYTE nTremorCount, nTremorParam; | ||
422 | BYTE nPatternLoop, nPatternLoopCount; | ||
423 | BYTE nRowNote, nRowInstr; | ||
424 | BYTE nRowVolCmd, nRowVolume; | ||
425 | BYTE nRowCommand, nRowParam; | ||
426 | BYTE nLeftVU, nRightVU; | ||
427 | BYTE nActiveMacro, nPadding; | ||
428 | } MODCHANNEL; | ||
429 | |||
430 | |||
431 | typedef struct _MODCHANNELSETTINGS | ||
432 | { | ||
433 | UINT nPan; | ||
434 | UINT nVolume; | ||
435 | DWORD dwFlags; | ||
436 | UINT nMixPlugin; | ||
437 | char szName[MAX_CHANNELNAME]; // changed from CHAR | ||
438 | } MODCHANNELSETTINGS; | ||
439 | |||
440 | |||
441 | typedef struct _MODCOMMAND | ||
442 | { | ||
443 | BYTE note; | ||
444 | BYTE instr; | ||
445 | BYTE volcmd; | ||
446 | BYTE command; | ||
447 | BYTE vol; | ||
448 | BYTE param; | ||
449 | } MODCOMMAND, *LPMODCOMMAND; | ||
450 | |||
451 | //////////////////////////////////////////////////////////////////// | ||
452 | // Mix Plugins | ||
453 | #define MIXPLUG_MIXREADY 0x01// Set when cleared | ||
454 | |||
455 | class IMixPlugin | ||
456 | { | ||
457 | public: | ||
458 | virtual int AddRef() = 0; | ||
459 | virtual int Release() = 0; | ||
460 | virtual void SaveAllParameters() = 0; | ||
461 | virtual void RestoreAllParameters() = 0; | ||
462 | virtual void Process(float *pOutL, float *pOutR, unsigned long nSamples) = 0; | ||
463 | virtual void Init(unsigned long nFreq, int bReset) = 0; | ||
464 | virtual void MidiSend(DWORD dwMidiCode) = 0; | ||
465 | virtual void MidiCommand(UINT nMidiCh, UINT nMidiProg, UINT note, UINT vol) = 0; | ||
466 | }; | ||
467 | |||
468 | |||
469 | #define MIXPLUG_INPUTF_MASTEREFFECT 0x01// Apply to master mix | ||
470 | #define MIXPLUG_INPUTF_BYPASS 0x02// Bypass effect | ||
471 | #define MIXPLUG_INPUTF_WETMIX 0x04// Wet Mix (dry added) | ||
472 | |||
473 | typedef struct _SNDMIXPLUGINSTATE | ||
474 | { | ||
475 | DWORD dwFlags; // MIXPLUG_XXXX | ||
476 | LONG nVolDecayL, nVolDecayR;// Buffer click removal | ||
477 | int *pMixBuffer; // Stereo effect send buffer | ||
478 | float *pOutBufferL; // Temp storage for int -> float conversion | ||
479 | float *pOutBufferR; | ||
480 | } SNDMIXPLUGINSTATE, *PSNDMIXPLUGINSTATE; | ||
481 | |||
482 | typedef struct _SNDMIXPLUGININFO | ||
483 | { | ||
484 | DWORD dwPluginId1; | ||
485 | DWORD dwPluginId2; | ||
486 | DWORD dwInputRouting;// MIXPLUG_INPUTF_XXXX | ||
487 | DWORD dwOutputRouting;// 0=mix 0x80+=fx | ||
488 | DWORD dwReserved[4];// Reserved for routing info | ||
489 | CHAR szName[32]; | ||
490 | CHAR szLibraryName[64];// original DLL name | ||
491 | } SNDMIXPLUGININFO, *PSNDMIXPLUGININFO; // Size should be 128 | ||
492 | |||
493 | typedef struct _SNDMIXPLUGIN | ||
494 | { | ||
495 | IMixPlugin *pMixPlugin; | ||
496 | PSNDMIXPLUGINSTATE pMixState; | ||
497 | ULONG nPluginDataSize; | ||
498 | PVOID pPluginData; | ||
499 | SNDMIXPLUGININFO Info; | ||
500 | } SNDMIXPLUGIN, *PSNDMIXPLUGIN; | ||
501 | |||
502 | typedefBOOL (__cdecl *PMIXPLUGINCREATEPROC)(PSNDMIXPLUGIN); | ||
503 | |||
504 | //////////////////////////////////////////////////////////////////// | ||
505 | |||
506 | enum { | ||
507 | MIDIOUT_START=0, | ||
508 | MIDIOUT_STOP, | ||
509 | MIDIOUT_TICK, | ||
510 | MIDIOUT_NOTEON, | ||
511 | MIDIOUT_NOTEOFF, | ||
512 | MIDIOUT_VOLUME, | ||
513 | MIDIOUT_PAN, | ||
514 | MIDIOUT_BANKSEL, | ||
515 | MIDIOUT_PROGRAM, | ||
516 | }; | ||
517 | |||
518 | |||
519 | typedef struct MODMIDICFG | ||
520 | { | ||
521 | char szMidiGlb[9*32]; // changed from CHAR | ||
522 | char szMidiSFXExt[16*32]; // changed from CHAR | ||
523 | char szMidiZXXExt[128*32]; // changed from CHAR | ||
524 | } MODMIDICFG, *LPMODMIDICFG; | ||
525 | |||
526 | |||
527 | typedef VOID (__cdecl * LPSNDMIXHOOKPROC)(int *, unsigned long, unsigned long); // buffer, samples, channels | ||
528 | |||
529 | |||
530 | |||
531 | //============== | ||
532 | class CSoundFile | ||
533 | //============== | ||
534 | { | ||
535 | public:// Static Members | ||
536 | static UINT m_nXBassDepth, m_nXBassRange; | ||
537 | static UINT m_nReverbDepth, m_nReverbDelay, gnReverbType; | ||
538 | static UINT m_nProLogicDepth, m_nProLogicDelay; | ||
539 | static UINT m_nStereoSeparation; | ||
540 | static UINT m_nMaxMixChannels; | ||
541 | static LONG m_nStreamVolume; | ||
542 | static DWORD gdwSysInfo, gdwSoundSetup, gdwMixingFreq, gnBitsPerSample, gnChannels; | ||
543 | static UINT gnAGC, gnVolumeRampSamples, gnVUMeter, gnCPUUsage; | ||
544 | static LPSNDMIXHOOKPROC gpSndMixHook; | ||
545 | static PMIXPLUGINCREATEPROC gpMixPluginCreateProc; | ||
546 | |||
547 | public:// for Editing | ||
548 | MODCHANNEL Chn[MAX_CHANNELS]; // Channels | ||
549 | UINT ChnMix[MAX_CHANNELS]; // Channels to be mixed | ||
550 | MODINSTRUMENT Ins[MAX_SAMPLES]; // Instruments | ||
551 | INSTRUMENTHEADER *Headers[MAX_INSTRUMENTS]; // Instrument Headers | ||
552 | MODCHANNELSETTINGS ChnSettings[MAX_BASECHANNELS]; // Channels settings | ||
553 | MODCOMMAND *Patterns[MAX_PATTERNS]; // Patterns | ||
554 | WORD PatternSize[MAX_PATTERNS]; // Patterns Lengths | ||
555 | BYTE Order[MAX_ORDERS]; // Pattern Orders | ||
556 | MODMIDICFG m_MidiCfg; // Midi macro config table | ||
557 | SNDMIXPLUGIN m_MixPlugins[MAX_MIXPLUGINS]; // Mix plugins | ||
558 | UINT m_nDefaultSpeed, m_nDefaultTempo, m_nDefaultGlobalVolume; | ||
559 | DWORD m_dwSongFlags; // Song flags SONG_XXXX | ||
560 | UINT m_nChannels, m_nMixChannels, m_nMixStat, m_nBufferCount; | ||
561 | UINT m_nType, m_nSamples, m_nInstruments; | ||
562 | UINT m_nTickCount, m_nTotalCount, m_nPatternDelay, m_nFrameDelay; | ||
563 | UINT m_nMusicSpeed, m_nMusicTempo; | ||
564 | UINT m_nNextRow, m_nRow; | ||
565 | UINT m_nPattern,m_nCurrentPattern,m_nNextPattern,m_nRestartPos; | ||
566 | UINT m_nMasterVolume, m_nGlobalVolume, m_nSongPreAmp; | ||
567 | UINT m_nFreqFactor, m_nTempoFactor, m_nOldGlbVolSlide; | ||
568 | LONG m_nMinPeriod, m_nMaxPeriod, m_nRepeatCount, m_nInitialRepeatCount; | ||
569 | DWORD m_nGlobalFadeSamples, m_nGlobalFadeMaxSamples; | ||
570 | UINT m_nMaxOrderPosition; | ||
571 | UINT m_nPatternNames; | ||
572 | LPSTR m_lpszSongComments, m_lpszPatternNames; | ||
573 | char m_szNames[MAX_INSTRUMENTS][32]; // changed from CHAR | ||
574 | CHAR CompressionTable[16]; | ||
575 | |||
576 | public: | ||
577 | CSoundFile(); | ||
578 | ~CSoundFile(); | ||
579 | |||
580 | public: | ||
581 | BOOL Create(LPCBYTE lpStream, DWORD dwMemLength=0); | ||
582 | BOOL Destroy(); | ||
583 | UINT GetType() const { return m_nType; } | ||
584 | UINT GetNumChannels() const; | ||
585 | UINT GetLogicalChannels() const { return m_nChannels; } | ||
586 | BOOL SetMasterVolume(UINT vol, BOOL bAdjustAGC=FALSE); | ||
587 | UINT GetMasterVolume() const { return m_nMasterVolume; } | ||
588 | UINT GetNumPatterns() const; | ||
589 | UINT GetNumInstruments() const; | ||
590 | UINT GetNumSamples() const { return m_nSamples; } | ||
591 | UINT GetCurrentPos() const; | ||
592 | UINT GetCurrentPattern() const { return m_nPattern; } | ||
593 | UINT GetCurrentOrder() const { return m_nCurrentPattern; } | ||
594 | UINT GetSongComments(LPSTR s, UINT cbsize, UINT linesize=32); | ||
595 | UINT GetRawSongComments(LPSTR s, UINT cbsize, UINT linesize=32); | ||
596 | UINT GetMaxPosition() const; | ||
597 | void SetCurrentPos(UINT nPos); | ||
598 | void SetCurrentOrder(UINT nOrder); | ||
599 | void GetTitle(LPSTR s) const { lstrcpyn(s,m_szNames[0],32); } | ||
600 | LPCSTR GetTitle() const { return m_szNames[0]; } | ||
601 | UINT GetSampleName(UINT nSample,LPSTR s=NULL) const; | ||
602 | UINT GetInstrumentName(UINT nInstr,LPSTR s=NULL) const; | ||
603 | UINT GetMusicSpeed() const { return m_nMusicSpeed; } | ||
604 | UINT GetMusicTempo() const { return m_nMusicTempo; } | ||
605 | DWORD GetLength(BOOL bAdjust, BOOL bTotal=FALSE); | ||
606 | DWORD GetSongTime() { return GetLength(FALSE, TRUE); } | ||
607 | void SetRepeatCount(int n) { m_nRepeatCount = n; m_nInitialRepeatCount = n; } | ||
608 | int GetRepeatCount() const { return m_nRepeatCount; } | ||
609 | BOOL IsPaused() const {return (m_dwSongFlags & SONG_PAUSED) ? TRUE : FALSE; } | ||
610 | void LoopPattern(int nPat, int nRow=0); | ||
611 | void CheckCPUUsage(UINT nCPU); | ||
612 | BOOL SetPatternName(UINT nPat, LPCSTR lpszName); | ||
613 | BOOL GetPatternName(UINT nPat, LPSTR lpszName, UINT cbSize=MAX_PATTERNNAME) const; | ||
614 | // Module Loaders | ||
615 | BOOL ReadXM(LPCBYTE lpStream, DWORD dwMemLength); | ||
616 | BOOL ReadS3M(LPCBYTE lpStream, DWORD dwMemLength); | ||
617 | BOOL ReadMod(LPCBYTE lpStream, DWORD dwMemLength); | ||
618 | BOOL ReadMed(LPCBYTE lpStream, DWORD dwMemLength); | ||
619 | BOOL ReadMTM(LPCBYTE lpStream, DWORD dwMemLength); | ||
620 | BOOL ReadSTM(LPCBYTE lpStream, DWORD dwMemLength); | ||
621 | BOOL ReadIT(LPCBYTE lpStream, DWORD dwMemLength); | ||
622 | BOOL Read669(LPCBYTE lpStream, DWORD dwMemLength); | ||
623 | BOOL ReadUlt(LPCBYTE lpStream, DWORD dwMemLength); | ||
624 | //BOOL ReadWav(LPCBYTE lpStream, DWORD dwMemLength); | ||
625 | BOOL ReadDSM(LPCBYTE lpStream, DWORD dwMemLength); | ||
626 | BOOL ReadFAR(LPCBYTE lpStream, DWORD dwMemLength); | ||
627 | BOOL ReadAMS(LPCBYTE lpStream, DWORD dwMemLength); | ||
628 | BOOL ReadAMS2(LPCBYTE lpStream, DWORD dwMemLength); | ||
629 | BOOL ReadMDL(LPCBYTE lpStream, DWORD dwMemLength); | ||
630 | BOOL ReadOKT(LPCBYTE lpStream, DWORD dwMemLength); | ||
631 | BOOL ReadDMF(LPCBYTE lpStream, DWORD dwMemLength); | ||
632 | BOOL ReadPTM(LPCBYTE lpStream, DWORD dwMemLength); | ||
633 | BOOL ReadDBM(LPCBYTE lpStream, DWORD dwMemLength); | ||
634 | BOOL ReadAMF(LPCBYTE lpStream, DWORD dwMemLength); | ||
635 | BOOL ReadMT2(LPCBYTE lpStream, DWORD dwMemLength); | ||
636 | BOOL ReadPSM(LPCBYTE lpStream, DWORD dwMemLength); | ||
637 | BOOL ReadJ2B(LPCBYTE lpStream, DWORD dwMemLength); | ||
638 | BOOL ReadUMX(LPCBYTE lpStream, DWORD dwMemLength); | ||
639 | // Save Functions | ||
640 | #ifndef MODPLUG_NO_FILESAVE | ||
641 | UINT WriteSample(FILE *f, MODINSTRUMENT *pins, UINT nFlags, UINT nMaxLen=0); | ||
642 | BOOL SaveXM(LPCSTR lpszFileName, UINT nPacking=0); | ||
643 | BOOL SaveS3M(LPCSTR lpszFileName, UINT nPacking=0); | ||
644 | BOOL SaveMod(LPCSTR lpszFileName, UINT nPacking=0); | ||
645 | BOOL SaveIT(LPCSTR lpszFileName, UINT nPacking=0); | ||
646 | #endif // MODPLUG_NO_FILESAVE | ||
647 | // MOD Convert function | ||
648 | UINT GetBestSaveFormat() const; | ||
649 | UINT GetSaveFormats() const; | ||
650 | void ConvertModCommand(MODCOMMAND *) const; | ||
651 | void S3MConvert(MODCOMMAND *m, BOOL bIT) const; | ||
652 | void S3MSaveConvert(UINT *pcmd, UINT *pprm, BOOL bIT) const; | ||
653 | WORD ModSaveCommand(const MODCOMMAND *m, BOOL bXM) const; | ||
654 | |||
655 | public: | ||
656 | // Real-time sound functions | ||
657 | VOID ResetChannels(); | ||
658 | |||
659 | UINT Read(LPVOID lpBuffer, UINT cbBuffer); | ||
660 | UINT CreateStereoMix(int count); | ||
661 | BOOL FadeSong(UINT msec); | ||
662 | BOOL GlobalFadeSong(UINT msec); | ||
663 | UINT GetTotalTickCount() const { return m_nTotalCount; } | ||
664 | VOID ResetTotalTickCount() { m_nTotalCount = 0; } | ||
665 | |||
666 | public: | ||
667 | // Mixer Config | ||
668 | static BOOL InitPlayer(BOOL bReset=FALSE); | ||
669 | static BOOL SetWaveConfig(UINT nRate,UINT nBits,UINT nChannels,BOOL bMMX=FALSE); | ||
670 | static BOOL SetResamplingMode(UINT nMode); // SRCMODE_XXXX | ||
671 | static BOOL IsStereo() { return (gnChannels > 1) ? TRUE : FALSE; } | ||
672 | static DWORD GetSampleRate() { return gdwMixingFreq; } | ||
673 | static DWORD GetBitsPerSample() { return gnBitsPerSample; } | ||
674 | static DWORD InitSysInfo(); | ||
675 | static DWORD GetSysInfo() { return gdwSysInfo; } | ||
676 | // AGC | ||
677 | static BOOL GetAGC() { return (gdwSoundSetup & SNDMIX_AGC) ? TRUE : FALSE; } | ||
678 | static void SetAGC(BOOL b); | ||
679 | static void ResetAGC(); | ||
680 | static void ProcessAGC(int count); | ||
681 | |||
682 | //GCCFIX -- added these functions back in! | ||
683 | static BOOL SetWaveConfigEx(BOOL bSurround,BOOL bNoOverSampling,BOOL bReverb,BOOL hqido,BOOL bMegaBass,BOOL bNR,BOOL bEQ); | ||
684 | // DSP Effects | ||
685 | static void InitializeDSP(BOOL bReset); | ||
686 | static void ProcessStereoDSP(int count); | ||
687 | static void ProcessMonoDSP(int count); | ||
688 | // [Reverb level 0(quiet)-100(loud)], [delay in ms, usually 40-200ms] | ||
689 | static BOOL SetReverbParameters(UINT nDepth, UINT nDelay); | ||
690 | // [XBass level 0(quiet)-100(loud)], [cutoff in Hz 10-100] | ||
691 | static BOOL SetXBassParameters(UINT nDepth, UINT nRange); | ||
692 | // [Surround level 0(quiet)-100(heavy)] [delay in ms, usually 5-40ms] | ||
693 | static BOOL SetSurroundParameters(UINT nDepth, UINT nDelay); | ||
694 | public: | ||
695 | BOOL ReadNote(); | ||
696 | BOOL ProcessRow(); | ||
697 | BOOL ProcessEffects(); | ||
698 | UINT GetNNAChannel(UINT nChn) const; | ||
699 | void CheckNNA(UINT nChn, UINT instr, int note, BOOL bForceCut); | ||
700 | void NoteChange(UINT nChn, int note, BOOL bPorta=FALSE, BOOL bResetEnv=TRUE); | ||
701 | void InstrumentChange(MODCHANNEL *pChn, UINT instr, BOOL bPorta=FALSE,BOOL bUpdVol=TRUE,BOOL bResetEnv=TRUE); | ||
702 | // Channel Effects | ||
703 | void PortamentoUp(MODCHANNEL *pChn, UINT param); | ||
704 | void PortamentoDown(MODCHANNEL *pChn, UINT param); | ||
705 | void FinePortamentoUp(MODCHANNEL *pChn, UINT param); | ||
706 | void FinePortamentoDown(MODCHANNEL *pChn, UINT param); | ||
707 | void ExtraFinePortamentoUp(MODCHANNEL *pChn, UINT param); | ||
708 | void ExtraFinePortamentoDown(MODCHANNEL *pChn, UINT param); | ||
709 | void TonePortamento(MODCHANNEL *pChn, UINT param); | ||
710 | void Vibrato(MODCHANNEL *pChn, UINT param); | ||
711 | void FineVibrato(MODCHANNEL *pChn, UINT param); | ||
712 | void VolumeSlide(MODCHANNEL *pChn, UINT param); | ||
713 | void PanningSlide(MODCHANNEL *pChn, UINT param); | ||
714 | void ChannelVolSlide(MODCHANNEL *pChn, UINT param); | ||
715 | void FineVolumeUp(MODCHANNEL *pChn, UINT param); | ||
716 | void FineVolumeDown(MODCHANNEL *pChn, UINT param); | ||
717 | void Tremolo(MODCHANNEL *pChn, UINT param); | ||
718 | void Panbrello(MODCHANNEL *pChn, UINT param); | ||
719 | void RetrigNote(UINT nChn, UINT param); | ||
720 | void NoteCut(UINT nChn, UINT nTick); | ||
721 | void KeyOff(UINT nChn); | ||
722 | int PatternLoop(MODCHANNEL *, UINT param); | ||
723 | void ExtendedMODCommands(UINT nChn, UINT param); | ||
724 | void ExtendedS3MCommands(UINT nChn, UINT param); | ||
725 | void ExtendedChannelEffect(MODCHANNEL *, UINT param); | ||
726 | void ProcessMidiMacro(UINT nChn, LPCSTR pszMidiMacro, UINT param=0); | ||
727 | void SetupChannelFilter(MODCHANNEL *pChn, BOOL bReset, int flt_modifier=256) const; | ||
728 | // Low-Level effect processing | ||
729 | void DoFreqSlide(MODCHANNEL *pChn, LONG nFreqSlide); | ||
730 | // Global Effects | ||
731 | void SetTempo(UINT param); | ||
732 | void SetSpeed(UINT param); | ||
733 | void GlobalVolSlide(UINT param); | ||
734 | DWORD IsSongFinished(UINT nOrder, UINT nRow) const; | ||
735 | BOOL IsValidBackwardJump(UINT nStartOrder, UINT nStartRow, UINT nJumpOrder, UINT nJumpRow) const; | ||
736 | // Read/Write sample functions | ||
737 | signed char GetDeltaValue(signed char prev, UINT n) const { return (signed char)(prev + CompressionTable[n & 0x0F]); } | ||
738 | UINT PackSample(int &sample, int next); | ||
739 | BOOL CanPackSample(LPSTR pSample, UINT nLen, UINT nPacking, BYTE *result=NULL); | ||
740 | UINT ReadSample(MODINSTRUMENT *pIns, UINT nFlags, LPCSTR pMemFile, DWORD dwMemLength); | ||
741 | BOOL DestroySample(UINT nSample); | ||
742 | BOOL DestroyInstrument(UINT nInstr); | ||
743 | BOOL IsSampleUsed(UINT nSample); | ||
744 | BOOL IsInstrumentUsed(UINT nInstr); | ||
745 | BOOL RemoveInstrumentSamples(UINT nInstr); | ||
746 | UINT DetectUnusedSamples(BOOL *); | ||
747 | BOOL RemoveSelectedSamples(BOOL *); | ||
748 | void AdjustSampleLoop(MODINSTRUMENT *pIns); | ||
749 | // I/O from another sound file | ||
750 | BOOL ReadInstrumentFromSong(UINT nInstr, CSoundFile *, UINT nSrcInstrument); | ||
751 | BOOL ReadSampleFromSong(UINT nSample, CSoundFile *, UINT nSrcSample); | ||
752 | // Period/Note functions | ||
753 | UINT GetNoteFromPeriod(UINT period) const; | ||
754 | UINT GetPeriodFromNote(UINT note, int nFineTune, UINT nC4Speed) const; | ||
755 | UINT GetFreqFromPeriod(UINT period, UINT nC4Speed, int nPeriodFrac=0) const; | ||
756 | // Misc functions | ||
757 | MODINSTRUMENT *GetSample(UINT n) { return Ins+n; } | ||
758 | void ResetMidiCfg(); | ||
759 | UINT MapMidiInstrument(DWORD dwProgram, UINT nChannel, UINT nNote); | ||
760 | BOOL ITInstrToMPT(const void *p, INSTRUMENTHEADER *penv, UINT trkvers); | ||
761 | UINT SaveMixPlugins(FILE *f=NULL, BOOL bUpdate=TRUE); | ||
762 | UINT LoadMixPlugins(const void *pData, UINT nLen); | ||
763 | #ifndef NO_FILTER | ||
764 | DWORD CutOffToFrequency(UINT nCutOff, int flt_modifier=256) const; // [0-255] => [1-10KHz] | ||
765 | #endif | ||
766 | |||
767 | // Static helper functions | ||
768 | public: | ||
769 | static DWORD TransposeToFrequency(int transp, int ftune=0); | ||
770 | static int FrequencyToTranspose(DWORD freq); | ||
771 | static void FrequencyToTranspose(MODINSTRUMENT *psmp); | ||
772 | |||
773 | // System-Dependant functions | ||
774 | public: | ||
775 | static MODCOMMAND *AllocatePattern(UINT rows, UINT nchns); | ||
776 | static signed char* AllocateSample(UINT nbytes); | ||
777 | static void FreePattern(LPVOID pat); | ||
778 | static void FreeSample(LPVOID p); | ||
779 | static UINT Normalize24BitBuffer(LPBYTE pbuffer, UINT cbsizebytes, DWORD lmax24, DWORD dwByteInc); | ||
780 | }; | ||
781 | |||
782 | |||
783 | // inline DWORD BigEndian(DWORD x) { return ((x & 0xFF) << 24) | ((x & 0xFF00) << 8) | ((x & 0xFF0000) >> 8) | ((x & 0xFF000000) >> 24); } | ||
784 | // inline WORD BigEndianW(WORD x) { return (WORD)(((x >> 8) & 0xFF) | ((x << 8) & 0xFF00)); } | ||
785 | |||
786 | |||
787 | ////////////////////////////////////////////////////////// | ||
788 | // WAVE format information | ||
789 | |||
790 | #pragma pack(1) | ||
791 | |||
792 | // Standard IFF chunks IDs | ||
793 | #define IFFID_FORM 0x4d524f46 | ||
794 | #define IFFID_RIFF 0x46464952 | ||
795 | #define IFFID_WAVE 0x45564157 | ||
796 | #define IFFID_LIST 0x5453494C | ||
797 | #define IFFID_INFO 0x4F464E49 | ||
798 | |||
799 | // IFF Info fields | ||
800 | #define IFFID_ICOP 0x504F4349 | ||
801 | #define IFFID_IART 0x54524149 | ||
802 | #define IFFID_IPRD 0x44525049 | ||
803 | #define IFFID_INAM 0x4D414E49 | ||
804 | #define IFFID_ICMT 0x544D4349 | ||
805 | #define IFFID_IENG 0x474E4549 | ||
806 | #define IFFID_ISFT 0x54465349 | ||
807 | #define IFFID_ISBJ 0x4A425349 | ||
808 | #define IFFID_IGNR 0x524E4749 | ||
809 | #define IFFID_ICRD 0x44524349 | ||
810 | |||
811 | // Wave IFF chunks IDs | ||
812 | #define IFFID_wave 0x65766177 | ||
813 | #define IFFID_fmt 0x20746D66 | ||
814 | #define IFFID_wsmp 0x706D7377 | ||
815 | #define IFFID_pcm 0x206d6370 | ||
816 | #define IFFID_data 0x61746164 | ||
817 | #define IFFID_smpl 0x6C706D73 | ||
818 | #define IFFID_xtra 0x61727478 | ||
819 | |||
820 | typedef struct WAVEFILEHEADER | ||
821 | { | ||
822 | DWORD id_RIFF; // "RIFF" | ||
823 | DWORD filesize; // file length-8 | ||
824 | DWORD id_WAVE; | ||
825 | } WAVEFILEHEADER; | ||
826 | |||
827 | |||
828 | typedef struct WAVEFORMATHEADER | ||
829 | { | ||
830 | DWORD id_fmt; // "fmt " | ||
831 | DWORD hdrlen; // 16 | ||
832 | WORD format; // 1 | ||
833 | WORD channels; // 1:mono, 2:stereo | ||
834 | DWORD freqHz; // sampling freq | ||
835 | DWORD bytessec; // bytes/sec=freqHz*samplesize | ||
836 | WORD samplesize;// sizeof(sample) | ||
837 | WORD bitspersample;// bits per sample (8/16) | ||
838 | } WAVEFORMATHEADER; | ||
839 | |||
840 | |||
841 | typedef struct WAVEDATAHEADER | ||
842 | { | ||
843 | DWORD id_data; // "data" | ||
844 | DWORD length; // length of data | ||
845 | } WAVEDATAHEADER; | ||
846 | |||
847 | |||
848 | typedef struct WAVESMPLHEADER | ||
849 | { | ||
850 | // SMPL | ||
851 | DWORD smpl_id; // "smpl"-> 0x6C706D73 | ||
852 | DWORD smpl_len; // length of smpl: 3Ch(54h with sustain loop) | ||
853 | DWORD dwManufacturer; | ||
854 | DWORD dwProduct; | ||
855 | DWORD dwSamplePeriod;// 1000000000/freqHz | ||
856 | DWORD dwBaseNote;// 3Ch = C-4 -> 60 + RelativeTone | ||
857 | DWORD dwPitchFraction; | ||
858 | DWORD dwSMPTEFormat; | ||
859 | DWORD dwSMPTEOffset; | ||
860 | DWORD dwSampleLoops;// number of loops | ||
861 | DWORD cbSamplerData; | ||
862 | } WAVESMPLHEADER; | ||
863 | |||
864 | |||
865 | typedef struct SAMPLELOOPSTRUCT | ||
866 | { | ||
867 | DWORD dwIdentifier; | ||
868 | DWORD dwLoopType; // 0=normal, 1=bidi | ||
869 | DWORD dwLoopStart; | ||
870 | DWORD dwLoopEnd; // Byte offset ? | ||
871 | DWORD dwFraction; | ||
872 | DWORD dwPlayCount; // Loop Count, 0=infinite | ||
873 | } SAMPLELOOPSTRUCT; | ||
874 | |||
875 | |||
876 | typedef struct WAVESAMPLERINFO | ||
877 | { | ||
878 | WAVESMPLHEADER wsiHdr; | ||
879 | SAMPLELOOPSTRUCT wsiLoops[2]; | ||
880 | } WAVESAMPLERINFO; | ||
881 | |||
882 | |||
883 | typedef struct WAVELISTHEADER | ||
884 | { | ||
885 | DWORD list_id;// "LIST" -> 0x5453494C | ||
886 | DWORD list_len; | ||
887 | DWORD info; // "INFO" | ||
888 | } WAVELISTHEADER; | ||
889 | |||
890 | |||
891 | typedef struct WAVEEXTRAHEADER | ||
892 | { | ||
893 | DWORD xtra_id; // "xtra"-> 0x61727478 | ||
894 | DWORD xtra_len; | ||
895 | DWORD dwFlags; | ||
896 | WORD wPan; | ||
897 | WORD wVolume; | ||
898 | WORD wGlobalVol; | ||
899 | WORD wReserved; | ||
900 | BYTE nVibType; | ||
901 | BYTE nVibSweep; | ||
902 | BYTE nVibDepth; | ||
903 | BYTE nVibRate; | ||
904 | } WAVEEXTRAHEADER; | ||
905 | |||
906 | #pragma pack() | ||
907 | |||
908 | /////////////////////////////////////////////////////////// | ||
909 | // Low-level Mixing functions | ||
910 | |||
911 | #define MIXBUFFERSIZE 512 | ||
912 | #define MIXING_ATTENUATION4 | ||
913 | #define MIXING_CLIPMIN (-0x08000000) | ||
914 | #define MIXING_CLIPMAX (0x07FFFFFF) | ||
915 | #define VOLUMERAMPPRECISION12 | ||
916 | #define FADESONGDELAY 100 | ||
917 | #define EQ_BUFFERSIZE (MIXBUFFERSIZE) | ||
918 | #define AGC_PRECISION 9 | ||
919 | #define AGC_UNITY (1 << AGC_PRECISION) | ||
920 | |||
921 | // Calling conventions | ||
922 | #ifdef WIN32 | ||
923 | #define MPPASMCALL__cdecl | ||
924 | #define MPPFASTCALL__fastcall | ||
925 | #else | ||
926 | #define MPPASMCALL | ||
927 | #define MPPFASTCALL | ||
928 | #endif | ||
929 | |||
930 | #define MOD2XMFineTune(k)((int)( (signed char)((k)<<4) )) | ||
931 | #define XM2MODFineTune(k)((int)( (k>>4)&0x0f )) | ||
932 | |||
933 | int _muldiv(long a, long b, long c); | ||
934 | int _muldivr(long a, long b, long c); | ||
935 | |||
936 | |||
937 | // Byte swapping functions from the GNU C Library and libsdl | ||
938 | |||
939 | /* Swap bytes in 16 bit value. */ | ||
940 | #ifdef __GNUC__ | ||
941 | # define bswap_16(x) \ | ||
942 | (__extension__ \ | ||
943 | ({ unsigned short int __bsx = (x); \ | ||
944 | ((((__bsx) >> 8) & 0xff) | (((__bsx) & 0xff) << 8)); })) | ||
945 | #else | ||
946 | static __inline unsigned short int | ||
947 | bswap_16 (unsigned short int __bsx) | ||
948 | { | ||
949 | return ((((__bsx) >> 8) & 0xff) | (((__bsx) & 0xff) << 8)); | ||
950 | } | ||
951 | #endif | ||
952 | |||
953 | /* Swap bytes in 32 bit value. */ | ||
954 | #ifdef __GNUC__ | ||
955 | # define bswap_32(x) \ | ||
956 | (__extension__ \ | ||
957 | ({ unsigned int __bsx = (x); \ | ||
958 | ((((__bsx) & 0xff000000) >> 24) | (((__bsx) & 0x00ff0000) >> 8) | \ | ||
959 | (((__bsx) & 0x0000ff00) << 8) | (((__bsx) & 0x000000ff) << 24)); })) | ||
960 | #else | ||
961 | static __inline unsigned int | ||
962 | bswap_32 (unsigned int __bsx) | ||
963 | { | ||
964 | return ((((__bsx) & 0xff000000) >> 24) | (((__bsx) & 0x00ff0000) >> 8) | | ||
965 | (((__bsx) & 0x0000ff00) << 8) | (((__bsx) & 0x000000ff) << 24)); | ||
966 | } | ||
967 | #endif | ||
968 | |||
969 | |||
970 | // From libsdl | ||
971 | #ifdef WORDS_BIGENDIAN | ||
972 | #define bswapLE16(X) bswap_16(X) | ||
973 | #define bswapLE32(X) bswap_32(X) | ||
974 | #define bswapBE16(X) (X) | ||
975 | #define bswapBE32(X) (X) | ||
976 | #else | ||
977 | #define bswapLE16(X) (X) | ||
978 | #define bswapLE32(X) (X) | ||
979 | #define bswapBE16(X) bswap_16(X) | ||
980 | #define bswapBE32(X) bswap_32(X) | ||
981 | #endif | ||
982 | |||
983 | |||
984 | #endif | ||