2 * This source code is public domain.
4 * Authors: Olivier Lapicque <olivierl@jps.net>,
5 * Adam Goode <adam@evdebs.org> (endian and char fixes for PPC)
8 #if defined(HAVE_CONFIG_H) && !defined(CONFIG_H_INCLUDED)
10 #define CONFIG_H_INCLUDED 1
17 int _strnicmp(const char *str1,const char *str2, int n);
21 typedef const BYTE * LPCBYTE;
24 #define MOD_AMIGAC2 0x1AB
25 #define MAX_SAMPLE_LENGTH 16000000
26 #define MAX_SAMPLE_RATE 192000
27 #define MAX_ORDERS 256
28 #define MAX_PATTERNS 240
29 #define MAX_SAMPLES 240
30 #define MAX_INSTRUMENTS MAX_SAMPLES
31 #ifdef MODPLUG_FASTSOUNDLIB
32 #define MAX_CHANNELS 80
34 #define MAX_CHANNELS 128
36 #define MAX_BASECHANNELS 64
37 #define MAX_ENVPOINTS 32
38 #define MIN_PERIOD 0x0020
39 #define MAX_PERIOD 0xFFFF
40 #define MAX_PATTERNNAME 32
41 #define MAX_CHANNELNAME 20
42 #define MAX_INFONAME 80
43 #define MAX_EQ_BANDS 6
44 #define MAX_MIXPLUGINS 8
47 #define MOD_TYPE_NONE 0x00
48 #define MOD_TYPE_MOD 0x01
49 #define MOD_TYPE_S3M 0x02
50 #define MOD_TYPE_XM 0x04
51 #define MOD_TYPE_MED 0x08
52 #define MOD_TYPE_MTM 0x10
53 #define MOD_TYPE_IT 0x20
54 #define MOD_TYPE_669 0x40
55 #define MOD_TYPE_ULT 0x80
56 #define MOD_TYPE_STM 0x100
57 #define MOD_TYPE_FAR 0x200
58 #define MOD_TYPE_WAV 0x400
59 #define MOD_TYPE_AMF 0x800
60 #define MOD_TYPE_AMS 0x1000
61 #define MOD_TYPE_DSM 0x2000
62 #define MOD_TYPE_MDL 0x4000
63 #define MOD_TYPE_OKT 0x8000
64 #define MOD_TYPE_MID 0x10000
65 #define MOD_TYPE_DMF 0x20000
66 #define MOD_TYPE_PTM 0x40000
67 #define MOD_TYPE_DBM 0x80000
68 #define MOD_TYPE_MT2 0x100000
69 #define MOD_TYPE_AMF0 0x200000
70 #define MOD_TYPE_PSM 0x400000
71 #define MOD_TYPE_J2B 0x800000
72 #define MOD_TYPE_ABC 0x1000000
73 #define MOD_TYPE_PAT 0x2000000
74 #define MOD_TYPE_UMX 0x80000000 // Fake type
75 #define MAX_MODTYPE 24
80 // Bits 0-7: Sample Flags
81 #define CHN_16BIT 0x01
83 #define CHN_PINGPONGLOOP 0x04
84 #define CHN_SUSTAINLOOP 0x08
85 #define CHN_PINGPONGSUSTAIN 0x10
86 #define CHN_PANNING 0x20
87 #define CHN_STEREO 0x40
88 #define CHN_PINGPONGFLAG 0x80
89 // Bits 8-31: Channel Flags
90 #define CHN_MUTE 0x100
91 #define CHN_KEYOFF 0x200
92 #define CHN_NOTEFADE 0x400
93 #define CHN_SURROUND 0x800
94 #define CHN_NOIDO 0x1000
95 #define CHN_HQSRC 0x2000
96 #define CHN_FILTER 0x4000
97 #define CHN_VOLUMERAMP 0x8000
98 #define CHN_VIBRATO 0x10000
99 #define CHN_TREMOLO 0x20000
100 #define CHN_PANBRELLO 0x40000
101 #define CHN_PORTAMENTO 0x80000
102 #define CHN_GLISSANDO 0x100000
103 #define CHN_VOLENV 0x200000
104 #define CHN_PANENV 0x400000
105 #define CHN_PITCHENV 0x800000
106 #define CHN_FASTVOLRAMP 0x1000000
107 #define CHN_EXTRALOUD 0x2000000
108 #define CHN_REVERB 0x4000000
109 #define CHN_NOREVERB 0x8000000
112 #define ENV_VOLUME 0x0001
113 #define ENV_VOLSUSTAIN 0x0002
114 #define ENV_VOLLOOP 0x0004
115 #define ENV_PANNING 0x0008
116 #define ENV_PANSUSTAIN 0x0010
117 #define ENV_PANLOOP 0x0020
118 #define ENV_PITCH 0x0040
119 #define ENV_PITCHSUSTAIN 0x0080
120 #define ENV_PITCHLOOP 0x0100
121 #define ENV_SETPANNING 0x0200
122 #define ENV_FILTER 0x0400
123 #define ENV_VOLCARRY 0x0800
124 #define ENV_PANCARRY 0x1000
125 #define ENV_PITCHCARRY 0x2000
128 #define CMD_ARPEGGIO 1
129 #define CMD_PORTAMENTOUP 2
130 #define CMD_PORTAMENTODOWN 3
131 #define CMD_TONEPORTAMENTO 4
132 #define CMD_VIBRATO 5
133 #define CMD_TONEPORTAVOL 6
134 #define CMD_VIBRATOVOL 7
135 #define CMD_TREMOLO 8
136 #define CMD_PANNING8 9
137 #define CMD_OFFSET 10
138 #define CMD_VOLUMESLIDE 11
139 #define CMD_POSITIONJUMP 12
140 #define CMD_VOLUME 13
141 #define CMD_PATTERNBREAK 14
142 #define CMD_RETRIG 15
145 #define CMD_TREMOR 18
146 #define CMD_MODCMDEX 19
147 #define CMD_S3MCMDEX 20
148 #define CMD_CHANNELVOLUME 21
149 #define CMD_CHANNELVOLSLIDE 22
150 #define CMD_GLOBALVOLUME 23
151 #define CMD_GLOBALVOLSLIDE 24
152 #define CMD_KEYOFF 25
153 #define CMD_FINEVIBRATO 26
154 #define CMD_PANBRELLO 27
155 #define CMD_XFINEPORTAUPDOWN 28
156 #define CMD_PANNINGSLIDE 29
157 #define CMD_SETENVPOSITION 30
161 // Volume Column commands
162 #define VOLCMD_VOLUME 1
163 #define VOLCMD_PANNING 2
164 #define VOLCMD_VOLSLIDEUP 3
165 #define VOLCMD_VOLSLIDEDOWN 4
166 #define VOLCMD_FINEVOLUP 5
167 #define VOLCMD_FINEVOLDOWN 6
168 #define VOLCMD_VIBRATOSPEED 7
169 #define VOLCMD_VIBRATO 8
170 #define VOLCMD_PANSLIDELEFT 9
171 #define VOLCMD_PANSLIDERIGHT 10
172 #define VOLCMD_TONEPORTAMENTO 11
173 #define VOLCMD_PORTAUP 12
174 #define VOLCMD_PORTADOWN 13
176 #define RSF_16BIT 0x04
177 #define RSF_STEREO 0x08
179 #define RS_PCM8S 0 // 8-bit signed
180 #define RS_PCM8U 1 // 8-bit unsigned
181 #define RS_PCM8D 2 // 8-bit delta values
182 #define RS_ADPCM4 3 // 4-bit ADPCM-packed
183 #define RS_PCM16D 4 // 16-bit delta values
184 #define RS_PCM16S 5 // 16-bit signed
185 #define RS_PCM16U 6 // 16-bit unsigned
186 #define RS_PCM16M 7 // 16-bit motorola order
187 #define RS_STPCM8S (RS_PCM8S|RSF_STEREO) // stereo 8-bit signed
188 #define RS_STPCM8U (RS_PCM8U|RSF_STEREO) // stereo 8-bit unsigned
189 #define RS_STPCM8D (RS_PCM8D|RSF_STEREO) // stereo 8-bit delta values
190 #define RS_STPCM16S (RS_PCM16S|RSF_STEREO) // stereo 16-bit signed
191 #define RS_STPCM16U (RS_PCM16U|RSF_STEREO) // stereo 16-bit unsigned
192 #define RS_STPCM16D (RS_PCM16D|RSF_STEREO) // stereo 16-bit delta values
193 #define RS_STPCM16M (RS_PCM16M|RSF_STEREO) // stereo 16-bit signed big endian
194 // IT 2.14 compressed samples
195 #define RS_IT2148 0x10
196 #define RS_IT21416 0x14
197 #define RS_IT2158 0x12
198 #define RS_IT21516 0x16
199 // AMS Packed Samples
201 #define RS_AMS16 0x15
202 // DMF Huffman compression
204 #define RS_DMF16 0x17
205 // MDL Huffman compression
207 #define RS_MDL16 0x24
208 #define RS_PTM8DTO16 0x25
209 // Stereo Interleaved Samples
210 #define RS_STIPCM8S (RS_PCM8S|0x40|RSF_STEREO) // stereo 8-bit signed
211 #define RS_STIPCM8U (RS_PCM8U|0x40|RSF_STEREO) // stereo 8-bit unsigned
212 #define RS_STIPCM16S (RS_PCM16S|0x40|RSF_STEREO) // stereo 16-bit signed
213 #define RS_STIPCM16U (RS_PCM16U|0x40|RSF_STEREO) // stereo 16-bit unsigned
214 #define RS_STIPCM16M (RS_PCM16M|0x40|RSF_STEREO) // stereo 16-bit signed big endian
216 #define RS_PCM24S (RS_PCM16S|0x80) // mono 24-bit signed
217 #define RS_STIPCM24S (RS_PCM16S|0x80|RSF_STEREO) // stereo 24-bit signed
218 #define RS_PCM32S (RS_PCM16S|0xC0) // mono 24-bit signed
219 #define RS_STIPCM32S (RS_PCM16S|0xC0|RSF_STEREO) // stereo 24-bit signed
222 #define NNA_NOTECUT 0
223 #define NNA_CONTINUE 1
224 #define NNA_NOTEOFF 2
225 #define NNA_NOTEFADE 3
231 #define DCT_INSTRUMENT 3
234 #define DNA_NOTECUT 0
235 #define DNA_NOTEOFF 1
236 #define DNA_NOTEFADE 2
238 // Mixer Hardware-Dependent features
239 #define SYSMIX_ENABLEMMX 0x01
240 #define SYSMIX_WINDOWSNT 0x02
241 #define SYSMIX_SLOWCPU 0x04
242 #define SYSMIX_FASTCPU 0x08
245 #define SONG_EMBEDMIDICFG 0x0001
246 #define SONG_FASTVOLSLIDES 0x0002
247 #define SONG_ITOLDEFFECTS 0x0004
248 #define SONG_ITCOMPATMODE 0x0008
249 #define SONG_LINEARSLIDES 0x0010
250 #define SONG_PATTERNLOOP 0x0020
251 #define SONG_STEP 0x0040
252 #define SONG_PAUSED 0x0080
253 #define SONG_FADINGSONG 0x0100
254 #define SONG_ENDREACHED 0x0200
255 #define SONG_GLOBALFADE 0x0400
256 #define SONG_CPUVERYHIGH 0x0800
257 #define SONG_FIRSTTICK 0x1000
258 #define SONG_MPTFILTERMODE 0x2000
259 #define SONG_SURROUNDPAN 0x4000
260 #define SONG_EXFILTERRANGE 0x8000
261 #define SONG_AMIGALIMITS 0x10000
263 // Global Options (Renderer)
264 #define SNDMIX_REVERSESTEREO 0x0001
265 #define SNDMIX_NOISEREDUCTION 0x0002
266 #define SNDMIX_AGC 0x0004
267 #define SNDMIX_NORESAMPLING 0x0008
268 #define SNDMIX_HQRESAMPLER 0x0010
269 #define SNDMIX_MEGABASS 0x0020
270 #define SNDMIX_SURROUND 0x0040
271 #define SNDMIX_REVERB 0x0080
272 #define SNDMIX_EQ 0x0100
273 #define SNDMIX_SOFTPANNING 0x0200
274 #define SNDMIX_ULTRAHQSRCMODE 0x0400
275 // Misc Flags (can safely be turned on or off)
276 #define SNDMIX_DIRECTTODISK 0x10000
277 #define SNDMIX_ENABLEMMX 0x20000
278 #define SNDMIX_NOBACKWARDJUMPS 0x40000
279 #define SNDMIX_MAXDEFAULTPAN 0x80000 // Used by the MOD loader
282 // Reverb Types (GM2 Presets)
284 REVERBTYPE_SMALLROOM,
285 REVERBTYPE_MEDIUMROOM,
286 REVERBTYPE_LARGEROOM,
287 REVERBTYPE_SMALLHALL,
288 REVERBTYPE_MEDIUMHALL,
289 REVERBTYPE_LARGEHALL,
304 typedef struct _MODINSTRUMENT
306 UINT nLength,nLoopStart,nLoopEnd;
307 UINT nSustainStart, nSustainEnd;
308 signed char *pSample;
314 signed char RelativeTone;
315 signed char nFineTune;
325 typedef struct _INSTRUMENTHEADER
331 WORD VolPoints[MAX_ENVPOINTS];
332 WORD PanPoints[MAX_ENVPOINTS];
333 WORD PitchPoints[MAX_ENVPOINTS];
334 BYTE VolEnv[MAX_ENVPOINTS];
335 BYTE PanEnv[MAX_ENVPOINTS];
336 BYTE PitchEnv[MAX_ENVPOINTS];
345 BYTE nVolSustainBegin;
349 BYTE nPanSustainBegin;
351 BYTE nPitchLoopStart;
353 BYTE nPitchSustainBegin;
354 BYTE nPitchSustainEnd;
374 typedef struct _MODCHANNEL
376 // First 32-bytes: Most used mixing information: don't change it
377 signed char * pCurrentSample;
379 DWORD nPosLo; // actually 16-bit
392 LONG nFilter_Y1, nFilter_Y2, nFilter_Y3, nFilter_Y4;
393 LONG nFilter_A0, nFilter_B0, nFilter_B1;
396 // Information not used in the mixer
397 signed char * pSample;
398 LONG nNewRightVol, nNewLeftVol;
399 LONG nRealVolume, nRealPan;
400 LONG nVolume, nPan, nFadeOutVol;
401 LONG nPeriod, nC4Speed, nPortamentoDest;
402 INSTRUMENTHEADER *pHeader;
403 MODINSTRUMENT *pInstrument;
404 DWORD nVolEnvPosition, nPanEnvPosition, nPitchEnvPosition;
405 DWORD nMasterChn, nVUMeter;
406 LONG nGlobalVol, nInsVol;
407 LONG nFineTune, nTranspose;
408 LONG nPortamentoSlide, nAutoVibDepth;
409 UINT nAutoVibPos, nVibratoPos, nTremoloPos, nPanbrelloPos;
411 signed short nVolSwing, nPanSwing;
414 BYTE nNewNote, nNewIns, nCommand, nArpeggio;
415 BYTE nOldVolumeSlide, nOldFineVolUpDown;
416 BYTE nOldPortaUpDown, nOldFinePortaUpDown;
417 BYTE nOldPanSlide, nOldChnVolSlide;
418 BYTE nVibratoType, nVibratoSpeed, nVibratoDepth;
419 BYTE nTremoloType, nTremoloSpeed, nTremoloDepth;
420 BYTE nPanbrelloType, nPanbrelloSpeed, nPanbrelloDepth;
421 BYTE nOldCmdEx, nOldVolParam, nOldTempo;
422 BYTE nOldOffset, nOldHiOffset;
423 BYTE nCutOff, nResonance;
424 BYTE nRetrigCount, nRetrigParam;
425 BYTE nTremorCount, nTremorParam;
426 BYTE nPatternLoop, nPatternLoopCount;
427 BYTE nRowNote, nRowInstr;
428 BYTE nRowVolCmd, nRowVolume;
429 BYTE nRowCommand, nRowParam;
430 BYTE nLeftVU, nRightVU;
431 BYTE nActiveMacro, nPadding;
435 typedef struct _MODCHANNELSETTINGS
441 char szName[MAX_CHANNELNAME]; // changed from CHAR
442 } MODCHANNELSETTINGS;
445 typedef struct _MODCOMMAND
453 } MODCOMMAND, *LPMODCOMMAND;
455 ////////////////////////////////////////////////////////////////////
457 #define MIXPLUG_MIXREADY 0x01 // Set when cleared
462 virtual ~IMixPlugin();
463 virtual int AddRef() = 0;
464 virtual int Release() = 0;
465 virtual void SaveAllParameters() = 0;
466 virtual void RestoreAllParameters() = 0;
467 virtual void Process(float *pOutL, float *pOutR, unsigned long nSamples) = 0;
468 virtual void Init(unsigned long nFreq, int bReset) = 0;
469 virtual void MidiSend(DWORD dwMidiCode) = 0;
470 virtual void MidiCommand(UINT nMidiCh, UINT nMidiProg, UINT note, UINT vol) = 0;
474 #define MIXPLUG_INPUTF_MASTEREFFECT 0x01 // Apply to master mix
475 #define MIXPLUG_INPUTF_BYPASS 0x02 // Bypass effect
476 #define MIXPLUG_INPUTF_WETMIX 0x04 // Wet Mix (dry added)
478 typedef struct _SNDMIXPLUGINSTATE
480 DWORD dwFlags; // MIXPLUG_XXXX
481 LONG nVolDecayL, nVolDecayR; // Buffer click removal
482 int *pMixBuffer; // Stereo effect send buffer
483 float *pOutBufferL; // Temp storage for int -> float conversion
485 } SNDMIXPLUGINSTATE, *PSNDMIXPLUGINSTATE;
487 typedef struct _SNDMIXPLUGININFO
491 DWORD dwInputRouting; // MIXPLUG_INPUTF_XXXX
492 DWORD dwOutputRouting; // 0=mix 0x80+=fx
493 DWORD dwReserved[4]; // Reserved for routing info
495 CHAR szLibraryName[64]; // original DLL name
496 } SNDMIXPLUGININFO, *PSNDMIXPLUGININFO; // Size should be 128
498 typedef struct _SNDMIXPLUGIN
500 IMixPlugin *pMixPlugin;
501 PSNDMIXPLUGINSTATE pMixState;
502 ULONG nPluginDataSize;
504 SNDMIXPLUGININFO Info;
505 } SNDMIXPLUGIN, *PSNDMIXPLUGIN;
507 typedef BOOL (*PMIXPLUGINCREATEPROC)(PSNDMIXPLUGIN);
509 ////////////////////////////////////////////////////////////////////
524 typedef struct MODMIDICFG
526 char szMidiGlb[9*32]; // changed from CHAR
527 char szMidiSFXExt[16*32]; // changed from CHAR
528 char szMidiZXXExt[128*32]; // changed from CHAR
529 } MODMIDICFG, *LPMODMIDICFG;
531 #define NOTE_MAX 120 //Defines maximum notevalue as well as maximum number of notes.
533 typedef VOID (* LPSNDMIXHOOKPROC)(int *, unsigned long, unsigned long); // buffer, samples, channels
541 public: // Static Members
542 static UINT m_nXBassDepth, m_nXBassRange;
543 static UINT m_nReverbDepth, m_nReverbDelay, gnReverbType;
544 static UINT m_nProLogicDepth, m_nProLogicDelay;
545 static UINT m_nStereoSeparation;
546 static UINT m_nMaxMixChannels;
547 static LONG m_nStreamVolume;
548 static DWORD gdwSysInfo, gdwSoundSetup, gdwMixingFreq, gnBitsPerSample, gnChannels;
549 static UINT gnAGC, gnVolumeRampSamples, gnVUMeter, gnCPUUsage;
550 static LPSNDMIXHOOKPROC gpSndMixHook;
551 static PMIXPLUGINCREATEPROC gpMixPluginCreateProc;
553 public: // for Editing
554 MODCHANNEL Chn[MAX_CHANNELS]; // Channels
555 UINT ChnMix[MAX_CHANNELS]; // Channels to be mixed
556 MODINSTRUMENT Ins[MAX_SAMPLES]; // Instruments
557 INSTRUMENTHEADER *Headers[MAX_INSTRUMENTS]; // Instrument Headers
558 MODCHANNELSETTINGS ChnSettings[MAX_BASECHANNELS]; // Channels settings
559 MODCOMMAND *Patterns[MAX_PATTERNS]; // Patterns
560 WORD PatternSize[MAX_PATTERNS]; // Patterns Lengths
561 BYTE Order[MAX_ORDERS]; // Pattern Orders
562 MODMIDICFG m_MidiCfg; // Midi macro config table
563 SNDMIXPLUGIN m_MixPlugins[MAX_MIXPLUGINS]; // Mix plugins
564 UINT m_nDefaultSpeed, m_nDefaultTempo, m_nDefaultGlobalVolume;
565 DWORD m_dwSongFlags; // Song flags SONG_XXXX
566 UINT m_nChannels, m_nMixChannels, m_nMixStat, m_nBufferCount;
567 UINT m_nType, m_nSamples, m_nInstruments;
568 UINT m_nTickCount, m_nTotalCount, m_nPatternDelay, m_nFrameDelay;
569 UINT m_nMusicSpeed, m_nMusicTempo;
570 UINT m_nNextRow, m_nRow;
571 UINT m_nPattern,m_nCurrentPattern,m_nNextPattern,m_nRestartPos;
572 UINT m_nMasterVolume, m_nGlobalVolume, m_nSongPreAmp;
573 UINT m_nFreqFactor, m_nTempoFactor, m_nOldGlbVolSlide;
574 LONG m_nMinPeriod, m_nMaxPeriod, m_nRepeatCount, m_nInitialRepeatCount;
575 DWORD m_nGlobalFadeSamples, m_nGlobalFadeMaxSamples;
576 UINT m_nMaxOrderPosition;
577 UINT m_nPatternNames;
578 LPSTR m_lpszSongComments, m_lpszPatternNames;
579 char m_szNames[MAX_INSTRUMENTS][32]; // changed from CHAR
580 CHAR CompressionTable[16];
587 BOOL Create(LPCBYTE lpStream, DWORD dwMemLength=0);
589 UINT GetType() const { return m_nType; }
590 UINT GetNumChannels() const;
591 UINT GetLogicalChannels() const { return m_nChannels; }
592 BOOL SetMasterVolume(UINT vol, BOOL bAdjustAGC=FALSE);
593 UINT GetMasterVolume() const { return m_nMasterVolume; }
594 UINT GetNumPatterns() const;
595 UINT GetNumInstruments() const;
596 UINT GetNumSamples() const { return m_nSamples; }
597 UINT GetCurrentPos() const;
598 UINT GetCurrentPattern() const { return m_nPattern; }
599 UINT GetCurrentOrder() const { return m_nCurrentPattern; }
600 UINT GetSongComments(LPSTR s, UINT cbsize, UINT linesize=32);
601 UINT GetRawSongComments(LPSTR s, UINT cbsize, UINT linesize=32);
602 UINT GetMaxPosition() const;
603 void SetCurrentPos(UINT nPos);
604 void SetCurrentOrder(UINT nOrder);
605 void GetTitle(LPSTR s) const { lstrcpyn(s,m_szNames[0],32); }
606 LPCSTR GetTitle() const { return m_szNames[0]; }
607 UINT GetSampleName(UINT nSample,LPSTR s=NULL) const;
608 UINT GetInstrumentName(UINT nInstr,LPSTR s=NULL) const;
609 UINT GetMusicSpeed() const { return m_nMusicSpeed; }
610 UINT GetMusicTempo() const { return m_nMusicTempo; }
611 DWORD GetLength(BOOL bAdjust, BOOL bTotal=FALSE);
612 DWORD GetSongTime() { return GetLength(FALSE, TRUE); }
613 void SetRepeatCount(int n) { m_nRepeatCount = n; m_nInitialRepeatCount = n; }
614 int GetRepeatCount() const { return m_nRepeatCount; }
615 BOOL IsPaused() const { return (m_dwSongFlags & SONG_PAUSED) ? TRUE : FALSE; }
616 void LoopPattern(int nPat, int nRow=0);
617 void CheckCPUUsage(UINT nCPU);
618 BOOL SetPatternName(UINT nPat, LPCSTR lpszName);
619 BOOL GetPatternName(UINT nPat, LPSTR lpszName, UINT cbSize=MAX_PATTERNNAME) const;
621 BOOL ReadXM(LPCBYTE lpStream, DWORD dwMemLength);
622 BOOL ReadS3M(LPCBYTE lpStream, DWORD dwMemLength);
623 BOOL ReadMod(LPCBYTE lpStream, DWORD dwMemLength);
624 BOOL ReadMed(LPCBYTE lpStream, DWORD dwMemLength);
625 BOOL ReadMTM(LPCBYTE lpStream, DWORD dwMemLength);
626 BOOL ReadSTM(LPCBYTE lpStream, DWORD dwMemLength);
627 BOOL ReadIT(LPCBYTE lpStream, DWORD dwMemLength);
628 BOOL Read669(LPCBYTE lpStream, DWORD dwMemLength);
629 BOOL ReadUlt(LPCBYTE lpStream, DWORD dwMemLength);
630 BOOL ReadWav(LPCBYTE lpStream, DWORD dwMemLength);
631 BOOL ReadDSM(LPCBYTE lpStream, DWORD dwMemLength);
632 BOOL ReadFAR(LPCBYTE lpStream, DWORD dwMemLength);
633 BOOL ReadAMS(LPCBYTE lpStream, DWORD dwMemLength);
634 BOOL ReadAMS2(LPCBYTE lpStream, DWORD dwMemLength);
635 BOOL ReadMDL(LPCBYTE lpStream, DWORD dwMemLength);
636 BOOL ReadOKT(LPCBYTE lpStream, DWORD dwMemLength);
637 BOOL ReadDMF(LPCBYTE lpStream, DWORD dwMemLength);
638 BOOL ReadPTM(LPCBYTE lpStream, DWORD dwMemLength);
639 BOOL ReadDBM(LPCBYTE lpStream, DWORD dwMemLength);
640 BOOL ReadAMF(LPCBYTE lpStream, DWORD dwMemLength);
641 BOOL ReadMT2(LPCBYTE lpStream, DWORD dwMemLength);
642 BOOL ReadPSM(LPCBYTE lpStream, DWORD dwMemLength);
643 BOOL ReadJ2B(LPCBYTE lpStream, DWORD dwMemLength);
644 BOOL ReadUMX(LPCBYTE lpStream, DWORD dwMemLength);
645 BOOL ReadABC(LPCBYTE lpStream, DWORD dwMemLength);
646 BOOL TestABC(LPCBYTE lpStream, DWORD dwMemLength);
647 BOOL ReadMID(LPCBYTE lpStream, DWORD dwMemLength);
648 BOOL TestMID(LPCBYTE lpStream, DWORD dwMemLength);
649 BOOL ReadPAT(LPCBYTE lpStream, DWORD dwMemLength);
650 BOOL TestPAT(LPCBYTE lpStream, DWORD dwMemLength);
652 #ifndef MODPLUG_NO_FILESAVE
653 UINT WriteSample(FILE *f, MODINSTRUMENT *pins, UINT nFlags, UINT nMaxLen=0);
654 BOOL SaveXM(LPCSTR lpszFileName, UINT nPacking=0);
655 BOOL SaveS3M(LPCSTR lpszFileName, UINT nPacking=0);
656 BOOL SaveMod(LPCSTR lpszFileName, UINT nPacking=0);
657 BOOL SaveIT(LPCSTR lpszFileName, UINT nPacking=0);
658 #endif // MODPLUG_NO_FILESAVE
659 // MOD Convert function
660 UINT GetBestSaveFormat() const;
661 UINT GetSaveFormats() const;
662 void ConvertModCommand(MODCOMMAND *) const;
663 void S3MConvert(MODCOMMAND *m, BOOL bIT) const;
664 void S3MSaveConvert(UINT *pcmd, UINT *pprm, BOOL bIT) const;
665 WORD ModSaveCommand(const MODCOMMAND *m, BOOL bXM) const;
668 // Real-time sound functions
669 VOID ResetChannels();
671 UINT Read(LPVOID lpBuffer, UINT cbBuffer);
672 UINT CreateStereoMix(int count);
673 BOOL FadeSong(UINT msec);
674 BOOL GlobalFadeSong(UINT msec);
675 UINT GetTotalTickCount() const { return m_nTotalCount; }
676 VOID ResetTotalTickCount() { m_nTotalCount = 0; }
680 static BOOL InitPlayer(BOOL bReset=FALSE);
681 static BOOL SetMixConfig(UINT nStereoSeparation, UINT nMaxMixChannels);
682 static BOOL SetWaveConfig(UINT nRate,UINT nBits,UINT nChannels,BOOL bMMX=FALSE);
683 static BOOL SetResamplingMode(UINT nMode); // SRCMODE_XXXX
684 static BOOL IsStereo() { return (gnChannels > 1) ? TRUE : FALSE; }
685 static DWORD GetSampleRate() { return gdwMixingFreq; }
686 static DWORD GetBitsPerSample() { return gnBitsPerSample; }
687 static DWORD InitSysInfo();
688 static DWORD GetSysInfo() { return gdwSysInfo; }
690 static BOOL GetAGC() { return (gdwSoundSetup & SNDMIX_AGC) ? TRUE : FALSE; }
691 static void SetAGC(BOOL b);
692 static void ResetAGC();
693 static void ProcessAGC(int count);
695 //GCCFIX -- added these functions back in!
696 static BOOL SetWaveConfigEx(BOOL bSurround,BOOL bNoOverSampling,BOOL bReverb,BOOL hqido,BOOL bMegaBass,BOOL bNR,BOOL bEQ);
698 static void InitializeDSP(BOOL bReset);
699 static void ProcessStereoDSP(int count);
700 static void ProcessMonoDSP(int count);
701 // [Reverb level 0(quiet)-100(loud)], [delay in ms, usually 40-200ms]
702 static BOOL SetReverbParameters(UINT nDepth, UINT nDelay);
703 // [XBass level 0(quiet)-100(loud)], [cutoff in Hz 10-100]
704 static BOOL SetXBassParameters(UINT nDepth, UINT nRange);
705 // [Surround level 0(quiet)-100(heavy)] [delay in ms, usually 5-40ms]
706 static BOOL SetSurroundParameters(UINT nDepth, UINT nDelay);
710 BOOL ProcessEffects();
711 UINT GetNNAChannel(UINT nChn) const;
712 void CheckNNA(UINT nChn, UINT instr, int note, BOOL bForceCut);
713 void NoteChange(UINT nChn, int note, BOOL bPorta=FALSE, BOOL bResetEnv=TRUE);
714 void InstrumentChange(MODCHANNEL *pChn, UINT instr, BOOL bPorta=FALSE,BOOL bUpdVol=TRUE,BOOL bResetEnv=TRUE);
716 void PortamentoUp(MODCHANNEL *pChn, UINT param);
717 void PortamentoDown(MODCHANNEL *pChn, UINT param);
718 void FinePortamentoUp(MODCHANNEL *pChn, UINT param);
719 void FinePortamentoDown(MODCHANNEL *pChn, UINT param);
720 void ExtraFinePortamentoUp(MODCHANNEL *pChn, UINT param);
721 void ExtraFinePortamentoDown(MODCHANNEL *pChn, UINT param);
722 void TonePortamento(MODCHANNEL *pChn, UINT param);
723 void Vibrato(MODCHANNEL *pChn, UINT param);
724 void FineVibrato(MODCHANNEL *pChn, UINT param);
725 void VolumeSlide(MODCHANNEL *pChn, UINT param);
726 void PanningSlide(MODCHANNEL *pChn, UINT param);
727 void ChannelVolSlide(MODCHANNEL *pChn, UINT param);
728 void FineVolumeUp(MODCHANNEL *pChn, UINT param);
729 void FineVolumeDown(MODCHANNEL *pChn, UINT param);
730 void Tremolo(MODCHANNEL *pChn, UINT param);
731 void Panbrello(MODCHANNEL *pChn, UINT param);
732 void RetrigNote(UINT nChn, UINT param);
733 void NoteCut(UINT nChn, UINT nTick);
734 void KeyOff(UINT nChn);
735 int PatternLoop(MODCHANNEL *, UINT param);
736 void ExtendedMODCommands(UINT nChn, UINT param);
737 void ExtendedS3MCommands(UINT nChn, UINT param);
738 void ExtendedChannelEffect(MODCHANNEL *, UINT param);
739 void ProcessMidiMacro(UINT nChn, LPCSTR pszMidiMacro, UINT param=0);
740 void SetupChannelFilter(MODCHANNEL *pChn, BOOL bReset, int flt_modifier=256) const;
741 // Low-Level effect processing
742 void DoFreqSlide(MODCHANNEL *pChn, LONG nFreqSlide);
744 void SetTempo(UINT param);
745 void SetSpeed(UINT param);
746 void GlobalVolSlide(UINT param);
747 DWORD IsSongFinished(UINT nOrder, UINT nRow) const;
748 BOOL IsValidBackwardJump(UINT nStartOrder, UINT nStartRow, UINT nJumpOrder, UINT nJumpRow) const;
749 // Read/Write sample functions
750 signed char GetDeltaValue(signed char prev, UINT n) const { return (signed char)(prev + CompressionTable[n & 0x0F]); }
751 UINT PackSample(int &sample, int next);
752 BOOL CanPackSample(LPSTR pSample, UINT nLen, UINT nPacking, BYTE *result=NULL);
753 UINT ReadSample(MODINSTRUMENT *pIns, UINT nFlags, LPCSTR pMemFile, DWORD dwMemLength);
754 BOOL DestroySample(UINT nSample);
755 BOOL DestroyInstrument(UINT nInstr);
756 BOOL IsSampleUsed(UINT nSample);
757 BOOL IsInstrumentUsed(UINT nInstr);
758 BOOL RemoveInstrumentSamples(UINT nInstr);
759 UINT DetectUnusedSamples(BOOL *);
760 BOOL RemoveSelectedSamples(BOOL *);
761 void AdjustSampleLoop(MODINSTRUMENT *pIns);
762 // I/O from another sound file
763 BOOL ReadInstrumentFromSong(UINT nInstr, CSoundFile *, UINT nSrcInstrument);
764 BOOL ReadSampleFromSong(UINT nSample, CSoundFile *, UINT nSrcSample);
765 // Period/Note functions
766 UINT GetNoteFromPeriod(UINT period) const;
767 UINT GetPeriodFromNote(UINT note, int nFineTune, UINT nC4Speed) const;
768 UINT GetFreqFromPeriod(UINT period, UINT nC4Speed, int nPeriodFrac=0) const;
770 MODINSTRUMENT *GetSample(UINT n) { return Ins+n; }
772 UINT MapMidiInstrument(DWORD dwProgram, UINT nChannel, UINT nNote);
773 BOOL ITInstrToMPT(const void *p, INSTRUMENTHEADER *penv, UINT trkvers);
774 UINT SaveMixPlugins(FILE *f=NULL, BOOL bUpdate=TRUE);
775 UINT LoadMixPlugins(const void *pData, UINT nLen);
777 DWORD CutOffToFrequency(UINT nCutOff, int flt_modifier=256) const; // [0-255] => [1-10KHz]
780 // Static helper functions
782 static DWORD TransposeToFrequency(int transp, int ftune=0);
783 static int FrequencyToTranspose(DWORD freq);
784 static void FrequencyToTranspose(MODINSTRUMENT *psmp);
786 // System-Dependant functions
788 static MODCOMMAND *AllocatePattern(UINT rows, UINT nchns);
789 static signed char* AllocateSample(UINT nbytes);
790 static void FreePattern(LPVOID pat);
791 static void FreeSample(LPVOID p);
792 static UINT Normalize24BitBuffer(LPBYTE pbuffer, UINT cbsizebytes, DWORD lmax24, DWORD dwByteInc);
796 // inline DWORD BigEndian(DWORD x) { return ((x & 0xFF) << 24) | ((x & 0xFF00) << 8) | ((x & 0xFF0000) >> 8) | ((x & 0xFF000000) >> 24); }
797 // inline WORD BigEndianW(WORD x) { return (WORD)(((x >> 8) & 0xFF) | ((x << 8) & 0xFF00)); }
800 //////////////////////////////////////////////////////////
801 // WAVE format information
805 // Standard IFF chunks IDs
806 #define IFFID_FORM 0x4d524f46
807 #define IFFID_RIFF 0x46464952
808 #define IFFID_WAVE 0x45564157
809 #define IFFID_LIST 0x5453494C
810 #define IFFID_INFO 0x4F464E49
813 #define IFFID_ICOP 0x504F4349
814 #define IFFID_IART 0x54524149
815 #define IFFID_IPRD 0x44525049
816 #define IFFID_INAM 0x4D414E49
817 #define IFFID_ICMT 0x544D4349
818 #define IFFID_IENG 0x474E4549
819 #define IFFID_ISFT 0x54465349
820 #define IFFID_ISBJ 0x4A425349
821 #define IFFID_IGNR 0x524E4749
822 #define IFFID_ICRD 0x44524349
824 // Wave IFF chunks IDs
825 #define IFFID_wave 0x65766177
826 #define IFFID_fmt 0x20746D66
827 #define IFFID_wsmp 0x706D7377
828 #define IFFID_pcm 0x206d6370
829 #define IFFID_data 0x61746164
830 #define IFFID_smpl 0x6C706D73
831 #define IFFID_xtra 0x61727478
833 typedef struct WAVEFILEHEADER
835 DWORD id_RIFF; // "RIFF"
836 DWORD filesize; // file length-8
841 typedef struct WAVEFORMATHEADER
843 DWORD id_fmt; // "fmt "
846 WORD channels; // 1:mono, 2:stereo
847 DWORD freqHz; // sampling freq
848 DWORD bytessec; // bytes/sec=freqHz*samplesize
849 WORD samplesize; // sizeof(sample)
850 WORD bitspersample; // bits per sample (8/16)
854 typedef struct WAVEDATAHEADER
856 DWORD id_data; // "data"
857 DWORD length; // length of data
861 typedef struct WAVESMPLHEADER
864 DWORD smpl_id; // "smpl" -> 0x6C706D73
865 DWORD smpl_len; // length of smpl: 3Ch (54h with sustain loop)
866 DWORD dwManufacturer;
868 DWORD dwSamplePeriod; // 1000000000/freqHz
869 DWORD dwBaseNote; // 3Ch = C-4 -> 60 + RelativeTone
870 DWORD dwPitchFraction;
873 DWORD dwSampleLoops; // number of loops
878 typedef struct SAMPLELOOPSTRUCT
881 DWORD dwLoopType; // 0=normal, 1=bidi
883 DWORD dwLoopEnd; // Byte offset ?
885 DWORD dwPlayCount; // Loop Count, 0=infinite
889 typedef struct WAVESAMPLERINFO
891 WAVESMPLHEADER wsiHdr;
892 SAMPLELOOPSTRUCT wsiLoops[2];
896 typedef struct WAVELISTHEADER
898 DWORD list_id; // "LIST" -> 0x5453494C
900 DWORD info; // "INFO"
904 typedef struct WAVEEXTRAHEADER
906 DWORD xtra_id; // "xtra" -> 0x61727478
921 ///////////////////////////////////////////////////////////
922 // Low-level Mixing functions
924 #define MIXBUFFERSIZE 512
925 #define MIXING_ATTENUATION 4
926 #define MIXING_CLIPMIN (-0x08000000)
927 #define MIXING_CLIPMAX (0x07FFFFFF)
928 #define VOLUMERAMPPRECISION 12
929 #define FADESONGDELAY 100
930 #define EQ_BUFFERSIZE (MIXBUFFERSIZE)
931 #define AGC_PRECISION 9
932 #define AGC_UNITY (1 << AGC_PRECISION)
934 // Calling conventions
936 #define MPPASMCALL __cdecl
937 #define MPPFASTCALL __fastcall
943 #define MOD2XMFineTune(k) ((int)( (signed char)((k)<<4) ))
944 #define XM2MODFineTune(k) ((int)( (k>>4)&0x0f ))
946 int _muldiv(long a, long b, long c);
947 int _muldivr(long a, long b, long c);
950 // Byte swapping functions from the GNU C Library and libsdl
952 /* Swap bytes in 16 bit value. */
954 # define bswap_16(x) \
956 ({ unsigned short int __bsx = (x); \
957 ((((__bsx) >> 8) & 0xff) | (((__bsx) & 0xff) << 8)); }))
959 static __inline unsigned short int
960 bswap_16 (unsigned short int __bsx)
962 return ((((__bsx) >> 8) & 0xff) | (((__bsx) & 0xff) << 8));
966 /* Swap bytes in 32 bit value. */
968 # define bswap_32(x) \
970 ({ unsigned int __bsx = (x); \
971 ((((__bsx) & 0xff000000) >> 24) | (((__bsx) & 0x00ff0000) >> 8) | \
972 (((__bsx) & 0x0000ff00) << 8) | (((__bsx) & 0x000000ff) << 24)); }))
974 static __inline unsigned int
975 bswap_32 (unsigned int __bsx)
977 return ((((__bsx) & 0xff000000) >> 24) | (((__bsx) & 0x00ff0000) >> 8) |
978 (((__bsx) & 0x0000ff00) << 8) | (((__bsx) & 0x000000ff) << 24));
982 #if (defined ARM) && (defined _WIN32_WCE)
983 static __inline unsigned short int
984 ARM_get16(const void *data)
986 unsigned short int s;
987 memcpy(&s,data,sizeof(s));
991 static __inline unsigned int
992 ARM_get32(const void *data)
995 memcpy(&s,data,sizeof(s));
999 #define bswapLE16(X) ARM_get16(&X)
1000 #define bswapLE32(X) ARM_get32(&X)
1001 #define bswapBE16(X) bswap_16(ARM_get16(&X))
1002 #define bswapBE32(X) bswap_32(ARM_get32(&X))
1005 #elif defined(WORDS_BIGENDIAN) && WORDS_BIGENDIAN
1006 #define bswapLE16(X) bswap_16(X)
1007 #define bswapLE32(X) bswap_32(X)
1008 #define bswapBE16(X) (X)
1009 #define bswapBE32(X) (X)
1011 #define bswapLE16(X) (X)
1012 #define bswapLE32(X) (X)
1013 #define bswapBE16(X) bswap_16(X)
1014 #define bswapBE32(X) bswap_32(X)