From: <sag...@us...> - 2011-03-08 13:11:07
|
Revision: 813 http://modplug.svn.sourceforge.net/modplug/?rev=813&view=rev Author: saga-games Date: 2011-03-08 13:10:59 +0000 (Tue, 08 Mar 2011) Log Message: ----------- [Fix] S3M Loader: Fix to pattern loader (for empty patterns)... God this code is so ugly! [Mod] Updated internet links. Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/soundlib/Load_s3m.cpp Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2011-03-07 16:33:26 UTC (rev 812) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2011-03-08 13:10:59 UTC (rev 813) @@ -92,16 +92,8 @@ ON_COMMAND(ID_PANIC, OnPanic) ON_COMMAND(ID_PLAYER_PAUSE, OnPlayerPause) ON_COMMAND_EX(IDD_TREEVIEW, OnBarCheck) - ON_COMMAND_EX(ID_NETLINK_OPENMPTWIKI, OnInternetLink) ON_COMMAND_EX(ID_NETLINK_MODPLUG, OnInternetLink) - ON_COMMAND_EX(ID_NETLINK_UT, OnInternetLink) - ON_COMMAND_EX(ID_NETLINK_OSMUSIC, OnInternetLink) - ON_COMMAND_EX(ID_NETLINK_MPTFR, OnInternetLink) - ON_COMMAND_EX(ID_NETLINK_HANDBOOK, OnInternetLink) - ON_COMMAND_EX(ID_NETLINK_FORUMS, OnInternetLink) - ON_COMMAND_EX(ID_NETLINK_PLUGINS, OnInternetLink) - ON_COMMAND_EX(ID_NETLINK_OPENMPTWIKI_GERMAN, OnInternetLink) - ON_COMMAND_EX(ID_NETLINK_MODARCHIVE, OnInternetLink) + ON_COMMAND_EX(ID_NETLINK_TOP_PICKS, OnInternetLink) ON_CBN_SELCHANGE(IDC_COMBO_BASEOCTAVE, OnOctaveChanged) ON_UPDATE_COMMAND_UI(ID_MIDI_RECORD, OnUpdateMidiRecord) ON_UPDATE_COMMAND_UI(ID_INDICATOR_TIME, OnUpdateTime) @@ -2801,6 +2793,8 @@ switch(nID) { case ID_NETLINK_MODPLUG: pszURL = "http://openmpt.org/"; break; + case ID_NETLINK_TOP_PICKS: pszURL = "http://openmpt.org/top_picks"; break; + /* case ID_NETLINK_OPENMPTWIKI:pszURL = "http://wiki.openmpt.org/"; break; // case ID_NETLINK_UT: pszURL = "http://www.united-trackers.org"; break; // case ID_NETLINK_OSMUSIC: pszURL = "http://www.osmusic.net/"; break; @@ -2810,6 +2804,7 @@ case ID_NETLINK_PLUGINS: pszURL = "http://www.kvraudio.com/"; break; case ID_NETLINK_MODARCHIVE: pszURL = "http://modarchive.org/"; break; case ID_NETLINK_OPENMPTWIKI_GERMAN: pszURL = "http://wikide.openmpt.org/Hauptseite"; break; + */ } if (pszURL) return CTrackApp::OpenURL(pszURL); return FALSE; Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2011-03-07 16:33:26 UTC (rev 812) +++ trunk/OpenMPT/mptrack/mptrack.rc 2011-03-08 13:10:59 UTC (rev 813) @@ -2031,15 +2031,8 @@ MENUITEM "&Search...", ID_HELP_SEARCH MENUITEM "&Report a bug", ID_REPORT_BUG MENUITEM SEPARATOR - POPUP "&Internet" - BEGIN - MENUITEM "ModPlug Central &Forums", ID_NETLINK_FORUMS - MENUITEM "OpenMPT Wiki", ID_NETLINK_OPENMPTWIKI - MENUITEM "OpenMPT Wiki (German)", ID_NETLINK_OPENMPTWIKI_GERMAN - MENUITEM "MPT-FR", ID_NETLINK_MPTFR - MENUITEM "&Kvr Audio (plugins)", ID_NETLINK_PLUGINS - MENUITEM "The Mod Archive", ID_NETLINK_MODARCHIVE - END + MENUITEM "&OpenMPT Website", ID_NETLINK_MODPLUG + MENUITEM "&Web Resources", ID_NETLINK_TOP_PICKS MENUITEM SEPARATOR MENUITEM "&About OpenMPT...", ID_APP_ABOUT END @@ -2371,10 +2364,8 @@ ID_PATTERN_EXPAND "Expand pattern\nExpand Pattern" ID_PATTERN_SHRINK "Shrink Pattern\nShrink Pattern" ID_HELP_SEARCH "Displays the help index\nHelp Index" - ID_NETLINK_MODPLUG "Go to ModPlug Central" - ID_NETLINK_UT "Go to United Trackers" - ID_NETLINK_OSMUSIC "Go to OSMusic.net" - ID_NETLINK_HANDBOOK "Go to the Tracker's Handbook" + ID_NETLINK_MODPLUG "Visit the OpenMPT website" + ID_NETLINK_TOP_PICKS "Visit our list of free web resources!" END STRINGTABLE @@ -2386,9 +2377,7 @@ BEGIN ID_SAMPLE_TRIM "Delete everything except the current selection\nTrim Sample" ID_FILE_SAVEMIDI "Export the current song to a standard MIDI file" - ID_NETLINK_FORUMS "Go to the ModPlug Central Music Forums" ID_INSTRUMENT_SAMPLEMAP "Edit the sample map" - ID_NETLINK_PLUGINS "Go to KVR Audio to download plugins" ID_PATTERNDETAIL_LO "Low pattern detail level\nLow pattern detail level" ID_PATTERNDETAIL_MED "Medium pattern detail level\nMedium pattern detail level" ID_PATTERNDETAIL_HI "High pattern detail level\nHigh pattern detail level" Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2011-03-07 16:33:26 UTC (rev 812) +++ trunk/OpenMPT/mptrack/resource.h 2011-03-08 13:10:59 UTC (rev 813) @@ -1036,17 +1036,13 @@ #define ID_PATTERNCOPY 32874 #define ID_PATTERNPASTE 32875 #define ID_NETLINK_MODPLUG 32876 -#define ID_NETLINK_UT 32877 -#define ID_NETLINK_OSMUSIC 32878 -#define ID_NETLINK_HANDBOOK 32879 +#define ID_NETLINK_TOP_PICKS 32877 #define ID_SAMPLE_TRIM 32880 #define ID_FILE_SAVEMIDI 32881 #define ID_MODTREE_OPENITEM 32882 -#define ID_NETLINK_FORUMS 32883 #define ID_CONTROLENTER 32885 #define ID_INSTRUMENT_SAMPLEMAP 32886 #define ID_SAMPLE_MONOCONVERT 32887 -#define ID_NETLINK_PLUGINS 32888 #define ID_SAMPLE_ZOOMUP 32889 #define ID_SAMPLE_ZOOMDOWN 32890 #define ID_PATTERNDETAIL_LO 32891 @@ -1116,7 +1112,6 @@ #define ID_VSTPRESETBACKWARDJUMP 36031 #define ID_VSTPRESETFORWARDJUMP 36032 #define ID_SELECTINST 36100 -#define ID_NETLINK_MPTFR 37001 #define ID_PLUG_RECORDAUTOMATION 37003 #define ID_LEARN_MACRO_FROM_PLUGGUI 37004 #define ID_CHANGE_INSTRUMENT 37020 @@ -1152,10 +1147,7 @@ #define ID_ENVELOPE_TOGGLERELEASENODE 59206 #define ID_Menu59207 59207 #define ID_ENVELOPE_SCALEPOINTS 59208 -#define ID_NETLINK_OPENMPTWIKI 59210 #define ID_VIEW_MIDIMAPPING 59211 -#define ID_NETLINK_OPENMPTWIKI_GERMAN 59213 -#define ID_NETLINK_MODARCHIVE 59214 #define ID_PATTERN_DUPLICATECHANNEL 59216 #define ID_EDIT_GOTO_MENU 59220 #define ID_CLEANUP_COMPO 59221 Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2011-03-07 16:33:26 UTC (rev 812) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2011-03-08 13:10:59 UTC (rev 813) @@ -222,11 +222,13 @@ if ((!lpStream) || (dwMemLength <= sizeof(S3MFILEHEADER) + 64)) return false; UINT insnum, patnum, nins, npat; - DWORD insfile[128]; - WORD ptr[256]; BYTE s[1024]; DWORD dwMemPos; - BYTE insflags[128], inspack[128]; + vector<DWORD> smpdatapos; + vector<WORD> smppos; + vector<WORD> patpos; + vector<BYTE> insflags; + vector<BYTE> inspack; S3MFILEHEADER psfh = *(S3MFILEHEADER *)lpStream; bool bKeepMidiMacros = false, bHasAdlibPatches = false; @@ -321,44 +323,46 @@ m_nSamples = insnum; patnum = npat = psfh.patnum; if (patnum > MAX_PATTERNS) patnum = MAX_PATTERNS; - memset(ptr, 0, sizeof(ptr)); - // this seems to be corrupted, the table can't really hold that many values. - if(nins + npat > 256) - return false; - - if (nins + npat) + // Read sample header offsets + smppos.resize(nins, 0); + for(UINT i = 0; i < nins; i++, dwMemPos += 2) { - memcpy(ptr, lpStream + dwMemPos, 2 * (nins + npat)); - dwMemPos += 2 * (nins + npat); - const UINT nLoopEnd = min(256, nins + npat); - for(UINT j = 0; j < nLoopEnd; ++j) + WORD ptr = *((WORD *)(lpStream + dwMemPos)); + smppos[i] = LittleEndianW(ptr); + } + // Read pattern offsets + patpos.resize(npat, 0); + for(UINT i = 0; i < npat; i++, dwMemPos += 2) + { + WORD ptr = *((WORD *)(lpStream + dwMemPos)); + patpos[i] = LittleEndianW(ptr); + } + // Read channel panning + if (psfh.panning_present == 0xFC) + { + const BYTE *chnpan = lpStream+dwMemPos; + for (UINT i=0; i<32; i++) if (chnpan[i] & 0x20) { - ptr[j] = LittleEndianW(ptr[j]); + ChnSettings[i].nPan = ((chnpan[i] & 0x0F) << 4) + 8; } - if (psfh.panning_present == 252) - { - const BYTE *chnpan = lpStream+dwMemPos; - for (UINT i=0; i<32; i++) if (chnpan[i] & 0x20) - { - ChnSettings[i].nPan = ((chnpan[i] & 0x0F) << 4) + 8; - } - } } - if (!m_nChannels) return true; + // Reading instrument headers - memset(insfile, 0, sizeof(insfile)); + smpdatapos.resize(insnum, 0); + inspack.resize(insnum, 0); + insflags.resize(insnum, 0); for (UINT iSmp=1; iSmp<=insnum; iSmp++) { - UINT nInd = ((DWORD)ptr[iSmp-1])*16; + UINT nInd = ((DWORD)smppos[iSmp - 1]) * 16; if ((!nInd) || (nInd + 0x50 > dwMemLength)) continue; - memcpy(s, lpStream+nInd, 0x50); + memcpy(s, lpStream + nInd, 0x50); memcpy(Samples[iSmp].filename, s+1, 12); SpaceToNullStringFixed<12>(Samples[iSmp].filename); - insflags[iSmp-1] = s[0x1F]; - inspack[iSmp-1] = s[0x1E]; + insflags[iSmp - 1] = s[0x1F]; + inspack[iSmp - 1] = s[0x1E]; s[0x4C] = 0; lstrcpy(m_szNames[iSmp], (LPCSTR)&s[0x30]); SpaceToNullStringFixed<28>(m_szNames[iSmp]); @@ -378,7 +382,7 @@ if (c5Speed < 1024) c5Speed = 1024; Samples[iSmp].nC5Speed = c5Speed; - insfile[iSmp - 1] = (s[0x0E] << 4) | (s[0x0F] << 12) | (s[0x0D] << 20); + smpdatapos[iSmp - 1] = (s[0x0E] << 4) | (s[0x0F] << 12) | (s[0x0D] << 20); if(Samples[iSmp].nLoopEnd < 2) Samples[iSmp].nLoopStart = Samples[iSmp].nLoopEnd = 0; @@ -393,6 +397,8 @@ } } + if (!m_nChannels) return true; + /* Try to find out if Zxx commands are supposed to be panning commands (PixPlay). We won't convert if there are not enough Zxx commands, too "high" Zxx commands or there are only "left" or "right" pannings (we assume that stereo should be somewhat balanced) */ @@ -400,13 +406,13 @@ int iZxxCountRight = 0, iZxxCountLeft = 0; // Reading patterns - for (UINT iPat=0; iPat<patnum; iPat++) + for (UINT iPat = 0; iPat < patnum; iPat++) { - UINT nInd = ((DWORD)ptr[nins+iPat]) << 4; - if (nInd + 0x40 > dwMemLength) continue; - WORD len = LittleEndianW(*((WORD *)(lpStream+nInd))); + bool fail = Patterns.Insert(iPat, 64); + UINT nInd = ((DWORD)patpos[iPat]) * 16; + if (nInd == 0 || nInd + 0x40 > dwMemLength) continue; + WORD len = LittleEndianW(*((WORD *)(lpStream + nInd))); nInd += 2; - bool fail = Patterns.Insert(iPat, 64); if ((!len) || (nInd + len > dwMemLength - 6) || (fail) ) continue; LPBYTE src = (LPBYTE)(lpStream+nInd); @@ -426,7 +432,7 @@ UINT chn = b & 0x1F; if (chn < m_nChannels) { - MODCOMMAND *m = &p[row*m_nChannels+chn]; + MODCOMMAND *m = &p[row * m_nChannels + chn]; if (b & 0x20) { if(j + nInd + 2 >= dwMemLength) break; @@ -498,15 +504,15 @@ } // Reading samples - for (UINT iRaw = 1; iRaw <= insnum; iRaw++) if ((Samples[iRaw].nLength) && (insfile[iRaw - 1])) + for (UINT iRaw = 1; iRaw <= insnum; iRaw++) if ((Samples[iRaw].nLength) && (smpdatapos[iRaw - 1])) { UINT flags = (psfh.version == 1) ? RS_PCM8S : RS_PCM8U; if (insflags[iRaw-1] & 4) flags += 5; if (insflags[iRaw-1] & 2) flags |= RSF_STEREO; if (inspack[iRaw-1] == 4) flags = RS_ADPCM4; - if(insfile[iRaw - 1] < dwMemLength) + if(smpdatapos[iRaw - 1] < dwMemLength) { - dwMemPos = insfile[iRaw - 1]; + dwMemPos = smpdatapos[iRaw - 1]; } if(dwMemPos < dwMemLength) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |