From: <sag...@us...> - 2010-05-20 21:41:42
|
Revision: 598 http://modplug.svn.sourceforge.net/modplug/?rev=598&view=rev Author: saga-games Date: 2010-05-20 21:41:36 +0000 (Thu, 20 May 2010) Log Message: ----------- [Fix] Sample Editor: When loading an extremely short raw file (f.e. 1 byte) twice, it crashed OpenMPT. [Imp] XM Loader: Improved detection of an old version of MPT. [Ref] Some rewriting of the CRawSampleDlg code. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/Mpdlgs.cpp trunk/OpenMPT/mptrack/Mpdlgs.h trunk/OpenMPT/soundlib/Load_mod.cpp trunk/OpenMPT/soundlib/Load_xm.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2010-05-15 20:26:56 UTC (rev 597) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2010-05-20 21:41:36 UTC (rev 598) @@ -716,14 +716,14 @@ CRawSampleDlg dlg(this); if(m_nPreviousRawFormat != 0) { - dlg.m_nFormat = m_nPreviousRawFormat; - dlg.m_bRememberFormat = true; + dlg.SetSampleFormat(m_nPreviousRawFormat); + dlg.SetRememberFormat(true); } EndWaitCursor(); if ((m_nPreviousRawFormat != 0) || (dlg.DoModal() == IDOK)) { - m_nPreviousRawFormat = ((dlg.m_bRememberFormat)) ? dlg.m_nFormat : 0; + m_nPreviousRawFormat = ((dlg.GetRemeberFormat())) ? dlg.GetSampleFormat() : 0; BeginWaitCursor(); UINT flags = 0; @@ -732,25 +732,19 @@ m_pSndFile->DestroySample(m_nSample); pSmp->nLength = len; pSmp->uFlags = RS_PCM8S; - pSmp->nGlobalVol = 64; - pSmp->nVolume = 256; - pSmp->nPan = 128; - pSmp->filename[0] = 0; - if (!pSmp->nC5Speed) pSmp->nC5Speed = 22050; - if (dlg.m_nFormat & 1) + + if (dlg.GetSampleFormat() & ER_16BIT) { pSmp->nLength >>= 1; - pSmp->uFlags |= CHN_16BIT; flags = RS_PCM16S; } - if (!(dlg.m_nFormat & 2)) + if (dlg.GetSampleFormat() & ER_UNSIGNED) { flags++; } // Interleaved Stereo Sample - if (dlg.m_nFormat & 4) + if (dlg.GetSampleFormat() & ER_STEREO) { - pSmp->uFlags |= CHN_STEREO; pSmp->nLength >>= 1; flags |= 0x40|RSF_STEREO; } @@ -764,6 +758,15 @@ if (m_pSndFile->ReadSample(pSmp, flags, p16, l16)) { bOk = true; + + pSmp->nGlobalVol = 64; + pSmp->nVolume = 256; + pSmp->nPan = 128; + pSmp->filename[0] = 0; + if (!pSmp->nC5Speed) pSmp->nC5Speed = 22050; + } else + { + m_pModDoc->GetSampleUndo()->Undo(m_nSample); } END_CRITICAL(); } else Modified: trunk/OpenMPT/mptrack/Mpdlgs.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mpdlgs.cpp 2010-05-15 20:26:56 UTC (rev 597) +++ trunk/OpenMPT/mptrack/Mpdlgs.cpp 2010-05-20 21:41:36 UTC (rev 598) @@ -1056,10 +1056,8 @@ ////////////////////////////////////////////////////////////// // CRawSampleDlg +UINT CRawSampleDlg::m_nFormat = ER_8BIT | ER_UNSIGNED | ER_MONO; -UINT CRawSampleDlg::m_nFormat = 0; - - BOOL CRawSampleDlg::OnInitDialog() //-------------------------------- { @@ -1073,9 +1071,12 @@ //------------------------ { m_nFormat = 0; - if (IsDlgButtonChecked(IDC_RADIO2)) m_nFormat |= 1; - if (IsDlgButtonChecked(IDC_RADIO4)) m_nFormat |= 2; - if (IsDlgButtonChecked(IDC_RADIO6)) m_nFormat |= 4; + if(IsDlgButtonChecked(IDC_RADIO1)) m_nFormat |= ER_8BIT; + if(IsDlgButtonChecked(IDC_RADIO2)) m_nFormat |= ER_16BIT; + if(IsDlgButtonChecked(IDC_RADIO3)) m_nFormat |= ER_UNSIGNED; + if(IsDlgButtonChecked(IDC_RADIO4)) m_nFormat |= ER_SIGNED; + if(IsDlgButtonChecked(IDC_RADIO5)) m_nFormat |= ER_MONO; + if(IsDlgButtonChecked(IDC_RADIO6)) m_nFormat |= ER_STEREO; m_bRememberFormat = IsDlgButtonChecked(IDC_CHK_REMEMBERSETTINGS) ? true : false; CDialog::OnOK(); } @@ -1084,9 +1085,9 @@ void CRawSampleDlg::UpdateDialog() //-------------------------------- { - CheckRadioButton(IDC_RADIO1, IDC_RADIO2, (m_nFormat & 1) ? IDC_RADIO2 : IDC_RADIO1); - CheckRadioButton(IDC_RADIO3, IDC_RADIO4, (m_nFormat & 2) ? IDC_RADIO4 : IDC_RADIO3); - CheckRadioButton(IDC_RADIO5, IDC_RADIO6, (m_nFormat & 4) ? IDC_RADIO6 : IDC_RADIO5); + CheckRadioButton(IDC_RADIO1, IDC_RADIO2, (m_nFormat & ER_8BIT) ? IDC_RADIO1 : IDC_RADIO2 ); + CheckRadioButton(IDC_RADIO3, IDC_RADIO4, (m_nFormat & ER_UNSIGNED) ? IDC_RADIO3 : IDC_RADIO4); + CheckRadioButton(IDC_RADIO5, IDC_RADIO6, (m_nFormat & ER_MONO) ? IDC_RADIO5 : IDC_RADIO6); CheckDlgButton(IDC_CHK_REMEMBERSETTINGS, (m_bRememberFormat) ? MF_CHECKED : MF_UNCHECKED); } Modified: trunk/OpenMPT/mptrack/Mpdlgs.h =================================================================== --- trunk/OpenMPT/mptrack/Mpdlgs.h 2010-05-15 20:26:56 UTC (rev 597) +++ trunk/OpenMPT/mptrack/Mpdlgs.h 2010-05-20 21:41:36 UTC (rev 598) @@ -129,18 +129,32 @@ }; +#define ER_8BIT 0x01 +#define ER_16BIT 0x02 + +#define ER_SIGNED 0x10 +#define ER_UNSIGNED 0x20 + +#define ER_MONO 0x0100 +#define ER_STEREO 0x0200 + //================================= class CRawSampleDlg: public CDialog //================================= { -public: +protected: static UINT m_nFormat; bool m_bRememberFormat; public: + static const UINT GetSampleFormat() { return m_nFormat; } + static void SetSampleFormat(UINT nFormat) { m_nFormat = nFormat; } + const bool GetRemeberFormat() { return m_bRememberFormat; }; + void SetRememberFormat(bool bRemember) { m_bRememberFormat = bRemember; }; + +public: CRawSampleDlg(CWnd *parent = NULL):CDialog(IDD_LOADRAWSAMPLE, parent) { - //m_nFormat = 0; m_bRememberFormat = false; } Modified: trunk/OpenMPT/soundlib/Load_mod.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mod.cpp 2010-05-15 20:26:56 UTC (rev 597) +++ trunk/OpenMPT/soundlib/Load_mod.cpp 2010-05-20 21:41:36 UTC (rev 598) @@ -55,7 +55,7 @@ case 'X' - 55: command = CMD_XFINEPORTAUPDOWN; break; case 'Y' - 55: command = CMD_PANBRELLO; break; //34 case 'Z' - 55: command = CMD_MIDI; break; //35 - case '\\' - 56: command = CMD_SMOOTHMIDI; break; //rewbs.smoothVST: 36 + case '\\' - 56: command = CMD_SMOOTHMIDI; break; //rewbs.smoothVST: 36 - note: this is actually displayed as "-" in FT2, but seems to be doing nothing. //case ':' - 21: command = CMD_DELAYCUT; break; //37 case '#' + 3: command = CMD_XPARAM; break; //rewbs.XMfixes - XParam is 38 default: command = 0; Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2010-05-15 20:26:56 UTC (rev 597) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2010-05-20 21:41:36 UTC (rev 598) @@ -245,7 +245,7 @@ BYTE samples_used[(MAX_SAMPLES + 7) / 8]; // for removing unused samples UINT unused_samples; // dito - bool bMadeWithModPlug = false, bProbablyMadeWithModPlug = false, bIsFT2 = false; + bool bMadeWithModPlug = false, bProbablyMadeWithModPlug = false, bProbablyMPT109 = false, bIsFT2 = false; // set this here already because XMs compressed with BoobieSqueezer will exit the function early SetModFlag(MSF_COMPATIBLE_PLAY, true); @@ -561,6 +561,9 @@ pSmp->nVibRate = xmsh.vibrate; memcpy(pSmp->filename, xmss.name, 22); SpaceToNullStringFixed(pSmp->filename, 21); + + if ((xmss.type & 3) == 3) // MPT 1.09 and maybe newer / older versions set both flags for bidi loops + bProbablyMPT109 = true; } #if 0 if ((xmsh.reserved2 > nsamples) && (xmsh.reserved2 <= 16)) @@ -683,7 +686,6 @@ if (!memcmp((LPCSTR)lpStream + 0x26, "OpenMPT ", 8)) { - //bMadeWithModPlug = true; // Don't set it - it's also used by compatibility export CHAR sVersion[13]; memcpy(sVersion, lpStream + 0x26 + 8, 12); sVersion[12] = 0; @@ -693,7 +695,13 @@ if(bMadeWithModPlug) { SetModFlag(MSF_COMPATIBLE_PLAY, false); - if(!m_dwLastSavedWithVersion) m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 16, 00, 00); + if(!m_dwLastSavedWithVersion) + { + if(bProbablyMPT109) + m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 09, 00, 00); + else + m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 16, 00, 00); + } } // -> CODE#0027 @@ -712,6 +720,9 @@ if(bInterpretOpenMPTMade && m_dwLastSavedWithVersion < MAKE_VERSION_NUMERIC(1, 17, 2, 50)) SetModFlag(MSF_MIDICC_BUGEMULATION, true); + if(bInterpretOpenMPTMade && m_dwLastSavedWithVersion == 0) + m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 17, 01, 00); // early versions of OpenMPT had no version indication. + return true; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |