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