From: <rel...@us...> - 2011-07-29 20:49:11
|
Revision: 938 http://modplug.svn.sourceforge.net/modplug/?rev=938&view=rev Author: relabsoluness Date: 2011-07-29 20:49:03 +0000 (Fri, 29 Jul 2011) Log Message: ----------- [Fix] MIDI: OpenMPT-made MIDI files might not open in MIDI players due to incorrect endian swap in a data field. [Fix] VST: VST host version fields didn't follow the actual version of OpenMPT (no behaviour changes expected). Modified Paths: -------------- trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/mod2midi.cpp trunk/OpenMPT/mptrack/mod2midi.h Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2011-07-29 12:25:18 UTC (rev 937) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2011-07-29 20:49:03 UTC (rev 938) @@ -2817,9 +2817,24 @@ #ifndef NO_VST char buffer[64]; - GetPrivateProfileString("VST Plugins", "HostProductString", CVstPluginManager::s_szHostProductString, buffer, ARRAYELEMCOUNT(buffer), m_szConfigFileName); + GetPrivateProfileString("VST Plugins", "HostProductString", CVstPluginManager::s_szHostProductString, buffer, CountOf(buffer), m_szConfigFileName); + + // Version <= 1.19.03.00 had buggy handling of custom host information. If last open was from + // such OpenMPT version, clear the related settings to get a clean start. + const CString sPreviousVer = CMainFrame::GetSettings().gcsPreviousVersion; + if (!sPreviousVer.IsEmpty() && + MptVersion::ToNum(sPreviousVer) < MAKE_VERSION_NUMERIC(1, 19, 03, 01) && + strcmp(buffer, "OpenMPT") == 0) + { + // Remove keys by calling write with nullptr. + WritePrivateProfileString(_T("VST Plugins"), _T("HostProductString"), nullptr, m_szConfigFileName); + WritePrivateProfileString(_T("VST Plugins"), _T("HostVendorString"), nullptr, m_szConfigFileName); + WritePrivateProfileString(_T("VST Plugins"), _T("HostVendorVersion"), nullptr, m_szConfigFileName); + } + + GetPrivateProfileString("VST Plugins", "HostProductString", CVstPluginManager::s_szHostProductString, buffer, CountOf(buffer), m_szConfigFileName); strcpy(CVstPluginManager::s_szHostProductString, buffer); - GetPrivateProfileString("VST Plugins", "HostVendorString", CVstPluginManager::s_szHostVendorString, buffer, ARRAYELEMCOUNT(buffer), m_szConfigFileName); + GetPrivateProfileString("VST Plugins", "HostVendorString", CVstPluginManager::s_szHostVendorString, buffer, CountOf(buffer), m_szConfigFileName); strcpy(CVstPluginManager::s_szHostVendorString, buffer); CVstPluginManager::s_nHostVendorVersion = GetPrivateProfileInt("VST Plugins", "HostVendorVersion", CVstPluginManager::s_nHostVendorVersion, m_szConfigFileName); #endif @@ -2876,9 +2891,9 @@ WritePrivateProfileString("VST Plugins", "NumPlugins", s, m_szConfigFileName); #ifndef NO_VST - WritePrivateProfileString("VST Plugins", "HostProductString", CVstPluginManager::s_szHostProductString, m_szConfigFileName); - WritePrivateProfileString("VST Plugins", "HostVendorString", CVstPluginManager::s_szHostVendorString, m_szConfigFileName); - CMainFrame::WritePrivateProfileLong("VST Plugins", "HostVendorVersion", CVstPluginManager::s_nHostVendorVersion, m_szConfigFileName); + //WritePrivateProfileString("VST Plugins", "HostProductString", CVstPluginManager::s_szHostProductString, m_szConfigFileName); + //WritePrivateProfileString("VST Plugins", "HostVendorString", CVstPluginManager::s_szHostVendorString, m_szConfigFileName); + //CMainFrame::WritePrivateProfileLong("VST Plugins", "HostVendorVersion", CVstPluginManager::s_nHostVendorVersion, m_szConfigFileName); #endif Modified: trunk/OpenMPT/mptrack/mod2midi.cpp =================================================================== --- trunk/OpenMPT/mptrack/mod2midi.cpp 2011-07-29 12:25:18 UTC (rev 937) +++ trunk/OpenMPT/mptrack/mod2midi.cpp 2011-07-29 20:49:03 UTC (rev 938) @@ -315,7 +315,7 @@ if (nProgram > 127) return; if ((m_nCurrInstr > 0) && (m_nCurrInstr < MAX_SAMPLES)) { - m_InstrMap[m_nCurrInstr].nProgram = nProgram; + m_InstrMap[m_nCurrInstr].nProgram = static_cast<uint8>(nProgram); } } @@ -347,7 +347,7 @@ UINT nMidiChCurPrg[16]; BYTE tmp[256]; CHAR s[256]; - UINT nPPQN, nTickMultiplier, nClock, nOrder, nRow; + UINT nTickMultiplier, nClock, nOrder, nRow; UINT nSpeed; CFile f; @@ -362,7 +362,7 @@ memset(Tracks, 0, sizeof(Tracks)); if (!m_pSndFile->m_nDefaultTempo) m_pSndFile->m_nDefaultTempo = 125; nTickMultiplier = MOD2MIDI_TEMPOFACTOR; - nPPQN = (m_pSndFile->m_nDefaultTempo*nTickMultiplier) / 5; + const uint16 wPPQN = static_cast<uint16>((m_pSndFile->m_nDefaultTempo*nTickMultiplier) / 5); rmid.id_RIFF = IFFID_RIFF; rmid.filelen = sizeof(rmid)+sizeof(mthd)-8; rmid.id_RMID = 0x44494D52; // "RMID" @@ -371,9 +371,9 @@ mthd.id = 0x6468544d; // "MThd" mthd.len = BigEndian(sizeof(mthd)-8); mthd.wFmt = BigEndianW(1); - mthd.wTrks = chnCount; // 1 track/channel + mthd.wTrks = static_cast<uint16>(chnCount); // 1 track/channel mthd.wTrks = BigEndianW(mthd.wTrks); //Convert to big endian value. - mthd.wDivision = BigEndianW(nPPQN); + mthd.wDivision = BigEndianW(wPPQN); if (m_bRmi) f.Write(&rmid, sizeof(rmid)); f.Write(&mthd, sizeof(mthd)); @@ -431,10 +431,12 @@ nRow = 0; continue; } + PatternRow patternRow = m_pSndFile->Patterns[nPat].GetRow(nRow); for (UINT nChn=0; nChn<chnCount; nChn++) { PDYNMIDITRACK pTrk = &Tracks[nChn]; - MODCOMMAND *m = m_pSndFile->Patterns[nPat].GetpModCommand(nRow, nChn); + //MODCOMMAND *m = m_pSndFile->Patterns[nPat].GetpModCommand(nRow, nChn); + const MODCOMMAND *m = &patternRow[nChn]; UINT delta_time = nClock - pTrk->nLastEventClock; UINT len = 0; @@ -454,8 +456,8 @@ pTrk->nInstrument = nIns; if ((nMidiCh != 9) && (nProgram != nMidiChCurPrg[nMidiCh])) { - tmp[len] = 0xC0|nMidiCh; - tmp[len+1] = nProgram; + tmp[len] = static_cast<BYTE>(0xC0|nMidiCh); + tmp[len+1] = static_cast<BYTE>(nProgram); tmp[len+2] = 0; len += 3; } @@ -469,7 +471,7 @@ if (pTrk->NoteOn[i]) { tmp[len] = 0x90|(pTrk->NoteOn[i]-1); - tmp[len+1] = i; + tmp[len+1] = static_cast<BYTE>(i); tmp[len+2] = 0; tmp[len+3] = 0; len += 4; @@ -478,9 +480,9 @@ } if (m->note <= NOTE_MAX) { - pTrk->NoteOn[note] = pTrk->nMidiChannel+1; - tmp[len] = 0x90|pTrk->nMidiChannel; - tmp[len+1] = (pTrk->nMidiChannel==9) ? pTrk->nMidiProgram : note; + pTrk->NoteOn[note] = static_cast<BYTE>(pTrk->nMidiChannel+1); + tmp[len] = static_cast<BYTE>(0x90|pTrk->nMidiChannel); + tmp[len+1] = (pTrk->nMidiChannel==9) ? static_cast<BYTE>(pTrk->nMidiProgram) : static_cast<BYTE>(note); UINT vol = 0x7f; UINT nsmp = pTrk->nInstrument; if (m_pSndFile->m_nInstruments) Modified: trunk/OpenMPT/mptrack/mod2midi.h =================================================================== --- trunk/OpenMPT/mptrack/mod2midi.h 2011-07-29 12:25:18 UTC (rev 937) +++ trunk/OpenMPT/mptrack/mod2midi.h 2011-07-29 20:49:03 UTC (rev 938) @@ -4,7 +4,7 @@ typedef struct _MOD2MIDIINSTR { UINT nChannel; - UINT nProgram; + uint8 nProgram; } MOD2MIDIINSTR, *PMOD2MIDIINSTR; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |