00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifdef HAVE_CONFIG_H
00012 #include "config.h"
00013 #endif
00014
00015 #ifndef __SNDFILE_H
00016 #define __SNDFILE_H
00017
00018 #ifndef LPCBYTE
00019 typedef const BYTE * LPCBYTE;
00020 #endif
00021
00022 #define MOD_AMIGAC2 0x1AB
00023 #define MAX_SAMPLE_LENGTH 16000000
00024 #define MAX_SAMPLE_RATE 50000
00025 #define MAX_ORDERS 256
00026 #define MAX_PATTERNS 240
00027 #define MAX_SAMPLES 240
00028 #define MAX_INSTRUMENTS MAX_SAMPLES
00029 #ifdef FASTSOUNDLIB
00030 #define MAX_CHANNELS 80
00031 #else
00032 #define MAX_CHANNELS 128
00033 #endif
00034 #define MAX_BASECHANNELS 64
00035 #define MAX_ENVPOINTS 32
00036 #define MIN_PERIOD 0x0020
00037 #define MAX_PERIOD 0xFFFF
00038 #define MAX_PATTERNNAME 32
00039 #define MAX_CHANNELNAME 20
00040 #define MAX_INFONAME 80
00041 #define MAX_EQ_BANDS 6
00042 #define MAX_MIXPLUGINS 8
00043
00044
00045 #define MOD_TYPE_NONE 0x00
00046 #define MOD_TYPE_MOD 0x01
00047 #define MOD_TYPE_S3M 0x02
00048 #define MOD_TYPE_XM 0x04
00049 #define MOD_TYPE_MED 0x08
00050 #define MOD_TYPE_MTM 0x10
00051 #define MOD_TYPE_IT 0x20
00052 #define MOD_TYPE_669 0x40
00053 #define MOD_TYPE_ULT 0x80
00054 #define MOD_TYPE_STM 0x100
00055 #define MOD_TYPE_FAR 0x200
00056 #define MOD_TYPE_WAV 0x400
00057 #define MOD_TYPE_AMF 0x800
00058 #define MOD_TYPE_AMS 0x1000
00059 #define MOD_TYPE_DSM 0x2000
00060 #define MOD_TYPE_MDL 0x4000
00061 #define MOD_TYPE_OKT 0x8000
00062 #define MOD_TYPE_MID 0x10000
00063 #define MOD_TYPE_DMF 0x20000
00064 #define MOD_TYPE_PTM 0x40000
00065 #define MOD_TYPE_DBM 0x80000
00066 #define MOD_TYPE_MT2 0x100000
00067 #define MOD_TYPE_AMF0 0x200000
00068 #define MOD_TYPE_PSM 0x400000
00069 #define MOD_TYPE_J2B 0x800000
00070 #define MOD_TYPE_UMX 0x80000000 // Fake type
00071 #define MAX_MODTYPE 23
00072
00073
00074
00075
00076
00077 #define CHN_16BIT 0x01
00078 #define CHN_LOOP 0x02
00079 #define CHN_PINGPONGLOOP 0x04
00080 #define CHN_SUSTAINLOOP 0x08
00081 #define CHN_PINGPONGSUSTAIN 0x10
00082 #define CHN_PANNING 0x20
00083 #define CHN_STEREO 0x40
00084 #define CHN_PINGPONGFLAG 0x80
00085
00086 #define CHN_MUTE 0x100
00087 #define CHN_KEYOFF 0x200
00088 #define CHN_NOTEFADE 0x400
00089 #define CHN_SURROUND 0x800
00090 #define CHN_NOIDO 0x1000
00091 #define CHN_HQSRC 0x2000
00092 #define CHN_FILTER 0x4000
00093 #define CHN_VOLUMERAMP 0x8000
00094 #define CHN_VIBRATO 0x10000
00095 #define CHN_TREMOLO 0x20000
00096 #define CHN_PANBRELLO 0x40000
00097 #define CHN_PORTAMENTO 0x80000
00098 #define CHN_GLISSANDO 0x100000
00099 #define CHN_VOLENV 0x200000
00100 #define CHN_PANENV 0x400000
00101 #define CHN_PITCHENV 0x800000
00102 #define CHN_FASTVOLRAMP 0x1000000
00103 #define CHN_EXTRALOUD 0x2000000
00104 #define CHN_REVERB 0x4000000
00105 #define CHN_NOREVERB 0x8000000
00106
00107
00108 #define ENV_VOLUME 0x0001
00109 #define ENV_VOLSUSTAIN 0x0002
00110 #define ENV_VOLLOOP 0x0004
00111 #define ENV_PANNING 0x0008
00112 #define ENV_PANSUSTAIN 0x0010
00113 #define ENV_PANLOOP 0x0020
00114 #define ENV_PITCH 0x0040
00115 #define ENV_PITCHSUSTAIN 0x0080
00116 #define ENV_PITCHLOOP 0x0100
00117 #define ENV_SETPANNING 0x0200
00118 #define ENV_FILTER 0x0400
00119 #define ENV_VOLCARRY 0x0800
00120 #define ENV_PANCARRY 0x1000
00121 #define ENV_PITCHCARRY 0x2000
00122
00123 #define CMD_NONE 0
00124 #define CMD_ARPEGGIO 1
00125 #define CMD_PORTAMENTOUP 2
00126 #define CMD_PORTAMENTODOWN 3
00127 #define CMD_TONEPORTAMENTO 4
00128 #define CMD_VIBRATO 5
00129 #define CMD_TONEPORTAVOL 6
00130 #define CMD_VIBRATOVOL 7
00131 #define CMD_TREMOLO 8
00132 #define CMD_PANNING8 9
00133 #define CMD_OFFSET 10
00134 #define CMD_VOLUMESLIDE 11
00135 #define CMD_POSITIONJUMP 12
00136 #define CMD_VOLUME 13
00137 #define CMD_PATTERNBREAK 14
00138 #define CMD_RETRIG 15
00139 #define CMD_SPEED 16
00140 #define CMD_TEMPO 17
00141 #define CMD_TREMOR 18
00142 #define CMD_MODCMDEX 19
00143 #define CMD_S3MCMDEX 20
00144 #define CMD_CHANNELVOLUME 21
00145 #define CMD_CHANNELVOLSLIDE 22
00146 #define CMD_GLOBALVOLUME 23
00147 #define CMD_GLOBALVOLSLIDE 24
00148 #define CMD_KEYOFF 25
00149 #define CMD_FINEVIBRATO 26
00150 #define CMD_PANBRELLO 27
00151 #define CMD_XFINEPORTAUPDOWN 28
00152 #define CMD_PANNINGSLIDE 29
00153 #define CMD_SETENVPOSITION 30
00154 #define CMD_MIDI 31
00155
00156
00157
00158 #define VOLCMD_VOLUME 1
00159 #define VOLCMD_PANNING 2
00160 #define VOLCMD_VOLSLIDEUP 3
00161 #define VOLCMD_VOLSLIDEDOWN 4
00162 #define VOLCMD_FINEVOLUP 5
00163 #define VOLCMD_FINEVOLDOWN 6
00164 #define VOLCMD_VIBRATOSPEED 7
00165 #define VOLCMD_VIBRATO 8
00166 #define VOLCMD_PANSLIDELEFT 9
00167 #define VOLCMD_PANSLIDERIGHT 10
00168 #define VOLCMD_TONEPORTAMENTO 11
00169 #define VOLCMD_PORTAUP 12
00170 #define VOLCMD_PORTADOWN 13
00171
00172 #define RSF_16BIT 0x04
00173 #define RSF_STEREO 0x08
00174
00175 #define RS_PCM8S 0 // 8-bit signed
00176 #define RS_PCM8U 1 // 8-bit unsigned
00177 #define RS_PCM8D 2 // 8-bit delta values
00178 #define RS_ADPCM4 3 // 4-bit ADPCM-packed
00179 #define RS_PCM16D 4 // 16-bit delta values
00180 #define RS_PCM16S 5 // 16-bit signed
00181 #define RS_PCM16U 6 // 16-bit unsigned
00182 #define RS_PCM16M 7 // 16-bit motorola order
00183 #define RS_STPCM8S (RS_PCM8S|RSF_STEREO) // stereo 8-bit signed
00184 #define RS_STPCM8U (RS_PCM8U|RSF_STEREO) // stereo 8-bit unsigned
00185 #define RS_STPCM8D (RS_PCM8D|RSF_STEREO) // stereo 8-bit delta values
00186 #define RS_STPCM16S (RS_PCM16S|RSF_STEREO) // stereo 16-bit signed
00187 #define RS_STPCM16U (RS_PCM16U|RSF_STEREO) // stereo 16-bit unsigned
00188 #define RS_STPCM16D (RS_PCM16D|RSF_STEREO) // stereo 16-bit delta values
00189 #define RS_STPCM16M (RS_PCM16M|RSF_STEREO) // stereo 16-bit signed big endian
00190
00191 #define RS_IT2148 0x10
00192 #define RS_IT21416 0x14
00193 #define RS_IT2158 0x12
00194 #define RS_IT21516 0x16
00195
00196 #define RS_AMS8 0x11
00197 #define RS_AMS16 0x15
00198
00199 #define RS_DMF8 0x13
00200 #define RS_DMF16 0x17
00201
00202 #define RS_MDL8 0x20
00203 #define RS_MDL16 0x24
00204 #define RS_PTM8DTO16 0x25
00205
00206 #define RS_STIPCM8S (RS_PCM8S|0x40|RSF_STEREO) // stereo 8-bit signed
00207 #define RS_STIPCM8U (RS_PCM8U|0x40|RSF_STEREO) // stereo 8-bit unsigned
00208 #define RS_STIPCM16S (RS_PCM16S|0x40|RSF_STEREO) // stereo 16-bit signed
00209 #define RS_STIPCM16U (RS_PCM16U|0x40|RSF_STEREO) // stereo 16-bit unsigned
00210 #define RS_STIPCM16M (RS_PCM16M|0x40|RSF_STEREO) // stereo 16-bit signed big endian
00211
00212 #define RS_PCM24S (RS_PCM16S|0x80) // mono 24-bit signed
00213 #define RS_STIPCM24S (RS_PCM16S|0x80|RSF_STEREO) // stereo 24-bit signed
00214 #define RS_PCM32S (RS_PCM16S|0xC0) // mono 24-bit signed
00215 #define RS_STIPCM32S (RS_PCM16S|0xC0|RSF_STEREO) // stereo 24-bit signed
00216
00217
00218 #define NNA_NOTECUT 0
00219 #define NNA_CONTINUE 1
00220 #define NNA_NOTEOFF 2
00221 #define NNA_NOTEFADE 3
00222
00223
00224 #define DCT_NONE 0
00225 #define DCT_NOTE 1
00226 #define DCT_SAMPLE 2
00227 #define DCT_INSTRUMENT 3
00228
00229
00230 #define DNA_NOTECUT 0
00231 #define DNA_NOTEOFF 1
00232 #define DNA_NOTEFADE 2
00233
00234
00235 #define SYSMIX_ENABLEMMX 0x01
00236 #define SYSMIX_WINDOWSNT 0x02
00237 #define SYSMIX_SLOWCPU 0x04
00238 #define SYSMIX_FASTCPU 0x08
00239
00240
00241 #define SONG_EMBEDMIDICFG 0x0001
00242 #define SONG_FASTVOLSLIDES 0x0002
00243 #define SONG_ITOLDEFFECTS 0x0004
00244 #define SONG_ITCOMPATMODE 0x0008
00245 #define SONG_LINEARSLIDES 0x0010
00246 #define SONG_PATTERNLOOP 0x0020
00247 #define SONG_STEP 0x0040
00248 #define SONG_PAUSED 0x0080
00249 #define SONG_FADINGSONG 0x0100
00250 #define SONG_ENDREACHED 0x0200
00251 #define SONG_GLOBALFADE 0x0400
00252 #define SONG_CPUVERYHIGH 0x0800
00253 #define SONG_FIRSTTICK 0x1000
00254 #define SONG_MPTFILTERMODE 0x2000
00255 #define SONG_SURROUNDPAN 0x4000
00256 #define SONG_EXFILTERRANGE 0x8000
00257 #define SONG_AMIGALIMITS 0x10000
00258
00259
00260 #define SNDMIX_REVERSESTEREO 0x0001
00261 #define SNDMIX_NOISEREDUCTION 0x0002
00262 #define SNDMIX_AGC 0x0004
00263 #define SNDMIX_NORESAMPLING 0x0008
00264 #define SNDMIX_HQRESAMPLER 0x0010
00265 #define SNDMIX_MEGABASS 0x0020
00266 #define SNDMIX_SURROUND 0x0040
00267 #define SNDMIX_REVERB 0x0080
00268 #define SNDMIX_EQ 0x0100
00269 #define SNDMIX_SOFTPANNING 0x0200
00270 #define SNDMIX_ULTRAHQSRCMODE 0x0400
00271
00272 #define SNDMIX_DIRECTTODISK 0x10000
00273 #define SNDMIX_ENABLEMMX 0x20000
00274 #define SNDMIX_NOBACKWARDJUMPS 0x40000
00275 #define SNDMIX_MAXDEFAULTPAN 0x80000 // Used by the MOD loader
00276
00277
00278
00279 enum {
00280 REVERBTYPE_SMALLROOM,
00281 REVERBTYPE_MEDIUMROOM,
00282 REVERBTYPE_LARGEROOM,
00283 REVERBTYPE_SMALLHALL,
00284 REVERBTYPE_MEDIUMHALL,
00285 REVERBTYPE_LARGEHALL,
00286 NUM_REVERBTYPES
00287 };
00288
00289
00290 enum {
00291 SRCMODE_NEAREST,
00292 SRCMODE_LINEAR,
00293 SRCMODE_SPLINE,
00294 SRCMODE_POLYPHASE,
00295 NUM_SRC_MODES
00296 };
00297
00298
00299
00300 typedef struct _MODINSTRUMENT
00301 {
00302 UINT nLength,nLoopStart,nLoopEnd;
00303 UINT nSustainStart, nSustainEnd;
00304 signed char *pSample;
00305 UINT nC4Speed;
00306 WORD nPan;
00307 WORD nVolume;
00308 WORD nGlobalVol;
00309 WORD uFlags;
00310 signed char RelativeTone;
00311 signed char nFineTune;
00312 BYTE nVibType;
00313 BYTE nVibSweep;
00314 BYTE nVibDepth;
00315 BYTE nVibRate;
00316 CHAR name[22];
00317 } MODINSTRUMENT;
00318
00319
00320
00321 typedef struct _INSTRUMENTHEADER
00322 {
00323 UINT nFadeOut;
00324 DWORD dwFlags;
00325 WORD nGlobalVol;
00326 WORD nPan;
00327 WORD VolPoints[MAX_ENVPOINTS];
00328 WORD PanPoints[MAX_ENVPOINTS];
00329 WORD PitchPoints[MAX_ENVPOINTS];
00330 BYTE VolEnv[MAX_ENVPOINTS];
00331 BYTE PanEnv[MAX_ENVPOINTS];
00332 BYTE PitchEnv[MAX_ENVPOINTS];
00333 BYTE Keyboard[128];
00334 BYTE NoteMap[128];
00335
00336 BYTE nVolEnv;
00337 BYTE nPanEnv;
00338 BYTE nPitchEnv;
00339 BYTE nVolLoopStart;
00340 BYTE nVolLoopEnd;
00341 BYTE nVolSustainBegin;
00342 BYTE nVolSustainEnd;
00343 BYTE nPanLoopStart;
00344 BYTE nPanLoopEnd;
00345 BYTE nPanSustainBegin;
00346 BYTE nPanSustainEnd;
00347 BYTE nPitchLoopStart;
00348 BYTE nPitchLoopEnd;
00349 BYTE nPitchSustainBegin;
00350 BYTE nPitchSustainEnd;
00351 BYTE nNNA;
00352 BYTE nDCT;
00353 BYTE nDNA;
00354 BYTE nPanSwing;
00355 BYTE nVolSwing;
00356 BYTE nIFC;
00357 BYTE nIFR;
00358 WORD wMidiBank;
00359 BYTE nMidiProgram;
00360 BYTE nMidiChannel;
00361 BYTE nMidiDrumKey;
00362 signed char nPPS;
00363 unsigned char nPPC;
00364 CHAR name[32];
00365 CHAR filename[12];
00366 } INSTRUMENTHEADER;
00367
00368
00369
00370 typedef struct _MODCHANNEL
00371 {
00372
00373 signed char * pCurrentSample;
00374 DWORD nPos;
00375 DWORD nPosLo;
00376 LONG nInc;
00377 LONG nRightVol;
00378 LONG nLeftVol;
00379 LONG nRightRamp;
00380 LONG nLeftRamp;
00381
00382 DWORD nLength;
00383 DWORD dwFlags;
00384 DWORD nLoopStart;
00385 DWORD nLoopEnd;
00386 LONG nRampRightVol;
00387 LONG nRampLeftVol;
00388 LONG nFilter_Y1, nFilter_Y2, nFilter_Y3, nFilter_Y4;
00389 LONG nFilter_A0, nFilter_B0, nFilter_B1;
00390 LONG nROfs, nLOfs;
00391 LONG nRampLength;
00392
00393 signed char * pSample;
00394 LONG nNewRightVol, nNewLeftVol;
00395 LONG nRealVolume, nRealPan;
00396 LONG nVolume, nPan, nFadeOutVol;
00397 LONG nPeriod, nC4Speed, nPortamentoDest;
00398 INSTRUMENTHEADER *pHeader;
00399 MODINSTRUMENT *pInstrument;
00400 DWORD nVolEnvPosition, nPanEnvPosition, nPitchEnvPosition;
00401 DWORD nMasterChn, nVUMeter;
00402 LONG nGlobalVol, nInsVol;
00403 LONG nFineTune, nTranspose;
00404 LONG nPortamentoSlide, nAutoVibDepth;
00405 UINT nAutoVibPos, nVibratoPos, nTremoloPos, nPanbrelloPos;
00406
00407 signed short nVolSwing, nPanSwing;
00408
00409 BYTE nNote, nNNA;
00410 BYTE nNewNote, nNewIns, nCommand, nArpeggio;
00411 BYTE nOldVolumeSlide, nOldFineVolUpDown;
00412 BYTE nOldPortaUpDown, nOldFinePortaUpDown;
00413 BYTE nOldPanSlide, nOldChnVolSlide;
00414 BYTE nVibratoType, nVibratoSpeed, nVibratoDepth;
00415 BYTE nTremoloType, nTremoloSpeed, nTremoloDepth;
00416 BYTE nPanbrelloType, nPanbrelloSpeed, nPanbrelloDepth;
00417 BYTE nOldCmdEx, nOldVolParam, nOldTempo;
00418 BYTE nOldOffset, nOldHiOffset;
00419 BYTE nCutOff, nResonance;
00420 BYTE nRetrigCount, nRetrigParam;
00421 BYTE nTremorCount, nTremorParam;
00422 BYTE nPatternLoop, nPatternLoopCount;
00423 BYTE nRowNote, nRowInstr;
00424 BYTE nRowVolCmd, nRowVolume;
00425 BYTE nRowCommand, nRowParam;
00426 BYTE nLeftVU, nRightVU;
00427 BYTE nActiveMacro, nPadding;
00428 } MODCHANNEL;
00429
00430
00431 typedef struct _MODCHANNELSETTINGS
00432 {
00433 UINT nPan;
00434 UINT nVolume;
00435 DWORD dwFlags;
00436 UINT nMixPlugin;
00437 char szName[MAX_CHANNELNAME];
00438 } MODCHANNELSETTINGS;
00439
00440
00441 typedef struct _MODCOMMAND
00442 {
00443 BYTE note;
00444 BYTE instr;
00445 BYTE volcmd;
00446 BYTE command;
00447 BYTE vol;
00448 BYTE param;
00449 } MODCOMMAND, *LPMODCOMMAND;
00450
00452
00453 #define MIXPLUG_MIXREADY 0x01 // Set when cleared
00454
00455 class IMixPlugin
00456 {
00457 public:
00458 virtual int AddRef() = 0;
00459 virtual int Release() = 0;
00460 virtual void SaveAllParameters() = 0;
00461 virtual void RestoreAllParameters() = 0;
00462 virtual void Process(float *pOutL, float *pOutR, unsigned long nSamples) = 0;
00463 virtual void Init(unsigned long nFreq, int bReset) = 0;
00464 virtual void MidiSend(DWORD dwMidiCode) = 0;
00465 virtual void MidiCommand(UINT nMidiCh, UINT nMidiProg, UINT note, UINT vol) = 0;
00466 };
00467
00468
00469 #define MIXPLUG_INPUTF_MASTEREFFECT 0x01 // Apply to master mix
00470 #define MIXPLUG_INPUTF_BYPASS 0x02 // Bypass effect
00471 #define MIXPLUG_INPUTF_WETMIX 0x04 // Wet Mix (dry added)
00472
00473 typedef struct _SNDMIXPLUGINSTATE
00474 {
00475 DWORD dwFlags;
00476 LONG nVolDecayL, nVolDecayR;
00477 int *pMixBuffer;
00478 float *pOutBufferL;
00479 float *pOutBufferR;
00480 } SNDMIXPLUGINSTATE, *PSNDMIXPLUGINSTATE;
00481
00482 typedef struct _SNDMIXPLUGININFO
00483 {
00484 DWORD dwPluginId1;
00485 DWORD dwPluginId2;
00486 DWORD dwInputRouting;
00487 DWORD dwOutputRouting;
00488 DWORD dwReserved[4];
00489 CHAR szName[32];
00490 CHAR szLibraryName[64];
00491 } SNDMIXPLUGININFO, *PSNDMIXPLUGININFO;
00492
00493 typedef struct _SNDMIXPLUGIN
00494 {
00495 IMixPlugin *pMixPlugin;
00496 PSNDMIXPLUGINSTATE pMixState;
00497 ULONG nPluginDataSize;
00498 PVOID pPluginData;
00499 SNDMIXPLUGININFO Info;
00500 } SNDMIXPLUGIN, *PSNDMIXPLUGIN;
00501
00502 typedef BOOL (__cdecl *PMIXPLUGINCREATEPROC)(PSNDMIXPLUGIN);
00503
00505
00506 enum {
00507 MIDIOUT_START=0,
00508 MIDIOUT_STOP,
00509 MIDIOUT_TICK,
00510 MIDIOUT_NOTEON,
00511 MIDIOUT_NOTEOFF,
00512 MIDIOUT_VOLUME,
00513 MIDIOUT_PAN,
00514 MIDIOUT_BANKSEL,
00515 MIDIOUT_PROGRAM,
00516 };
00517
00518
00519 typedef struct MODMIDICFG
00520 {
00521 char szMidiGlb[9*32];
00522 char szMidiSFXExt[16*32];
00523 char szMidiZXXExt[128*32];
00524 } MODMIDICFG, *LPMODMIDICFG;
00525
00526
00527 typedef VOID (__cdecl * LPSNDMIXHOOKPROC)(int *, unsigned long, unsigned long);
00528
00529
00530
00531
00532 class CSoundFile
00533
00534 {
00535 public:
00536 static UINT m_nXBassDepth, m_nXBassRange;
00537 static UINT m_nReverbDepth, m_nReverbDelay, gnReverbType;
00538 static UINT m_nProLogicDepth, m_nProLogicDelay;
00539 static UINT m_nStereoSeparation;
00540 static UINT m_nMaxMixChannels;
00541 static LONG m_nStreamVolume;
00542 static DWORD gdwSysInfo, gdwSoundSetup, gdwMixingFreq, gnBitsPerSample, gnChannels;
00543 static UINT gnAGC, gnVolumeRampSamples, gnVUMeter, gnCPUUsage;
00544 static LPSNDMIXHOOKPROC gpSndMixHook;
00545 static PMIXPLUGINCREATEPROC gpMixPluginCreateProc;
00546
00547 public:
00548 MODCHANNEL Chn[MAX_CHANNELS];
00549 UINT ChnMix[MAX_CHANNELS];
00550 MODINSTRUMENT Ins[MAX_SAMPLES];
00551 INSTRUMENTHEADER *Headers[MAX_INSTRUMENTS];
00552 MODCHANNELSETTINGS ChnSettings[MAX_BASECHANNELS];
00553 MODCOMMAND *Patterns[MAX_PATTERNS];
00554 WORD PatternSize[MAX_PATTERNS];
00555 BYTE Order[MAX_ORDERS];
00556 MODMIDICFG m_MidiCfg;
00557 SNDMIXPLUGIN m_MixPlugins[MAX_MIXPLUGINS];
00558 UINT m_nDefaultSpeed, m_nDefaultTempo, m_nDefaultGlobalVolume;
00559 DWORD m_dwSongFlags;
00560 UINT m_nChannels, m_nMixChannels, m_nMixStat, m_nBufferCount;
00561 UINT m_nType, m_nSamples, m_nInstruments;
00562 UINT m_nTickCount, m_nTotalCount, m_nPatternDelay, m_nFrameDelay;
00563 UINT m_nMusicSpeed, m_nMusicTempo;
00564 UINT m_nNextRow, m_nRow;
00565 UINT m_nPattern,m_nCurrentPattern,m_nNextPattern,m_nRestartPos;
00566 UINT m_nMasterVolume, m_nGlobalVolume, m_nSongPreAmp;
00567 UINT m_nFreqFactor, m_nTempoFactor, m_nOldGlbVolSlide;
00568 LONG m_nMinPeriod, m_nMaxPeriod, m_nRepeatCount, m_nInitialRepeatCount;
00569 DWORD m_nGlobalFadeSamples, m_nGlobalFadeMaxSamples;
00570 UINT m_nMaxOrderPosition;
00571 UINT m_nPatternNames;
00572 LPSTR m_lpszSongComments, m_lpszPatternNames;
00573 char m_szNames[MAX_INSTRUMENTS][32];
00574 CHAR CompressionTable[16];
00575
00576 public:
00577 CSoundFile();
00578 ~CSoundFile();
00579
00580 public:
00581 BOOL Create(LPCBYTE lpStream, DWORD dwMemLength=0);
00582 BOOL Destroy();
00583 UINT GetType() const { return m_nType; }
00584 UINT GetNumChannels() const;
00585 UINT GetLogicalChannels() const { return m_nChannels; }
00586 BOOL SetMasterVolume(UINT vol, BOOL bAdjustAGC=FALSE);
00587 UINT GetMasterVolume() const { return m_nMasterVolume; }
00588 UINT GetNumPatterns() const;
00589 UINT GetNumInstruments() const;
00590 UINT GetNumSamples() const { return m_nSamples; }
00591 UINT GetCurrentPos() const;
00592 UINT GetCurrentPattern() const { return m_nPattern; }
00593 UINT GetCurrentOrder() const { return m_nCurrentPattern; }
00594 UINT GetSongComments(LPSTR s, UINT cbsize, UINT linesize=32);
00595 UINT GetRawSongComments(LPSTR s, UINT cbsize, UINT linesize=32);
00596 UINT GetMaxPosition() const;
00597 void SetCurrentPos(UINT nPos);
00598 void SetCurrentOrder(UINT nOrder);
00599 void GetTitle(LPSTR s) const { lstrcpyn(s,m_szNames[0],32); }
00600 LPCSTR GetTitle() const { return m_szNames[0]; }
00601 UINT GetSampleName(UINT nSample,LPSTR s=NULL) const;
00602 UINT GetInstrumentName(UINT nInstr,LPSTR s=NULL) const;
00603 UINT GetMusicSpeed() const { return m_nMusicSpeed; }
00604 UINT GetMusicTempo() const { return m_nMusicTempo; }
00605 DWORD GetLength(BOOL bAdjust, BOOL bTotal=FALSE);
00606 DWORD GetSongTime() { return GetLength(FALSE, TRUE); }
00607 void SetRepeatCount(int n) { m_nRepeatCount = n; m_nInitialRepeatCount = n; }
00608 int GetRepeatCount() const { return m_nRepeatCount; }
00609 BOOL IsPaused() const { return (m_dwSongFlags & SONG_PAUSED) ? TRUE : FALSE; }
00610 void LoopPattern(int nPat, int nRow=0);
00611 void CheckCPUUsage(UINT nCPU);
00612 BOOL SetPatternName(UINT nPat, LPCSTR lpszName);
00613 BOOL GetPatternName(UINT nPat, LPSTR lpszName, UINT cbSize=MAX_PATTERNNAME) const;
00614
00615 BOOL ReadXM(LPCBYTE lpStream, DWORD dwMemLength);
00616 BOOL ReadS3M(LPCBYTE lpStream, DWORD dwMemLength);
00617 BOOL ReadMod(LPCBYTE lpStream, DWORD dwMemLength);
00618 BOOL ReadMed(LPCBYTE lpStream, DWORD dwMemLength);
00619 BOOL ReadMTM(LPCBYTE lpStream, DWORD dwMemLength);
00620 BOOL ReadSTM(LPCBYTE lpStream, DWORD dwMemLength);
00621 BOOL ReadIT(LPCBYTE lpStream, DWORD dwMemLength);
00622 BOOL Read669(LPCBYTE lpStream, DWORD dwMemLength);
00623 BOOL ReadUlt(LPCBYTE lpStream, DWORD dwMemLength);
00624
00625 BOOL ReadDSM(LPCBYTE lpStream, DWORD dwMemLength);
00626 BOOL ReadFAR(LPCBYTE lpStream, DWORD dwMemLength);
00627 BOOL ReadAMS(LPCBYTE lpStream, DWORD dwMemLength);
00628 BOOL ReadAMS2(LPCBYTE lpStream, DWORD dwMemLength);
00629 BOOL ReadMDL(LPCBYTE lpStream, DWORD dwMemLength);
00630 BOOL ReadOKT(LPCBYTE lpStream, DWORD dwMemLength);
00631 BOOL ReadDMF(LPCBYTE lpStream, DWORD dwMemLength);
00632 BOOL ReadPTM(LPCBYTE lpStream, DWORD dwMemLength);
00633 BOOL ReadDBM(LPCBYTE lpStream, DWORD dwMemLength);
00634 BOOL ReadAMF(LPCBYTE lpStream, DWORD dwMemLength);
00635 BOOL ReadMT2(LPCBYTE lpStream, DWORD dwMemLength);
00636 BOOL ReadPSM(LPCBYTE lpStream, DWORD dwMemLength);
00637 BOOL ReadJ2B(LPCBYTE lpStream, DWORD dwMemLength);
00638 BOOL ReadUMX(LPCBYTE lpStream, DWORD dwMemLength);
00639
00640 #ifndef MODPLUG_NO_FILESAVE
00641 UINT WriteSample(FILE *f, MODINSTRUMENT *pins, UINT nFlags, UINT nMaxLen=0);
00642 BOOL SaveXM(LPCSTR lpszFileName, UINT nPacking=0);
00643 BOOL SaveS3M(LPCSTR lpszFileName, UINT nPacking=0);
00644 BOOL SaveMod(LPCSTR lpszFileName, UINT nPacking=0);
00645 BOOL SaveIT(LPCSTR lpszFileName, UINT nPacking=0);
00646 #endif // MODPLUG_NO_FILESAVE
00647
00648 UINT GetBestSaveFormat() const;
00649 UINT GetSaveFormats() const;
00650 void ConvertModCommand(MODCOMMAND *) const;
00651 void S3MConvert(MODCOMMAND *m, BOOL bIT) const;
00652 void S3MSaveConvert(UINT *pcmd, UINT *pprm, BOOL bIT) const;
00653 WORD ModSaveCommand(const MODCOMMAND *m, BOOL bXM) const;
00654
00655 public:
00656
00657 VOID ResetChannels();
00658
00659 UINT Read(LPVOID lpBuffer, UINT cbBuffer);
00660 UINT CreateStereoMix(int count);
00661 BOOL FadeSong(UINT msec);
00662 BOOL GlobalFadeSong(UINT msec);
00663 UINT GetTotalTickCount() const { return m_nTotalCount; }
00664 VOID ResetTotalTickCount() { m_nTotalCount = 0; }
00665
00666 public:
00667
00668 static BOOL InitPlayer(BOOL bReset=FALSE);
00669 static BOOL SetWaveConfig(UINT nRate,UINT nBits,UINT nChannels,BOOL bMMX=FALSE);
00670 static BOOL SetResamplingMode(UINT nMode);
00671 static BOOL IsStereo() { return (gnChannels > 1) ? TRUE : FALSE; }
00672 static DWORD GetSampleRate() { return gdwMixingFreq; }
00673 static DWORD GetBitsPerSample() { return gnBitsPerSample; }
00674 static DWORD InitSysInfo();
00675 static DWORD GetSysInfo() { return gdwSysInfo; }
00676
00677 static BOOL GetAGC() { return (gdwSoundSetup & SNDMIX_AGC) ? TRUE : FALSE; }
00678 static void SetAGC(BOOL b);
00679 static void ResetAGC();
00680 static void ProcessAGC(int count);
00681
00682
00683 static BOOL SetWaveConfigEx(BOOL bSurround,BOOL bNoOverSampling,BOOL bReverb,BOOL hqido,BOOL bMegaBass,BOOL bNR,BOOL bEQ);
00684
00685 static void InitializeDSP(BOOL bReset);
00686 static void ProcessStereoDSP(int count);
00687 static void ProcessMonoDSP(int count);
00688
00689 static BOOL SetReverbParameters(UINT nDepth, UINT nDelay);
00690
00691 static BOOL SetXBassParameters(UINT nDepth, UINT nRange);
00692
00693 static BOOL SetSurroundParameters(UINT nDepth, UINT nDelay);
00694 public:
00695 BOOL ReadNote();
00696 BOOL ProcessRow();
00697 BOOL ProcessEffects();
00698 UINT GetNNAChannel(UINT nChn) const;
00699 void CheckNNA(UINT nChn, UINT instr, int note, BOOL bForceCut);
00700 void NoteChange(UINT nChn, int note, BOOL bPorta=FALSE, BOOL bResetEnv=TRUE);
00701 void InstrumentChange(MODCHANNEL *pChn, UINT instr, BOOL bPorta=FALSE,BOOL bUpdVol=TRUE,BOOL bResetEnv=TRUE);
00702
00703 void PortamentoUp(MODCHANNEL *pChn, UINT param);
00704 void PortamentoDown(MODCHANNEL *pChn, UINT param);
00705 void FinePortamentoUp(MODCHANNEL *pChn, UINT param);
00706 void FinePortamentoDown(MODCHANNEL *pChn, UINT param);
00707 void ExtraFinePortamentoUp(MODCHANNEL *pChn, UINT param);
00708 void ExtraFinePortamentoDown(MODCHANNEL *pChn, UINT param);
00709 void TonePortamento(MODCHANNEL *pChn, UINT param);
00710 void Vibrato(MODCHANNEL *pChn, UINT param);
00711 void FineVibrato(MODCHANNEL *pChn, UINT param);
00712 void VolumeSlide(MODCHANNEL *pChn, UINT param);
00713 void PanningSlide(MODCHANNEL *pChn, UINT param);
00714 void ChannelVolSlide(MODCHANNEL *pChn, UINT param);
00715 void FineVolumeUp(MODCHANNEL *pChn, UINT param);
00716 void FineVolumeDown(MODCHANNEL *pChn, UINT param);
00717 void Tremolo(MODCHANNEL *pChn, UINT param);
00718 void Panbrello(MODCHANNEL *pChn, UINT param);
00719 void RetrigNote(UINT nChn, UINT param);
00720 void NoteCut(UINT nChn, UINT nTick);
00721 void KeyOff(UINT nChn);
00722 int PatternLoop(MODCHANNEL *, UINT param);
00723 void ExtendedMODCommands(UINT nChn, UINT param);
00724 void ExtendedS3MCommands(UINT nChn, UINT param);
00725 void ExtendedChannelEffect(MODCHANNEL *, UINT param);
00726 void ProcessMidiMacro(UINT nChn, LPCSTR pszMidiMacro, UINT param=0);
00727 void SetupChannelFilter(MODCHANNEL *pChn, BOOL bReset, int flt_modifier=256) const;
00728
00729 void DoFreqSlide(MODCHANNEL *pChn, LONG nFreqSlide);
00730
00731 void SetTempo(UINT param);
00732 void SetSpeed(UINT param);
00733 void GlobalVolSlide(UINT param);
00734 DWORD IsSongFinished(UINT nOrder, UINT nRow) const;
00735 BOOL IsValidBackwardJump(UINT nStartOrder, UINT nStartRow, UINT nJumpOrder, UINT nJumpRow) const;
00736
00737 signed char GetDeltaValue(signed char prev, UINT n) const { return (signed char)(prev + CompressionTable[n & 0x0F]); }
00738 UINT PackSample(int &sample, int next);
00739 BOOL CanPackSample(LPSTR pSample, UINT nLen, UINT nPacking, BYTE *result=NULL);
00740 UINT ReadSample(MODINSTRUMENT *pIns, UINT nFlags, LPCSTR pMemFile, DWORD dwMemLength);
00741 BOOL DestroySample(UINT nSample);
00742 BOOL DestroyInstrument(UINT nInstr);
00743 BOOL IsSampleUsed(UINT nSample);
00744 BOOL IsInstrumentUsed(UINT nInstr);
00745 BOOL RemoveInstrumentSamples(UINT nInstr);
00746 UINT DetectUnusedSamples(BOOL *);
00747 BOOL RemoveSelectedSamples(BOOL *);
00748 void AdjustSampleLoop(MODINSTRUMENT *pIns);
00749
00750 BOOL ReadInstrumentFromSong(UINT nInstr, CSoundFile *, UINT nSrcInstrument);
00751 BOOL ReadSampleFromSong(UINT nSample, CSoundFile *, UINT nSrcSample);
00752
00753 UINT GetNoteFromPeriod(UINT period) const;
00754 UINT GetPeriodFromNote(UINT note, int nFineTune, UINT nC4Speed) const;
00755 UINT GetFreqFromPeriod(UINT period, UINT nC4Speed, int nPeriodFrac=0) const;
00756
00757 MODINSTRUMENT *GetSample(UINT n) { return Ins+n; }
00758 void ResetMidiCfg();
00759 UINT MapMidiInstrument(DWORD dwProgram, UINT nChannel, UINT nNote);
00760 BOOL ITInstrToMPT(const void *p, INSTRUMENTHEADER *penv, UINT trkvers);
00761 UINT SaveMixPlugins(FILE *f=NULL, BOOL bUpdate=TRUE);
00762 UINT LoadMixPlugins(const void *pData, UINT nLen);
00763 #ifndef NO_FILTER
00764 DWORD CutOffToFrequency(UINT nCutOff, int flt_modifier=256) const;
00765 #endif
00766
00767
00768 public:
00769 static DWORD TransposeToFrequency(int transp, int ftune=0);
00770 static int FrequencyToTranspose(DWORD freq);
00771 static void FrequencyToTranspose(MODINSTRUMENT *psmp);
00772
00773
00774 public:
00775 static MODCOMMAND *AllocatePattern(UINT rows, UINT nchns);
00776 static signed char* AllocateSample(UINT nbytes);
00777 static void FreePattern(LPVOID pat);
00778 static void FreeSample(LPVOID p);
00779 static UINT Normalize24BitBuffer(LPBYTE pbuffer, UINT cbsizebytes, DWORD lmax24, DWORD dwByteInc);
00780 };
00781
00782
00783
00784
00785
00786
00788
00789
00790 #pragma pack(1)
00791
00792
00793 #define IFFID_FORM 0x4d524f46
00794 #define IFFID_RIFF 0x46464952
00795 #define IFFID_WAVE 0x45564157
00796 #define IFFID_LIST 0x5453494C
00797 #define IFFID_INFO 0x4F464E49
00798
00799
00800 #define IFFID_ICOP 0x504F4349
00801 #define IFFID_IART 0x54524149
00802 #define IFFID_IPRD 0x44525049
00803 #define IFFID_INAM 0x4D414E49
00804 #define IFFID_ICMT 0x544D4349
00805 #define IFFID_IENG 0x474E4549
00806 #define IFFID_ISFT 0x54465349
00807 #define IFFID_ISBJ 0x4A425349
00808 #define IFFID_IGNR 0x524E4749
00809 #define IFFID_ICRD 0x44524349
00810
00811
00812 #define IFFID_wave 0x65766177
00813 #define IFFID_fmt 0x20746D66
00814 #define IFFID_wsmp 0x706D7377
00815 #define IFFID_pcm 0x206d6370
00816 #define IFFID_data 0x61746164
00817 #define IFFID_smpl 0x6C706D73
00818 #define IFFID_xtra 0x61727478
00819
00820 typedef struct WAVEFILEHEADER
00821 {
00822 DWORD id_RIFF;
00823 DWORD filesize;
00824 DWORD id_WAVE;
00825 } WAVEFILEHEADER;
00826
00827
00828 typedef struct WAVEFORMATHEADER
00829 {
00830 DWORD id_fmt;
00831 DWORD hdrlen;
00832 WORD format;
00833 WORD channels;
00834 DWORD freqHz;
00835 DWORD bytessec;
00836 WORD samplesize;
00837 WORD bitspersample;
00838 } WAVEFORMATHEADER;
00839
00840
00841 typedef struct WAVEDATAHEADER
00842 {
00843 DWORD id_data;
00844 DWORD length;
00845 } WAVEDATAHEADER;
00846
00847
00848 typedef struct WAVESMPLHEADER
00849 {
00850
00851 DWORD smpl_id;
00852 DWORD smpl_len;
00853 DWORD dwManufacturer;
00854 DWORD dwProduct;
00855 DWORD dwSamplePeriod;
00856 DWORD dwBaseNote;
00857 DWORD dwPitchFraction;
00858 DWORD dwSMPTEFormat;
00859 DWORD dwSMPTEOffset;
00860 DWORD dwSampleLoops;
00861 DWORD cbSamplerData;
00862 } WAVESMPLHEADER;
00863
00864
00865 typedef struct SAMPLELOOPSTRUCT
00866 {
00867 DWORD dwIdentifier;
00868 DWORD dwLoopType;
00869 DWORD dwLoopStart;
00870 DWORD dwLoopEnd;
00871 DWORD dwFraction;
00872 DWORD dwPlayCount;
00873 } SAMPLELOOPSTRUCT;
00874
00875
00876 typedef struct WAVESAMPLERINFO
00877 {
00878 WAVESMPLHEADER wsiHdr;
00879 SAMPLELOOPSTRUCT wsiLoops[2];
00880 } WAVESAMPLERINFO;
00881
00882
00883 typedef struct WAVELISTHEADER
00884 {
00885 DWORD list_id;
00886 DWORD list_len;
00887 DWORD info;
00888 } WAVELISTHEADER;
00889
00890
00891 typedef struct WAVEEXTRAHEADER
00892 {
00893 DWORD xtra_id;
00894 DWORD xtra_len;
00895 DWORD dwFlags;
00896 WORD wPan;
00897 WORD wVolume;
00898 WORD wGlobalVol;
00899 WORD wReserved;
00900 BYTE nVibType;
00901 BYTE nVibSweep;
00902 BYTE nVibDepth;
00903 BYTE nVibRate;
00904 } WAVEEXTRAHEADER;
00905
00906 #pragma pack()
00907
00909
00910
00911 #define MIXBUFFERSIZE 512
00912 #define MIXING_ATTENUATION 4
00913 #define MIXING_CLIPMIN (-0x08000000)
00914 #define MIXING_CLIPMAX (0x07FFFFFF)
00915 #define VOLUMERAMPPRECISION 12
00916 #define FADESONGDELAY 100
00917 #define EQ_BUFFERSIZE (MIXBUFFERSIZE)
00918 #define AGC_PRECISION 9
00919 #define AGC_UNITY (1 << AGC_PRECISION)
00920
00921
00922 #ifdef WIN32
00923 #define MPPASMCALL __cdecl
00924 #define MPPFASTCALL __fastcall
00925 #else
00926 #define MPPASMCALL
00927 #define MPPFASTCALL
00928 #endif
00929
00930 #define MOD2XMFineTune(k) ((int)( (signed char)((k)<<4) ))
00931 #define XM2MODFineTune(k) ((int)( (k>>4)&0x0f ))
00932
00933 int _muldiv(long a, long b, long c);
00934 int _muldivr(long a, long b, long c);
00935
00936
00937
00938
00939
00940 #ifdef __GNUC__
00941 # define bswap_16(x) \
00942 (__extension__ \
00943 ({ unsigned short int __bsx = (x); \
00944 ((((__bsx) >> 8) & 0xff) | (((__bsx) & 0xff) << 8)); }))
00945 #else
00946 static __inline unsigned short int
00947 bswap_16 (unsigned short int __bsx)
00948 {
00949 return ((((__bsx) >> 8) & 0xff) | (((__bsx) & 0xff) << 8));
00950 }
00951 #endif
00952
00953
00954 #ifdef __GNUC__
00955 # define bswap_32(x) \
00956 (__extension__ \
00957 ({ unsigned int __bsx = (x); \
00958 ((((__bsx) & 0xff000000) >> 24) | (((__bsx) & 0x00ff0000) >> 8) | \
00959 (((__bsx) & 0x0000ff00) << 8) | (((__bsx) & 0x000000ff) << 24)); }))
00960 #else
00961 static __inline unsigned int
00962 bswap_32 (unsigned int __bsx)
00963 {
00964 return ((((__bsx) & 0xff000000) >> 24) | (((__bsx) & 0x00ff0000) >> 8) |
00965 (((__bsx) & 0x0000ff00) << 8) | (((__bsx) & 0x000000ff) << 24));
00966 }
00967 #endif
00968
00969
00970
00971 #ifdef WORDS_BIGENDIAN
00972 #define bswapLE16(X) bswap_16(X)
00973 #define bswapLE32(X) bswap_32(X)
00974 #define bswapBE16(X) (X)
00975 #define bswapBE32(X) (X)
00976 #else
00977 #define bswapLE16(X) (X)
00978 #define bswapLE32(X) (X)
00979 #define bswapBE16(X) bswap_16(X)
00980 #define bswapBE32(X) bswap_32(X)
00981 #endif
00982
00983
00984 #endif