From: <sag...@us...> - 2009-12-20 18:17:26
|
Revision: 446 http://modplug.svn.sourceforge.net/modplug/?rev=446&view=rev Author: saga-games Date: 2009-12-20 18:17:16 +0000 (Sun, 20 Dec 2009) Log Message: ----------- [Fix] The S3M format actually knows muted channels. Added this to the S3M loader/saver and MuteChannel functions. Modified Paths: -------------- trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-12-20 01:10:47 UTC (rev 445) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-12-20 18:17:16 UTC (rev 446) @@ -1013,7 +1013,7 @@ bool CModDoc::MuteChannel(CHANNELINDEX nChn, bool doMute) -//---------------------------------------------- +//------------------------------------------------------- { DWORD muteType = (CMainFrame::m_dwPatternSetup&PATTERN_SYNCMUTE)? CHN_SYNCMUTE:CHN_MUTE; @@ -1057,8 +1057,8 @@ } } - //Mark IT as modified - if (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) { + //Mark IT/MPTM/S3M as modified + if (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_S3M)) { CMainFrame::GetMainFrame()->ThreadSafeSetModified(this); } Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-12-20 01:10:47 UTC (rev 445) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-12-20 18:17:16 UTC (rev 446) @@ -218,7 +218,7 @@ bool CSoundFile::ReadS3M(const BYTE *lpStream, DWORD dwMemLength) //--------------------------------------------------------------- { - if ((!lpStream) || (dwMemLength <= sizeof(S3MFILEHEADER)+sizeof(S3MSAMPLESTRUCT)+64)) return false; + if ((!lpStream) || (dwMemLength <= sizeof(S3MFILEHEADER)+64)) return false; UINT insnum,patnum,nins,npat; DWORD insfile[128]; @@ -282,16 +282,24 @@ m_nChannels = 4; for (UINT ich=0; ich<32; ich++) { - ChnSettings[ich].nPan = 128; ChnSettings[ich].nVolume = 64; - ChnSettings[ich].dwFlags = CHN_MUTE; - if (psfh.channels[ich] != 0xFF) + if(psfh.channels[ich] == 0xFF) { - m_nChannels = ich+1; - UINT b = psfh.channels[ich] & 0x0F; - ChnSettings[ich].nPan = (b & 8) ? 0xC0 : 0x40; - ChnSettings[ich].dwFlags = 0; + ChnSettings[ich].nPan = 128; + ChnSettings[ich].dwFlags = CHN_MUTE; + } else + { + m_nChannels = ich + 1; + ChnSettings[ich].nPan = (psfh.channels[ich] & 8) ? 0xC0 : 0x40; + if (psfh.channels[ich] & 0x80) + { + ChnSettings[ich].dwFlags = CHN_MUTE; + /* Detect Adlib channels: + c = channels[ich] ^ 0x80; + if(c >= 16 && c < 32) adlibChannel = true; + */ + } } } if (m_nChannels < 1) m_nChannels = 1; @@ -572,7 +580,9 @@ if (i < m_nChannels) { UINT tmp = (i & 0x0F) >> 1; - header[0x40+i] = (i & 0x10) | ((i & 1) ? 8+tmp : tmp); + tmp = (i & 0x10) | ((i & 1) ? 8 + tmp : tmp); + if((ChnSettings[i].dwFlags & CHN_MUTE) != 0) tmp |= 0x80; + header[0x40+i] = tmp; } else header[0x40+i] = 0xFF; } fwrite(header, 0x60, 1, f); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |