summaryrefslogtreecommitdiff
path: root/core/multimedia/opieplayer/modplug/sndfile.h
Unidiff
Diffstat (limited to 'core/multimedia/opieplayer/modplug/sndfile.h') (more/less context) (show whitespace changes)
-rw-r--r--core/multimedia/opieplayer/modplug/sndfile.h984
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
19typedef 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)
279enum {
280 REVERBTYPE_SMALLROOM,
281 REVERBTYPE_MEDIUMROOM,
282 REVERBTYPE_LARGEROOM,
283 REVERBTYPE_SMALLHALL,
284 REVERBTYPE_MEDIUMHALL,
285 REVERBTYPE_LARGEHALL,
286 NUM_REVERBTYPES
287};
288
289
290enum {
291 SRCMODE_NEAREST,
292 SRCMODE_LINEAR,
293 SRCMODE_SPLINE,
294 SRCMODE_POLYPHASE,
295 NUM_SRC_MODES
296};
297
298
299// Sample Struct
300typedef 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
321typedef 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
370typedef 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
431typedef 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
441typedef 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
455class IMixPlugin
456{
457public:
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
473typedef 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
482typedef 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
493typedef 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
506enum {
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
519typedef 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
527typedef VOID (__cdecl * LPSNDMIXHOOKPROC)(int *, unsigned long, unsigned long); // buffer, samples, channels
528
529
530
531//==============
532class 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
576public:
577 CSoundFile();
578 ~CSoundFile();
579
580public:
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
655public:
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
666public:
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);
694public:
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
768public:
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
774public:
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
820typedef struct WAVEFILEHEADER
821{
822 DWORD id_RIFF; // "RIFF"
823 DWORD filesize; // file length-8
824 DWORD id_WAVE;
825} WAVEFILEHEADER;
826
827
828typedef 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
841typedef struct WAVEDATAHEADER
842{
843 DWORD id_data; // "data"
844 DWORD length; // length of data
845} WAVEDATAHEADER;
846
847
848typedef 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
865typedef 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
876typedef struct WAVESAMPLERINFO
877{
878 WAVESMPLHEADER wsiHdr;
879 SAMPLELOOPSTRUCT wsiLoops[2];
880} WAVESAMPLERINFO;
881
882
883typedef struct WAVELISTHEADER
884{
885 DWORD list_id;// "LIST" -> 0x5453494C
886 DWORD list_len;
887 DWORD info; // "INFO"
888} WAVELISTHEADER;
889
890
891typedef 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
933int _muldiv(long a, long b, long c);
934int _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
946static __inline unsigned short int
947bswap_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
961static __inline unsigned int
962bswap_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