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