Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

sndfile.h

Go to the documentation of this file.
00001 /*
00002  * This program is  free software; you can redistribute it  and modify it
00003  * under the terms of the GNU  General Public License as published by the
00004  * Free Software Foundation; either version 2  of the license or (at your
00005  * option) any later version.
00006  *
00007  * Authors: Olivier Lapicque <olivierl@jps.net>,
00008  *          Adam Goode       <adam@evdebs.org> (endian and char fixes for PPC)
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 // Channel flags:
00076 // Bits 0-7:    Sample Flags
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 // Bits 8-31:   Channel Flags
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 // Volume Column commands
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 // IT 2.14 compressed samples
00191 #define RS_IT2148               0x10
00192 #define RS_IT21416              0x14
00193 #define RS_IT2158               0x12
00194 #define RS_IT21516              0x16
00195 // AMS Packed Samples
00196 #define RS_AMS8                 0x11
00197 #define RS_AMS16                0x15
00198 // DMF Huffman compression
00199 #define RS_DMF8                 0x13
00200 #define RS_DMF16                0x17
00201 // MDL Huffman compression
00202 #define RS_MDL8                 0x20
00203 #define RS_MDL16                0x24
00204 #define RS_PTM8DTO16    0x25
00205 // Stereo Interleaved Samples
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 // 24-bit signed
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 // NNA types
00218 #define NNA_NOTECUT             0
00219 #define NNA_CONTINUE    1
00220 #define NNA_NOTEOFF             2
00221 #define NNA_NOTEFADE    3
00222 
00223 // DCT types
00224 #define DCT_NONE                0
00225 #define DCT_NOTE                1
00226 #define DCT_SAMPLE              2
00227 #define DCT_INSTRUMENT  3
00228 
00229 // DNA types
00230 #define DNA_NOTECUT             0
00231 #define DNA_NOTEOFF             1
00232 #define DNA_NOTEFADE    2
00233 
00234 // Mixer Hardware-Dependent features
00235 #define SYSMIX_ENABLEMMX        0x01
00236 #define SYSMIX_WINDOWSNT        0x02
00237 #define SYSMIX_SLOWCPU          0x04
00238 #define SYSMIX_FASTCPU          0x08
00239 
00240 // Module flags
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 // Global Options (Renderer)
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 // Misc Flags (can safely be turned on or off)
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 // Reverb Types (GM2 Presets)
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 // Sample Struct
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 // Instrument Struct
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 // Channel Struct
00370 typedef struct _MODCHANNEL
00371 {
00372         // First 32-bytes: Most used mixing information: don't change it
00373         signed char * pCurrentSample;           
00374         DWORD nPos;
00375         DWORD nPosLo;   // actually 16-bit
00376         LONG nInc;              // 16.16
00377         LONG nRightVol;
00378         LONG nLeftVol;
00379         LONG nRightRamp;
00380         LONG nLeftRamp;
00381         // 2nd cache line
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         // Information not used in the mixer
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         // 16-bit members
00407         signed short nVolSwing, nPanSwing;
00408         // 8-bit members
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];        // changed from CHAR
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 // Mix Plugins
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;                                  // MIXPLUG_XXXX
00476         LONG nVolDecayL, nVolDecayR;    // Buffer click removal
00477         int *pMixBuffer;                                // Stereo effect send buffer
00478         float *pOutBufferL;                             // Temp storage for int -> float conversion
00479         float *pOutBufferR;
00480 } SNDMIXPLUGINSTATE, *PSNDMIXPLUGINSTATE;
00481 
00482 typedef struct _SNDMIXPLUGININFO
00483 {
00484         DWORD dwPluginId1;
00485         DWORD dwPluginId2;
00486         DWORD dwInputRouting;   // MIXPLUG_INPUTF_XXXX
00487         DWORD dwOutputRouting;  // 0=mix 0x80+=fx
00488         DWORD dwReserved[4];    // Reserved for routing info
00489         CHAR szName[32];
00490         CHAR szLibraryName[64]; // original DLL name
00491 } SNDMIXPLUGININFO, *PSNDMIXPLUGININFO; // Size should be 128
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];      // changed from CHAR
00522         char szMidiSFXExt[16*32];  // changed from CHAR
00523         char szMidiZXXExt[128*32]; // changed from CHAR
00524 } MODMIDICFG, *LPMODMIDICFG;
00525 
00526 
00527 typedef VOID (__cdecl * LPSNDMIXHOOKPROC)(int *, unsigned long, unsigned long); // buffer, samples, channels
00528 
00529 
00530 
00531 //==============
00532 class CSoundFile
00533 //==============
00534 {
00535 public: // Static Members
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: // for Editing
00548         MODCHANNEL Chn[MAX_CHANNELS];                                   // Channels
00549         UINT ChnMix[MAX_CHANNELS];                                              // Channels to be mixed
00550         MODINSTRUMENT Ins[MAX_SAMPLES];                                 // Instruments
00551         INSTRUMENTHEADER *Headers[MAX_INSTRUMENTS];             // Instrument Headers
00552         MODCHANNELSETTINGS ChnSettings[MAX_BASECHANNELS]; // Channels settings
00553         MODCOMMAND *Patterns[MAX_PATTERNS];                             // Patterns
00554         WORD PatternSize[MAX_PATTERNS];                                 // Patterns Lengths
00555         BYTE Order[MAX_ORDERS];                                                 // Pattern Orders
00556         MODMIDICFG m_MidiCfg;                                                   // Midi macro config table
00557         SNDMIXPLUGIN m_MixPlugins[MAX_MIXPLUGINS];              // Mix plugins
00558         UINT m_nDefaultSpeed, m_nDefaultTempo, m_nDefaultGlobalVolume;
00559         DWORD m_dwSongFlags;                                                    // Song flags SONG_XXXX
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];    // changed from CHAR
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         // Module Loaders
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 //      BOOL ReadWav(LPCBYTE lpStream, DWORD dwMemLength);
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         // Save Functions
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         // MOD Convert function
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         // Real-time sound functions
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         // Mixer Config
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); // SRCMODE_XXXX
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         // AGC
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         //GCCFIX -- added these functions back in!
00683         static BOOL SetWaveConfigEx(BOOL bSurround,BOOL bNoOverSampling,BOOL bReverb,BOOL hqido,BOOL bMegaBass,BOOL bNR,BOOL bEQ);
00684         // DSP Effects
00685         static void InitializeDSP(BOOL bReset);
00686         static void ProcessStereoDSP(int count);
00687         static void ProcessMonoDSP(int count);
00688         // [Reverb level 0(quiet)-100(loud)], [delay in ms, usually 40-200ms]
00689         static BOOL SetReverbParameters(UINT nDepth, UINT nDelay);
00690         // [XBass level 0(quiet)-100(loud)], [cutoff in Hz 10-100]
00691         static BOOL SetXBassParameters(UINT nDepth, UINT nRange);
00692         // [Surround level 0(quiet)-100(heavy)] [delay in ms, usually 5-40ms]
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         // Channel Effects
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         // Low-Level effect processing
00729         void DoFreqSlide(MODCHANNEL *pChn, LONG nFreqSlide);
00730         // Global Effects
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         // Read/Write sample functions
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         // I/O from another sound file
00750         BOOL ReadInstrumentFromSong(UINT nInstr, CSoundFile *, UINT nSrcInstrument);
00751         BOOL ReadSampleFromSong(UINT nSample, CSoundFile *, UINT nSrcSample);
00752         // Period/Note functions
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         // Misc functions
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; // [0-255] => [1-10KHz]
00765 #endif
00766 
00767         // Static helper functions
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         // System-Dependant functions
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 // inline DWORD BigEndian(DWORD x) { return ((x & 0xFF) << 24) | ((x & 0xFF00) << 8) | ((x & 0xFF0000) >> 8) | ((x & 0xFF000000) >> 24); }
00784 // inline WORD BigEndianW(WORD x) { return (WORD)(((x >> 8) & 0xFF) | ((x << 8) & 0xFF00)); }
00785 
00786 
00788 // WAVE format information
00789 
00790 #pragma pack(1)
00791 
00792 // Standard IFF chunks IDs
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 // IFF Info fields
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 // Wave IFF chunks IDs
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;          // "RIFF"
00823         DWORD filesize;         // file length-8
00824         DWORD id_WAVE;
00825 } WAVEFILEHEADER;
00826 
00827 
00828 typedef struct WAVEFORMATHEADER
00829 {
00830         DWORD id_fmt;           // "fmt "
00831         DWORD hdrlen;           // 16
00832         WORD format;            // 1
00833         WORD channels;          // 1:mono, 2:stereo
00834         DWORD freqHz;           // sampling freq
00835         DWORD bytessec;         // bytes/sec=freqHz*samplesize
00836         WORD samplesize;        // sizeof(sample)
00837         WORD bitspersample;     // bits per sample (8/16)
00838 } WAVEFORMATHEADER;
00839 
00840 
00841 typedef struct WAVEDATAHEADER
00842 {
00843         DWORD id_data;          // "data"
00844         DWORD length;           // length of data
00845 } WAVEDATAHEADER;
00846 
00847 
00848 typedef struct WAVESMPLHEADER
00849 {
00850         // SMPL
00851         DWORD smpl_id;          // "smpl"       -> 0x6C706D73
00852         DWORD smpl_len;         // length of smpl: 3Ch  (54h with sustain loop)
00853         DWORD dwManufacturer;
00854         DWORD dwProduct;
00855         DWORD dwSamplePeriod;   // 1000000000/freqHz
00856         DWORD dwBaseNote;       // 3Ch = C-4 -> 60 + RelativeTone
00857         DWORD dwPitchFraction;
00858         DWORD dwSMPTEFormat;
00859         DWORD dwSMPTEOffset;
00860         DWORD dwSampleLoops;    // number of loops
00861         DWORD cbSamplerData;
00862 } WAVESMPLHEADER;
00863 
00864 
00865 typedef struct SAMPLELOOPSTRUCT
00866 {
00867         DWORD dwIdentifier;
00868         DWORD dwLoopType;               // 0=normal, 1=bidi
00869         DWORD dwLoopStart;
00870         DWORD dwLoopEnd;                // Byte offset ?
00871         DWORD dwFraction;
00872         DWORD dwPlayCount;              // Loop Count, 0=infinite
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;  // "LIST" -> 0x5453494C
00886         DWORD list_len;
00887         DWORD info;             // "INFO"
00888 } WAVELISTHEADER;
00889 
00890 
00891 typedef struct WAVEEXTRAHEADER
00892 {
00893         DWORD xtra_id;  // "xtra"       -> 0x61727478
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 // Low-level Mixing functions
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 // Calling conventions
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 // Byte swapping functions from the GNU C Library and libsdl
00938 
00939 /* Swap bytes in 16 bit value.  */
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 /* Swap bytes in 32 bit value.  */
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 // From libsdl
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

Generated on Sat Nov 5 16:15:42 2005 for OPIE by  doxygen 1.4.2