From: <man...@us...> - 2013-04-16 22:00:45
|
Revision: 1895 http://sourceforge.net/p/modplug/code/1895 Author: manxorist Date: 2013-04-16 22:00:18 +0000 (Tue, 16 Apr 2013) Log Message: ----------- [Ref] Add compile-time assertions for the size of all on-disk structures. [Ref] Tag all on-disk structures with PACKED attribute, and use #pragma pack only when NEEDS_PRAGMA_PACK is defined for the current compiler in typedefs.h . Modified Paths: -------------- trunk/OpenMPT/common/typedefs.h trunk/OpenMPT/mptrack/TrackerSettings.h trunk/OpenMPT/mptrack/mod2midi.cpp trunk/OpenMPT/mptrack/tagging.h trunk/OpenMPT/sounddsp/EQ.cpp trunk/OpenMPT/sounddsp/EQ.h trunk/OpenMPT/soundlib/Dlsbank.cpp trunk/OpenMPT/soundlib/Dlsbank.h trunk/OpenMPT/soundlib/ITTools.h trunk/OpenMPT/soundlib/LOAD_AMF.CPP trunk/OpenMPT/soundlib/LOAD_DBM.CPP trunk/OpenMPT/soundlib/LOAD_DMF.CPP trunk/OpenMPT/soundlib/LOAD_DSM.CPP trunk/OpenMPT/soundlib/Load_669.cpp trunk/OpenMPT/soundlib/Load_ams.cpp trunk/OpenMPT/soundlib/Load_far.cpp trunk/OpenMPT/soundlib/Load_gdm.cpp trunk/OpenMPT/soundlib/Load_imf.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_itp.cpp trunk/OpenMPT/soundlib/Load_mdl.cpp trunk/OpenMPT/soundlib/Load_med.cpp trunk/OpenMPT/soundlib/Load_mid.cpp trunk/OpenMPT/soundlib/Load_mod.cpp trunk/OpenMPT/soundlib/Load_mt2.cpp trunk/OpenMPT/soundlib/Load_mtm.cpp trunk/OpenMPT/soundlib/Load_okt.cpp trunk/OpenMPT/soundlib/Load_psm.cpp trunk/OpenMPT/soundlib/Load_ptm.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Load_stm.cpp trunk/OpenMPT/soundlib/Load_ult.cpp trunk/OpenMPT/soundlib/Load_umx.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/MIDIMacros.h trunk/OpenMPT/soundlib/Mmcmp.cpp trunk/OpenMPT/soundlib/SampleFormats.cpp trunk/OpenMPT/soundlib/WAVTools.h trunk/OpenMPT/soundlib/Wav.h trunk/OpenMPT/soundlib/XMTools.h trunk/OpenMPT/soundlib/load_j2b.cpp trunk/OpenMPT/soundlib/plugins/PlugInterface.h trunk/OpenMPT/unarchiver/ungzip.h Modified: trunk/OpenMPT/common/typedefs.h =================================================================== --- trunk/OpenMPT/common/typedefs.h 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/common/typedefs.h 2013-04-16 22:00:18 UTC (rev 1895) @@ -33,8 +33,8 @@ #endif #if defined(_MSC_VER) -#define USE_PRAGMA_PACK #define PACKED __declspec(align(1)) +#define NEEDS_PRAGMA_PACK #elif defined(__GNUC__) #define PACKED __attribute__((packed))) __attribute__((aligned(1)))) #endif Modified: trunk/OpenMPT/mptrack/TrackerSettings.h =================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.h 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/mptrack/TrackerSettings.h 2013-04-16 22:00:18 UTC (rev 1895) @@ -118,12 +118,19 @@ // EQ -struct EQPreset +#ifdef NEEDS_PRAGMA_PACK +#pragma pack(push, 1) +#endif +struct PACKED EQPreset { char szName[12]; UINT Gains[MAX_EQ_BANDS]; UINT Freqs[MAX_EQ_BANDS]; }; +#ifdef NEEDS_PRAGMA_PACK +#pragma pack(pop) +#endif +STATIC_ASSERT(sizeof(EQPreset) == 60); // Chords Modified: trunk/OpenMPT/mptrack/mod2midi.cpp =================================================================== --- trunk/OpenMPT/mptrack/mod2midi.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/mptrack/mod2midi.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -15,9 +15,11 @@ #include "mod2midi.h" #include "Wav.h" +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif -typedef struct _RMIDDATACHUNK +typedef struct PACKED _RMIDDATACHUNK { DWORD id_RIFF; // "RIFF" DWORD filelen; @@ -26,7 +28,9 @@ DWORD datalen; } RMIDDATACHUNK, *PRMIDDATACHUNK; -typedef struct _MTHDCHUNK // (big endian) +STATIC_ASSERT(sizeof(RMIDDATACHUNK) == 20); + +typedef struct PACKED _MTHDCHUNK // (big endian) { DWORD id; // "MThd" = 0x6468544D DWORD len; // 6 @@ -35,12 +39,20 @@ WORD wDivision; // PPQN } MTHDCHUNK, *PMTHDCHUNK; -typedef struct _MTRKCHUNK // (big endian) +STATIC_ASSERT(sizeof(MTHDCHUNK) == 14); + +typedef struct PACKED _MTRKCHUNK // (big endian) { DWORD id; // "MTrk" = 0x6B72544D DWORD len; } MTRKCHUNK, *PMTRKCHUNK; +STATIC_ASSERT(sizeof(MTRKCHUNK) == 8); + +#ifdef NEEDS_PRAGMA_PACK +#pragma pack(pop) +#endif + typedef struct _DYNMIDITRACK { UINT nTrackSize; @@ -56,9 +68,7 @@ void WriteLen(unsigned long len); } DYNMIDITRACK, *PDYNMIDITRACK; -#pragma pack(pop) - void DYNMIDITRACK::Write(const void *pBuffer, unsigned long nBytes) //----------------------------------------------------------------- { Modified: trunk/OpenMPT/mptrack/tagging.h =================================================================== --- trunk/OpenMPT/mptrack/tagging.h 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/mptrack/tagging.h 2013-04-16 22:00:18 UTC (rev 1895) @@ -18,9 +18,11 @@ /////////////////////////////////////////////////////////////////////////////////////////////////// // ID3v2.4 Tags +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif -struct ID3v2Header +struct PACKED ID3v2Header { uint8 signature[3]; uint8 version[2]; @@ -29,7 +31,9 @@ // Total: 10 bytes }; -struct ID3v2Frame +STATIC_ASSERT(sizeof(ID3v2Header) == 10); + +struct PACKED ID3v2Frame { uint32 frameid; uint32 size; @@ -37,7 +41,11 @@ // Total: 10 bytes }; +STATIC_ASSERT(sizeof(ID3v2Frame) == 10); + +#ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) +#endif // we will add some padding bytes to our id3v2 tag (extending tags will be easier this way) #define ID3v2_PADDING 512 Modified: trunk/OpenMPT/sounddsp/EQ.cpp =================================================================== --- trunk/OpenMPT/sounddsp/EQ.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/sounddsp/EQ.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -43,24 +43,24 @@ }; -static const REAL f2ic = (REAL)(1 << 28); -static const REAL i2fc = (REAL)(1.0 / (1 << 28)); +static const float32 f2ic = (float32)(1 << 28); +static const float32 i2fc = (float32)(1.0 / (1 << 28)); static const EQBANDSTRUCT gEQDefaults[MAX_EQ_BANDS*2] = { // Default: Flat EQ - {0,0,0,0,0, 0,0,0,0, 1, 120, FALSE}, - {0,0,0,0,0, 0,0,0,0, 1, 600, FALSE}, - {0,0,0,0,0, 0,0,0,0, 1, 1200, FALSE}, - {0,0,0,0,0, 0,0,0,0, 1, 3000, FALSE}, - {0,0,0,0,0, 0,0,0,0, 1, 6000, FALSE}, - {0,0,0,0,0, 0,0,0,0, 1, 10000, FALSE}, - {0,0,0,0,0, 0,0,0,0, 1, 120, FALSE}, - {0,0,0,0,0, 0,0,0,0, 1, 600, FALSE}, - {0,0,0,0,0, 0,0,0,0, 1, 1200, FALSE}, - {0,0,0,0,0, 0,0,0,0, 1, 3000, FALSE}, - {0,0,0,0,0, 0,0,0,0, 1, 6000, FALSE}, - {0,0,0,0,0, 0,0,0,0, 1, 10000, FALSE}, + {0,0,0,0,0, 0,0,0,0, 1, 120, false}, + {0,0,0,0,0, 0,0,0,0, 1, 600, false}, + {0,0,0,0,0, 0,0,0,0, 1, 1200, false}, + {0,0,0,0,0, 0,0,0,0, 1, 3000, false}, + {0,0,0,0,0, 0,0,0,0, 1, 6000, false}, + {0,0,0,0,0, 0,0,0,0, 1, 10000, false}, + {0,0,0,0,0, 0,0,0,0, 1, 120, false}, + {0,0,0,0,0, 0,0,0,0, 1, 600, false}, + {0,0,0,0,0, 0,0,0,0, 1, 1200, false}, + {0,0,0,0,0, 0,0,0,0, 1, 3000, false}, + {0,0,0,0,0, 0,0,0,0, 1, 6000, false}, + {0,0,0,0,0, 0,0,0,0, 1, 10000, false}, }; #ifdef ENABLE_X86 @@ -77,8 +77,8 @@ #define PBS_Y1 DWORD PTR [eax+28] #define PBS_Y2 DWORD PTR [eax+32] -static void EQFilter(EQBANDSTRUCT *pbs, REAL *pbuffer, UINT nCount) -//------------------------------------------------------------------------- +static void EQFilter(EQBANDSTRUCT *pbs, float32 *pbuffer, UINT nCount) +//-------------------------------------------------------------------- { _asm { mov eax, pbs // eax = pbs @@ -124,8 +124,8 @@ } -static void AMD_StereoEQ(EQBANDSTRUCT *pbl, EQBANDSTRUCT *pbr, REAL *pbuffer, UINT nCount) -//---------------------------------------------------------------------------------------- +static void AMD_StereoEQ(EQBANDSTRUCT *pbl, EQBANDSTRUCT *pbr, float32 *pbuffer, UINT nCount) +//------------------------------------------------------------------------------------------- { #ifdef ENABLE_3DNOW float tmp[16]; @@ -208,8 +208,8 @@ } -static void SSE_StereoEQ(EQBANDSTRUCT *pbl, EQBANDSTRUCT *pbr, REAL *pbuffer, UINT nCount) -//---------------------------------------------------------------------------------------- +static void SSE_StereoEQ(EQBANDSTRUCT *pbl, EQBANDSTRUCT *pbr, float32 *pbuffer, UINT nCount) +//------------------------------------------------------------------------------------------- { #ifdef ENABLE_SSE static const float gk1 = 1.0f; @@ -306,13 +306,13 @@ #else -static void EQFilter(EQBANDSTRUCT *pbs, REAL *pbuffer, UINT nCount) -//----------------------------------------------------------------- +static void EQFilter(EQBANDSTRUCT *pbs, float32 *pbuffer, UINT nCount) +//-------------------------------------------------------------------- { for (UINT i=0; i<nCount; i++) { - REAL x = pbuffer[i]; - REAL y = pbs->a1 * pbs->x1 + pbs->a2 * pbs->x2 + pbs->a0 * x + pbs->b1 * pbs->y1 + pbs->b2 * pbs->y2; + float32 x = pbuffer[i]; + float32 y = pbs->a1 * pbs->x1 + pbs->a2 * pbs->x2 + pbs->a0 * x + pbs->b1 * pbs->y1 + pbs->b2 * pbs->y2; pbs->x2 = pbs->x1; pbs->y2 = pbs->y1; pbs->x1 = x; @@ -407,6 +407,10 @@ CEQ::CEQ() //-------- { + #if defined(ENABLE_MMX) || defined(ENABLE_SSE) + ALWAYS_ASSERT(((uintptr_t)&(gEQ[0])) % 4 == 0); + ALWAYS_ASSERT(((uintptr_t)&(gEQ[1])) % 4 == 0); + #endif memcpy(gEQ, gEQDefaults, sizeof(gEQ)); } @@ -414,12 +418,12 @@ void CEQ::Initialize(BOOL bReset, DWORD MixingFreq) //------------------------------------------------- { - REAL fMixingFreq = (REAL)MixingFreq; + float32 fMixingFreq = (float32)MixingFreq; // Gain = 0.5 (-6dB) .. 2 (+6dB) for (UINT band=0; band<MAX_EQ_BANDS*2; band++) if (gEQ[band].bEnable) { - REAL k, k2, r, f; - REAL v0, v1; + float32 k, k2, r, f; + float32 v0, v1; BOOL b = bReset; f = gEQ[band].CenterFrequency / fMixingFreq; @@ -428,7 +432,7 @@ // k = tan(PI*f); k = f * 3.141592654f; k = k + k*f; -// if (k > (REAL)0.707) k = (REAL)0.707; +// if (k > (float32)0.707) k = (float32)0.707; k2 = k*k; v0 = gEQ[band].Gain; v1 = 1; @@ -445,31 +449,31 @@ if (r != gEQ[band].a0) { gEQ[band].a0 = r; - b = TRUE; + b = true; } r = 2 * (k2 - 1) / (1 + v1*k + k2); if (r != gEQ[band].a1) { gEQ[band].a1 = r; - b = TRUE; + b = true; } r = (1 - v0*k + k2) / (1 + v1*k + k2); if (r != gEQ[band].a2) { gEQ[band].a2 = r; - b = TRUE; + b = true; } r = - 2 * (k2 - 1) / (1 + v1*k + k2); if (r != gEQ[band].b1) { gEQ[band].b1 = r; - b = TRUE; + b = true; } r = - (1 - v1*k + k2) / (1 + v1*k + k2); if (r != gEQ[band].b2) { gEQ[band].b2 = r; - b = TRUE; + b = true; } if (b) { @@ -498,13 +502,13 @@ { for (UINT i=0; i<MAX_EQ_BANDS; i++) { - REAL g, f = 0; + float32 g, f = 0; if (i < nGains) { UINT n = pGains[i]; if (n > 32) n = 32; - g = ((REAL)gEqLinearToDB[n]) / 64.0f; - if (pFreqs) f = (REAL)(int)pFreqs[i]; + g = ((float32)gEqLinearToDB[n]) / 64.0f; + if (pFreqs) f = (float32)(int)pFreqs[i]; } else { g = 1; @@ -515,12 +519,12 @@ gEQ[i+MAX_EQ_BANDS].CenterFrequency = f; if (f > 20.0f) { - gEQ[i].bEnable = TRUE; - gEQ[i+MAX_EQ_BANDS].bEnable = TRUE; + gEQ[i].bEnable = true; + gEQ[i+MAX_EQ_BANDS].bEnable = true; } else { - gEQ[i].bEnable = FALSE; - gEQ[i+MAX_EQ_BANDS].bEnable = FALSE; + gEQ[i].bEnable = false; + gEQ[i+MAX_EQ_BANDS].bEnable = false; } } Initialize(bReset, MixingFreq); Modified: trunk/OpenMPT/sounddsp/EQ.h =================================================================== --- trunk/OpenMPT/sounddsp/EQ.h 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/sounddsp/EQ.h 2013-04-16 22:00:18 UTC (rev 1895) @@ -15,20 +15,24 @@ #include "../soundlib/SoundFilePlayConfig.h" -#define REAL float #define MAX_EQ_BANDS 6 -#pragma pack(push, 4) -typedef struct _EQBANDSTRUCT +typedef struct ALIGN(4) _EQBANDSTRUCT { - REAL a0, a1, a2, b1, b2; - REAL x1, x2, y1, y2; - REAL Gain, CenterFrequency; - BOOL bEnable; -} EQBANDSTRUCT, *PEQBANDSTRUCT; -#pragma pack(pop) + float32 a0; + float32 a1; + float32 a2; + float32 b1; + float32 b2; + float32 x1; + float32 x2; + float32 y1; + float32 y2; + float32 Gain; + float32 CenterFrequency; + bool bEnable; +} EQBANDSTRUCT; - //======= class CEQ //======= Modified: trunk/OpenMPT/soundlib/Dlsbank.cpp =================================================================== --- trunk/OpenMPT/soundlib/Dlsbank.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/Dlsbank.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -108,7 +108,9 @@ #define ART_DEFAULTPAN MAKE_ART (CONN_SRC_NONE, CONN_SRC_NONE, CONN_DST_PAN) +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif ////////////////////////////////////////////////////////// // DLS IFF Chunk IDs @@ -134,47 +136,59 @@ ////////////////////////////////////////////////////////// // DLS Structures definitions -typedef struct IFFCHUNK +typedef struct PACKED IFFCHUNK { DWORD id; DWORD len; } IFFCHUNK, *LPIFFCHUNK; -typedef struct RIFFCHUNKID +STATIC_ASSERT(sizeof(IFFCHUNK) == 8); + +typedef struct PACKED RIFFCHUNKID { DWORD id_RIFF; DWORD riff_len; DWORD id_DLS; } RIFFCHUNKID; -typedef struct LISTCHUNK +STATIC_ASSERT(sizeof(RIFFCHUNKID) == 12); + +typedef struct PACKED LISTCHUNK { DWORD id; DWORD len; DWORD listid; } LISTCHUNK; -typedef struct DLSRGNRANGE +STATIC_ASSERT(sizeof(LISTCHUNK) == 12); + +typedef struct PACKED DLSRGNRANGE { WORD usLow; WORD usHigh; } DLSRGNRANGE; -typedef struct COLHCHUNK +STATIC_ASSERT(sizeof(DLSRGNRANGE) == 4); + +typedef struct PACKED COLHCHUNK { DWORD id; DWORD len; DWORD ulInstruments; } COLHCHUNK; -typedef struct VERSCHUNK +STATIC_ASSERT(sizeof(COLHCHUNK) == 12); + +typedef struct PACKED VERSCHUNK { DWORD id; DWORD len; WORD version[4]; } VERSCHUNK; -typedef struct PTBLCHUNK +STATIC_ASSERT(sizeof(VERSCHUNK) == 16); + +typedef struct PACKED PTBLCHUNK { DWORD id; DWORD len; @@ -183,7 +197,9 @@ DWORD ulOffsets[1]; } PTBLCHUNK; -typedef struct INSHCHUNK +STATIC_ASSERT(sizeof(PTBLCHUNK) == 20); + +typedef struct PACKED INSHCHUNK { DWORD id; DWORD len; @@ -192,7 +208,9 @@ DWORD ulInstrument; } INSHCHUNK; -typedef struct RGNHCHUNK +STATIC_ASSERT(sizeof(INSHCHUNK) == 20); + +typedef struct PACKED RGNHCHUNK { DWORD id; DWORD len; @@ -202,7 +220,9 @@ WORD usKeyGroup; } RGNHCHUNK; -typedef struct WLNKCHUNK +STATIC_ASSERT(sizeof(RGNHCHUNK) == 20); + +typedef struct PACKED WLNKCHUNK { DWORD id; DWORD len; @@ -212,7 +232,9 @@ DWORD ulTableIndex; } WLNKCHUNK; -typedef struct ART1CHUNK +STATIC_ASSERT(sizeof(WLNKCHUNK) == 20); + +typedef struct PACKED ART1CHUNK { DWORD id; DWORD len; @@ -220,7 +242,9 @@ DWORD cConnectionBlocks; } ART1CHUNK; -typedef struct CONNECTIONBLOCK +STATIC_ASSERT(sizeof(ART1CHUNK) == 16); + +typedef struct PACKED CONNECTIONBLOCK { WORD usSource; WORD usControl; @@ -229,19 +253,23 @@ LONG lScale; } CONNECTIONBLOCK; -typedef struct WSMPCHUNK +STATIC_ASSERT(sizeof(CONNECTIONBLOCK) == 12); + +typedef struct PACKED WSMPCHUNK { DWORD id; DWORD len; DWORD cbSize; WORD usUnityNote; - signed short sFineTune; + SHORT sFineTune; LONG lAttenuation; DWORD fulOptions; DWORD cSampleLoops; } WSMPCHUNK; -typedef struct WSMPSAMPLELOOP +STATIC_ASSERT(sizeof(WSMPCHUNK) == 28); + +typedef struct PACKED WSMPSAMPLELOOP { DWORD cbSize; DWORD ulLoopType; @@ -249,7 +277,9 @@ DWORD ulLoopLength; } WSMPSAMPLELOOP; +STATIC_ASSERT(sizeof(WSMPSAMPLELOOP) == 16); + ///////////////////////////////////////////////////////////////////// // SF2 IFF Chunk IDs @@ -285,7 +315,7 @@ ///////////////////////////////////////////////////////////////////// // SF2 Structures Definitions -typedef struct SFPRESETHEADER +typedef struct PACKED SFPRESETHEADER { CHAR achPresetName[20]; WORD wPreset; @@ -296,37 +326,49 @@ DWORD dwMorphology; } SFPRESETHEADER; -typedef struct SFPRESETBAG +STATIC_ASSERT(sizeof(SFPRESETHEADER) == 38); + +typedef struct PACKED SFPRESETBAG { WORD wGenNdx; WORD wModNdx; } SFPRESETBAG; -typedef struct SFGENLIST +STATIC_ASSERT(sizeof(SFPRESETBAG) == 4); + +typedef struct PACKED SFGENLIST { WORD sfGenOper; WORD genAmount; } SFGENLIST; -typedef struct SFINST +STATIC_ASSERT(sizeof(SFGENLIST) == 4); + +typedef struct PACKED SFINST { CHAR achInstName[20]; WORD wInstBagNdx; } SFINST; -typedef struct SFINSTBAG +STATIC_ASSERT(sizeof(SFINST) == 22); + +typedef struct PACKED SFINSTBAG { WORD wGenNdx; WORD wModNdx; } SFINSTBAG; -typedef struct SFINSTGENLIST +STATIC_ASSERT(sizeof(SFINSTBAG) == 4); + +typedef struct PACKED SFINSTGENLIST { WORD sfGenOper; WORD genAmount; } SFINSTGENLIST; -typedef struct SFSAMPLE +STATIC_ASSERT(sizeof(SFINSTGENLIST) == 4); + +typedef struct PACKED SFSAMPLE { CHAR achSampleName[20]; DWORD dwStart; @@ -340,7 +382,16 @@ WORD sfSampleType; } SFSAMPLE; +STATIC_ASSERT(sizeof(SFSAMPLE) == 46); +// End of structures definitions +///////////////////////////////////////////////////////////////////// + +#ifdef NEEDS_PRAGMA_PACK +#pragma pack(pop) +#endif + + typedef struct SF2LOADERINFO { UINT nPresetBags; @@ -356,12 +407,7 @@ } SF2LOADERINFO; -// End of structures definitions ///////////////////////////////////////////////////////////////////// - -#pragma pack(pop) - -///////////////////////////////////////////////////////////////////// // Unit conversion LONG CDLSBank::DLS32BitTimeCentsToMilliseconds(LONG lTimeCents) Modified: trunk/OpenMPT/soundlib/Dlsbank.h =================================================================== --- trunk/OpenMPT/soundlib/Dlsbank.h 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/Dlsbank.h 2013-04-16 22:00:18 UTC (rev 1895) @@ -14,7 +14,9 @@ class CSoundFile; #include "Snd_defs.h" +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif #define DLSMAXREGIONS 128 #define DLSMAXENVELOPES 2048 @@ -27,8 +29,7 @@ #define DLSREGION_SELFNONEXCLUSIVE 0x80 #define DLSREGION_SUSTAINLOOP 0x100 - -typedef struct DLSREGION +typedef struct PACKED DLSREGION { DWORD ulLoopStart; DWORD ulLoopEnd; @@ -42,7 +43,9 @@ BYTE uUnityNote; } DLSREGION; -typedef struct DLSENVELOPE +STATIC_ASSERT(sizeof(DLSREGION) == 21); + +typedef struct PACKED DLSENVELOPE { // Volume Envelope WORD wVolAttack; // Attack Time: 0-1000, 1 = 20ms (1/50s) -> [0-20s] @@ -53,10 +56,12 @@ BYTE nDefPan; } DLSENVELOPE; +STATIC_ASSERT(sizeof(DLSENVELOPE) == 8); + // Special Bank bits #define F_INSTRUMENT_DRUMS 0x80000000 -typedef struct DLSINSTRUMENT +typedef struct PACKED DLSINSTRUMENT { DWORD ulBank, ulInstrument; UINT nRegions, nMelodicEnv; @@ -66,7 +71,9 @@ WORD wPresetBagNdx, wPresetBagNum; } DLSINSTRUMENT; -typedef struct DLSSAMPLEEX +STATIC_ASSERT(sizeof(DLSINSTRUMENT) == 2740); + +typedef struct PACKED DLSSAMPLEEX { CHAR szName[20]; DWORD dwLen; @@ -77,6 +84,8 @@ CHAR chPitchCorrection; } DLSSAMPLEEX; +STATIC_ASSERT(sizeof(DLSSAMPLEEX) == 38); + #pragma pack(pop) #define SOUNDBANK_TYPE_INVALID 0 Modified: trunk/OpenMPT/soundlib/ITTools.h =================================================================== --- trunk/OpenMPT/soundlib/ITTools.h 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/ITTools.h 2013-04-16 22:00:18 UTC (rev 1895) @@ -14,9 +14,11 @@ #include "../soundlib/ModSample.h" #include "../soundlib/SampleIO.h" +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif -struct ITFileHeader +struct PACKED ITFileHeader { // Magic Bytes enum Magic @@ -81,7 +83,7 @@ STATIC_ASSERT(sizeof(ITFileHeader) == 192); -struct ITEnvelope +struct PACKED ITEnvelope { // Envelope Flags enum ITEnvelopeFlags @@ -112,7 +114,7 @@ // Old Impulse Instrument Format (cmwt < 0x200) -struct ITOldInstrument +struct PACKED ITOldInstrument { // Magic Bytes enum Magic @@ -158,7 +160,7 @@ // Impulse Instrument Format -struct ITInstrument +struct PACKED ITInstrument { // Magic Bytes enum Magic @@ -213,7 +215,7 @@ // MPT IT Instrument Extension -struct ITInstrumentEx +struct PACKED ITInstrumentEx { enum Magic { @@ -236,7 +238,7 @@ // IT Sample Format -struct ITSample +struct PACKED ITSample { // Magic Bytes enum Magic @@ -305,7 +307,7 @@ #endif // MODPLUG_TRACKER // IT Header extension: Save history -struct ITHistoryStruct +struct PACKED ITHistoryStruct { uint16 fatdate; // DOS / FAT date when the file was opened / created in the editor. For details, read http://msdn.microsoft.com/en-us/library/ms724247(VS.85).aspx uint16 fattime; // DOS / FAT time when the file was opened / created in the editor. @@ -327,7 +329,9 @@ STATIC_ASSERT(sizeof(ITHistoryStruct) == 8); +#ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) +#endif enum IT_ReaderBitMasks { Modified: trunk/OpenMPT/soundlib/LOAD_AMF.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_AMF.CPP 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/LOAD_AMF.CPP 2013-04-16 22:00:18 UTC (rev 1895) @@ -15,10 +15,12 @@ #include "Loaders.h" +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif // ASYLUM AMF File Header -struct AsylumFileHeader +struct PACKED AsylumFileHeader { char signature[32]; uint8 defaultSpeed; @@ -33,7 +35,7 @@ // ASYLUM AMF Sample Header -struct AsylumSampleHeader +struct PACKED AsylumSampleHeader { char name[22]; uint8 finetune; @@ -71,7 +73,31 @@ STATIC_ASSERT(sizeof(AsylumSampleHeader) == 37); + +// DSMI AMF File Header +struct PACKED AMFFileHeader +{ + char amf[3]; + uint8 version; + char title[32]; + uint8 numSamples; + uint8 numOrders; + uint16 numTracks; + uint8 numChannels; + + // Convert all multi-byte numeric values to current platform's endianness or vice versa. + void ConvertEndianness() + { + SwapBytesLE(numTracks); + } +}; + +STATIC_ASSERT(sizeof(AMFFileHeader) == 41); + + +#ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) +#endif bool CSoundFile::ReadAMF_Asylum(FileReader &file) @@ -159,31 +185,6 @@ } -#pragma pack(push, 1) - -// DSMI AMF File Header -struct AMFFileHeader -{ - char amf[3]; - uint8 version; - char title[32]; - uint8 numSamples; - uint8 numOrders; - uint16 numTracks; - uint8 numChannels; - - // Convert all multi-byte numeric values to current platform's endianness or vice versa. - void ConvertEndianness() - { - SwapBytesLE(numTracks); - } -}; - -STATIC_ASSERT(sizeof(AMFFileHeader) == 41); - -#pragma pack(pop) - - // Read a single AMF track (channel) into a pattern. void AMFReadPattern(CPattern &pattern, CHANNELINDEX chn, FileReader &fileChunk) //----------------------------------------------------------------------------- Modified: trunk/OpenMPT/soundlib/LOAD_DBM.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2013-04-16 22:00:18 UTC (rev 1895) @@ -24,9 +24,11 @@ #define DBM_ID_PATT 0x54544150 #define DBM_ID_SMPL 0x4c504d53 +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif -struct DBMFileHeader +struct PACKED DBMFileHeader { uint32 dbm_id; // "DBM0" = 0x304d4244 uint16 trkver; // Tracker version: 02.15 @@ -48,7 +50,9 @@ // uint16 orderlist[0]; // orderlist[orders] in words }; -struct DBMInstrument +STATIC_ASSERT(sizeof(DBMFileHeader) == 132); + +struct PACKED DBMInstrument { char name[30]; uint16 sampleno; @@ -60,7 +64,9 @@ uint16 flags; }; -struct DBMEnvelope +STATIC_ASSERT(sizeof(DBMInstrument) == 50); + +struct PACKED DBMEnvelope { uint16 instrument; uint8 flags; @@ -72,21 +78,29 @@ uint16 volenv[2 * 32]; }; -struct DBMPattern +STATIC_ASSERT(sizeof(DBMEnvelope) == 136); + +struct PACKED DBMPattern { uint16 rows; uint32 packedsize; uint8 patterndata[2]; // [packedsize] }; -struct DBMSample +STATIC_ASSERT(sizeof(DBMPattern) == 8); + +struct PACKED DBMSample { uint32 flags; uint32 samplesize; uint8 sampledata[2]; // [samplesize] }; +STATIC_ASSERT(sizeof(DBMSample) == 10); + +#ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) +#endif static const ModCommand::COMMAND dbmEffects[23] = Modified: trunk/OpenMPT/soundlib/LOAD_DMF.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2013-04-16 22:00:18 UTC (rev 1895) @@ -20,10 +20,12 @@ #include "../mptrack/Moddoc.h" #endif // MODPLUG_TRACKER +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif // DMF header -struct DMFFileHeader +struct PACKED DMFFileHeader { char signature[4]; // "DDMF" uint8 version; // 1 - 7 are beta versions, 8 is the official thing, 10 is xtracker32 @@ -35,7 +37,9 @@ uint8 creationYear; }; -struct DMFChunk +STATIC_ASSERT(sizeof(DMFFileHeader) == 66); + +struct PACKED DMFChunk { // 32-Bit chunk identifiers enum ChunkIdentifiers @@ -68,8 +72,10 @@ } }; +STATIC_ASSERT(sizeof(DMFChunk) == 8); + // Order list -struct DMFSequence +struct PACKED DMFSequence { uint16 loopStart; uint16 loopEnd; @@ -83,8 +89,10 @@ } }; +STATIC_ASSERT(sizeof(DMFSequence) == 4); + // Pattern header (global) -struct DMFPatterns +struct PACKED DMFPatterns { uint16 numPatterns; // 1..1024 patterns uint8 numTracks; // 1..32 channels @@ -96,8 +104,10 @@ } }; +STATIC_ASSERT(sizeof(DMFPatterns) == 3); + // Pattern header (for each pattern) -struct DMFPatternHeader +struct PACKED DMFPatternHeader { uint8 numTracks; // 1..32 channels uint8 beat; // [hi|lo] -> hi = rows per beat, lo = reserved @@ -113,8 +123,10 @@ } }; +STATIC_ASSERT(sizeof(DMFPatternHeader) == 8); + // Sample header -struct DMFSampleHeader +struct PACKED DMFSampleHeader { enum SampleFlags { @@ -181,14 +193,20 @@ } }; +STATIC_ASSERT(sizeof(DMFSampleHeader) == 16); + // Sample header tail (between head and tail, there might be the library name of the sample, depending on the DMF version) -struct DMFSampleHeaderTail +struct PACKED DMFSampleHeaderTail { uint16 filler; uint32 crc32; }; +STATIC_ASSERT(sizeof(DMFSampleHeaderTail) == 6); + +#ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) +#endif // Pattern translation memory struct DMFPatternSettings Modified: trunk/OpenMPT/soundlib/LOAD_DSM.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DSM.CPP 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/LOAD_DSM.CPP 2013-04-16 22:00:18 UTC (rev 1895) @@ -12,7 +12,9 @@ #include "stdafx.h" #include "Loaders.h" +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif #define DSMID_RIFF 0x46464952 // "RIFF" #define DSMID_DSMF 0x464d5344 // "DSMF" @@ -21,13 +23,15 @@ #define DSMID_PATT 0x54544150 // "PATT" -typedef struct DSMNOTE +typedef struct PACKED DSMNOTE { BYTE note,ins,vol,cmd,inf; } DSMNOTE; +STATIC_ASSERT(sizeof(DSMNOTE) == 5); -typedef struct DSMSAMPLE + +typedef struct PACKED DSMSAMPLE { DWORD id_INST; DWORD inst_len; @@ -44,8 +48,10 @@ CHAR samplename[28]; } DSMSAMPLE; +STATIC_ASSERT(sizeof(DSMSAMPLE) == 72); -typedef struct DSMFILEHEADER + +typedef struct PACKED DSMFILEHEADER { DWORD id_RIFF; // "RIFF" DWORD riff_len; @@ -54,8 +60,10 @@ DWORD song_len; } DSMFILEHEADER; +STATIC_ASSERT(sizeof(DSMFILEHEADER) == 20); -typedef struct DSMSONG + +typedef struct PACKED DSMSONG { CHAR songname[28]; WORD reserved1; @@ -73,7 +81,10 @@ BYTE orders[128]; } DSMSONG; -typedef struct DSMPATT +STATIC_ASSERT(sizeof(DSMSONG) == 192); + + +typedef struct PACKED DSMPATT { DWORD id_PATT; DWORD patt_len; @@ -81,7 +92,12 @@ BYTE dummy2; } DSMPATT; +STATIC_ASSERT(sizeof(DSMPATT) == 10); + + +#ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) +#endif bool CSoundFile::ReadDSM(const LPCBYTE lpStream, const DWORD dwMemLength) Modified: trunk/OpenMPT/soundlib/Load_669.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_669.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/Load_669.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -13,9 +13,11 @@ #include "stdafx.h" #include "Loaders.h" +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif -struct _669FileHeader +struct PACKED _669FileHeader { enum MagicBytes { @@ -42,7 +44,7 @@ STATIC_ASSERT(sizeof(_669FileHeader) == 497); -struct _669Sample +struct PACKED _669Sample { char filename[13]; uint32 length; @@ -80,7 +82,9 @@ STATIC_ASSERT(sizeof(_669Sample) == 25); +#ifdef USER_PRAGMA_PACK #pragma pack(pop) +#endif bool CSoundFile::Read669(FileReader &file) Modified: trunk/OpenMPT/soundlib/Load_ams.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ams.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/Load_ams.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -283,10 +283,12 @@ ///////////////////////////////////////////////////////////////////// // AMS (Extreme's Tracker) 1.x loader +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif // AMS File Header -struct AMSFileHeader +struct PACKED AMSFileHeader { uint8 versionLow; uint8 versionHigh; @@ -306,9 +308,11 @@ } }; +STATIC_ASSERT(sizeof(AMSFileHeader) == 11); + // AMS Sample Header -struct AMSSampleHeader +struct PACKED AMSSampleHeader { enum SampleFlags { @@ -365,8 +369,12 @@ } }; +STATIC_ASSERT(sizeof(AMSSampleHeader) == 17); + +#ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) +#endif bool CSoundFile::ReadAMS(FileReader &file) @@ -490,10 +498,13 @@ ///////////////////////////////////////////////////////////////////// // AMS (Velvet Studio) 2.1 / 2.2 loader -#pragma pack(1) +#ifdef NEEDS_PRAGMA_PACK +#pragma pack(push, 1) +#endif + // AMS2 File Header -struct AMS2FileHeader +struct PACKED AMS2FileHeader { enum FileFlags { @@ -515,9 +526,11 @@ }; }; +STATIC_ASSERT(sizeof(AMS2FileHeader) == 7); + // AMS2 Instument Envelope -struct AMS2Envelope +struct PACKED AMS2Envelope { uint8 speed; // Envelope speed uint8 sustainPoint; // Envelope sustain point @@ -557,9 +570,11 @@ } }; +STATIC_ASSERT(sizeof(AMS2Envelope) == 5); + // AMS2 Instrument Data -struct AMS2Instrument +struct PACKED AMS2Instrument { enum EnvelopeFlags { @@ -607,9 +622,11 @@ }; +STATIC_ASSERT(sizeof(AMS2Instrument) == 5); + // AMS2 Sample Header -struct AMS2SampleHeader +struct PACKED AMS2SampleHeader { enum SampleFlags { @@ -679,9 +696,11 @@ } }; +STATIC_ASSERT(sizeof(AMS2SampleHeader) == 20); + // AMS2 Song Description Header -struct AMS2Description +struct PACKED AMS2Description { uint32 packedLen; // Including header uint32 unpackedLen; @@ -697,10 +716,14 @@ } }; +STATIC_ASSERT(sizeof(AMS2Description) == 11); -#pragma pack() +#ifdef NEEDS_PRAGMA_PACK +#pragma pack(pop) +#endif + bool CSoundFile::ReadAMS2(FileReader &file) //----------------------------------------- { Modified: trunk/OpenMPT/soundlib/Load_far.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_far.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/Load_far.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -12,10 +12,12 @@ #include "Loaders.h" +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif // FAR File Header -struct FARFileHeader +struct PACKED FARFileHeader { uint8 magic[4]; char songName[40]; @@ -40,7 +42,7 @@ STATIC_ASSERT(sizeof(FARFileHeader) == 98); -struct FAROrderHeader +struct PACKED FAROrderHeader { uint8 orders[256]; uint8 numPatterns; // supposed to be "number of patterns stored in the file"; apparently that's wrong @@ -62,7 +64,7 @@ // FAR Sample header -struct FARSampleHeader +struct PACKED FARSampleHeader { // Sample flags enum SampleFlags @@ -125,7 +127,9 @@ STATIC_ASSERT(sizeof(FARSampleHeader) == 48); +#ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) +#endif bool CSoundFile::ReadFAR(FileReader &file) Modified: trunk/OpenMPT/soundlib/Load_gdm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_gdm.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/Load_gdm.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -16,10 +16,13 @@ #include "stdafx.h" #include "Loaders.h" +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif + // GDM File Header -struct GDMFileHeader +struct PACKED GDMFileHeader { // Header magic bytes enum HeaderMagic @@ -82,8 +85,11 @@ } }; +STATIC_ASSERT(sizeof(GDMFileHeader) == 157); + + // GDM Sample Header -struct GDMSampleHeader +struct PACKED GDMSampleHeader { enum SampleFlags { @@ -116,8 +122,14 @@ } }; +STATIC_ASSERT(sizeof(GDMSampleHeader) == 62); + + +#ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) +#endif + bool CSoundFile::ReadGDM(FileReader &file) //---------------------------------------- { Modified: trunk/OpenMPT/soundlib/Load_imf.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_imf.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/Load_imf.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -15,9 +15,11 @@ #include "../mptrack/moddoc.h" #endif // MODPLUG_TRACKER +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif -struct IMFChannel +struct PACKED IMFChannel { char name[12]; // Channel name (ASCIIZ-String, max 11 chars) uint8 chorus; // Default chorus @@ -26,7 +28,9 @@ uint8 status; // Channel status: 0 = enabled, 1 = mute, 2 = disabled (ignore effects!) }; -struct IMFFileHeader +STATIC_ASSERT(sizeof(IMFChannel) == 16); + +struct PACKED IMFFileHeader { enum SongFlags { @@ -59,7 +63,9 @@ } }; -struct IMFEnvelope +STATIC_ASSERT(sizeof(IMFFileHeader) == 832); + +struct PACKED IMFEnvelope { enum EnvFlags { @@ -76,13 +82,17 @@ uint8 unused[3]; }; -struct IMFEnvNode +STATIC_ASSERT(sizeof(IMFEnvelope) == 8); + +struct PACKED IMFEnvNode { uint16 tick; uint16 value; }; -struct IMFInstrument +STATIC_ASSERT(sizeof(IMFEnvNode) == 4); + +struct PACKED IMFInstrument { enum EnvTypes { @@ -166,7 +176,9 @@ } }; -struct IMFSample +STATIC_ASSERT(sizeof(IMFInstrument) == 384); + +struct PACKED IMFSample { enum SampleFlags { @@ -228,7 +240,11 @@ } }; +STATIC_ASSERT(sizeof(IMFSample) == 64); + +#ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) +#endif static const uint8 imfEffects[] = { Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -1135,7 +1135,7 @@ { itHeader.flags |= ITFileHeader::reqEmbeddedMIDIConfig; itHeader.special |= ITFileHeader::embedMIDIConfiguration; - dwExtra += sizeof(MIDIMacroConfig); + dwExtra += sizeof(MIDIMacroConfigData); } // Pattern Names @@ -1180,7 +1180,7 @@ // Writing midi cfg if(itHeader.flags & ITFileHeader::reqEmbeddedMIDIConfig) { - fwrite(&m_MidiCfg, 1, sizeof(MIDIMacroConfig), f); + fwrite(static_cast<MIDIMacroConfigData*>(&m_MidiCfg), 1, sizeof(MIDIMacroConfigData), f); } // Writing pattern names Modified: trunk/OpenMPT/soundlib/Load_itp.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_itp.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/Load_itp.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -351,7 +351,7 @@ // Song midi config // midi cfg data length - id = m_SongFlags[SONG_EMBEDMIDICFG] ? sizeof(MIDIMacroConfig) : 0; + id = m_SongFlags[SONG_EMBEDMIDICFG] ? sizeof(MIDIMacroConfigData) : 0; fwrite(&id, 1, sizeof(id), f); // midi cfg Modified: trunk/OpenMPT/soundlib/Load_mdl.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mdl.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/Load_mdl.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -16,16 +16,20 @@ #pragma warning(disable:4244) //"conversion from 'type1' to 'type2', possible loss of data" +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif -struct MDLFileHeader +struct PACKED MDLFileHeader { DWORD id; // "DMDL" = 0x4C444D44 BYTE version; }; +STATIC_ASSERT(sizeof(MDLFileHeader) == 5); -struct MDLInfoBlock + +struct PACKED MDLInfoBlock { char songname[32]; char composer[20]; @@ -38,8 +42,10 @@ uint8 seq[256]; }; +STATIC_ASSERT(sizeof(MDLInfoBlock) == 347); -struct MDLPatternHeader + +struct PACKED MDLPatternHeader { uint8 channels; uint8 lastrow; // nrows = lastrow+1 @@ -47,16 +53,20 @@ uint16 data[1]; }; +STATIC_ASSERT(sizeof(MDLPatternHeader) == 20); -struct MDLSampleHeaderCommon + +struct PACKED MDLSampleHeaderCommon { uint8 sampleIndex; char name[32]; char filename[8]; }; +STATIC_ASSERT(sizeof(MDLSampleHeaderCommon) == 41); -struct MDLSampleHeader + +struct PACKED MDLSampleHeader { MDLSampleHeaderCommon info; uint32 c4Speed; @@ -70,7 +80,7 @@ STATIC_ASSERT(sizeof(MDLSampleHeader) == 59); -struct MDLSampleHeaderv0 +struct PACKED MDLSampleHeaderv0 { MDLSampleHeaderCommon info; uint16 c4Speed; @@ -84,7 +94,9 @@ STATIC_ASSERT(sizeof(MDLSampleHeaderv0) == 57); +#ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) +#endif void ConvertMDLCommand(ModCommand *m, UINT eff, UINT data) Modified: trunk/OpenMPT/soundlib/Load_med.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_med.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/Load_med.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -60,9 +60,12 @@ #define MMDTAG_FX_GROUPNAME (MMDTAG_PTR|5) // the Global Effects group shouldn't have name saved! #define MMDTAG_FX_GRPNAMELEN 6 // namelen includes zero term. +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif -typedef struct tagMEDMODULEHEADER + +typedef struct PACKED tagMEDMODULEHEADER { DWORD id; // MMD1-MMD3 DWORD modlen; // Size of file @@ -84,8 +87,10 @@ BYTE extra_songs; // # of songs - 1 } MEDMODULEHEADER; +STATIC_ASSERT(sizeof(MEDMODULEHEADER) == 52); -typedef struct tagMMD0SAMPLE + +typedef struct PACKED tagMMD0SAMPLE { WORD rep, replen; BYTE midich; @@ -94,9 +99,11 @@ signed char strans; } MMD0SAMPLE; +STATIC_ASSERT(sizeof(MMD0SAMPLE) == 8); + // Sample header is immediately followed by sample data... -typedef struct tagMMDSAMPLEHEADER +typedef struct PACKED tagMMDSAMPLEHEADER { DWORD length; // length of *one* *unpacked* channel in *bytes* WORD type; @@ -122,9 +129,11 @@ BYTE SampleData[1]; // Sample Data } MMDSAMPLEHEADER; +STATIC_ASSERT(sizeof(MMDSAMPLEHEADER) == 21); + // MMD0/MMD1 song header -typedef struct tagMMD0SONGHEADER +typedef struct PACKED tagMMD0SONGHEADER { MMD0SAMPLE sample[63]; WORD numblocks; // # of blocks @@ -140,9 +149,11 @@ BYTE numsamples; // # of samples (max=63) } MMD0SONGHEADER; +STATIC_ASSERT(sizeof(MMD0SONGHEADER) == 788); + // MMD2/MMD3 song header -typedef struct tagMMD2SONGHEADER +typedef struct PACKED tagMMD2SONGHEADER { MMD0SAMPLE sample[63]; WORD numblocks; // # of blocks @@ -171,6 +182,9 @@ BYTE numsamples; // # of samples (max 63) } MMD2SONGHEADER; +STATIC_ASSERT(sizeof(MMD2SONGHEADER) == 788); + + // For MMD0 the note information is held in 3 bytes, byte0, byte1, byte2. For reference we // number the bits in each byte 0..7, where 0 is the low bit. // The note is held as bits 5..0 of byte0 @@ -178,13 +192,15 @@ // The command number is bits 3,2,1,0 of byte1, command data is in byte2: // For command 0, byte2 represents the second data byte, otherwise byte2 // represents the first data byte. -typedef struct tagMMD0BLOCK +typedef struct PACKED tagMMD0BLOCK { BYTE numtracks; BYTE lines; // File value is 1 less than actual, so 0 -> 1 line } MMD0BLOCK; // BYTE data[lines+1][tracks][3]; +STATIC_ASSERT(sizeof(MMD0BLOCK) == 2); + // For MMD1,MMD2,MMD3 the note information is carried in 4 bytes, byte0, byte1, // byte2 and byte3 // The note is held as byte0 (values above 0x84 are ignored) @@ -192,15 +208,17 @@ // The command number is held as byte2, command data is in byte3 // For commands 0 and 0x19 byte3 represents the second data byte, // otherwise byte2 represents the first data byte. -typedef struct tagMMD1BLOCK +typedef struct PACKED tagMMD1BLOCK { WORD numtracks; // Number of tracks, may be > 64, but then that data is skipped. WORD lines; // Stored value is 1 less than actual, so 0 -> 1 line DWORD info; // Offset of BlockInfo (if 0, no block_info is present) } MMD1BLOCK; +STATIC_ASSERT(sizeof(MMD1BLOCK) == 8); -typedef struct tagMMD1BLOCKINFO + +typedef struct PACKED tagMMD1BLOCKINFO { DWORD hlmask; // Unimplemented - ignore DWORD blockname; // file offset of block name @@ -210,10 +228,12 @@ DWORD reserved[4]; // future expansion } MMD1BLOCKINFO; +STATIC_ASSERT(sizeof(MMD1BLOCKINFO) == 36); + // A set of play sequences is stored as an array of ULONG files offsets // Each offset points to the play sequence itself. -typedef struct tagMMD2PLAYSEQ +typedef struct PACKED tagMMD2PLAYSEQ { CHAR name[32]; DWORD command_offs; // filepos of command table @@ -222,11 +242,13 @@ WORD seq[512]; // skip if > 0x8000 } MMD2PLAYSEQ; +STATIC_ASSERT(sizeof(MMD2PLAYSEQ) == 1066); + // A command table contains commands that effect a particular play sequence // entry. The only commands read in are STOP or POSJUMP, all others are ignored // POSJUMP is presumed to have extra bytes containing a WORD for the position -typedef struct tagMMDCOMMAND +typedef struct PACKED tagMMDCOMMAND { WORD offset; // Offset within current sequence entry BYTE cmdnumber; // STOP (537) or POSJUMP (538) (others skipped) @@ -234,8 +256,10 @@ BYTE extra_bytes[4];// [extra_count]; } MMDCOMMAND; // Last entry has offset == 0xFFFF, cmd_number == 0 and 0 extrabytes +STATIC_ASSERT(sizeof(MMDCOMMAND) == 8); -typedef struct tagMMD0EXP + +typedef struct PACKED tagMMD0EXP { DWORD nextmod; // File offset of next Hdr DWORD exp_smp; // Pointer to extra instrument data @@ -261,7 +285,12 @@ DWORD tag_end; } MMD0EXP; +STATIC_ASSERT(sizeof(MMD0EXP) == 80); + + +#ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) +#endif Modified: trunk/OpenMPT/soundlib/Load_mid.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mid.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/Load_mid.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -31,9 +31,11 @@ //UINT gnMidiImportSpeed = 3; //UINT gnMidiPatternLen = 128; +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif -typedef struct MIDIFILEHEADER +typedef struct PACKED MIDIFILEHEADER { DWORD id; // "MThd" = 0x6468544D DWORD len; // 6 @@ -42,13 +44,20 @@ WORD wDivision; // F0 } MIDIFILEHEADER; +STATIC_ASSERT(sizeof(MIDIFILEHEADER) == 14); -typedef struct MIDITRACKHEADER +typedef struct PACKED MIDITRACKHEADER { DWORD id; // "MTrk" = 0x6B72544D DWORD len; } MIDITRACKHEADER; +STATIC_ASSERT(sizeof(MIDITRACKHEADER) == 8); + +#ifdef NEEDS_PRAGMA_PACK +#pragma pack(pop) +#endif + ////////////////////////////////////////////////////////////////////// // Midi Loader Internal Structures @@ -88,10 +97,7 @@ LONG nexteventtime; } MIDITRACK; -#pragma pack(pop) - - extern const LPCSTR szMidiGroupNames[17] = { "Piano", Modified: trunk/OpenMPT/soundlib/Load_mod.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mod.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/Load_mod.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -190,10 +190,13 @@ } +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif + // File Header -struct MODFileHeader +struct PACKED MODFileHeader { uint8 numOrders; uint8 restartPos; @@ -204,7 +207,7 @@ // Sample Header -struct MODSampleHeader +struct PACKED MODSampleHeader { char name[22]; uint16 length; @@ -326,7 +329,9 @@ STATIC_ASSERT(sizeof(MODSampleHeader) == 30); +#ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) +#endif // Functor for fixing VBlank MODs and MODs with 7-bit panning Modified: trunk/OpenMPT/soundlib/Load_mt2.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mt2.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/Load_mt2.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -14,9 +14,11 @@ //#define MT2DEBUG +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif -typedef struct _MT2FILEHEADER +typedef struct PACKED _MT2FILEHEADER { DWORD dwMT20; // 0x3032544D "MT20" DWORD dwSpecial; @@ -36,13 +38,17 @@ BYTE Orders[256]; } MT2FILEHEADER; -typedef struct _MT2PATTERN +STATIC_ASSERT(sizeof(MT2FILEHEADER) == 382); + +typedef struct PACKED _MT2PATTERN { WORD wLines; DWORD wDataLen; } MT2PATTERN; -typedef struct _MT2COMMAND +STATIC_ASSERT(sizeof(MT2PATTERN) == 6); + +typedef struct PACKED _MT2COMMAND { BYTE note; // 0=nothing, 97=note off BYTE instr; @@ -53,21 +59,27 @@ BYTE fxparam2; } MT2COMMAND; -typedef struct _MT2DRUMSDATA +STATIC_ASSERT(sizeof(MT2COMMAND) == 7); + +typedef struct PACKED _MT2DRUMSDATA { WORD wDrumPatterns; WORD wDrumSamples[8]; BYTE DrumPatternOrder[256]; } MT2DRUMSDATA; -typedef struct _MT2AUTOMATION +STATIC_ASSERT(sizeof(MT2DRUMSDATA) == 274); + +typedef struct PACKED _MT2AUTOMATION { DWORD dwFlags; DWORD dwEffectId; DWORD nEnvPoints; } MT2AUTOMATION; -typedef struct _MT2INSTRUMENT +STATIC_ASSERT(sizeof(MT2AUTOMATION) == 12); + +typedef struct PACKED _MT2INSTRUMENT { CHAR szName[32]; DWORD dwDataLen; @@ -84,7 +96,9 @@ WORD wEnvFlags2; } MT2INSTRUMENT; -typedef struct _MT2ENVELOPE +STATIC_ASSERT(sizeof(MT2INSTRUMENT) == 148); + +typedef struct PACKED _MT2ENVELOPE { BYTE nFlags; BYTE nPoints; @@ -95,7 +109,9 @@ BYTE EnvData[64]; } MT2ENVELOPE; -typedef struct _MT2SYNTH +STATIC_ASSERT(sizeof(MT2ENVELOPE) == 72); + +typedef struct PACKED _MT2SYNTH { BYTE nSynthId; BYTE nFxId; @@ -106,7 +122,9 @@ BYTE bReserved[25]; } MT2SYNTH; -typedef struct _MT2SAMPLE +STATIC_ASSERT(sizeof(MT2SYNTH) == 32); + +typedef struct PACKED _MT2SAMPLE { CHAR szName[32]; DWORD dwDataLen; @@ -124,7 +142,9 @@ WORD wSamplesPerBeat; } MT2SAMPLE; -typedef struct _MT2GROUP +STATIC_ASSERT(sizeof(MT2SAMPLE) == 62); + +typedef struct PACKED _MT2GROUP { BYTE nSmpNo; BYTE nVolume; // 0-128 @@ -132,7 +152,11 @@ BYTE Reserved[5]; } MT2GROUP; +STATIC_ASSERT(sizeof(MT2GROUP) == 8); + +#ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) +#endif static void ConvertMT2Command(CSoundFile *that, ModCommand *m, MT2COMMAND *p) Modified: trunk/OpenMPT/soundlib/Load_mtm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mtm.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/Load_mtm.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -12,10 +12,12 @@ #include "stdafx.h" #include "Loaders.h" +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif // File Header -struct MTMFileHeader +struct PACKED MTMFileHeader { char id[3]; // MTM file marker uint8 version; // Tracker version @@ -42,7 +44,7 @@ // Sample Header -struct MTMSampleHeader +struct PACKED MTMSampleHeader { char samplename[22]; uint32 length; @@ -89,7 +91,10 @@ STATIC_ASSERT(sizeof(MTMSampleHeader) == 37); + +#ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) +#endif bool CSoundFile::ReadMTM(FileReader &file) Modified: trunk/OpenMPT/soundlib/Load_okt.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_okt.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/Load_okt.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -12,9 +12,11 @@ #include "stdafx.h" #include "Loaders.h" +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif -struct OktIffChunk +struct PACKED OktIffChunk { // IFF chunk names enum ChunkIdentifiers @@ -40,7 +42,9 @@ } }; -struct OktSample +STATIC_ASSERT(sizeof(OktIffChunk) == 8); + +struct PACKED OktSample { char name[20]; uint32 length; // length in bytes @@ -62,7 +66,9 @@ STATIC_ASSERT(sizeof(OktSample) == 32); +#ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) +#endif // Parse the sample header block void ReadOKTSamples(FileReader &chunk, vector<bool> &sample7bit, CSoundFile *pSndFile) Modified: trunk/OpenMPT/soundlib/Load_psm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_psm.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/Load_psm.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -27,7 +27,9 @@ #include "../mptrack/moddoc.h" #endif // MODPLUG_TRACKER +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif //////////////////////////////////////////////////////////// // @@ -35,7 +37,7 @@ // // PSM File Header -struct PSMFileHeader +struct PACKED PSMFileHeader { // Magic Bytes enum PSMMagic @@ -57,8 +59,10 @@ } }; +STATIC_ASSERT(sizeof(PSMFileHeader) == 12); + // RIFF-style Chunk -struct PSMChunk +struct PACKED PSMChunk { // 32-Bit chunk identifiers enum ChunkIdentifiers @@ -93,8 +97,10 @@ } }; +STATIC_ASSERT(sizeof(PSMChunk) == 8); + // Song Information -struct PSMSongHeader +struct PACKED PSMSongHeader { char songType[9]; // Mostly "MAINSONG " (But not in Extreme Pinball!) uint8 compression; // 1 - uncompressed @@ -102,8 +108,10 @@ }; +STATIC_ASSERT(sizeof(PSMSongHeader) == 11); + // Regular sample header -struct PSMOldSampleHeader +struct PACKED PSMOldSampleHeader { uint8 flags; char fileName[8]; // Filename of the original module (without extension) @@ -159,9 +167,10 @@ } }; +STATIC_ASSERT(sizeof(PSMOldSampleHeader) == 96); // Sinaria sample header (and possibly other games) -struct PSMNewSampleHeader +struct PACKED PSMNewSampleHeader { uint8 flags; char fileName[8]; // Filename of the original module (without extension) @@ -216,7 +225,12 @@ SampleIO::deltaPCM); } }; + +STATIC_ASSERT(sizeof(PSMNewSampleHeader) == 96); + +#ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) +#endif struct PSMSubSong // For internal use (pattern conversion) @@ -937,9 +951,11 @@ // PSM16 support starts here. // +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif -struct PSM16FileHeader +struct PACKED PSM16FileHeader { // 32-Bit chunk identifiers enum PSM16Magic @@ -994,7 +1010,9 @@ } }; -struct PSM16SampleHeader +STATIC_ASSERT(sizeof(PSM16FileHeader) == 146); + +struct PACKED PSM16SampleHeader { enum SampleFlags { @@ -1086,7 +1104,9 @@ } }; -struct PSM16PatternHeader +STATIC_ASSERT(sizeof(PSM16SampleHeader) == 64); + +struct PACKED PSM16PatternHeader { uint16 size; // includes header bytes uint8 numRows; // 1 ... 64 @@ -1098,7 +1118,11 @@ } }; +STATIC_ASSERT(sizeof(PSM16PatternHeader) == 4); + +#ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) +#endif bool CSoundFile::ReadPSM16(FileReader &file) Modified: trunk/OpenMPT/soundlib/Load_ptm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ptm.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/Load_ptm.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -15,9 +15,11 @@ #pragma warning(disable:4244) //"conversion from 'type1' to 'type2', possible loss of data" +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif -typedef struct PTMFILEHEADER +typedef struct PACKED PTMFILEHEADER { CHAR songname[28]; // name of song, asciiz string CHAR eof; // 26 @@ -37,8 +39,9 @@ WORD patseg[128]; // pattern offsets (*16) } PTMFILEHEADER, *LPPTMFILEHEADER; +STATIC_ASSERT(sizeof(PTMFILEHEADER) == 608); -typedef struct PTMSAMPLE +typedef struct PACKED PTMSAMPLE { BYTE sampletype; // sample type (bit array) CHAR filename[12]; // name of external sample file @@ -54,7 +57,11 @@ DWORD ptms_id; // sample identification, 'PTMS' or 0x534d5450 } PTMSAMPLE; +STATIC_ASSERT(sizeof(PTMSAMPLE) == 80); + +#ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) +#endif bool CSoundFile::ReadPTM(const BYTE *lpStream, const DWORD dwMemLength) Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -149,10 +149,12 @@ } +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif // S3M File Header -struct S3MFileHeader +struct PACKED S3MFileHeader { // Magic Bytes enum S3MMagic @@ -233,7 +235,7 @@ // S3M Sample Header -struct S3MSampleHeader +struct PACKED S3MSampleHeader { enum SampleMagic { @@ -401,7 +403,10 @@ STATIC_ASSERT(sizeof(S3MSampleHeader) == 80); + +#ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) +#endif // Functor for fixing PixPlay 4-Bit Zxx panning commands Modified: trunk/OpenMPT/soundlib/Load_stm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_stm.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/Load_stm.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -14,10 +14,13 @@ #pragma warning(disable:4244) //"conversion from 'type1' to 'type2', possible loss of data" +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif + // STM sample header struct -struct STMSampleHeader +struct PACKED STMSampleHeader { char filename[12]; // Can't have long comments - just filename comments :) uint8 zero; @@ -69,9 +72,11 @@ } }; +STATIC_ASSERT(sizeof(STMSampleHeader) == 32); + // STM file header -struct STMFileHeader +struct PACKED STMFileHeader { char songname[20]; char trackername[8]; // !SCREAM! for ST 2.xx @@ -87,9 +92,11 @@ uint8 order[128]; // Order list }; +STATIC_ASSERT(sizeof(STMFileHeader) == 1168); + // Pattern note entry -struct STMPatternEntry +struct PACKED STMPatternEntry { uint8 note; uint8 insvol; @@ -97,11 +104,14 @@ uint8 cmdinf; }; +STATIC_ASSERT(sizeof(STMPatternEntry) == 4); + +#ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) +#endif - bool CSoundFile::ReadSTM(FileReader &file) //---------------------------------------- { Modified: trunk/OpenMPT/soundlib/Load_ult.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ult.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/Load_ult.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -12,9 +12,11 @@ #include "stdafx.h" #include "Loaders.h" +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif -struct UltFileHeader +struct PACKED UltFileHeader { char signature[14]; // "MAS_UTrack_V00" uint8 version; // '1'...'4' @@ -25,7 +27,7 @@ STATIC_ASSERT(sizeof(UltFileHeader) == 48); -struct UltSample +struct PACKED UltSample { enum UltSampleFlags { @@ -97,7 +99,9 @@ STATIC_ASSERT(sizeof(UltSample) == 66); +#ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) +#endif /* Unhandled effects: 5x1 - do not loop sample (x is unused) Modified: trunk/OpenMPT/soundlib/Load_umx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_umx.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/Load_umx.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -12,10 +12,12 @@ #include "stdafx.h" #include "Loaders.h" +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif // UMX File Header -struct UMXFileHeader +struct PACKED UMXFileHeader { // Magic Bytes enum UMXMagic @@ -49,7 +51,11 @@ } }; +STATIC_ASSERT(sizeof(UMXFileHeader) == 36); + +#ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) +#endif // Read compressed unreal integers - similar to MIDI integers, but signed values are possible. Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -879,9 +879,9 @@ { DWORD d = 0x4944494D; fwrite(&d, 1, 4, f); - d = sizeof(MIDIMacroConfig); + d = sizeof(MIDIMacroConfigData); fwrite(&d, 1, 4, f); - fwrite(&m_MidiCfg, 1, sizeof(MIDIMacroConfig), f); + fwrite(static_cast<MIDIMacroConfigData*>(&m_MidiCfg), 1, sizeof(MIDIMacroConfigData), f); } // Writing Pattern Names const PATTERNINDEX numNamedPats = Patterns.GetNumNamedPatterns(); Modified: trunk/OpenMPT/soundlib/MIDIMacros.h =================================================================== --- trunk/OpenMPT/soundlib/MIDIMacros.h 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/MIDIMacros.h 2013-04-16 22:00:18 UTC (rev 1895) @@ -69,17 +69,25 @@ #define NUM_MACROS 16 // number of parametered macros #define MACRO_LENGTH 32 // max number of chars per macro -//=================== -class MIDIMacroConfig -//=================== -{ -public: +#ifdef NEEDS_PRAGMA_PACK +#pragma pack(push, 1) +#endif +struct PACKED MIDIMacroConfigData +{ char szMidiGlb[9][MACRO_LENGTH]; // Global MIDI macros char szMidiSFXExt[16][MACRO_LENGTH]; // Parametric MIDI macros char szMidiZXXExt[128][MACRO_LENGTH]; // Fixed MIDI macros +}; +STATIC_ASSERT(sizeof(MIDIMacroConfigData) == 4896); // this is directly written to files, so the size must be correct! + +//======================================================= +class PACKED MIDIMacroConfig : public MIDIMacroConfigData +//======================================================= +{ + public: MIDIMacroConfig() { Reset(); }; @@ -149,4 +157,8 @@ }; -STATIC_ASSERT(sizeof(MIDIMacroConfig) == 4896); // this is directly written to files, so the size must be correct! +STATIC_ASSERT(sizeof(MIDIMacroConfig) == sizeof(MIDIMacroConfigData)); // this is directly written to files, so the size must be correct! + +#ifdef NEEDS_PRAGMA_PACK +#pragma pack(pop) +#endif Modified: trunk/OpenMPT/soundlib/Mmcmp.cpp =================================================================== --- trunk/OpenMPT/soundlib/Mmcmp.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/Mmcmp.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -304,9 +304,11 @@ // XPK unpacker // +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif -typedef struct _XPKFILEHEADER +typedef struct PACKED _XPKFILEHEADER { DWORD dwXPKF; DWORD dwSrcLen; @@ -316,7 +318,11 @@ DWORD dwReserved; } XPKFILEHEADER, *PXPKFILEHEADER; +STATIC_ASSERT(sizeof(XPKFILEHEADER) == 36); + +#ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) +#endif static int bfextu(const BYTE *p,int bo,int bc) Modified: trunk/OpenMPT/soundlib/SampleFormats.cpp =================================================================== --- trunk/OpenMPT/soundlib/SampleFormats.cpp 2013-04-16 21:24:09 UTC (rev 1894) +++ trunk/OpenMPT/soundlib/SampleFormats.cpp 2013-04-16 22:00:18 UTC (rev 1895) @@ -560,9 +560,12 @@ ///////////////////////////////////////////////////////////// // GUS Patches +#ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) +#endif -typedef struct GF1PATCHFILEHEADER + +typedef struct PACKED GF1PATCHFILEHEADER { DWORD gf1p; // "GF1P" DWORD atch; // "ATCH" @@ -578,8 +581,10 @@ BYTE reserved2[36]; } GF1PATCHFILEHEADER; +STATIC_ASSERT(sizeof(GF1PATCHFILEHEADER) == 129); -typedef struct GF1INSTRUMENT + +typedef struct PACKED GF1INSTRUMENT { WORD id; // Instrument id: 0-65535 CHAR name[16]; // Name of instrument. Gravis doesn't seem to use it @@ -588,8 +593,10 @@ BYTE reserved[40]; } GF1INSTRUMENT; +STATIC_ASSERT(sizeof(GF1INSTRUMENT) == 63); -typedef struct GF1SAMPLEHEADER + +typedef struct PACKED GF1SAMPLEHEADER { CHAR name[7]; // null terminated string. name of the wave. BYTE fractions; // Start loop point fraction in 4 bits + End loop point fraction in the 4 other bits. @@ -610,6 +617,8 @@ BYTE reserved[36]; } GF1SAMPLEHEADER; +STATIC_ASSERT(sizeof(GF1SAMPLEHEADER) == 96); + // -- GF1 Envelopes -- // // It can be represented like this (the envelope is totally bogus, it is @@... [truncated message content] |