|
From: <sag...@us...> - 2013-04-26 22:13:17
|
Revision: 1977
http://sourceforge.net/p/modplug/code/1977
Author: saga-games
Date: 2013-04-26 22:13:07 +0000 (Fri, 26 Apr 2013)
Log Message:
-----------
[Ref] Make all mod loaders reset global and channel settings to their defaults (in case some other loader already put some garbage there)
Modified Paths:
--------------
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_digi.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_wav.cpp
trunk/OpenMPT/soundlib/Load_xm.cpp
trunk/OpenMPT/soundlib/ModSequence.cpp
trunk/OpenMPT/soundlib/ModSequence.h
trunk/OpenMPT/soundlib/Sndfile.cpp
trunk/OpenMPT/soundlib/Sndfile.h
trunk/OpenMPT/soundlib/load_j2b.cpp
Modified: trunk/OpenMPT/soundlib/LOAD_AMF.CPP
===================================================================
--- trunk/OpenMPT/soundlib/LOAD_AMF.CPP 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/LOAD_AMF.CPP 2013-04-26 22:13:07 UTC (rev 1977)
@@ -114,22 +114,20 @@
return false;
}
+ InitializeGlobals();
+ InitializeChannels();
m_nType = MOD_TYPE_AMF0;
m_nChannels = 8;
- m_nInstruments = 0;
- m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME;
m_nDefaultSpeed = fileHeader.defaultSpeed;
m_nDefaultTempo = fileHeader.defaultTempo;
m_nSamples = fileHeader.numSamples;
- m_nRestartPos = 0;
if(fileHeader.restartPos < fileHeader.numOrders)
{
m_nRestartPos = fileHeader.restartPos;
}
m_szNames[0][0] = '\0';
- Order.ReadAsByte(file, fileHeader.numOrders);
- file.Skip(256 - fileHeader.numOrders);
+ Order.ReadAsByte(file, 256, fileHeader.numOrders);
// Read Sample Headers
for(SAMPLEINDEX smp = 1; smp <= GetNumSamples(); smp++)
@@ -371,6 +369,13 @@
return false;
}
+ InitializeGlobals();
+ InitializeChannels();
+
+ m_nType = MOD_TYPE_AMF;
+ m_nChannels = fileHeader.numChannels;
+ m_nSamples = fileHeader.numSamples;
+
StringFixer::ReadString<StringFixer::maybeNullTerminated>(m_szNames[0], fileHeader.title);
if(fileHeader.version < 10)
@@ -381,11 +386,6 @@
SetupMODPanning(true);
}
- m_nType = MOD_TYPE_AMF;
- m_nChannels = fileHeader.numChannels;
- m_nSamples = fileHeader.numSamples;
- m_nInstruments = 0;
-
// Setup Channel Pan Positions
if(fileHeader.version >= 11)
{
Modified: trunk/OpenMPT/soundlib/LOAD_DBM.CPP
===================================================================
--- trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2013-04-26 22:13:07 UTC (rev 1977)
@@ -210,6 +210,10 @@
dwMemPos = sizeof(DBMFileHeader);
nOrders = BigEndianW(pfh->orders);
if (dwMemPos + 2 * nOrders + 8*3 >= dwMemLength) return false;
+
+ InitializeGlobals();
+ InitializeChannels();
+
nInstruments = BigEndianW(pfh->instruments);
nSamples = BigEndianW(pfh->samples);
nPatterns = BigEndianW(pfh->patterns);
Modified: trunk/OpenMPT/soundlib/LOAD_DMF.CPP
===================================================================
--- trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2013-04-26 22:13:07 UTC (rev 1977)
@@ -966,6 +966,7 @@
return false;
}
+ InitializeGlobals();
StringFixer::ReadString<StringFixer::spacePadded>(m_szNames[0], fileHeader.songname);
#ifdef MODPLUG_TRACKER
@@ -1086,6 +1087,7 @@
}
}
+ InitializeChannels();
m_nType = MOD_TYPE_DMF;
m_SongFlags = SONG_LINEARSLIDES | SONG_ITCOMPATGXX; // this will be converted to IT format by MPT. SONG_ITOLDEFFECTS is not set because of tremor and vibrato.
SetModFlag(MSF_COMPATIBLE_PLAY, true);
Modified: trunk/OpenMPT/soundlib/LOAD_DSM.CPP
===================================================================
--- trunk/OpenMPT/soundlib/LOAD_DSM.CPP 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/LOAD_DSM.CPP 2013-04-26 22:13:07 UTC (rev 1977)
@@ -115,6 +115,8 @@
|| (pfh->song_len > dwMemLength)) return false;
psong = (DSMSONG *)(lpStream + sizeof(DSMFILEHEADER));
dwMemPos = sizeof(DSMFILEHEADER) + pfh->song_len;
+
+ InitializeGlobals();
m_nType = MOD_TYPE_DSM;
m_nChannels = psong->numtrk;
if (m_nChannels < 1) m_nChannels = 1;
@@ -130,6 +132,7 @@
for (UINT iPan=0; iPan<16; iPan++)
{
+ ChnSettings[iPan].Reset();
ChnSettings[iPan].nPan = 0x80;
if (psong->panpos[iPan] <= 0x80)
{
Modified: trunk/OpenMPT/soundlib/Load_669.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_669.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/Load_669.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -93,23 +93,18 @@
_669FileHeader fileHeader;
file.Rewind();
- if(!file.ReadConvertEndianness(fileHeader))
+ if(!file.ReadConvertEndianness(fileHeader)
+ || (fileHeader.sig != _669FileHeader::magic669 && fileHeader.sig != _669FileHeader::magic669Ext)
+ || fileHeader.samples > 64
+ || fileHeader.restartPos >= 128
+ || fileHeader.patterns > 128)
{
return false;
}
- if(fileHeader.sig != _669FileHeader::magic669 && fileHeader.sig != _669FileHeader::magic669Ext)
- {
- return false;
- }
-
//bool has669Ext = fileHeader.sig == _669FileHeader::magic669Ext;
- if(fileHeader.samples > 64 || fileHeader.restartPos >= 128
- || fileHeader.patterns > 128)
- {
- return false;
- }
+ InitializeGlobals();
m_nType = MOD_TYPE_669;
m_SongFlags = SONG_LINEARSLIDES;
m_nMinPeriod = 28 << 2;
@@ -143,9 +138,8 @@
// Set up panning
for(CHANNELINDEX chn = 0; chn < 8; chn++)
{
+ ChnSettings[chn].Reset();
ChnSettings[chn].nPan = (chn & 1) ? 0xD0 : 0x30;
- ChnSettings[chn].nVolume = 64;
- ChnSettings[chn].dwFlags.reset();
}
// Reading Patterns
Modified: trunk/OpenMPT/soundlib/Load_ams.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_ams.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/Load_ams.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -392,9 +392,10 @@
return false;
}
+ InitializeGlobals();
+
m_nType = MOD_TYPE_AMS;
m_SongFlags = SONG_ITCOMPATGXX | SONG_ITOLDEFFECTS;
- m_nInstruments = 0;
m_nChannels = (fileHeader.channelConfig & 0x1F) + 1;
m_nSamples = fileHeader.numSamps;
SetModFlag(MSF_COMPATIBLE_PLAY, true);
@@ -423,6 +424,7 @@
// Read channel names
for(CHANNELINDEX chn = 0; chn < GetNumChannels(); chn++)
{
+ ChnSettings[chn].Reset();
ReadAMSString(ChnSettings[chn].szName, file);
}
@@ -754,10 +756,10 @@
return false;
}
+ InitializeGlobals();
+
m_nType = MOD_TYPE_AMS2;
m_SongFlags = SONG_ITCOMPATGXX | SONG_ITOLDEFFECTS | ((headerFlags & AMS2FileHeader::linearSlides) ? SONG_LINEARSLIDES : SongFlags(0));
- m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME;
- m_nSamplePreAmp = m_nVSTiVolume = 48;
m_nInstruments = fileHeader.numIns;
m_nChannels = 32;
SetModFlag(MSF_COMPATIBLE_PLAY, true);
@@ -857,6 +859,7 @@
// Channel names
for(CHANNELINDEX chn = 0; chn < 32; chn++)
{
+ ChnSettings[chn].Reset();
ReadAMSString(ChnSettings[chn].szName, file);
}
Modified: trunk/OpenMPT/soundlib/Load_digi.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_digi.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/Load_digi.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -67,18 +67,17 @@
return false;
}
- Order.ReadFromArray(fileHeader.orders, fileHeader.lastOrdIndex + 1);
+ // Globals
+ InitializeGlobals();
+ InitializeChannels();
- // Globals
m_nType = MOD_TYPE_DIGI;
m_nChannels = fileHeader.numChannels;
- m_nInstruments = 0;
m_nSamples = 31;
m_nSamplePreAmp = 256 / m_nChannels;
- m_nDefaultSpeed = 6;
- m_nDefaultTempo = 125;
- m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME;
+ Order.ReadFromArray(fileHeader.orders, fileHeader.lastOrdIndex + 1);
+
// Read sample headers
for(SAMPLEINDEX smp = 0; smp < 31; smp++)
{
Modified: trunk/OpenMPT/soundlib/Load_far.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_far.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/Load_far.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -147,10 +147,9 @@
}
// Globals
+ InitializeGlobals();
m_nType = MOD_TYPE_FAR;
m_nChannels = 16;
- m_nInstruments = 0;
- m_nSamples = 0;
m_nSamplePreAmp = 32;
m_nDefaultSpeed = fileHeader.defaultSpeed;
m_nDefaultTempo = 80;
@@ -161,9 +160,9 @@
// Read channel settings
for(CHANNELINDEX chn = 0; chn < 16; chn++)
{
+ ChnSettings[chn].Reset();
ChnSettings[chn].dwFlags = fileHeader.onOff[chn] ? ChannelFlags(0) : CHN_MUTE;
ChnSettings[chn].nPan = ((fileHeader.chnPanning[chn] & 0x0F) << 4) + 8;
- ChnSettings[chn].nVolume = 64;
}
// Read song message
Modified: trunk/OpenMPT/soundlib/Load_gdm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_gdm.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/Load_gdm.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -134,44 +134,39 @@
//----------------------------------------
{
file.Rewind();
- GDMFileHeader fileHeader;
- if(!file.ReadConvertEndianness(fileHeader))
- {
- return false;
- }
- // Is it a valid GDM file?
- if(fileHeader.magic != GDMFileHeader::magicGDM_
- || fileHeader.dosEOF[0] != 13 || fileHeader.dosEOF[1] != 10 || fileHeader.dosEOF[2] != 26
- || fileHeader.magic2 != GDMFileHeader::magicGMFS
- || fileHeader.formatMajorVer != 1 || fileHeader.formatMinorVer != 0)
- {
- return false;
- }
-
// 1-MOD, 2-MTM, 3-S3M, 4-669, 5-FAR, 6-ULT, 7-STM, 8-MED
- static const MODTYPE gdmFormatOrigin[] =
+ const MODTYPE gdmFormatOrigin[] =
{
MOD_TYPE_NONE, MOD_TYPE_MOD, MOD_TYPE_MTM, MOD_TYPE_S3M, MOD_TYPE_669, MOD_TYPE_FAR, MOD_TYPE_ULT, MOD_TYPE_STM, MOD_TYPE_MED
};
- m_nType = gdmFormatOrigin[fileHeader.originalFormat % CountOf(gdmFormatOrigin)];
- if(m_nType == MOD_TYPE_NONE)
+ GDMFileHeader fileHeader;
+ if(!file.ReadConvertEndianness(fileHeader)
+ || fileHeader.magic != GDMFileHeader::magicGDM_
+ || fileHeader.dosEOF[0] != 13 || fileHeader.dosEOF[1] != 10 || fileHeader.dosEOF[2] != 26
+ || fileHeader.magic2 != GDMFileHeader::magicGMFS
+ || fileHeader.formatMajorVer != 1 || fileHeader.formatMinorVer != 0
+ || fileHeader.originalFormat >= CountOf(gdmFormatOrigin)
+ || fileHeader.originalFormat == 0)
{
return false;
}
+ InitializeGlobals();
+ m_nType = gdmFormatOrigin[fileHeader.originalFormat];
+
// Song name
- MemsetZero(m_szNames);
StringFixer::ReadString<StringFixer::maybeNullTerminated>(m_szNames[0], fileHeader.songTitle);
// Read channel pan map... 0...15 = channel panning, 16 = surround channel, 255 = channel does not exist
m_nChannels = 32;
for(CHANNELINDEX i = 0; i < 32; i++)
{
+ ChnSettings[i].Reset();
if(fileHeader.panMap[i] < 16)
{
- ChnSettings[i].nPan = MIN((fileHeader.panMap[i] * 16) + 8, 256);
+ ChnSettings[i].nPan = std::min((fileHeader.panMap[i] * 16) + 8, 256);
} else if(fileHeader.panMap[i] == 16)
{
ChnSettings[i].nPan = 128;
@@ -186,9 +181,6 @@
m_nDefaultGlobalVolume = MIN(fileHeader.masterVol * 4, 256);
m_nDefaultSpeed = fileHeader.tempo;
m_nDefaultTempo = fileHeader.bpm;
- m_nRestartPos = 0; // Not supported in this format, so use the default value
- m_nSamplePreAmp = 48; // Dito
- m_nVSTiVolume = 48; // Dito
// Read orders
if(file.Seek(fileHeader.orderOffset))
Modified: trunk/OpenMPT/soundlib/Load_imf.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_imf.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/Load_imf.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -404,6 +404,8 @@
return false;
}
+ InitializeGlobals();
+
// Read channel configuration
std::bitset<32> ignoreChannels; // bit set for each channel that's completely disabled
m_nChannels = 0;
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -293,6 +293,8 @@
return false;
}
+ InitializeGlobals();
+
bool interpretModPlugMade = false;
// OpenMPT crap at the end of file
@@ -411,6 +413,7 @@
// Reading Channels Pan Positions
for(CHANNELINDEX i = 0; i < 64; i++) if(fileHeader.chnpan[i] != 0xFF)
{
+ ChnSettings[i].Reset();
ChnSettings[i].nVolume = Clamp(fileHeader.chnvol[i], uint8(0), uint8(64));
ChnSettings[i].nPan = 128;
ChnSettings[i].dwFlags.reset();
Modified: trunk/OpenMPT/soundlib/Load_itp.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_itp.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/Load_itp.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -57,6 +57,8 @@
return false;
}
+ InitializeGlobals();
+
// Song comments
songMessage.Read(file, file.ReadUint32LE(), SongMessage::leCR);
Modified: trunk/OpenMPT/soundlib/Load_mdl.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mdl.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/Load_mdl.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -314,7 +314,9 @@
dwTrackPos = 0;
pvolenv = ppanenv = ppitchenv = NULL;
nvolenv = npanenv = npitchenv = 0;
- m_nSamples = m_nInstruments = 0;
+
+ InitializeGlobals();
+
while (dwMemPos+6 < dwMemLength)
{
block = *((WORD *)(lpStream+dwMemPos));
@@ -344,7 +346,7 @@
m_nChannels = 4;
for (i=0; i<32; i++)
{
- ChnSettings[i].nVolume = 64;
+ ChnSettings[i].Reset();
ChnSettings[i].nPan = (pmib->channelinfo[i] & 0x7F) << 1;
if (pmib->channelinfo[i] & 0x80)
ChnSettings[i].dwFlags.set(CHN_MUTE);
Modified: trunk/OpenMPT/soundlib/Load_med.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_med.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/Load_med.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -541,8 +541,11 @@
Log(" extra_songs = %d\n", pmmh->extra_songs);
Log("\n");
#endif
+
+ InitializeGlobals();
+ InitializeChannels();
m_nType = MOD_TYPE_MED;
- m_nSamplePreAmp = 0x20;
+ m_nSamplePreAmp = 32;
dwBlockArr = BigEndian(pmmh->blockarr);
dwSmplArr = BigEndian(pmmh->smplarr);
dwExpData = BigEndian(pmmh->expdata);
Modified: trunk/OpenMPT/soundlib/Load_mid.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mid.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/Load_mid.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -532,11 +532,10 @@
miditracks.resize(tracks);
// Reading File...
+ InitializeGlobals();
m_nType = MOD_TYPE_MID;
m_nChannels = 32;
- m_nSamples = 0;
- m_nInstruments = 0;
- m_SongFlags.set(SONG_LINEARSLIDES);
+ m_SongFlags = SONG_LINEARSLIDES;
m_szNames[0][0] = 0;
// MIDI->MOD Tempo Conversion
@@ -571,9 +570,7 @@
for (UINT ics=0; ics<MAX_BASECHANNELS; ics++)
{
// Channel settings
- ChnSettings[ics].nPan = 128;
- ChnSettings[ics].nVolume = 64;
- ChnSettings[ics].dwFlags.reset();
+ ChnSettings[ics].Reset();
// Channels state
chnstate[ics].pan = 128;
chnstate[ics].pitchsrc = 0x2000;
Modified: trunk/OpenMPT/soundlib/Load_mod.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mod.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/Load_mod.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -483,6 +483,7 @@
return false;
}
+ InitializeGlobals();
m_nChannels = 4;
// Check MOD Magic
@@ -753,6 +754,8 @@
return false;
}
+ InitializeGlobals();
+
// We'll have to do some heuristic checks to find out whether this is an old Ultimate Soundtracker module
// or if it was made with the newer Soundtracker versions.
// Thanks for Fraggie for this information! (http://www.un4seen.com/forum/?topic=14471.msg100829#msg100829)
Modified: trunk/OpenMPT/soundlib/Load_mt2.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mt2.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/Load_mt2.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -231,6 +231,9 @@
|| (pfh->wVersion < 0x0200) || (pfh->wVersion >= 0x0300)
|| (pfh->wChannels < 1) || (pfh->wChannels > MAX_BASECHANNELS)) return false;
pdd = NULL;
+
+ InitializeGlobals();
+ InitializeChannels();
m_nType = MOD_TYPE_MT2;
m_nChannels = pfh->wChannels;
m_nRestartPos = pfh->wRestart;
Modified: trunk/OpenMPT/soundlib/Load_mtm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mtm.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/Load_mtm.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -115,6 +115,7 @@
return false;
}
+ InitializeGlobals();
StringFixer::ReadString<StringFixer::maybeNullTerminated>(m_szNames[0], fileHeader.songName);
m_nType = MOD_TYPE_MTM;
m_nSamples = fileHeader.numSamples;
@@ -132,14 +133,13 @@
// Setting Channel Pan Position
for(CHANNELINDEX chn = 0; chn < GetNumChannels(); chn++)
{
+ ChnSettings[chn].Reset();
ChnSettings[chn].nPan = ((fileHeader.panPos[chn] & 0x0F) << 4) + 8;
- ChnSettings[chn].nVolume = 64;
}
// Reading pattern order
const ORDERINDEX readOrders = fileHeader.lastOrder + 1;
- Order.ReadAsByte(file, readOrders);
- file.Skip(128 - readOrders);
+ Order.ReadAsByte(file, 128, readOrders);
// Reading Patterns
const ROWINDEX rowsPerPat = std::min(ROWINDEX(fileHeader.beatsPerTrack), MAX_PATTERN_ROWS);
Modified: trunk/OpenMPT/soundlib/Load_okt.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_okt.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/Load_okt.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -112,8 +112,8 @@
// Parse a pattern block
-void ReadOKTPattern(FileReader &chunk, PATTERNINDEX nPat, CSoundFile *pSndFile)
-//-----------------------------------------------------------------------------
+void ReadOKTPattern(FileReader &chunk, PATTERNINDEX nPat, CSoundFile &sndFile)
+//----------------------------------------------------------------------------
{
if(!chunk.CanRead(2))
{
@@ -122,16 +122,16 @@
ROWINDEX rows = Clamp(static_cast<ROWINDEX>(chunk.ReadUint16BE()), ROWINDEX(1), MAX_PATTERN_ROWS);
- if(pSndFile->Patterns.Insert(nPat, rows))
+ if(sndFile.Patterns.Insert(nPat, rows))
{
return;
}
- const CHANNELINDEX chns = pSndFile->GetNumChannels();
+ const CHANNELINDEX chns = sndFile.GetNumChannels();
for(ROWINDEX row = 0; row < rows; row++)
{
- ModCommand *m = pSndFile->Patterns[nPat].GetRow(row);
+ ModCommand *m = sndFile.Patterns[nPat].GetRow(row);
for(CHANNELINDEX chn = 0; chn < chns; chn++, m++)
{
uint8 note = chunk.ReadUint8();
@@ -294,9 +294,8 @@
vector<bool> sample7bit; // 7-/8-bit sample
ORDERINDEX nOrders = 0;
- MemsetZero(m_szNames);
- m_nChannels = 0;
- m_nSamples = 0;
+ InitializeGlobals();
+ m_szNames[0][0] = '\0';
// Go through IFF chunks...
while(file.BytesLeft())
@@ -327,8 +326,10 @@
uint8 ch1 = chunk.ReadUint8(), ch2 = chunk.ReadUint8();
if(ch1 || ch2)
{
+ ChnSettings[m_nChannels].Reset();
ChnSettings[m_nChannels++].nPan = (((nChn & 3) == 1) || ((nChn & 3) == 2)) ? 0xC0 : 0x40;
}
+ ChnSettings[m_nChannels].Reset();
ChnSettings[m_nChannels++].nPan = (((nChn & 3) == 1) || ((nChn & 3) == 2)) ? 0xC0 : 0x40;
}
break;
@@ -406,7 +407,7 @@
for(PATTERNINDEX nPat = 0; nPat < patternChunks.size(); nPat++)
{
if(patternChunks[nPat].GetLength() > 0)
- ReadOKTPattern(patternChunks[nPat], nPat, this);
+ ReadOKTPattern(patternChunks[nPat], nPat, *this);
else
Patterns.Insert(nPat, 64); // invent empty pattern
}
Modified: trunk/OpenMPT/soundlib/Load_psm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_psm.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/Load_psm.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -287,15 +287,11 @@
}
// Yep, this seems to be a valid file.
+ InitializeGlobals();
m_nType = MOD_TYPE_PSM;
m_SongFlags = SONG_ITOLDEFFECTS | SONG_ITCOMPATGXX;
SetModFlag(MSF_COMPATIBLE_PLAY, true);
- m_nChannels = 0;
- MemsetZero(m_szNames);
-
- m_nVSTiVolume = m_nSamplePreAmp = 48; // not supported in this format, so use a good default value
-
// pattern offset and identifier
PATTERNINDEX numPatterns = 0; // used for setting up the orderlist - final pattern count
vector<FileReader> patternChunks; // pattern offsets (sorted as they occour in the file)
@@ -643,6 +639,7 @@
m_nRestartPos = subsongs[0].restartPos;
for(CHANNELINDEX chn = 0; chn < m_nChannels; chn++)
{
+ ChnSettings[chn].Reset();
ChnSettings[chn].nVolume = subsongs[0].channelVolume[chn];
ChnSettings[chn].nPan = subsongs[0].channelPanning[chn];
ChnSettings[chn].dwFlags.set(CHN_SURROUND, subsongs[0].channelSurround[chn]);
@@ -1141,22 +1138,21 @@
|| (fileHeader.formatVersion != 0x10 && fileHeader.formatVersion != 0x01) // why is this sometimes 0x01?
|| fileHeader.patternVersion != 0 // 255ch pattern version not supported (did anyone use this?)
|| (fileHeader.songType & 3) != 0
- || MAX(fileHeader.numChannelsPlay, fileHeader.numChannelsReal) == 0)
+ || std::max(fileHeader.numChannelsPlay, fileHeader.numChannelsReal) == 0)
{
return false;
}
// Seems to be valid!
-
+ InitializeGlobals();
m_nType = MOD_TYPE_S3M;
- m_nChannels = MIN(MAX(fileHeader.numChannelsPlay, fileHeader.numChannelsReal), MAX_BASECHANNELS);
+ m_nChannels = Clamp(CHANNELINDEX(fileHeader.numChannelsPlay), CHANNELINDEX(fileHeader.numChannelsReal), MAX_BASECHANNELS);
m_nSamplePreAmp = fileHeader.masterVolume;
if(m_nSamplePreAmp == 255)
{
// Most of the time, the master volume value makes sense... Just not when it's 255.
m_nSamplePreAmp = 48;
}
- m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME;
m_nDefaultSpeed = fileHeader.songSpeed;
m_nDefaultTempo = fileHeader.songTempo;
@@ -1174,6 +1170,7 @@
{
for(CHANNELINDEX i = 0; i < 32; i++)
{
+ ChnSettings[i].Reset();
ChnSettings[i].nPan = ((15 - (file.ReadUint8() & 0x0F)) * 256 + 8) / 15; // 15 seems to be left and 0 seems to be right...
ChnSettings[i].nVolume = 64;
ChnSettings[i].dwFlags.reset(); // (i >= fileHeader.numChannelsPlay) ? CHN_MUTE : 0; // don't mute channels, as muted channels are completely ignored in S3M
Modified: trunk/OpenMPT/soundlib/Load_ptm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_ptm.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/Load_ptm.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -95,6 +95,7 @@
StringFixer::ReadString<StringFixer::maybeNullTerminated>(m_szNames[0], pfh.songname);
+ InitializeGlobals();
m_nType = MOD_TYPE_PTM;
m_nChannels = pfh.nchannels;
m_nSamples = MIN(pfh.nsamples, MAX_SAMPLES - 1);
@@ -104,7 +105,7 @@
for (CHANNELINDEX ipan = 0; ipan < m_nChannels; ipan++)
{
- ChnSettings[ipan].nVolume = 64;
+ ChnSettings[ipan].Reset();
ChnSettings[ipan].nPan = ((pfh.chnpan[ipan] & 0x0F) << 4) + 4;
}
for (SAMPLEINDEX ismp = 0; ismp < m_nSamples; ismp++, dwMemPos += sizeof(PTMSAMPLE))
Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_s3m.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -443,6 +443,8 @@
return false;
}
+ InitializeGlobals();
+
// ST3 ignored Zxx commands, so if we find that a file was made with ST3, we should erase all MIDI macros.
bool keepMidiMacros = false;
@@ -519,7 +521,7 @@
m_nChannels = 4;
for(CHANNELINDEX i = 0; i < 32; i++)
{
- ChnSettings[i].nVolume = 64;
+ ChnSettings[i].Reset();
if(fileHeader.channels[i] == 0xFF)
{
Modified: trunk/OpenMPT/soundlib/Load_stm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_stm.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/Load_stm.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -130,11 +130,10 @@
StringFixer::ReadString<StringFixer::maybeNullTerminated>(m_szNames[0], fileHeader.songname);
// Read STM header
+ InitializeGlobals();
m_nType = MOD_TYPE_STM;
- m_SongFlags.reset();
m_nSamples = 31;
m_nChannels = 4;
- m_nInstruments = 0;
m_nMinPeriod = 64;
m_nMaxPeriod = 0x7FFF;
m_nDefaultSpeed = fileHeader.initTempo >> 4;
@@ -146,8 +145,7 @@
// Setting up channels
for(CHANNELINDEX chn = 0; chn < 4; chn++)
{
- ChnSettings[chn].dwFlags.reset();
- ChnSettings[chn].nVolume = 64;
+ ChnSettings[chn].Reset();
ChnSettings[chn].nPan = (chn & 1) ? 0x40 : 0xC0;
}
Modified: trunk/OpenMPT/soundlib/Load_ult.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_ult.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/Load_ult.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -389,6 +389,7 @@
return false;
}
+ InitializeGlobals();
StringFixer::ReadString<StringFixer::maybeNullTerminated>(m_szNames[0], fileHeader.songName);
m_nType = MOD_TYPE_ULT;
@@ -435,12 +436,14 @@
{
for(CHANNELINDEX chn = 0; chn < GetNumChannels(); chn++)
{
+ ChnSettings[chn].Reset();
ChnSettings[chn].nPan = ((file.ReadUint8() & 0x0F) << 4) + 8;
}
} else
{
for(CHANNELINDEX chn = 0; chn < GetNumChannels(); chn++)
{
+ ChnSettings[chn].Reset();
ChnSettings[chn].nPan = (chn & 1) ? 192 : 64;
}
}
Modified: trunk/OpenMPT/soundlib/Load_wav.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_wav.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/Load_wav.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -55,6 +55,7 @@
return false;
}
+ InitializeGlobals();
m_nChannels = std::max(wavFile.GetNumChannels(), uint16(2));
if(Patterns.Insert(0, 64) || Patterns.Insert(1, 64))
{
@@ -92,9 +93,8 @@
for(CHANNELINDEX channel = 0; channel < wavFile.GetNumChannels(); channel++)
{
+ ChnSettings[channel].Reset();
ChnSettings[channel].nPan = (channel % 2u) ? 256 : 0;
- ChnSettings[channel].nVolume = 64;
- ChnSettings[channel].dwFlags.reset();
}
// Setting up pattern
Modified: trunk/OpenMPT/soundlib/Load_xm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_xm.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/Load_xm.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -263,6 +263,10 @@
return false;
}
+ InitializeGlobals();
+ InitializeChannels();
+ ChangeModTypeTo(MOD_TYPE_XM);
+
FlagSet<TrackerVersions> madeWith(verUnknown);
if(!memcmp(fileHeader.trackerName, "FastTracker v 2.00 ", 20))
@@ -275,15 +279,12 @@
StringFixer::ReadString<StringFixer::spacePadded>(m_szNames[0], fileHeader.songName);
- m_nType = MOD_TYPE_NONE; // Ensure that order list items FE and FF are not converted.
- ChangeModTypeTo(MOD_TYPE_XM);
m_nMinPeriod = 27;
m_nMaxPeriod = 54784;
m_nRestartPos = fileHeader.restartPos;
m_nChannels = fileHeader.channels;
m_nInstruments = std::min(fileHeader.instruments, uint16(MAX_INSTRUMENTS - 1));
- m_nSamples = 0;
m_nDefaultSpeed = Clamp(fileHeader.speed, uint16(1), uint16(31));
m_nDefaultTempo = Clamp(fileHeader.tempo, uint16(32), uint16(512));
Modified: trunk/OpenMPT/soundlib/ModSequence.cpp
===================================================================
--- trunk/OpenMPT/soundlib/ModSequence.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/ModSequence.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -743,14 +743,14 @@
}
-bool ModSequence::ReadAsByte(FileReader &file, size_t howMany)
-//------------------------------------------------------------
+bool ModSequence::ReadAsByte(FileReader &file, size_t howMany, size_t readEntries)
+//--------------------------------------------------------------------------------
{
if(!file.CanRead(howMany))
{
return false;
}
- ORDERINDEX readEntries = static_cast<ORDERINDEX>(howMany);
+ LimitMax(readEntries, howMany);
if(!(m_sndFile.GetType() & MOD_TYPE_MPT))
{
LimitMax(readEntries, MAX_ORDERS);
Modified: trunk/OpenMPT/soundlib/ModSequence.h
===================================================================
--- trunk/OpenMPT/soundlib/ModSequence.h 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/ModSequence.h 2013-04-26 22:13:07 UTC (rev 1977)
@@ -101,7 +101,7 @@
// Read/write.
size_t WriteAsByte(FILE* f, const uint16 count) const;
bool ReadAsByte(const BYTE* pFrom, const int howMany, const int memLength);
- bool ReadAsByte(FileReader &file, size_t howMany);
+ bool ReadAsByte(FileReader &file, size_t howMany, size_t readEntries = SIZE_MAX);
template<typename T, size_t arraySize>
bool ReadFromArray(const T (&orders)[arraySize], size_t howMany = arraySize);
Modified: trunk/OpenMPT/soundlib/Sndfile.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/Sndfile.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -472,6 +472,45 @@
}
+// Global variable initializer for loader functions
+void CSoundFile::InitializeGlobals()
+//---------------------------
+{
+ // Do not add or change any of these values! And if you do, review each and every loader to check if they require these defaults!
+ m_nType = MOD_TYPE_NONE;
+ m_nChannels = 0;
+ m_nInstruments = 0;
+ m_nSamples = 0;
+ m_nSamplePreAmp = 48;
+ m_nVSTiVolume = 48;
+ m_nDefaultSpeed = 6;
+ m_nDefaultTempo = 125;
+ m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME;
+ m_nRestartPos = 0;
+ m_SongFlags.reset();
+ m_nMinPeriod = 16;
+ m_nMaxPeriod = 32767;
+ m_dwLastSavedWithVersion = m_dwCreatedWithVersion = 0;
+
+ SetMixLevels(mixLevels_compatible);
+ SetModFlags(0);
+
+ Order.resize(1);
+ Patterns.ClearPatterns();
+ songMessage.clear();
+}
+
+
+void CSoundFile::InitializeChannels()
+//-----------------------------------
+{
+ for(CHANNELINDEX nChn = 0; nChn < MAX_BASECHANNELS; nChn++)
+ {
+ InitChannel(nChn);
+ }
+}
+
+
#ifdef MODPLUG_TRACKER
BOOL CSoundFile::Create(LPCBYTE lpStream, CModDoc *pModDoc, DWORD dwMemLength)
//----------------------------------------------------------------------------
@@ -483,18 +522,14 @@
{
#endif // MODPLUG_TRACKER
- m_nType = MOD_TYPE_NONE;
- m_SongFlags.reset();
- m_nChannels = 0;
m_nMixChannels = 0;
- m_nSamples = 0;
- m_nInstruments = 0;
m_nFreqFactor = m_nTempoFactor = 128;
- m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME;
m_nGlobalVolume = MAX_GLOBAL_VOLUME;
m_nOldGlbVolSlide = 0;
- m_nDefaultSpeed = 6;
- m_nDefaultTempo = 125;
+
+ InitializeGlobals();
+
+ // Playback
m_nPatternDelay = 0;
m_nFrameDelay = 0;
m_nNextRow = 0;
@@ -504,28 +539,15 @@
m_nNextOrder = 0;
m_nNextPatStartRow = 0;
m_nSeqOverride = ORDERINDEX_INVALID;
- m_nRestartPos = 0;
- m_nMinPeriod = 16;
- m_nMaxPeriod = 32767;
- m_nSamplePreAmp = 48;
- m_nVSTiVolume = 48;
+
m_nMaxOrderPosition = 0;
- m_nMixLevels = mixLevels_compatible; // Will be overridden if appropriate.
MemsetZero(ChnMix);
MemsetZero(Instruments);
MemsetZero(m_szNames);
MemsetZero(m_MixPlugins);
- //Order.assign(MAX_ORDERS, Order.GetInvalidPatIndex());
- Order.resize(1);
- Patterns.ClearPatterns();
- songMessage.clear();
- for (CHANNELINDEX nChn = 0; nChn < MAX_BASECHANNELS; nChn++)
+ if(lpStream)
{
- InitChannel(nChn);
- }
- if (lpStream)
- {
FileReader file(lpStream, dwMemLength);
#ifndef NO_ARCHIVE_SUPPORT
Modified: trunk/OpenMPT/soundlib/Sndfile.h
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.h 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/Sndfile.h 2013-04-26 22:13:07 UTC (rev 1977)
@@ -471,6 +471,10 @@
bool InitChannel(CHANNELINDEX nChn);
+ // Global variable initializer for loader functions
+ void InitializeGlobals();
+ void InitializeChannels();
+
// Module Loaders
bool ReadXM(FileReader &file);
bool ReadS3M(FileReader &file);
Modified: trunk/OpenMPT/soundlib/load_j2b.cpp
===================================================================
--- trunk/OpenMPT/soundlib/load_j2b.cpp 2013-04-26 20:45:10 UTC (rev 1976)
+++ trunk/OpenMPT/soundlib/load_j2b.cpp 2013-04-26 22:13:07 UTC (rev 1977)
@@ -749,10 +749,6 @@
else
return false;
- m_nChannels = 0;
- m_nSamples = 0;
- m_nInstruments = 0;
-
ChunkReader chunkFile(file);
// RIFF AM has a padding byte so that all chunks have an even size.
ChunkReader::ChunkList<AMFFRiffChunk> chunks = chunkFile.ReadChunks<AMFFRiffChunk>(isAM ? 2 : 1);
@@ -761,17 +757,15 @@
// "INIT" - Song info (AM)
FileReader chunk(chunks.GetChunk(isAM ? AMFFRiffChunk::idINIT : AMFFRiffChunk::idMAIN));
AMFFMainChunk mainChunk;
- if(!chunk.IsValid() || !chunk.Read(mainChunk))
+ if(!chunk.IsValid()
+ || !chunk.Read(mainChunk)
+ || mainChunk.channels < 1
+ || !chunk.CanRead(mainChunk.channels))
{
return false;
}
- StringFixer::ReadString<StringFixer::maybeNullTerminated>(m_szNames[0], mainChunk.songname);
-
- if(mainChunk.channels < 1 || !chunk.CanRead(mainChunk.channels))
- {
- return false;
- }
+ InitializeGlobals();
m_SongFlags = SONG_ITOLDEFFECTS | SONG_ITCOMPATGXX;
m_SongFlags.set(SONG_LINEARSLIDES, !(mainChunk.flags & AMFFMainChunk::amigaSlides));
@@ -779,21 +773,20 @@
m_nDefaultSpeed = mainChunk.speed;
m_nDefaultTempo = mainChunk.tempo;
m_nDefaultGlobalVolume = mainChunk.globalvolume * 2;
- m_nSamplePreAmp = m_nVSTiVolume = 48;
m_nType = MOD_TYPE_J2B;
ASSERT(mainChunk.unknown == LittleEndian(0xFF0001C5) || mainChunk.unknown == LittleEndian(0x35800716) || mainChunk.unknown == LittleEndian(0xFF00FFFF));
+ StringFixer::ReadString<StringFixer::maybeNullTerminated>(m_szNames[0], mainChunk.songname);
+
// It seems like there's no way to differentiate between
// Muted and Surround channels (they're all 0xA0) - might
// be a limitation in mod2j2b.
for(CHANNELINDEX nChn = 0; nChn < m_nChannels; nChn++)
{
- ChnSettings[nChn].nVolume = 64;
- ChnSettings[nChn].nPan = 128;
+ ChnSettings[nChn].Reset();
uint8 pan = chunk.ReadUint8();
-
if(isAM)
{
if(pan > 128)
@@ -805,7 +798,7 @@
if(pan >= 128)
ChnSettings[nChn].dwFlags = CHN_MUTE;
else
- ChnSettings[nChn].nPan = pan * 4;
+ ChnSettings[nChn].nPan = std::min(pan * 4, 256);
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|