From: <sag...@us...> - 2010-04-17 13:14:57
|
Revision: 569 http://modplug.svn.sourceforge.net/modplug/?rev=569&view=rev Author: saga-games Date: 2010-04-17 13:14:48 +0000 (Sat, 17 Apr 2010) Log Message: ----------- [Fix] IT Loader: ChibiTracker uses \n instead of \r in the IT comment text, which was not handled properly. [Fix] S3M Loader: Slightly improved the AdLib instrument detection. [Ref] Using #defined constants for sample (file)name length now. [Ref] Some more refactoring, especially in the j2b loader. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/view_com.cpp trunk/OpenMPT/soundlib/Dlsbank.cpp trunk/OpenMPT/soundlib/IT_DEFS.H trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Sampleio.cpp trunk/OpenMPT/soundlib/Snd_defs.h trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp trunk/OpenMPT/soundlib/load_j2b.cpp trunk/OpenMPT/soundlib/modcommand.h Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2010-04-14 21:31:59 UTC (rev 568) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2010-04-17 13:14:48 UTC (rev 569) @@ -306,7 +306,7 @@ { wsprintf(s, "%d: ", j); UINT l = strlen(s); - memcpy(s+l, pSndFile->m_szNames[j], 32); + memcpy(s+l, pSndFile->m_szNames[j], MAX_SAMPLENAME); s[l+32] = 0; AppendMenu(hSubMenu, MF_STRING, ID_NOTEMAP_EDITSAMPLE+j, s); } Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2010-04-14 21:31:59 UTC (rev 568) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2010-04-17 13:14:48 UTC (rev 569) @@ -615,11 +615,11 @@ wsprintf(s, "%d-bit %s, len: %d", pSmp->GetElementarySampleSize() * 8, (pSmp->uFlags & CHN_STEREO) ? "stereo" : "mono", pSmp->nLength); SetDlgItemText(IDC_TEXT5, s); // Name - memcpy(s, m_pSndFile->m_szNames[m_nSample], 32); + memcpy(s, m_pSndFile->m_szNames[m_nSample], MAX_SAMPLENAME); s[31] = 0; SetDlgItemText(IDC_SAMPLE_NAME, s); // File Name - memcpy(s, pSmp->filename, 22); + memcpy(s, pSmp->filename, MAX_SAMPLEFILENAME); s[21] = 0; if (m_pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) s[0] = 0; SetDlgItemText(IDC_SAMPLE_FILENAME, s); @@ -791,16 +791,16 @@ // MOD/XM strcat(szFullFilename, szExt); szFullFilename[31] = 0; - memcpy(m_pSndFile->m_szNames[m_nSample], szFullFilename, 32); + memcpy(m_pSndFile->m_szNames[m_nSample], szFullFilename, MAX_SAMPLENAME); } else { // S3M/IT szFullFilename[31] = 0; - if (!m_pSndFile->m_szNames[m_nSample][0]) memcpy(m_pSndFile->m_szNames[m_nSample], szFullFilename, 32); + if (!m_pSndFile->m_szNames[m_nSample][0]) memcpy(m_pSndFile->m_szNames[m_nSample], szFullFilename, MAX_SAMPLENAME); if (strlen(szFullFilename) < 9) strcat(szFullFilename, szExt); } szFullFilename[21] = 0; - memcpy(pSmp->filename, szFullFilename, 22); + memcpy(pSmp->filename, szFullFilename, MAX_SAMPLEFILENAME); } if ((m_pSndFile->m_nType & MOD_TYPE_XM) && (!(pSmp->uFlags & CHN_PANNING))) { @@ -980,11 +980,11 @@ } if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) { - memcpy(szFileName, m_pSndFile->Samples[m_nSample].filename, 22); + memcpy(szFileName, m_pSndFile->Samples[m_nSample].filename, MAX_SAMPLEFILENAME); szFileName[22] = 0; } else { - memcpy(szFileName, m_pSndFile->m_szNames[m_nSample], 32); + memcpy(szFileName, m_pSndFile->m_szNames[m_nSample], MAX_SAMPLENAME); szFileName[32] = 0; } if (!szFileName[0]) strcpy(szFileName, "untitled"); } @@ -2313,9 +2313,9 @@ m_EditName.GetWindowText(s, sizeof(s)); for (UINT i=strlen(s); i<32; i++) s[i] = 0; s[31] = 0; - if (strncmp(s, m_pSndFile->m_szNames[m_nSample], 32)) + if (strncmp(s, m_pSndFile->m_szNames[m_nSample], MAX_SAMPLENAME)) { - memcpy(m_pSndFile->m_szNames[m_nSample], s, 32); + memcpy(m_pSndFile->m_szNames[m_nSample], s, MAX_SAMPLENAME); m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | (HINT_SMPNAMES|HINT_SAMPLEINFO), this); m_pModDoc->UpdateAllViews(NULL, HINT_INSNAMES, this); m_pModDoc->SetModified(); @@ -2333,9 +2333,9 @@ m_EditFileName.GetWindowText(s, sizeof(s)); s[21] = 0; for (UINT i=strlen(s); i<22; i++) s[i] = 0; - if (strncmp(s, m_pSndFile->Samples[m_nSample].filename, 22)) + if (strncmp(s, m_pSndFile->Samples[m_nSample].filename, MAX_SAMPLEFILENAME)) { - memcpy(m_pSndFile->Samples[m_nSample].filename, s, 22); + memcpy(m_pSndFile->Samples[m_nSample].filename, s, MAX_SAMPLEFILENAME); m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEINFO, this); if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified(); } Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2010-04-14 21:31:59 UTC (rev 568) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2010-04-17 13:14:48 UTC (rev 569) @@ -947,7 +947,8 @@ { UINT command = m->command & 0x3F; int n = (pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) ? gszModCommands[command] : gszS3mCommands[command]; - if (n <= ' ') n = '?'; + ASSERT(n > ' '); + //if (n <= ' ') n = '?'; DrawLetter(xbmp+x, 0, (char)n, pfnt->nEltWidths[3], pfnt->nCmdOfs); } else { @@ -1472,7 +1473,7 @@ if ((nsmp) && (nsmp <= pSndFile->m_nSamples)) { CHAR sztmp2[64] = ""; - memcpy(sztmp2, pSndFile->m_szNames[nsmp], 32); + memcpy(sztmp2, pSndFile->m_szNames[nsmp], MAX_SAMPLENAME); sztmp2[32] = 0; if (sztmp2[0]) { @@ -1485,7 +1486,7 @@ { if (m->instr <= pSndFile->m_nSamples) { - memcpy(sztmp, pSndFile->m_szNames[m->instr], 32); + memcpy(sztmp, pSndFile->m_szNames[m->instr], MAX_SAMPLENAME); sztmp[32] = 0; } } Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2010-04-14 21:31:59 UTC (rev 568) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2010-04-17 13:14:48 UTC (rev 569) @@ -1421,7 +1421,8 @@ { CHAR s[256]; DWORD dwPos = ScreenToSample(pt.x); - if (dwPos <= pSmp->nLength) { + if (dwPos <= pSmp->nLength) + { //Set loop points wsprintf(s, "Set Loop Start to:\t%d", dwPos); ::AppendMenu(hMenu, MF_STRING|((dwPos+4<=pSmp->nLoopEnd)?0:MF_GRAYED), @@ -1475,7 +1476,7 @@ // if there's no selection, but loop points //::AppendMenu(hMenu, MF_STRING|(m_dwEndSel>m_dwBeginSel)?0:MF_GRAYED, // ID_SAMPLE_TRIM, "Trim\t" + ih->GetKeyTextFromCommand(kcSampleTrim)); - ::AppendMenu(hMenu, MF_STRING|(bIsGrayed)?MF_GRAYED:0, ID_SAMPLE_TRIM, sTrimMenuText.c_str()); + ::AppendMenu(hMenu, MF_STRING|(bIsGrayed) ? MF_GRAYED : 0, ID_SAMPLE_TRIM, sTrimMenuText.c_str()); ::AppendMenu(hMenu, MF_STRING, ID_EDIT_CUT, "Cut\t" + ih->GetKeyTextFromCommand(kcEditCut)); ::AppendMenu(hMenu, MF_STRING, ID_EDIT_COPY, "Copy\t" + ih->GetKeyTextFromCommand(kcEditCopy)); } @@ -1857,8 +1858,8 @@ pxh->xtra_len += 32; if (pSmp->filename[0]) { - memcpy(pszText+32, pSmp->filename, 22); - pxh->xtra_len += 22; + memcpy(pszText + 32, pSmp->filename, MAX_SAMPLEFILENAME); + pxh->xtra_len += MAX_SAMPLEFILENAME; } } phdr->filesize += sizeof(WAVESMPLHEADER) + pxh->xtra_len + 8; Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-04-14 21:31:59 UTC (rev 568) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-04-17 13:14:48 UTC (rev 569) @@ -1337,7 +1337,7 @@ if (pSndFile->Instruments[i]) memcpy(s+k, pSndFile->Instruments[i]->name, 32); } else - memcpy(s+k, pSndFile->m_szNames[i], 32); + memcpy(s+k, pSndFile->m_szNames[i], MAX_SAMPLENAME); s[k+32] = 0; combo->SetItemData(combo->AddString(s), i); } Modified: trunk/OpenMPT/mptrack/view_com.cpp =================================================================== --- trunk/OpenMPT/mptrack/view_com.cpp 2010-04-14 21:31:59 UTC (rev 568) +++ trunk/OpenMPT/mptrack/view_com.cpp 2010-04-17 13:14:48 UTC (rev 569) @@ -247,7 +247,7 @@ switch(iCol) { case SMPLIST_SAMPLENAME: - lstrcpyn(s, pSndFile->m_szNames[iSmp+1], 32); + lstrcpyn(s, pSndFile->m_szNames[iSmp+1], MAX_SAMPLENAME); break; case SMPLIST_SAMPLENO: wsprintf(s, "%02d", iSmp+1); Modified: trunk/OpenMPT/soundlib/Dlsbank.cpp =================================================================== --- trunk/OpenMPT/soundlib/Dlsbank.cpp 2010-04-14 21:31:59 UTC (rev 568) +++ trunk/OpenMPT/soundlib/Dlsbank.cpp 2010-04-17 13:14:48 UTC (rev 569) @@ -1592,7 +1592,7 @@ if (pSndFile->m_nType & MOD_TYPE_XM) psmp->uFlags |= CHN_PANNING; } } - if (pDlsIns->szName[0]) memcpy(pSndFile->m_szNames[nSample], pDlsIns->szName, 31); + if (pDlsIns->szName[0]) memcpy(pSndFile->m_szNames[nSample], pDlsIns->szName, MAX_SAMPLENAME - 1); bOk = TRUE; } FreeWaveForm(pWaveForm); Modified: trunk/OpenMPT/soundlib/IT_DEFS.H =================================================================== --- trunk/OpenMPT/soundlib/IT_DEFS.H 2010-04-14 21:31:59 UTC (rev 568) +++ trunk/OpenMPT/soundlib/IT_DEFS.H 2010-04-17 13:14:48 UTC (rev 569) @@ -25,7 +25,7 @@ BYTE pwd; // pitch wheel depth WORD msglength; DWORD msgoffset; - DWORD reserved; + DWORD reserved; // ChibiTracker writes "CHBI" here. BYTE chnpan[64]; BYTE chnvol[64]; } ITFILEHEADER; Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2010-04-14 21:31:59 UTC (rev 568) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2010-04-17 13:14:48 UTC (rev 569) @@ -1030,6 +1030,15 @@ { memcpy(m_lpszSongComments, lpStream+pifh->msgoffset, pifh->msglength); m_lpszSongComments[pifh->msglength] = 0; + // ChibiTracker uses \n instead of \r. + if(pifh->cwtv == 0x0214 && pifh->cmwt == 0x0214 && LittleEndian(pifh->reserved) == 0x49424843) + { + for(size_t i = 0; i < pifh->msglength; i++) + { + if(m_lpszSongComments[i] == '\n') + m_lpszSongComments[i] = '\r'; + } + } } } // Reading orders Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2010-04-14 21:31:59 UTC (rev 568) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2010-04-17 13:14:48 UTC (rev 569) @@ -393,7 +393,7 @@ Samples[iSmp].nLoopStart = Samples[iSmp].nLoopEnd = 0; Samples[iSmp].nPan = 0x80; //ASSERT(iLooplength == 0 || iLooplength > 4); - } else if(s[0] == S3I_TYPE_ADMEL) + } else if(s[0] >= S3I_TYPE_ADMEL) { bHasAdlibPatches = true; } Modified: trunk/OpenMPT/soundlib/Sampleio.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sampleio.cpp 2010-04-14 21:31:59 UTC (rev 568) +++ trunk/OpenMPT/soundlib/Sampleio.cpp 2010-04-17 13:14:48 UTC (rev 569) @@ -557,15 +557,15 @@ // Name present (clipboard only) UINT xtrabytes = pxh->xtra_len + 8 - sizeof(WAVEEXTRAHEADER); LPSTR pszTextEx = (LPSTR)(pxh+1); - if (xtrabytes >= 32) + if (xtrabytes >= MAX_SAMPLENAME) { - memcpy(m_szNames[nSample], pszTextEx, 31); - pszTextEx += 32; - xtrabytes -= 32; - if (xtrabytes >= 22) + memcpy(m_szNames[nSample], pszTextEx, MAX_SAMPLENAME - 1); + pszTextEx += MAX_SAMPLENAME; + xtrabytes -= MAX_SAMPLENAME; + if (xtrabytes >= MAX_SAMPLEFILENAME) { - memcpy(pSmp->filename, pszTextEx, 22); - xtrabytes -= 22; + memcpy(pSmp->filename, pszTextEx, MAX_SAMPLEFILENAME); + xtrabytes -= MAX_SAMPLEFILENAME; } } } Modified: trunk/OpenMPT/soundlib/Snd_defs.h =================================================================== --- trunk/OpenMPT/soundlib/Snd_defs.h 2010-04-14 21:31:59 UTC (rev 568) +++ trunk/OpenMPT/soundlib/Snd_defs.h 2010-04-17 13:14:48 UTC (rev 569) @@ -75,6 +75,9 @@ #define MAX_ENVPOINTS 240 #define MIN_PERIOD 0x0020 #define MAX_PERIOD 0xFFFF +// String lengths +#define MAX_SAMPLENAME 32 // also affects module name! +#define MAX_SAMPLEFILENAME 22 #define MAX_PATTERNNAME 32 #define MAX_CHANNELNAME 20 #define MAX_INFONAME 80 @@ -136,7 +139,7 @@ #define CHN_KEYOFF 0x200 // exit sustain #define CHN_NOTEFADE 0x400 // fade note (instrument mode) #define CHN_SURROUND 0x800 // use surround channel -#define CHN_NOIDO 0x1000 // ??? +#define CHN_NOIDO 0x1000 // Indicates if the channel is near enough to an exact multiple of the base frequency that any interpolation won't be noticeable - or if interpolation was switched off completely. --Storlek #define CHN_HQSRC 0x2000 // ??? #define CHN_FILTER 0x4000 // filtered output #define CHN_VOLUMERAMP 0x8000 // ramp volume @@ -391,4 +394,11 @@ INST_NUMFILTERMODES };*/ +// Vibrato Types +#define VIB_SINE 0 +#define VIB_SQUARE 1 +#define VIB_RAMP_UP 2 +#define VIB_RAMP_DOWN 3 +#define VIB_RANDOM 4 + #endif Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2010-04-14 21:31:59 UTC (rev 568) +++ trunk/OpenMPT/soundlib/Sndfile.h 2010-04-17 13:14:48 UTC (rev 569) @@ -41,7 +41,7 @@ BYTE nVibDepth; BYTE nVibRate; CHAR name[32]; - CHAR filename[22]; + CHAR filename[MAX_SAMPLEFILENAME]; // Return the size of one (elementary) sample in bytes. uint8 GetElementarySampleSize() const {return (uFlags & CHN_16BIT) ? 2 : 1;} @@ -596,7 +596,7 @@ MODSAMPLE Samples[MAX_SAMPLES]; // Sample Headers MODINSTRUMENT *Instruments[MAX_INSTRUMENTS]; // Instrument Headers MODINSTRUMENT m_defaultInstrument; // Currently only used to get default values for extented properties. - CHAR m_szNames[MAX_SAMPLES][32]; // Song and sample names + CHAR m_szNames[MAX_SAMPLES][MAX_SAMPLENAME]; // Song and sample names MODMIDICFG m_MidiCfg; // Midi macro config table SNDMIXPLUGIN m_MixPlugins[MAX_MIXPLUGINS]; // Mix plugins SNDMIXSONGEQ m_SongEQ; // Default song EQ preset Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2010-04-14 21:31:59 UTC (rev 568) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2010-04-17 13:14:48 UTC (rev 569) @@ -872,7 +872,8 @@ { int nchn32 = 0; MODCHANNEL *pChn = Chn; - for (UINT nChn=0; nChn<m_nChannels; nChn++,pChn++) { + for (UINT nChn=0; nChn<m_nChannels; nChn++,pChn++) + { //if(!(pChn->dwFlags & CHN_MUTE)) //removed by rewbs: fix http://www.modplug.com/forum/viewtopic.php?t=3358 nchn32++; } @@ -880,7 +881,8 @@ DWORD mastervol; - if (m_pConfig->getUseGlobalPreAmp()) { + if (m_pConfig->getUseGlobalPreAmp()) + { int realmastervol = m_nMasterVolume; if (realmastervol > 0x80) { //Attenuate global pre-amp depending on num channels @@ -909,7 +911,7 @@ // Update channels data m_nMixChannels = 0; MODCHANNEL *pChn = Chn; - for (UINT nChn=0; nChn<MAX_CHANNELS; nChn++,pChn++) + for (UINT nChn = 0; nChn < MAX_CHANNELS; nChn++, pChn++) { skipchn: @@ -937,8 +939,9 @@ pChn++; } } - if (nChn < MAX_CHANNELS) goto skipchn; - goto done; + if (nChn < MAX_CHANNELS) + goto skipchn; // >:( + break; } // Reset channel data pChn->nInc = 0; @@ -973,13 +976,12 @@ { if(!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) || GetModFlag(MSF_OLDVOLSWING)) { - vol = pChn->nVolume + pChn->nVolSwing; + vol += pChn->nVolSwing; } else { pChn->nVolume += pChn->nVolSwing; - if(pChn->nVolume > 256) pChn->nVolume = 256; - if(pChn->nVolume < 0) pChn->nVolume = 0; + pChn->nVolume = CLAMP(pChn->nVolume, 0, 256); vol = pChn->nVolume; pChn->nVolSwing = 0; } @@ -1034,7 +1036,8 @@ // IT compatibility 12. / 13.: Tremor if(IsCompatibleMode(TRK_IMPULSETRACKER)) { - if ((pChn->nTremorCount & 128) && pChn->nLength) { + if ((pChn->nTremorCount & 128) && pChn->nLength) + { if (pChn->nTremorCount == 128) pChn->nTremorCount = (pChn->nTremorParam >> 4) | 192; else if (pChn->nTremorCount == 192) @@ -1934,7 +1937,7 @@ pChn->nLength = 0; } } -done: + // Checking Max Mix Channels reached: ordering by volume if ((m_nMixChannels >= m_nMaxMixChannels) && (!(gdwSoundSetup & SNDMIX_DIRECTTODISK))) { Modified: trunk/OpenMPT/soundlib/load_j2b.cpp =================================================================== --- trunk/OpenMPT/soundlib/load_j2b.cpp 2010-04-14 21:31:59 UTC (rev 568) +++ trunk/OpenMPT/soundlib/load_j2b.cpp 2010-04-17 13:14:48 UTC (rev 569) @@ -17,84 +17,84 @@ // header for compressed j2b files struct J2BHEADER { - DWORD signature; // MUSE - DWORD deadbeaf; // 0xDEADBEAF (AM) or 0xDEADBABE (AMFF) - DWORD j2blength; // complete filesize - DWORD crc32; // checksum of the compressed data block - DWORD packed_length; // length of the compressed data block - DWORD unpacked_length; // length of the decompressed module + uint32 signature; // MUSE + uint32 deadbeaf; // 0xDEADBEAF (AM) or 0xDEADBABE (AMFF) + uint32 j2blength; // complete filesize + uint32 crc32; // checksum of the compressed data block + uint32 packed_length; // length of the compressed data block + uint32 unpacked_length; // length of the decompressed module }; // am(ff) stuff -struct RIFFCHUNK +struct AMFF_RIFFCHUNK { - DWORD signature; // "RIFF" - DWORD chunksize; // chunk size without header + uint32 signature; // "RIFF" + uint32 chunksize; // chunk size without header }; // this header is used for both AM's "INIT" as well as AMFF's "MAIN" chunk struct AMFFCHUNK_MAIN { - char songname[64]; - BYTE flags; - BYTE channels; - BYTE speed; - BYTE tempo; - DWORD unknown; - BYTE globalvolume; + char songname[64]; + uint8 flags; + uint8 channels; + uint8 speed; + uint8 tempo; + uint32 unknown; + uint8 globalvolume; }; struct AMFFCHUNK_INSTRUMENT { - BYTE unknown; // 0x00 - BYTE sample; // sample number + uint8 unknown; // 0x00 + uint8 sample; // sample number char name[28]; char stuff[195]; // lots of NULs? }; struct AMFFCHUNK_SAMPLE { - DWORD signature; // "SAMP" - DWORD chunksize; // header + sample size - char name[28]; - BYTE pan; - BYTE volume; - WORD flags; - DWORD length; - DWORD loopstart; - DWORD loopend; - DWORD samplerate; - DWORD reserved1; - DWORD reserved2; + uint32 signature; // "SAMP" + uint32 chunksize; // header + sample size + char name[28]; + uint8 pan; + uint8 volume; + uint16 flags; + uint32 length; + uint32 loopstart; + uint32 loopend; + uint32 samplerate; + uint32 reserved1; + uint32 reserved2; }; struct AMCHUNK_INSTRUMENT { - BYTE unknown; // 0x00 - BYTE sample; // sample number + uint8 unknown; // 0x00 + uint8 sample; // sample number char name[32]; }; struct AMCHUNK_SAMPLE { - DWORD signature; // "SAMP" - DWORD chunksize; // header + sample size - DWORD headsize; // header size - char name[32]; - WORD pan; - WORD volume; - WORD flags; - WORD unkown; - DWORD length; - DWORD loopstart; - DWORD loopend; - DWORD samplerate; + uint32 signature; // "SAMP" + uint32 chunksize; // header + sample size + uint32 headsize; // header size + char name[32]; + uint16 pan; + uint16 volume; + uint16 flags; + uint16 unkown; + uint32 length; + uint32 loopstart; + uint32 loopend; + uint32 samplerate; }; #pragma pack() -static BYTE riffam_efftrans[26] = +static uint8 riffam_efftrans[26] = { CMD_ARPEGGIO, CMD_PORTAMENTOUP, CMD_PORTAMENTODOWN, CMD_TONEPORTAMENTO, CMD_VIBRATO, CMD_TONEPORTAVOL, CMD_VIBRATOVOL, CMD_TREMOLO, @@ -126,7 +126,7 @@ MODCOMMAND *mrow = Patterns[nPat]; MODCOMMAND *m = mrow; ROWINDEX nRow = 0; - BYTE flags; + uint8 flags; while((nRow < nRows) && (dwMemPos < dwMemLength)) { @@ -245,29 +245,29 @@ DWORD dwMemPos = 0; - ASSERT_CAN_READ(sizeof(RIFFCHUNK)); - RIFFCHUNK *chunkheader = (RIFFCHUNK *)lpStream; + ASSERT_CAN_READ(sizeof(AMFF_RIFFCHUNK)); + AMFF_RIFFCHUNK *chunkheader = (AMFF_RIFFCHUNK *)lpStream; if(LittleEndian(chunkheader->signature) != 0x46464952 // "RIFF" - || LittleEndian(chunkheader->chunksize) != dwMemLength - sizeof(RIFFCHUNK) + || LittleEndian(chunkheader->chunksize) != dwMemLength - sizeof(AMFF_RIFFCHUNK) ) return false; - dwMemPos += sizeof(RIFFCHUNK); + dwMemPos += sizeof(AMFF_RIFFCHUNK); bool bIsAM; // false: AMFF, true: AM ASSERT_CAN_READ(4); - if(LittleEndian(*(DWORD *)(lpStream + dwMemPos)) == 0x46464D41) bIsAM = false; // "AMFF" - else if(LittleEndian(*(DWORD *)(lpStream + dwMemPos)) == 0x20204D41) bIsAM = true; // "AM " + if(LittleEndian(*(uint32 *)(lpStream + dwMemPos)) == 0x46464D41) bIsAM = false; // "AMFF" + else if(LittleEndian(*(uint32 *)(lpStream + dwMemPos)) == 0x20204D41) bIsAM = true; // "AM " else return false; dwMemPos += 4; // go through all chunks now while(dwMemPos < dwMemLength) { - ASSERT_CAN_READ(sizeof(RIFFCHUNK)); - chunkheader = (RIFFCHUNK *)(lpStream + dwMemPos); - dwMemPos += sizeof(RIFFCHUNK); + ASSERT_CAN_READ(sizeof(AMFF_RIFFCHUNK)); + chunkheader = (AMFF_RIFFCHUNK *)(lpStream + dwMemPos); + dwMemPos += sizeof(AMFF_RIFFCHUNK); ASSERT_CAN_READ(LittleEndian(chunkheader->chunksize)); DWORD dwChunkEnd = dwMemPos + LittleEndian(chunkheader->chunksize); @@ -380,17 +380,17 @@ if(bIsAM) { ASSERT_CAN_READ_CHUNK(4); - if(LittleEndian(*(DWORD *)(lpStream + dwMemPos)) != 0x20204941) break; // "AI " + if(LittleEndian(*(uint32 *)(lpStream + dwMemPos)) != 0x20204941) break; // "AI " dwMemPos += 4; - ASSERT_CAN_READ_CHUNK(sizeof(RIFFCHUNK)); - RIFFCHUNK *instchunk = (RIFFCHUNK *)(lpStream + dwMemPos); - dwMemPos += sizeof(RIFFCHUNK); + ASSERT_CAN_READ_CHUNK(sizeof(AMFF_RIFFCHUNK)); + AMFF_RIFFCHUNK *instchunk = (AMFF_RIFFCHUNK *)(lpStream + dwMemPos); + dwMemPos += sizeof(AMFF_RIFFCHUNK); ASSERT_CAN_READ_CHUNK(LittleEndian(instchunk->chunksize)); if(LittleEndian(instchunk->signature) != 0x54534E49) break; // "INST" ASSERT_CAN_READ_CHUNK(4); - DWORD dwHeadlen = LittleEndian(*(DWORD *)(lpStream + dwMemPos)); + DWORD dwHeadlen = LittleEndian(*(uint32 *)(lpStream + dwMemPos)); dwMemPos +=4 ; ASSERT_CAN_READ_CHUNK(sizeof(AMCHUNK_INSTRUMENT)); @@ -405,14 +405,14 @@ memcpy(m_szNames[nSmp], instheadchunk->name, 32); SpaceToNullStringFixed(m_szNames[nSmp], 31); - ASSERT_CAN_READ_CHUNK(sizeof(RIFFCHUNK)); - instchunk = (RIFFCHUNK *)(lpStream + dwMemPos); - dwMemPos += sizeof(RIFFCHUNK); + ASSERT_CAN_READ_CHUNK(sizeof(AMFF_RIFFCHUNK)); + instchunk = (AMFF_RIFFCHUNK *)(lpStream + dwMemPos); + dwMemPos += sizeof(AMFF_RIFFCHUNK); ASSERT_CAN_READ_CHUNK(LittleEndian(instchunk->chunksize)); if(LittleEndian(instchunk->signature) != 0x46464952) break; // yet another "RIFF"... ASSERT_CAN_READ_CHUNK(4); - if(LittleEndian(*(DWORD *)(lpStream + dwMemPos)) != 0x20205341) break; // "AS " (ain't this boring?) + if(LittleEndian(*(uint32 *)(lpStream + dwMemPos)) != 0x20205341) break; // "AS " (ain't this boring?) dwMemPos += 4; ASSERT_CAN_READ_CHUNK(sizeof(AMCHUNK_SAMPLE)); Modified: trunk/OpenMPT/soundlib/modcommand.h =================================================================== --- trunk/OpenMPT/soundlib/modcommand.h 2010-04-14 21:31:59 UTC (rev 568) +++ trunk/OpenMPT/soundlib/modcommand.h 2010-04-17 13:14:48 UTC (rev 569) @@ -59,17 +59,13 @@ // Returns true if and only if note is NOTE_PC or NOTE_PCS. bool IsPcNote() const {return note == NOTE_PC || note == NOTE_PCS;} - static bool IsPcNote(MODCOMMAND::NOTE note_id) {return note_id == NOTE_PC || note_id == NOTE_PCS;} + static bool IsPcNote(NOTE note_id) {return note_id == NOTE_PC || note_id == NOTE_PCS;} // Swap volume and effect column (doesn't do any conversion as it's mainly for importing formats with multiple effect columns, so beware!) void SwapEffects() { - VOLCMD vcold = volcmd; - VOL vold = vol; - volcmd = command; - vol = param; - command = vcold; - param = vold; + std::swap(volcmd, command); + std::swap(vol, param); } public: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |