From: <sag...@us...> - 2015-05-13 20:28:03
|
Revision: 5089 http://sourceforge.net/p/modplug/code/5089 Author: saga-games Date: 2015-05-13 20:27:57 +0000 (Wed, 13 May 2015) Log Message: ----------- [Fix] Some VST plugins (e.g. SmartElektronix Ambience) write directly to the memory chunk that is passed to them when loading preset files. This memory block was not writable since OpenMPT 1.22. [Imp] When a plugin dispatch call causes an exception, show the name of the opcode that caused the exception. Modified Paths: -------------- trunk/OpenMPT/build/vs2008/OpenMPT.vcproj trunk/OpenMPT/build/vs2010/OpenMPT.vcxproj trunk/OpenMPT/build/vs2010/OpenMPT.vcxproj.filters trunk/OpenMPT/build/vs2012/OpenMPT.vcxproj trunk/OpenMPT/build/vs2012/OpenMPT.vcxproj.filters trunk/OpenMPT/build/vs2013/OpenMPT.vcxproj trunk/OpenMPT/build/vs2013/OpenMPT.vcxproj.filters trunk/OpenMPT/build/vs2015/OpenMPT.vcxproj trunk/OpenMPT/build/vs2015/OpenMPT.vcxproj.filters trunk/OpenMPT/mptrack/VstPresets.cpp trunk/OpenMPT/mptrack/VstPresets.h trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/mptrack_10.vcxproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters Added Paths: ----------- trunk/OpenMPT/soundlib/plugins/OpCodes.h Modified: trunk/OpenMPT/build/vs2008/OpenMPT.vcproj =================================================================== --- trunk/OpenMPT/build/vs2008/OpenMPT.vcproj 2015-05-13 16:14:47 UTC (rev 5088) +++ trunk/OpenMPT/build/vs2008/OpenMPT.vcproj 2015-05-13 20:27:57 UTC (rev 5089) @@ -2009,6 +2009,10 @@ > </File> <File + RelativePath="..\..\soundlib\plugins\OpCodes.h" + > + </File> + <File RelativePath="..\..\soundlib\plugins\PlugInterface.h" > </File> Modified: trunk/OpenMPT/build/vs2010/OpenMPT.vcxproj =================================================================== --- trunk/OpenMPT/build/vs2010/OpenMPT.vcxproj 2015-05-13 16:14:47 UTC (rev 5088) +++ trunk/OpenMPT/build/vs2010/OpenMPT.vcxproj 2015-05-13 20:27:57 UTC (rev 5089) @@ -488,6 +488,7 @@ <ClInclude Include="..\..\soundlib\modsmp_ctrl.h" /> <ClInclude Include="..\..\soundlib\pattern.h" /> <ClInclude Include="..\..\soundlib\patternContainer.h" /> + <ClInclude Include="..\..\soundlib\plugins\OpCodes.h" /> <ClInclude Include="..\..\soundlib\plugins\PlugInterface.h" /> <ClInclude Include="..\..\soundlib\plugins\PluginEventQueue.h" /> <ClInclude Include="..\..\soundlib\plugins\PluginMixBuffer.h" /> Modified: trunk/OpenMPT/build/vs2010/OpenMPT.vcxproj.filters =================================================================== --- trunk/OpenMPT/build/vs2010/OpenMPT.vcxproj.filters 2015-05-13 16:14:47 UTC (rev 5088) +++ trunk/OpenMPT/build/vs2010/OpenMPT.vcxproj.filters 2015-05-13 20:27:57 UTC (rev 5089) @@ -507,6 +507,9 @@ <ClInclude Include="..\..\soundlib\patternContainer.h"> <Filter>soundlib</Filter> </ClInclude> + <ClInclude Include="..\..\soundlib\plugins\OpCodes.h"> + <Filter>soundlib\plugins</Filter> + </ClInclude> <ClInclude Include="..\..\soundlib\plugins\PlugInterface.h"> <Filter>soundlib\plugins</Filter> </ClInclude> Modified: trunk/OpenMPT/build/vs2012/OpenMPT.vcxproj =================================================================== --- trunk/OpenMPT/build/vs2012/OpenMPT.vcxproj 2015-05-13 16:14:47 UTC (rev 5088) +++ trunk/OpenMPT/build/vs2012/OpenMPT.vcxproj 2015-05-13 20:27:57 UTC (rev 5089) @@ -494,6 +494,7 @@ <ClInclude Include="..\..\soundlib\modsmp_ctrl.h" /> <ClInclude Include="..\..\soundlib\pattern.h" /> <ClInclude Include="..\..\soundlib\patternContainer.h" /> + <ClInclude Include="..\..\soundlib\plugins\OpCodes.h" /> <ClInclude Include="..\..\soundlib\plugins\PlugInterface.h" /> <ClInclude Include="..\..\soundlib\plugins\PluginEventQueue.h" /> <ClInclude Include="..\..\soundlib\plugins\PluginMixBuffer.h" /> Modified: trunk/OpenMPT/build/vs2012/OpenMPT.vcxproj.filters =================================================================== --- trunk/OpenMPT/build/vs2012/OpenMPT.vcxproj.filters 2015-05-13 16:14:47 UTC (rev 5088) +++ trunk/OpenMPT/build/vs2012/OpenMPT.vcxproj.filters 2015-05-13 20:27:57 UTC (rev 5089) @@ -507,6 +507,9 @@ <ClInclude Include="..\..\soundlib\patternContainer.h"> <Filter>soundlib</Filter> </ClInclude> + <ClInclude Include="..\..\soundlib\plugins\OpCodes.h"> + <Filter>soundlib\plugins</Filter> + </ClInclude> <ClInclude Include="..\..\soundlib\plugins\PlugInterface.h"> <Filter>soundlib\plugins</Filter> </ClInclude> Modified: trunk/OpenMPT/build/vs2013/OpenMPT.vcxproj =================================================================== --- trunk/OpenMPT/build/vs2013/OpenMPT.vcxproj 2015-05-13 16:14:47 UTC (rev 5088) +++ trunk/OpenMPT/build/vs2013/OpenMPT.vcxproj 2015-05-13 20:27:57 UTC (rev 5089) @@ -495,6 +495,7 @@ <ClInclude Include="..\..\soundlib\modsmp_ctrl.h" /> <ClInclude Include="..\..\soundlib\pattern.h" /> <ClInclude Include="..\..\soundlib\patternContainer.h" /> + <ClInclude Include="..\..\soundlib\plugins\OpCodes.h" /> <ClInclude Include="..\..\soundlib\plugins\PlugInterface.h" /> <ClInclude Include="..\..\soundlib\plugins\PluginEventQueue.h" /> <ClInclude Include="..\..\soundlib\plugins\PluginMixBuffer.h" /> Modified: trunk/OpenMPT/build/vs2013/OpenMPT.vcxproj.filters =================================================================== --- trunk/OpenMPT/build/vs2013/OpenMPT.vcxproj.filters 2015-05-13 16:14:47 UTC (rev 5088) +++ trunk/OpenMPT/build/vs2013/OpenMPT.vcxproj.filters 2015-05-13 20:27:57 UTC (rev 5089) @@ -507,6 +507,9 @@ <ClInclude Include="..\..\soundlib\patternContainer.h"> <Filter>soundlib</Filter> </ClInclude> + <ClInclude Include="..\..\soundlib\plugins\OpCodes.h"> + <Filter>soundlib\plugins</Filter> + </ClInclude> <ClInclude Include="..\..\soundlib\plugins\PlugInterface.h"> <Filter>soundlib\plugins</Filter> </ClInclude> Modified: trunk/OpenMPT/build/vs2015/OpenMPT.vcxproj =================================================================== --- trunk/OpenMPT/build/vs2015/OpenMPT.vcxproj 2015-05-13 16:14:47 UTC (rev 5088) +++ trunk/OpenMPT/build/vs2015/OpenMPT.vcxproj 2015-05-13 20:27:57 UTC (rev 5089) @@ -495,6 +495,7 @@ <ClInclude Include="..\..\soundlib\modsmp_ctrl.h" /> <ClInclude Include="..\..\soundlib\pattern.h" /> <ClInclude Include="..\..\soundlib\patternContainer.h" /> + <ClInclude Include="..\..\soundlib\plugins\OpCodes.h" /> <ClInclude Include="..\..\soundlib\plugins\PlugInterface.h" /> <ClInclude Include="..\..\soundlib\plugins\PluginEventQueue.h" /> <ClInclude Include="..\..\soundlib\plugins\PluginMixBuffer.h" /> Modified: trunk/OpenMPT/build/vs2015/OpenMPT.vcxproj.filters =================================================================== --- trunk/OpenMPT/build/vs2015/OpenMPT.vcxproj.filters 2015-05-13 16:14:47 UTC (rev 5088) +++ trunk/OpenMPT/build/vs2015/OpenMPT.vcxproj.filters 2015-05-13 20:27:57 UTC (rev 5089) @@ -507,6 +507,9 @@ <ClInclude Include="..\..\soundlib\patternContainer.h"> <Filter>soundlib</Filter> </ClInclude> + <ClInclude Include="..\..\soundlib\plugins\OpCodes.h"> + <Filter>soundlib\plugins</Filter> + </ClInclude> <ClInclude Include="..\..\soundlib\plugins\PlugInterface.h"> <Filter>soundlib\plugins</Filter> </ClInclude> Modified: trunk/OpenMPT/mptrack/VstPresets.cpp =================================================================== --- trunk/OpenMPT/mptrack/VstPresets.cpp 2015-05-13 16:14:47 UTC (rev 5088) +++ trunk/OpenMPT/mptrack/VstPresets.cpp 2015-05-13 20:27:57 UTC (rev 5089) @@ -90,8 +90,19 @@ } } else { - FileReader chunk = file.ReadChunk(file.ReadUint32BE()); - plugin.Dispatch(effSetChunk, 1, chunk.GetLength(), const_cast<char *>(chunk.GetRawData()), 0); + uint32 chunkSize = file.ReadUint32BE(); + // Some nasty plugins (e.g. SmartElectronix Ambience) write to our memory block. + // Directly writing to a memory-mapped file block results in a crash... + char *chunkData = new (std::nothrow) char[chunkSize]; + if(chunkData) + { + file.ReadRaw(chunkData, chunkSize); + plugin.Dispatch(effSetChunk, 1, chunkSize, chunkData, 0); + delete[] chunkData; + } else + { + return outOfMemory; + } } plugin.Dispatch(effEndSetProgram, 0, 0, nullptr, 0.0f); } else if((header.fxMagic == bankMagic || header.fxMagic == chunkBankMagic) && firstChunk) @@ -126,8 +137,19 @@ plugin.SetCurrentProgram(oldCurrentProgram); } else { - FileReader chunk = file.ReadChunk(file.ReadUint32BE()); - plugin.Dispatch(effSetChunk, 0, chunk.GetLength(), const_cast<char *>(chunk.GetRawData()), 0); + uint32 chunkSize = file.ReadUint32BE(); + // Some nasty plugins (e.g. SmartElectronix Ambience) write to our memory block. + // Directly writing to a memory-mapped file block results in a crash... + char *chunkData = new (std::nothrow) char[chunkSize]; + if(chunkData) + { + file.ReadRaw(chunkData, chunkSize); + plugin.Dispatch(effSetChunk, 0, chunkSize, chunkData, 0); + delete[] chunkData; + } else + { + return outOfMemory; + } } if(header.version >= 2) { @@ -282,6 +304,8 @@ return "This file appears to be for a different plugin."; case VSTPresets::wrongParameters: return "The number of parameters in this file is incompatible with the current plugin."; + case VSTPresets::outOfMemory: + return "Not enough memory to load preset data."; } return nullptr; } Modified: trunk/OpenMPT/mptrack/VstPresets.h =================================================================== --- trunk/OpenMPT/mptrack/VstPresets.h 2015-05-13 16:14:47 UTC (rev 5088) +++ trunk/OpenMPT/mptrack/VstPresets.h 2015-05-13 20:27:57 UTC (rev 5089) @@ -26,6 +26,7 @@ invalidFile, wrongPlugin, wrongParameters, + outOfMemory, }; #ifndef NO_VST Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2015-05-13 16:14:47 UTC (rev 5088) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2015-05-13 20:27:57 UTC (rev 5089) @@ -26,6 +26,7 @@ #include "../common/mptFileIO.h" #include "../common/FileReader.h" #include "FileDialog.h" +#include "../soundlib/plugins/OpCodes.h" OPENMPT_NAMESPACE_BEGIN @@ -1088,7 +1089,15 @@ } } catch (...) { - ReportPlugException(mpt::String::Print(L"Exception in Dispatch(%1)!", opCode)); + std::string codeStr; + if(opCode < CountOf(VstOpCodes)) + { + codeStr = VstOpCodes[opCode]; + } else + { + codeStr = mpt::ToString(opCode); + } + ReportPlugException(mpt::String::Print(L"Exception in Dispatch(%1)!", codeStr)); } return result; @@ -1982,13 +1991,11 @@ SetParameter(nParam, fValue); } -//rewbs.smoothVST UINT CVstPlugin::GetZxxParameter(UINT nParam) //------------------------------------------- { return (UINT) (GetParameter(nParam) * 127.0f + 0.5f); } -//end rewbs.smoothVST // Automate a parameter from the plugin GUI (both custom and default plugin GUI) @@ -2002,6 +2009,8 @@ return; } + // TODO: Check if any params are actually automatable, and if there are but this one isn't, chicken out + if (m_bRecordAutomation) { // Record parameter change @@ -2129,7 +2138,7 @@ { UINT nParams = (m_Effect.numParams > 0) ? m_Effect.numParams : 0; UINT nLen = nParams * sizeof(float); - ULONG nType = *(ULONG *)m_pMixStruct->pPluginData; + uint32_t nType = *(uint32_t *)m_pMixStruct->pPluginData; if ((Dispatch(effIdentify, 0, 0, nullptr, 0) == 'NvEf') && (nType == 'NvEf')) { Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2015-05-13 16:14:47 UTC (rev 5088) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2015-05-13 20:27:57 UTC (rev 5089) @@ -1001,6 +1001,7 @@ <ClInclude Include="..\soundlib\mod_specifications.h" /> <ClInclude Include="..\soundlib\pattern.h" /> <ClInclude Include="..\soundlib\patternContainer.h" /> + <ClInclude Include="..\soundlib\plugins\OpCodes.h" /> <ClInclude Include="..\soundlib\plugins\PluginEventQueue.h" /> <ClInclude Include="..\soundlib\plugins\PluginMixBuffer.h" /> <ClInclude Include="..\soundlib\plugins\PlugInterface.h" /> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2015-05-13 16:14:47 UTC (rev 5088) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2015-05-13 20:27:57 UTC (rev 5089) @@ -1077,6 +1077,9 @@ <ClInclude Include="FadeLaws.h"> <Filter>Header Files\mptrack</Filter> </ClInclude> + <ClInclude Include="..\soundlib\plugins\OpCodes.h"> + <Filter>Header Files\soundlib\plugins</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <None Include="res\bitmap1.bmp"> Added: trunk/OpenMPT/soundlib/plugins/OpCodes.h =================================================================== --- trunk/OpenMPT/soundlib/plugins/OpCodes.h (rev 0) +++ trunk/OpenMPT/soundlib/plugins/OpCodes.h 2015-05-13 20:27:57 UTC (rev 5089) @@ -0,0 +1,97 @@ +/* + * OpCodes.h + * --------- + * Purpose: A human-readable list of VST opcodes, for error reporting purposes. + * Notes : (currently none) + * Authors: OpenMPT Devs + * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. + */ + + +#pragma once + +#ifndef NO_VST +static const char *VstOpCodes[] = +{ + "effOpen", + "effClose," + "effSetProgram", + "effGetProgram", + "effSetProgramName", + "effGetProgramName", + "effGetParamLabel", + "effGetParamDisplay", + "effGetParamName", + "effGetVu", + "effSetSampleRate" + "effSetBlockSize" + "effMainsChanged" + "effEditGetRect," + "effEditOpen," + "effEditClose," + "effEditDraw", + "effEditMouse", + "effEditKey", + "effEditIdle", + "effEditTop", + "effEditSleep", + "effIdentify", + "effGetChunk", + "effSetChunk", + "effProcessEvents", + "effCanBeAutomated", + "effString2Parameter", + "effGetNumProgramCategories", + "effGetProgramNameIndexed", + "effCopyProgram", + "effConnectInput", + "effConnectOutput", + "effGetInputProperties", + "effGetOutputProperties", + "effGetPlugCategory", + "effGetCurrentPosition", + "effGetDestinationBuffer", + "effOfflineNotify", + "effOfflinePrepare", + "effOfflineRun", + "effProcessVarIo", + "effSetSpeakerArrangement", + "effSetBlockSizeAndSampleRate", + "effSetBypass", + "effGetEffectName", + "effGetErrorText", + "effGetVendorString", + "effGetProductString", + "effGetVendorVersion", + "effVendorSpecific", + "effCanDo", + "effGetTailSize", + "effIdle", + "effGetIcon", + "effSetViewPosition", + "effGetParameterProperties", + "effKeysRequired", + "effGetVstVersion", + "effEditKeyDown", + "effEditKeyUp", + "effSetEditKnobMode", + "effGetMidiProgramName", + "effGetCurrentMidiProgram", + "effGetMidiProgramCategory", + "effHasMidiProgramsChanged", + "effGetMidiKeyName", + "effBeginSetProgram", + "effEndSetProgram", + "effGetSpeakerArrangement", + "effShellGetNextPlugin", + "effStartProcess", + "effStopProcess", + "effSetTotalSampleToProcess", + "effSetPanLaw", + "effBeginLoadBank", + "effBeginLoadProgram", + "effSetProcessPrecision", + "effGetNumMidiInputChannels", + "effGetNumMidiOutputChannels" +}; +#endif \ No newline at end of file Property changes on: trunk/OpenMPT/soundlib/plugins/OpCodes.h ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/x-chdr \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |