From: <rel...@us...> - 2010-02-15 21:05:10
|
Revision: 495 http://modplug.svn.sourceforge.net/modplug/?rev=495&view=rev Author: relabsoluness Date: 2010-02-15 21:05:01 +0000 (Mon, 15 Feb 2010) Log Message: ----------- [Fix] Pattern Editor: status bar change done in r485 is now applied also when using hex-display. [Fix] VST: Returned host CanDo-values were wrong (since pre RC1 era). [Mod] ITP: Removed 'terminate loading on newer version'-functionality introduced in r493. [Mod] Version: Changed version to 1.18.00.01 [Mod] Misc: Some minor changes. [Svn] TortoiseSVN setting logminsize is now defined to prevent commits with empty log message. Instrument extension handling: [Mod] 'dF..' extension uses the old(pre 1.18.00.00) format again. [Mod] Limit envpoints to 32 on saving if possible. [Fix] Loading PFLG, AFLG and VFLG entries was broken (since they were introduced?). [Fix] 'dF..' conversion was faulty (introduced in r483). Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_seq.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/version.h trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Sampleio.cpp trunk/OpenMPT/soundlib/Snd_defs.h trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h Property Changed: ---------------- trunk/OpenMPT/ Property changes on: trunk/OpenMPT ___________________________________________________________________ Added: tsvn:logminsize + 10 Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2010-02-14 15:02:53 UTC (rev 494) +++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2010-02-15 21:05:01 UTC (rev 495) @@ -698,7 +698,7 @@ s[0] = 0; if(CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY) { - wsprintf(s, "Position %02Xh of %02Xh", m_nScrollPos, pSndFile->Order.GetLengthFirstEmpty()); + wsprintf(s, "Position %02Xh of %02Xh", m_nScrollPos, pSndFile->Order.GetLengthTailTrimmed()); } else { @@ -709,7 +709,7 @@ if (m_nScrollPos < pSndFile->Order.GetLength()) { - UINT nPat = pSndFile->Order[m_nScrollPos]; + PATTERNINDEX nPat = pSndFile->Order[m_nScrollPos]; if ((nPat < pSndFile->Patterns.Size()) && (nPat < pSndFile->m_nPatternNames)) { CHAR szpat[40] = ""; Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2010-02-14 15:02:53 UTC (rev 494) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2010-02-15 21:05:01 UTC (rev 495) @@ -645,6 +645,13 @@ Log("VST plugin to host: Eff: 0x%.8X, Opcode = %d, Index = %d, Value = %d, PTR = %.8X, OPT = %.3f\n",(int)effect, opcode,index,value,(int)ptr,opt); #endif + enum HostCanDo + { + HostDoNotKnow = 0, + HostCanDo = 1, + HostCanNotDo = -1 + }; + switch(opcode) { // Called when plugin param is changed via gui @@ -929,14 +936,14 @@ //"asyncProcessing", //"offline", //"supportShell" - if (!(strcmp((char*)ptr,"sendVstEvents")==0 || + if ((strcmp((char*)ptr,"sendVstEvents")==0 || strcmp((char*)ptr,"sendVstMidiEvent")==0 || strcmp((char*)ptr,"sendVstTimeInfo")==0 || strcmp((char*)ptr,"supplyIdle")==0 || strcmp((char*)ptr,"sizeWindow")==0)) - return 1; + return HostCanDo; else - return -1; + return HostCanNotDo; // case audioMasterGetLanguage: return kVstLangEnglish; Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2010-02-14 15:02:53 UTC (rev 494) +++ trunk/OpenMPT/mptrack/version.h 2010-02-15 21:05:01 UTC (rev 495) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 18 #define VER_MINOR 00 -#define VER_MINORMINOR 00 +#define VER_MINORMINOR 01 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2010-02-14 15:02:53 UTC (rev 494) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2010-02-15 21:05:01 UTC (rev 495) @@ -457,9 +457,6 @@ version = id; streamPos += sizeof(DWORD); - if(version > ITP_VERSION) - return false; - m_nType = MOD_TYPE_IT; // Song name @@ -850,11 +847,6 @@ default: ptr += sizeof(__int32); // jump field code ReadExtendedInstrumentProperty(Instruments[i], fcode, ptr, lpStream + dwMemLength); - // fix old instrument flags which got broken in OpenMPT 1.17.03.03 due to refactoring (rev 415). - if(version == 0x00000101 && fcode == 'dF..') - { - ConvertOldExtendedFlagFormat(Instruments[i]); - } break; } } @@ -3526,7 +3518,7 @@ fwrite(&size, 1, sizeof(__int16), f); fwrite(&m_dwCreatedWithVersion, 1, size, f); - code = 'LSWV'; //write m_dwCreatedWithVersion + code = 'LSWV'; //write m_dwLastSavedWithVersion fwrite(&code, 1, sizeof(__int32), f); size = sizeof(m_dwLastSavedWithVersion); fwrite(&size, 1, sizeof(__int16), f); Modified: trunk/OpenMPT/soundlib/Sampleio.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sampleio.cpp 2010-02-14 15:02:53 UTC (rev 494) +++ trunk/OpenMPT/soundlib/Sampleio.cpp 2010-02-15 21:05:01 UTC (rev 495) @@ -2021,6 +2021,9 @@ if(fadr && code != 'K[..') // copy field data in instrument's header memcpy(fadr,ptr,size); // (except for keyboard mapping) ptr += size; // jump field + + if (code == 'dF..' && fadr != nullptr) // 'dF..' field requires additional processing. + ConvertReadExtendedFlags(pIns); } @@ -2056,8 +2059,6 @@ // Seek for supported extended settings header if( code == 'MPTX' ) { - bool newFormat = false; // new flag format (separate flags for envelopes) - bool hasFlags = false; // do we really need to convert the flags? pData += sizeof(code); // jump extension header code while( (uintptr_t)(pData - pDataStart) <= nMemLength - 4) @@ -2065,39 +2066,31 @@ memcpy(&code, pData, sizeof(code)); // read field code pData += sizeof(code); // jump field code ReadExtendedInstrumentProperty(pIns, code, pData, pEnd); - if(code == 'VFLG') - newFormat = true; - if(code == 'dF..') - hasFlags = true; } - if(!newFormat && hasFlags) - { - ConvertOldExtendedFlagFormat(pIns); - } } } -void ConvertOldExtendedFlagFormat(MODINSTRUMENT *pIns) -//---------------------------------------------------- +void ConvertReadExtendedFlags(MODINSTRUMENT *pIns) +//------------------------------------------------ { - DWORD dwOldFlags = pIns->dwFlags; + const DWORD dwOldFlags = pIns->dwFlags; pIns->dwFlags = pIns->VolEnv.dwFlags = pIns->PanEnv.dwFlags = pIns->PitchEnv.dwFlags = 0; - if(dwOldFlags & 0x0001) pIns->VolEnv.dwFlags |= ENV_ENABLED; - if(dwOldFlags & 0x0002) pIns->VolEnv.dwFlags |= ENV_SUSTAIN; - if(dwOldFlags & 0x0004) pIns->VolEnv.dwFlags |= ENV_LOOP; - if(dwOldFlags & 0x0008) pIns->PanEnv.dwFlags |= ENV_ENABLED; - if(dwOldFlags & 0x0010) pIns->PanEnv.dwFlags |= ENV_SUSTAIN; - if(dwOldFlags & 0x0020) pIns->PanEnv.dwFlags |= ENV_LOOP; - if(dwOldFlags & 0x0040) pIns->PitchEnv.dwFlags |= ENV_ENABLED; - if(dwOldFlags & 0x0080) pIns->PitchEnv.dwFlags |= ENV_SUSTAIN; - if(dwOldFlags & 0x0100) pIns->VolEnv.dwFlags |= ENV_LOOP; - if(dwOldFlags & 0x0200) pIns->dwFlags |= INS_SETPANNING; - if(dwOldFlags & 0x0400) pIns->PitchEnv.dwFlags |= ENV_FILTER; - if(dwOldFlags & 0x0800) pIns->VolEnv.dwFlags |= ENV_CARRY; - if(dwOldFlags & 0x1000) pIns->PanEnv.dwFlags |= ENV_CARRY; - if(dwOldFlags & 0x2000) pIns->PitchEnv.dwFlags |= ENV_CARRY; - if(dwOldFlags & 0x4000) pIns->dwFlags |= INS_MUTE; + if(dwOldFlags & dFdd_VOLUME) pIns->VolEnv.dwFlags |= ENV_ENABLED; + if(dwOldFlags & dFdd_VOLSUSTAIN) pIns->VolEnv.dwFlags |= ENV_SUSTAIN; + if(dwOldFlags & dFdd_VOLLOOP) pIns->VolEnv.dwFlags |= ENV_LOOP; + if(dwOldFlags & dFdd_PANNING) pIns->PanEnv.dwFlags |= ENV_ENABLED; + if(dwOldFlags & dFdd_PANSUSTAIN) pIns->PanEnv.dwFlags |= ENV_SUSTAIN; + if(dwOldFlags & dFdd_PANLOOP) pIns->PanEnv.dwFlags |= ENV_LOOP; + if(dwOldFlags & dFdd_PITCH) pIns->PitchEnv.dwFlags |= ENV_ENABLED; + if(dwOldFlags & dFdd_PITCHSUSTAIN) pIns->PitchEnv.dwFlags |= ENV_SUSTAIN; + if(dwOldFlags & dFdd_PITCHLOOP) pIns->PitchEnv.dwFlags |= ENV_LOOP; + if(dwOldFlags & dFdd_SETPANNING) pIns->dwFlags |= INS_SETPANNING; + if(dwOldFlags & dFdd_FILTER) pIns->PitchEnv.dwFlags |= ENV_FILTER; + if(dwOldFlags & dFdd_VOLCARRY) pIns->VolEnv.dwFlags |= ENV_CARRY; + if(dwOldFlags & dFdd_PANCARRY) pIns->PanEnv.dwFlags |= ENV_CARRY; + if(dwOldFlags & dFdd_PITCHCARRY) pIns->PitchEnv.dwFlags |= ENV_CARRY; + if(dwOldFlags & dFdd_MUTE) pIns->dwFlags |= INS_MUTE; } Modified: trunk/OpenMPT/soundlib/Snd_defs.h =================================================================== --- trunk/OpenMPT/soundlib/Snd_defs.h 2010-02-14 15:02:53 UTC (rev 494) +++ trunk/OpenMPT/soundlib/Snd_defs.h 2010-02-15 21:05:01 UTC (rev 495) @@ -167,10 +167,30 @@ #define ENV_CARRY 0x08 // env carry #define ENV_FILTER 0x10 // filter env enabled (this has to be combined with ENV_ENABLED in the pitch envelope's flags) + +// Flags of 'dF..' datafield in extended instrument properties. +#define dFdd_VOLUME 0x0001 +#define dFdd_VOLSUSTAIN 0x0002 +#define dFdd_VOLLOOP 0x0004 +#define dFdd_PANNING 0x0008 +#define dFdd_PANSUSTAIN 0x0010 +#define dFdd_PANLOOP 0x0020 +#define dFdd_PITCH 0x0040 +#define dFdd_PITCHSUSTAIN 0x0080 +#define dFdd_PITCHLOOP 0x0100 +#define dFdd_SETPANNING 0x0200 +#define dFdd_FILTER 0x0400 +#define dFdd_VOLCARRY 0x0800 +#define dFdd_PANCARRY 0x1000 +#define dFdd_PITCHCARRY 0x2000 +#define dFdd_MUTE 0x4000 + + // instrument-specific flags #define INS_SETPANNING 0x01 // panning enabled -#define INS_MUTE 0x02 // instrumentd is muted +#define INS_MUTE 0x02 // instrument is muted + // envelope types in instrument editor enum enmEnvelopeTypes { Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2010-02-14 15:02:53 UTC (rev 494) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2010-02-15 21:05:01 UTC (rev 495) @@ -153,7 +153,7 @@ IFC. nIFC; IFR. nIFR; K[. Keyboard[128]; -LSWV [EXT] nPlugMixMode +LSWV [EXT] Last Saved With Version MB.. wMidiBank; MC.. nMidiChannel; MDK. nMidiDrumKey; @@ -219,6 +219,7 @@ // Convenient macro to help WRITE_HEADER declaration for single type members ONLY (non-array) // -------------------------------------------------------------------------------------------- #define WRITE_MPTHEADER_sized_member(name,type,code) \ +static_assert(sizeof(input->name) >= sizeof(type), "");\ fcode = #@code;\ fwrite(& fcode , 1 , sizeof( __int32 ) , file);\ fsize = sizeof( type );\ @@ -229,19 +230,55 @@ // Convenient macro to help WRITE_HEADER declaration for array members ONLY // -------------------------------------------------------------------------------------------- #define WRITE_MPTHEADER_array_member(name,type,code,arraysize) \ +ASSERT(sizeof(input->name) >= sizeof(type) * arraysize);\ fcode = #@code;\ fwrite(& fcode , 1 , sizeof( __int32 ) , file);\ fsize = sizeof( type ) * arraysize;\ fwrite(& fsize , 1 , sizeof( __int16 ) , file);\ fwrite(&input-> name , 1 , fsize , file); +namespace { +// Create 'dF..' entry. +DWORD CreateExtensionFlags(const MODINSTRUMENT& ins) +//-------------------------------------------------- +{ + DWORD dwFlags = 0; + if (ins.VolEnv.dwFlags & ENV_ENABLED) dwFlags |= dFdd_VOLUME; + if (ins.VolEnv.dwFlags & ENV_SUSTAIN) dwFlags |= dFdd_VOLSUSTAIN; + if (ins.VolEnv.dwFlags & ENV_LOOP) dwFlags |= dFdd_VOLLOOP; + if (ins.PanEnv.dwFlags & ENV_ENABLED) dwFlags |= dFdd_PANNING; + if (ins.PanEnv.dwFlags & ENV_SUSTAIN) dwFlags |= dFdd_PANSUSTAIN; + if (ins.PanEnv.dwFlags & ENV_LOOP) dwFlags |= dFdd_PANLOOP; + if (ins.PitchEnv.dwFlags & ENV_ENABLED) dwFlags |= dFdd_PITCH; + if (ins.PitchEnv.dwFlags & ENV_SUSTAIN) dwFlags |= dFdd_PITCHSUSTAIN; + if (ins.PitchEnv.dwFlags & ENV_LOOP) dwFlags |= dFdd_PITCHLOOP; + if (ins.dwFlags & INS_SETPANNING) dwFlags |= dFdd_SETPANNING; + if (ins.PitchEnv.dwFlags & ENV_FILTER) dwFlags |= dFdd_FILTER; + if (ins.VolEnv.dwFlags & ENV_CARRY) dwFlags |= dFdd_VOLCARRY; + if (ins.PanEnv.dwFlags & ENV_CARRY) dwFlags |= dFdd_PANCARRY; + if (ins.PitchEnv.dwFlags & ENV_CARRY) dwFlags |= dFdd_PITCHCARRY; + if (ins.dwFlags & INS_MUTE) dwFlags |= dFdd_MUTE; + return dwFlags; +} +} // unnamed namespace. + // Write (in 'file') 'input' MODINSTRUMENT with 'code' & 'size' extra field infos for each member void WriteInstrumentHeaderStruct(MODINSTRUMENT * input, FILE * file) { __int32 fcode; __int16 fsize; WRITE_MPTHEADER_sized_member( nFadeOut , UINT , FO.. ) -WRITE_MPTHEADER_sized_member( dwFlags , DWORD , dF.. ) + +{ // dwFlags needs to be constructed so write it manually. + //WRITE_MPTHEADER_sized_member( dwFlags , DWORD , dF.. ) + const DWORD dwFlags = CreateExtensionFlags(*input); + fcode = 'dF..'; + fwrite(&fcode, 1, sizeof(int32), file); + fsize = sizeof(dwFlags); + fwrite(&fsize, 1, sizeof(int16), file); + fwrite(&dwFlags, 1, fsize, file); +} + WRITE_MPTHEADER_sized_member( nGlobalVol , UINT , GV.. ) WRITE_MPTHEADER_sized_member( nPan , UINT , P... ) WRITE_MPTHEADER_sized_member( VolEnv.nNodes , UINT , VE.. ) @@ -272,12 +309,12 @@ WRITE_MPTHEADER_sized_member( nMidiDrumKey , BYTE , MDK. ) WRITE_MPTHEADER_sized_member( nPPS , signed char , PPS. ) WRITE_MPTHEADER_sized_member( nPPC , unsigned char , PPC. ) -WRITE_MPTHEADER_array_member( VolEnv.Ticks , WORD , VP[. , MAX_ENVPOINTS ) -WRITE_MPTHEADER_array_member( PanEnv.Ticks , WORD , PP[. , MAX_ENVPOINTS ) -WRITE_MPTHEADER_array_member( PitchEnv.Ticks , WORD , PiP[ , MAX_ENVPOINTS ) -WRITE_MPTHEADER_array_member( VolEnv.Values , BYTE , VE[. , MAX_ENVPOINTS ) -WRITE_MPTHEADER_array_member( PanEnv.Values , BYTE , PE[. , MAX_ENVPOINTS ) -WRITE_MPTHEADER_array_member( PitchEnv.Values , BYTE , PiE[ , MAX_ENVPOINTS ) +WRITE_MPTHEADER_array_member( VolEnv.Ticks , WORD , VP[. , ((input->VolEnv.nNodes > 32) ? MAX_ENVPOINTS : 32)) +WRITE_MPTHEADER_array_member( PanEnv.Ticks , WORD , PP[. , ((input->PanEnv.nNodes > 32) ? MAX_ENVPOINTS : 32)) +WRITE_MPTHEADER_array_member( PitchEnv.Ticks , WORD , PiP[ , ((input->PitchEnv.nNodes > 32) ? MAX_ENVPOINTS : 32)) +WRITE_MPTHEADER_array_member( VolEnv.Values , BYTE , VE[. , ((input->VolEnv.nNodes > 32) ? MAX_ENVPOINTS : 32)) +WRITE_MPTHEADER_array_member( PanEnv.Values , BYTE , PE[. , ((input->PanEnv.nNodes > 32) ? MAX_ENVPOINTS : 32)) +WRITE_MPTHEADER_array_member( PitchEnv.Values , BYTE , PiE[ , ((input->PitchEnv.nNodes > 32) ? MAX_ENVPOINTS : 32)) WRITE_MPTHEADER_array_member( NoteMap , BYTE , NM[. , 128 ) WRITE_MPTHEADER_array_member( Keyboard , WORD , K[.. , 128 ) WRITE_MPTHEADER_array_member( name , CHAR , n[.. , 32 ) @@ -376,9 +413,9 @@ GET_MPTHEADER_sized_member( PitchEnv.nReleaseNode , BYTE , PERN ) GET_MPTHEADER_sized_member( PanEnv.nReleaseNode , BYTE , AERN ) GET_MPTHEADER_sized_member( VolEnv.nReleaseNode , BYTE , VERN ) -GET_MPTHEADER_sized_member( PitchEnv.dwFlags , BYTE , PFLG ) -GET_MPTHEADER_sized_member( PanEnv.dwFlags , BYTE , AFLG ) -GET_MPTHEADER_sized_member( VolEnv.dwFlags , BYTE , VFLG ) +GET_MPTHEADER_sized_member( PitchEnv.dwFlags , DWORD , PFLG ) +GET_MPTHEADER_sized_member( PanEnv.dwFlags , DWORD , AFLG ) +GET_MPTHEADER_sized_member( VolEnv.dwFlags , DWORD , VFLG ) } return pointer; Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2010-02-14 15:02:53 UTC (rev 494) +++ trunk/OpenMPT/soundlib/Sndfile.h 2010-02-15 21:05:01 UTC (rev 495) @@ -1193,8 +1193,8 @@ // Read extended instrument properties from 'pDataStart' to instrument 'pIns'. void ReadExtendedInstrumentProperties(MODINSTRUMENT* pIns, const LPCBYTE pDataStart, const size_t nMemLength); -// Convert old instrument flag format, where all flags used to be stored in one single flag. Now, some flags are stored in envelope-specific flag fields. -void ConvertOldExtendedFlagFormat(MODINSTRUMENT* pIns); +// Convert instrument flags which were read from 'dF..' extension to proper internal representation. +void ConvertReadExtendedFlags(MODINSTRUMENT* pIns); #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |