From: <man...@us...> - 2013-06-28 21:20:28
|
Revision: 2434 http://sourceforge.net/p/modplug/code/2434 Author: manxorist Date: 2013-06-28 21:20:18 +0000 (Fri, 28 Jun 2013) Log Message: ----------- [Ref] Move platform endianness detection from typedefs.h to CompilerDetect.h so we can use in in BuildSettings.h. [Ref] Always disable file saving on big-endian platforms for now because it is known broken and unlikely to be fixed anytime soon. [Ref] Make testsuite compileable without file saving support. Modified Paths: -------------- trunk/OpenMPT/common/BuildSettings.h trunk/OpenMPT/common/CompilerDetect.h trunk/OpenMPT/common/typedefs.h trunk/OpenMPT/test/test.cpp Modified: trunk/OpenMPT/common/BuildSettings.h =================================================================== --- trunk/OpenMPT/common/BuildSettings.h 2013-06-28 21:02:30 UTC (rev 2433) +++ trunk/OpenMPT/common/BuildSettings.h 2013-06-28 21:20:18 UTC (rev 2434) @@ -128,7 +128,7 @@ #elif defined(LIBOPENMPT_BUILD) #define ENABLE_TESTS -#define MODPLUG_NO_FILESAVE +//#define MODPLUG_NO_FILESAVE //#define NO_LOGGING #define NO_ARCHIVE_SUPPORT //#define NO_FILEREADER_STD_ISTREAM @@ -170,9 +170,13 @@ #endif #if defined(ENABLE_TESTS) && defined(MODPLUG_NO_FILESAVE) -#undef MODPLUG_NO_FILESAVE // tests require file saving +#undef MODPLUG_NO_FILESAVE // tests recommend file saving #endif +#if defined(PLATFORM_BIG_ENDIAN) && !defined(MODPLUG_NO_FILESAVE) +#define MODPLUG_NO_FILESAVE // file saving is broken on big endian +#endif + #if !defined(NO_LIBMODPLUG) #if !defined(LIBOPENMPT_BUILD) || (defined(LIBOPENMPT_BUILD) && defined(_WIN32) && !defined(LIBOPENMPT_BUILD_DLL)) #define NO_LIBMODPLUG // libmodplug interface emulation requires libopenmpt dll build on windows Modified: trunk/OpenMPT/common/CompilerDetect.h =================================================================== --- trunk/OpenMPT/common/CompilerDetect.h 2013-06-28 21:02:30 UTC (rev 2433) +++ trunk/OpenMPT/common/CompilerDetect.h 2013-06-28 21:20:18 UTC (rev 2434) @@ -87,3 +87,55 @@ #define MPT_MSVC_AT_LEAST(version,sp) 0 #define MPT_MSVC_BEFORE(version,sp) 0 #endif + + + +#if MPT_COMPILER_MSVC + #define PLATFORM_LITTLE_ENDIAN +#elif MPT_COMPILER_GCC + #if MPT_GCC_AT_LEAST(4,6,0) + #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + #define PLATFORM_BIG_ENDIAN + #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + #define PLATFORM_LITTLE_ENDIAN + #endif + #endif +#elif MPT_COMPILER_CLANG + #if MPT_CLANG_AT_LEAST(3,2,0) + #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + #define PLATFORM_BIG_ENDIAN + #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + #define PLATFORM_LITTLE_ENDIAN + #endif + #endif +#endif + +// fallback: +#if !defined(PLATFORM_BIG_ENDIAN) && !defined(PLATFORM_LITTLE_ENDIAN) + // taken from boost/detail/endian.hpp + #if (defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)) \ + || (defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__)) \ + || (defined(_STLP_BIG_ENDIAN) && !defined(_STLP_LITTLE_ENDIAN)) + #define PLATFORM_BIG_ENDIAN + #elif (defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)) \ + || (defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)) \ + || (defined(_STLP_LITTLE_ENDIAN) && !defined(_STLP_BIG_ENDIAN)) + #define PLATFORM_LITTLE_ENDIAN + #elif defined(__sparc) || defined(__sparc__) \ + || defined(_POWER) || defined(__powerpc__) \ + || defined(__ppc__) || defined(__hpux) || defined(__hppa) \ + || defined(_MIPSEB) || defined(_POWER) \ + || defined(__s390__) + #define PLATFORM_BIG_ENDIAN + #elif defined(__i386__) || defined(__alpha__) \ + || defined(__ia64) || defined(__ia64__) \ + || defined(_M_IX86) || defined(_M_IA64) \ + || defined(_M_ALPHA) || defined(__amd64) \ + || defined(__amd64__) || defined(_M_AMD64) \ + || defined(__x86_64) || defined(__x86_64__) \ + || defined(_M_X64) || defined(__bfin__) + #define PLATFORM_LITTLE_ENDIAN + #else + #error "unkown endianness" + #endif +#endif Modified: trunk/OpenMPT/common/typedefs.h =================================================================== --- trunk/OpenMPT/common/typedefs.h 2013-06-28 21:02:30 UTC (rev 2433) +++ trunk/OpenMPT/common/typedefs.h 2013-06-28 21:20:18 UTC (rev 2434) @@ -31,59 +31,7 @@ #if MPT_COMPILER_MSVC - #define PLATFORM_LITTLE_ENDIAN -#elif MPT_COMPILER_GCC - #if MPT_GCC_AT_LEAST(4,6,0) - #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ - #define PLATFORM_BIG_ENDIAN - #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ - #define PLATFORM_LITTLE_ENDIAN - #endif - #endif -#elif MPT_COMPILER_CLANG - #if MPT_CLANG_AT_LEAST(3,2,0) - #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ - #define PLATFORM_BIG_ENDIAN - #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ - #define PLATFORM_LITTLE_ENDIAN - #endif - #endif -#endif -// fallback: -#if !defined(PLATFORM_BIG_ENDIAN) && !defined(PLATFORM_LITTLE_ENDIAN) - // taken from boost/detail/endian.hpp - #if (defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)) \ - || (defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__)) \ - || (defined(_STLP_BIG_ENDIAN) && !defined(_STLP_LITTLE_ENDIAN)) - #define PLATFORM_BIG_ENDIAN - #elif (defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)) \ - || (defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)) \ - || (defined(_STLP_LITTLE_ENDIAN) && !defined(_STLP_BIG_ENDIAN)) - #define PLATFORM_LITTLE_ENDIAN - #elif defined(__sparc) || defined(__sparc__) \ - || defined(_POWER) || defined(__powerpc__) \ - || defined(__ppc__) || defined(__hpux) || defined(__hppa) \ - || defined(_MIPSEB) || defined(_POWER) \ - || defined(__s390__) - #define PLATFORM_BIG_ENDIAN - #elif defined(__i386__) || defined(__alpha__) \ - || defined(__ia64) || defined(__ia64__) \ - || defined(_M_IX86) || defined(_M_IA64) \ - || defined(_M_ALPHA) || defined(__amd64) \ - || defined(__amd64__) || defined(_M_AMD64) \ - || defined(__x86_64) || defined(__x86_64__) \ - || defined(_M_X64) || defined(__bfin__) - #define PLATFORM_LITTLE_ENDIAN - #else - #error "unkown endianness" - #endif -#endif - - - -#if MPT_COMPILER_MSVC - #if MPT_MSVC_BEFORE(2010,0) #define nullptr 0 #endif Modified: trunk/OpenMPT/test/test.cpp =================================================================== --- trunk/OpenMPT/test/test.cpp 2013-06-28 21:02:30 UTC (rev 2433) +++ trunk/OpenMPT/test/test.cpp 2013-06-28 21:20:18 UTC (rev 2434) @@ -1289,6 +1289,8 @@ return; } +#ifndef MODPLUG_NO_FILESAVE + static void SaveIT(const TSoundFileContainer &sndFile, const std::string &filename) { sndFile->SaveIT(filename.c_str(), false); @@ -1306,8 +1308,10 @@ #endif +#endif + // Test file loading and saving void TestLoadSaveFile() //--------------------- @@ -1324,13 +1328,16 @@ TestLoadMPTMFile(GetrSoundFile(sndFileContainer)); - // Test file saving - SaveIT(sndFileContainer, filenameBase + "saved.mptm"); + #ifndef MODPLUG_NO_FILESAVE + // Test file saving + SaveIT(sndFileContainer, filenameBase + "saved.mptm"); + #endif DestroySoundFileContainer(sndFileContainer); } // Reload the saved file and test if everything is still working correctly. + #ifndef MODPLUG_NO_FILESAVE { TSoundFileContainer sndFileContainer = CreateSoundFileContainer(filenameBase + "saved.mptm"); @@ -1338,6 +1345,7 @@ DestroySoundFileContainer(sndFileContainer); } + #endif // Test XM file loading { @@ -1353,13 +1361,16 @@ GetrSoundFile(sndFileContainer).m_nSamples++; GetrSoundFile(sndFileContainer).Instruments[1]->Keyboard[110] = GetrSoundFile(sndFileContainer).GetNumSamples(); - // Test file saving - SaveXM(sndFileContainer, filenameBase + "saved.xm"); + #ifndef MODPLUG_NO_FILESAVE + // Test file saving + SaveXM(sndFileContainer, filenameBase + "saved.xm"); + #endif DestroySoundFileContainer(sndFileContainer); } // Reload the saved file and test if everything is still working correctly. + #ifndef MODPLUG_NO_FILESAVE { TSoundFileContainer sndFileContainer = CreateSoundFileContainer(filenameBase + "saved.xm"); @@ -1367,6 +1378,7 @@ DestroySoundFileContainer(sndFileContainer); } + #endif // Test S3M file loading { @@ -1374,13 +1386,16 @@ TestLoadS3MFile(GetrSoundFile(sndFileContainer), false); - // Test file saving - SaveS3M(sndFileContainer, filenameBase + "saved.s3m"); + #ifndef MODPLUG_NO_FILESAVE + // Test file saving + SaveS3M(sndFileContainer, filenameBase + "saved.s3m"); + #endif DestroySoundFileContainer(sndFileContainer); } // Reload the saved file and test if everything is still working correctly. + #ifndef MODPLUG_NO_FILESAVE { TSoundFileContainer sndFileContainer = CreateSoundFileContainer(filenameBase + "saved.s3m"); @@ -1388,6 +1403,7 @@ DestroySoundFileContainer(sndFileContainer); } + #endif } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2013-06-29 00:07:15
|
Revision: 2436 http://sourceforge.net/p/modplug/code/2436 Author: saga-games Date: 2013-06-29 00:07:03 +0000 (Sat, 29 Jun 2013) Log Message: ----------- [Ref] Make CMappedFile true RAII style (put Close() in ~CMappedFile) Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/soundlib/Dlsbank.cpp trunk/OpenMPT/soundlib/Load_itp.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2013-06-28 21:49:19 UTC (rev 2435) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2013-06-29 00:07:03 UTC (rev 2436) @@ -1429,11 +1429,8 @@ // -! NEW_FEATURE#0023 bOk = TRUE; } - - f.Unlock(); } - f.Close(); EndWaitCursor(); if (bOk) { Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2013-06-28 21:49:19 UTC (rev 2435) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2013-06-29 00:07:03 UTC (rev 2436) @@ -811,9 +811,7 @@ m_modDoc.GetSampleUndo().RemoveLastUndoStep(m_nSample); } } - f.Unlock(); OpenError: - f.Close(); EndWaitCursor(); if (bOk) { Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2013-06-28 21:49:19 UTC (rev 2435) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2013-06-29 00:07:03 UTC (rev 2436) @@ -1583,10 +1583,8 @@ ok = m_WaveFile.ReadSampleFromFile(1, p, dwLen); m_WaveFile.AllocateInstrument(1, 1); } - f.Unlock(); } } - f.Close(); } } if(ok) Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2013-06-28 21:49:19 UTC (rev 2435) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2013-06-29 00:07:03 UTC (rev 2436) @@ -225,7 +225,6 @@ f.Unlock(); } } - f.Close(); } } #endif Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2013-06-28 21:49:19 UTC (rev 2435) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2013-06-29 00:07:03 UTC (rev 2436) @@ -1970,6 +1970,7 @@ CMappedFile::~CMappedFile() //------------------------- { + Close(); } Modified: trunk/OpenMPT/mptrack/View_tre.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp 2013-06-28 21:49:19 UTC (rev 2435) +++ trunk/OpenMPT/mptrack/View_tre.cpp 2013-06-29 00:07:03 UTC (rev 2436) @@ -283,7 +283,6 @@ f.Unlock(); } } - f.Close(); } } strcpy(m_szSongName, pszSongName); Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2013-06-28 21:49:19 UTC (rev 2435) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2013-06-29 00:07:03 UTC (rev 2436) @@ -1682,7 +1682,6 @@ FileReader file(f.Lock(len), len); errorStr = VSTPresets::GetErrorMessage(VSTPresets::LoadFile(file, *this)); - f.Close(); } else { errorStr = "Can't open file."; Modified: trunk/OpenMPT/soundlib/Dlsbank.cpp =================================================================== --- trunk/OpenMPT/soundlib/Dlsbank.cpp 2013-06-28 21:49:19 UTC (rev 2435) +++ trunk/OpenMPT/soundlib/Dlsbank.cpp 2013-06-29 00:07:03 UTC (rev 2436) @@ -1159,7 +1159,6 @@ if (dwMemLength >= 256) lpMemFile = MapFile.Lock(); if (!lpMemFile) { - MapFile.Close(); return FALSE; } @@ -1382,8 +1381,6 @@ { ConvertSF2ToDLS(&sf2info); } - MapFile.Unlock(); - MapFile.Close(); #ifdef DLSBANK_LOG Log("DLS bank closed\n"); #endif Modified: trunk/OpenMPT/soundlib/Load_itp.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_itp.cpp 2013-06-28 21:49:19 UTC (rev 2435) +++ trunk/OpenMPT/soundlib/Load_itp.cpp 2013-06-29 00:07:03 UTC (rev 2436) @@ -221,7 +221,6 @@ if(!lpFile) { f.Close(); continue; } ReadInstrumentFromFile(ins + 1, lpFile, size); - f.Unlock(); f.Close(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-06-30 13:13:33
|
Revision: 2438 http://sourceforge.net/p/modplug/code/2438 Author: manxorist Date: 2013-06-30 13:13:24 +0000 (Sun, 30 Jun 2013) Log Message: ----------- [Ref] Rewrite SampleFormatConverters.h to avoid pointer casts inside the functor objects and generally improve type safety of the conversion interface a bit. [Ref] Always assume stateful functors in CopySample functions. [Ref] Copy interleaved stereo samples with a single interleaved loop instead of iterating twice oder the data. Modified Paths: -------------- trunk/OpenMPT/soundlib/Load_wav.cpp trunk/OpenMPT/soundlib/SampleFormatConverters.h trunk/OpenMPT/soundlib/SampleFormats.cpp trunk/OpenMPT/soundlib/SampleIO.cpp trunk/OpenMPT/test/test.cpp Modified: trunk/OpenMPT/soundlib/Load_wav.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_wav.cpp 2013-06-30 12:04:38 UTC (rev 2437) +++ trunk/OpenMPT/soundlib/Load_wav.cpp 2013-06-30 13:13:24 UTC (rev 2438) @@ -33,8 +33,8 @@ return false; } - const uint8 *inBuf = reinterpret_cast<const uint8 *>(file.GetRawData()); - CopySample<SampleConverter>(sample.pSample, sample.nLength, 1, inBuf + offset, file.BytesLeft() - offset, numChannels); + const char *inBuf = file.GetRawData(); + CopySample<SampleConverter>(reinterpret_cast<typename SampleConverter::output_t*>(sample.pSample), sample.nLength, 1, inBuf + offset, file.BytesLeft() - offset, numChannels); CSoundFile::AdjustSampleLoop(sample); return true; } @@ -155,21 +155,21 @@ if(wavFile.GetSampleFormat() == WAVFormatChunk::fmtFloat) { - CopyWavChannel<ReadFloat32toInt16PCM<littleEndian32> >(sample, sampleChunk, channel, wavFile.GetNumChannels()); + CopyWavChannel<SC::ConversionChain<SC::Convert<int16, float32>, SC::DecodeFloat32<littleEndian32> > >(sample, sampleChunk, channel, wavFile.GetNumChannels()); } else { if(wavFile.GetBitsPerSample() <= 8) { - CopyWavChannel<ReadInt8PCM<0x80u> >(sample, sampleChunk, channel, wavFile.GetNumChannels()); + CopyWavChannel<SC::DecodeUint8>(sample, sampleChunk, channel, wavFile.GetNumChannels()); } else if(wavFile.GetBitsPerSample() <= 16) { - CopyWavChannel<ReadInt16PCM<0, littleEndian16> >(sample, sampleChunk, channel, wavFile.GetNumChannels()); + CopyWavChannel<SC::DecodeInt16<0, littleEndian16> >(sample, sampleChunk, channel, wavFile.GetNumChannels()); } else if(wavFile.GetBitsPerSample() <= 24) { - CopyWavChannel<ReadBigIntTo16PCM<3, 1, 2> >(sample, sampleChunk, channel, wavFile.GetNumChannels()); + CopyWavChannel<SC::ConversionChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, littleEndian24> > >(sample, sampleChunk, channel, wavFile.GetNumChannels()); } else if(wavFile.GetBitsPerSample() <= 32) { - CopyWavChannel<ReadBigIntTo16PCM<4, 2, 3> >(sample, sampleChunk, channel, wavFile.GetNumChannels()); + CopyWavChannel<SC::ConversionChain<SC::Convert<int16, int32>, SC::DecodeInt32<0, littleEndian32> > >(sample, sampleChunk, channel, wavFile.GetNumChannels()); } } Modified: trunk/OpenMPT/soundlib/SampleFormatConverters.h =================================================================== --- trunk/OpenMPT/soundlib/SampleFormatConverters.h 2013-06-30 12:04:38 UTC (rev 2437) +++ trunk/OpenMPT/soundlib/SampleFormatConverters.h 2013-06-30 13:13:24 UTC (rev 2438) @@ -20,174 +20,265 @@ #define bigEndian16 1, 0 -////////////////////////////////////////////////////// -// Sample conversion functors -enum SampleConversionState { conversionHasNoState, conversionHasState }; +namespace SC { // SC = _S_ample_C_onversion -// Sample conversion functor base class, which contains all the basic properties of the conversion. -template <typename TIn, typename TOut, SampleConversionState state> -struct SampleConversionFunctor -{ - // The sample data type that is accepted as input by the functor - typedef TIn input_t; - // The sample data type that is output by the functor - typedef TOut output_t; - // Declares whether the sample conversion functor has a state, i.e. if there are - // dependencies between two functor calls (e.g. when loading delta-encoded samples). - // Sometimes there might be quicker ways to load a sample if it is known that there is - // no state, for example in the case CopyStereoInterleavedSample: If there are no - // dependencies between functor calls, we can load the whole interleaved stream in one - // go, else we will have to load the left and right channel independently (example: - // for delta-encoded samples, the delta value is usally a per-channel property) - static const SampleConversionState hasState = state; - // Now it's your job to add this to child classes :) - // inline output_t operator() (const void *sourceBuffer) { ... } -}; +// Every sample conversion functor has to typedef its input_t and output_t +// and has to provide a static const input_inc member +// which describes by how many input_t elements inBuf has to be incremented between invocations. +// input_inc is normally 1 except when decoding e.g. bigger sample values +// from multiple char values. +// Another possible use for input_inc could be reading only one channel of +// an interleaved multi-channel sample (although there is currently no functor to do this). -// 7-Bit sample with unused high bit conversion -template <int8 offset> -struct ReadInt7to8PCM : SampleConversionFunctor<int8, int8, conversionHasNoState> + +struct DecodeInt7 { - forceinline int8 operator() (const void *sourceBuffer) + typedef char input_t; + typedef int8 output_t; + static const int input_inc = 1; + forceinline output_t operator() (const input_t *inBuf) { - return static_cast<int8>(Clamp(static_cast<int16>((*static_cast<const int8 *>(sourceBuffer)) - offset) * 2, -128, 127)); + return Clamp(int8(*inBuf), int8(-64), int8(63)) * 2; } }; +struct DecodeInt8 +{ + typedef char input_t; + typedef int8 output_t; + static const int input_inc = 1; + forceinline output_t operator() (const input_t *inBuf) + { + return int8(*inBuf); + } +}; -// 8-Bit sample conversion -template <int8 offset> -struct ReadInt8PCM : SampleConversionFunctor<int8, int8, conversionHasNoState> +struct DecodeUint8 { - forceinline int8 operator() (const void *sourceBuffer) + typedef char input_t; + typedef int8 output_t; + static const int input_inc = 1; + forceinline output_t operator() (const input_t *inBuf) { - return (*static_cast<const int8 *>(sourceBuffer)) - offset; + return int8(int(uint8(*inBuf)) - 128); } }; - -// 8-Bit delta sample conversion -struct ReadInt8DeltaPCM : SampleConversionFunctor<int8, int8, conversionHasState> +struct DecodeInt8Delta { - int8 delta; - - ReadInt8DeltaPCM() : delta(0) { } - - forceinline int8 operator() (const void *sourceBuffer) + typedef char input_t; + typedef int8 output_t; + static const int input_inc = 1; + uint8 delta; + DecodeInt8Delta() : delta(0) { } + forceinline output_t operator() (const input_t *inBuf) { - delta += *static_cast<const int8 *>(sourceBuffer); - return static_cast<int8>(delta); + delta += uint8(*inBuf); + return int8(delta); } }; - -// 16-Bit sample conversion (for both little and big endian, depending on template parameters) template <int16 offset, size_t loByteIndex, size_t hiByteIndex> -struct ReadInt16PCM : SampleConversionFunctor<int16, int16, conversionHasNoState> +struct DecodeInt16 { - forceinline int16 operator() (const void *sourceBuffer) + typedef char input_t; + typedef int16 output_t; + static const int input_inc = 2; + forceinline output_t operator() (const input_t *inBuf) { - const uint8 *inBuf = static_cast<const uint8 *>(sourceBuffer); - return (inBuf[loByteIndex] | (inBuf[hiByteIndex] << 8)) - offset; + return (uint8(inBuf[loByteIndex]) | (uint8(inBuf[hiByteIndex]) << 8)) - offset; } }; - -// 16-Bit delta sample conversion (for both little and big endian, depending on template parameters) template <size_t loByteIndex, size_t hiByteIndex> -struct ReadInt16DeltaPCM : SampleConversionFunctor<int16, int16, conversionHasState> +struct DecodeInt16Delta { - int16 delta; + typedef char input_t; + typedef int16 output_t; + static const int input_inc = 2; + uint16 delta; + DecodeInt16Delta() : delta(0) { } + forceinline output_t operator() (const input_t *inBuf) + { + delta += uint8(inBuf[loByteIndex]) | (uint8(inBuf[hiByteIndex]) << 8); + return int16(delta); + } +}; - ReadInt16DeltaPCM() : delta(0) { } +struct DecodeInt16Delta8 +{ + typedef char input_t; + typedef int16 output_t; + static const int input_inc = 2; + uint16 delta; + DecodeInt16Delta8() : delta(0) { } + forceinline output_t operator() (const input_t *inBuf) + { + delta += uint8(inBuf[0]); + int16 result = delta & 0xFF; + delta += uint8(inBuf[1]); + result |= (delta << 8); + return result; + } +}; - forceinline int16 operator() (const void *sourceBuffer) +template <int32 offset, size_t loByteIndex, size_t midByteIndex, size_t hiByteIndex> +struct DecodeInt24 +{ + typedef char input_t; + typedef int32 output_t; + static const int input_inc = 3; + forceinline output_t operator() (const input_t *inBuf) { - const uint8 *inBuf = static_cast<const uint8 *>(sourceBuffer); - delta += inBuf[loByteIndex] | (inBuf[hiByteIndex] << 8); - return static_cast<int16>(delta); + return ((uint8(inBuf[loByteIndex]) << 8) | (uint8(inBuf[midByteIndex]) << 16) | (uint8(inBuf[hiByteIndex]) << 24)) - offset; } }; +template <int32 offset, size_t loLoByteIndex, size_t loHiByteIndex, size_t hiLoByteIndex, size_t hiHiByteIndex> +struct DecodeInt32 +{ + typedef char input_t; + typedef int32 output_t; + static const int input_inc = 4; + forceinline output_t operator() (const input_t *inBuf) + { + return (uint8(inBuf[loLoByteIndex]) | (uint8(inBuf[loHiByteIndex]) << 8) | (uint8(inBuf[hiLoByteIndex]) << 16) | (uint8(inBuf[hiHiByteIndex]) << 24)) - offset; + } +}; -// 8-Bit delta to 16-Bit sample conversion (PTM samples) -struct ReadInt8to16DeltaPCM : SampleConversionFunctor<int16, int16, conversionHasState> +template <size_t loLoByteIndex, size_t loHiByteIndex, size_t hiLoByteIndex, size_t hiHiByteIndex> +struct DecodeFloat32 { - int16 delta; + typedef char input_t; + typedef float32 output_t; + static const int input_inc = 4; + forceinline output_t operator() (const input_t *inBuf) + { + return DecodeFloatLE(uint8_4(uint8(inBuf[loLoByteIndex]), uint8(inBuf[loHiByteIndex]), uint8(inBuf[hiLoByteIndex]), uint8(inBuf[hiHiByteIndex]))); + } +}; - ReadInt8to16DeltaPCM() : delta(0) { } - - forceinline int16 operator() (const void *sourceBuffer) +template <typename Tsample> +struct ReadSample +{ + typedef Tsample input_t; + typedef Tsample output_t; + static const int input_inc = 1; + forceinline output_t operator() (const input_t * inBuf) { - const int8 *inBuf = static_cast<const int8 *>(sourceBuffer); - delta += inBuf[0]; - int16 result = delta & 0xFF; - delta += inBuf[1]; - result |= (delta << 8); - return result; + return *inBuf; } }; -// 24-Bit sample conversion (for both little and big endian, depending on template parameters): Extend to 32-Bit -template <int32 offset, size_t loByteIndex, size_t midByteIndex, size_t hiByteIndex> -struct ReadInt24to32PCM : SampleConversionFunctor<char[3], int32, conversionHasNoState> + +template <typename Tdst, typename Tsrc, int shift> +struct ConvertShift { - forceinline int32 operator() (const void *sourceBuffer) + typedef Tsrc input_t; + typedef Tdst output_t; + static const int input_inc = 1; + forceinline output_t operator() (const input_t * inBuf) { - const uint8 *inBuf = static_cast<const uint8 *>(sourceBuffer); - return ((inBuf[loByteIndex] << 8) | (inBuf[midByteIndex] << 16) | (inBuf[hiByteIndex] << 24)) - offset; + return mpt::saturate_cast<output_t>(*inBuf >> shift); } }; -// 32-Bit sample conversion (for both little and big endian, depending on template parameters) -template <int32 offset, size_t loLoByteIndex, size_t loHiByteIndex, size_t hiLoByteIndex, size_t hiHiByteIndex> -struct ReadInt32PCM : SampleConversionFunctor<int32, int32, conversionHasNoState> + +template <typename Tdst, typename Tsrc> +struct Convert; + +template <typename Tid> +struct Convert<Tid, Tid> { - forceinline int32 operator() (const void *sourceBuffer) + typedef Tid input_t; + typedef Tid output_t; + static const int input_inc = 1; + forceinline output_t operator() (const input_t * inBuf) { - const uint8 *inBuf = static_cast<const uint8 *>(sourceBuffer); - return (inBuf[loLoByteIndex] | (inBuf[loHiByteIndex] << 8) | (inBuf[hiLoByteIndex] << 16) | (inBuf[hiHiByteIndex] << 24)) - offset; + return *inBuf; } }; +template <> +struct Convert<int8, int16> +{ + typedef int16 input_t; + typedef int8 output_t; + static const int input_inc = 1; + forceinline output_t operator() (const input_t *inBuf) + { + return int8(*inBuf >> 8); + } +}; -// Signed integer PCM (e.g. 24-Bit, 32-Bit) to 16-Bit signed sample conversion with truncation (for both little and big endian, depending on template parameters) -template <size_t inputTypeSize, size_t loByteIndex, size_t hiByteIndex> -struct ReadBigIntTo16PCM : SampleConversionFunctor<char[inputTypeSize], int16, conversionHasNoState> +template <> +struct Convert<int8, int32> { - forceinline int16 operator() (const void *sourceBuffer) + typedef int32 input_t; + typedef int8 output_t; + static const int input_inc = 1; + forceinline output_t operator() (const input_t *inBuf) { - const uint8 *inBuf = static_cast<const uint8 *>(sourceBuffer); - return inBuf[loByteIndex] | (inBuf[hiByteIndex] << 8); + return int8(*inBuf >> 24); } }; +template <> +struct Convert<int8, float32> +{ + typedef float32 input_t; + typedef int8 output_t; + static const int input_inc = 1; + forceinline output_t operator() (const input_t *inBuf) + { + float val = *inBuf; + Limit(val, -1.0f, 1.0f); + val *= 128.0f; + // MSVC with x87 floating point math calls floor for the more intuitive version + // return mpt::saturate_cast<int8>(static_cast<int>(std::floor(val + 0.5f))); + return mpt::saturate_cast<int8>(static_cast<int>(val * 2.0f + 1.0f) >> 1); + } +}; -// 32-Bit signed integer PCM with padding to 16-Bit signed sample conversion with truncation (assuming sample data has same endianness as host) -template <size_t shift> -struct ReadBigIntToInt16PCMNative : SampleConversionFunctor<int32, int16, conversionHasNoState> +template <> +struct Convert<int16, int8> { - forceinline int16 operator() (const void *sourceBuffer) + typedef int8 input_t; + typedef int16 output_t; + static const int input_inc = 1; + forceinline output_t operator() (const input_t *inBuf) { - return static_cast<int16>((*static_cast<const int32 *>(sourceBuffer)) >> shift); + return int16(*inBuf << 8); } }; +template <> +struct Convert<int16, int32> +{ + typedef int32 input_t; + typedef int16 output_t; + static const int input_inc = 1; + forceinline output_t operator() (const input_t *inBuf) + { + return int16(*inBuf >> 16); + } +}; -// 32-Bit floating point to 16-Bit signed PCM sample conversion with clipping (for both little and big endian, depending on template parameters) -template <size_t loLoByteIndex, size_t loHiByteIndex, size_t hiLoByteIndex, size_t hiHiByteIndex> -struct ReadFloat32toInt16PCM : SampleConversionFunctor<float, int16, conversionHasNoState> +template <> +struct Convert<int16, float32> { - forceinline int16 operator() (const void *sourceBuffer) + typedef float32 input_t; + typedef int16 output_t; + static const int input_inc = 1; + forceinline output_t operator() (const input_t *inBuf) { - const uint8 *inBuf = static_cast<const uint8 *>(sourceBuffer); - float val = DecodeFloatLE(uint8_4(inBuf[loLoByteIndex], inBuf[loHiByteIndex], inBuf[hiLoByteIndex], inBuf[hiHiByteIndex])); + float val = *inBuf; Limit(val, -1.0f, 1.0f); val *= 32768.0f; // MSVC with x87 floating point math calls floor for the more intuitive version @@ -197,73 +288,76 @@ }; -////////////////////////////////////////////////////// -// Sample normalization + conversion functors -// Signed integer PCM (up to 32-Bit) to 16-Bit signed sample conversion with normalization. A second sample conversion functor is used for actual sample reading. -template <typename SampleConversion> -struct ReadBigIntToInt16PCMandNormalize : SampleConversionFunctor<typename SampleConversion::input_t, int16, conversionHasNoState> +// Reads sample data with Func and passes it directly to Func2. +// Func1::output_t and Func2::input_t must be identical +template <typename Func2, typename Func1> +struct ConversionChain { - uint32 maxVal; - SampleConversion sampleConv; - - ReadBigIntToInt16PCMandNormalize() : maxVal(0) + typedef typename Func1::input_t input_t; + typedef typename Func2::output_t output_t; + static const int input_inc = Func1::input_inc; + Func1 func1; + Func2 func2; + forceinline output_t operator() (const input_t *inBuf) { - static_assert(SampleConversion::hasState == false, "Implementation of this conversion functor is stateless"); - static_assert(sizeof(typename SampleConversion::output_t) <= 4, "Implementation of this conversion functor is only suitable for 32-Bit integers or smaller"); + typename Func1::output_t tmp = func1(inBuf); + return func2(&tmp); } +}; - forceinline void FindMax(const void *sourceBuffer) + + +template <typename Tsample> +struct Normalize; + +template <> +struct Normalize<int32> +{ + typedef int32 input_t; + typedef int32 output_t; + static const int input_inc = 1; + uint32 maxVal; + Normalize() : maxVal(0) { } + forceinline void FindMax(const input_t *inBuf) { - int32 val = sampleConv(sourceBuffer); - + int32 val = *inBuf; if(val < 0) { if(val == int32_min) { - maxVal = static_cast<uint32>(-int32_min); + maxVal = static_cast<uint32>(-static_cast<int64>(int32_min)); return; } val = -val; } - if(static_cast<uint32>(val) > maxVal) { maxVal = static_cast<uint32>(val); } } - bool IsSilent() const { return maxVal == 0; } - - forceinline int16 operator() (const void *sourceBuffer) + forceinline output_t operator() (const input_t *inBuf) { - int32 val = sampleConv(sourceBuffer); - val = Util::muldivrfloor(val, 32768, maxVal); - return mpt::saturate_cast<int16>(val); + return Util::muldivrfloor(*inBuf, (uint32)1 << 31, maxVal); } }; - -// 32-Bit floating point to 16-Bit signed PCM sample conversion with normalization (for both little and big endian, depending on template parameters) -template <size_t loLoByteIndex, size_t loHiByteIndex, size_t hiLoByteIndex, size_t hiHiByteIndex> -struct ReadFloat32to16PCMandNormalize : SampleConversionFunctor<float, int16, conversionHasNoState> +template <> +struct Normalize<float32> { + typedef float32 input_t; + typedef float32 output_t; + static const int input_inc = 1; uint32 intMaxVal; float maxValInv; - - ReadFloat32to16PCMandNormalize() + Normalize() : intMaxVal(0), maxValInv(1.0f) { } + forceinline void FindMax(const input_t *inBuf) { - intMaxVal = 0; - maxValInv = 0.0f; - } - - forceinline void FindMax(const void *sourceBuffer) - { - const uint8 *inBuf = static_cast<const uint8 *>(sourceBuffer); - uint32 val = inBuf[loLoByteIndex] | (inBuf[loHiByteIndex] << 8) | (inBuf[hiLoByteIndex] << 16) | (inBuf[hiHiByteIndex] << 24); + uint32 val = EncodeFloatNE(*inBuf); val &= ~0x80000000; // Remove sign for absolute value // IEEE float values are lexicographically ordered and can be compared when interpreted as integers. @@ -274,7 +368,6 @@ intMaxVal = val; } } - bool IsSilent() { if(intMaxVal == 0) @@ -282,28 +375,57 @@ return true; } else { - maxValInv = 1.0f / DecodeFloatLE(uint8_4().SetLE(intMaxVal)); + maxValInv = 1.0f / DecodeFloatNE(intMaxVal); return false; } } + forceinline output_t operator() (const input_t *inBuf) + { + return *inBuf * maxValInv; + } +}; - forceinline int16 operator() (const void *sourceBuffer) + + +// Reads sample data with Func1, then normalizes the sample data, and then converts it with Func2. +// Func1::output_t and Func2::input_t must be identical. +// Func1 or Func2 can also be the identity transform (ReadSample<T>). +template <typename Func2, typename Func1> +struct NormalizationChain +{ + typedef typename Func1::input_t input_t; + typedef typename Func2::output_t output_t; + static const int input_inc = Func1::input_inc; + Func1 func1; + Normalize<typename Func1::output_t> normalize; + Func2 func2; + forceinline void FindMax(const input_t *inBuf) { - const uint8 *inBuf = static_cast<const uint8 *>(sourceBuffer); - float val = DecodeFloatLE(uint8_4(inBuf[loLoByteIndex], inBuf[loHiByteIndex], inBuf[hiLoByteIndex], inBuf[hiHiByteIndex])); - val *= maxValInv; - val *= 32768.0f; - // MSVC with x87 floating point math calls floor for the more intuitive version - // return mpt::saturate_cast<int16>(static_cast<int>(std::floor(val + 0.5f))); - return mpt::saturate_cast<int16>(static_cast<int>(val * 2.0f + 1.0f) >> 1); + typename Func1::output_t tmp = func1(inBuf); + normalize.FindMax(&tmp); } + bool IsSilent() + { + return normalize.IsSilent(); + } + forceinline output_t operator() (const input_t *inBuf) + { + typename Func1::output_t tmp1 = func1(inBuf); + typename Func1::output_t norm = normalize(&tmp1); + typename Func2::output_t tmp2 = func2(&norm); + return tmp2; + } }; + +} // namespace SC + + + ////////////////////////////////////////////////////// // Actual sample conversion functions - // Copy a sample data buffer. // targetBuffer: Buffer in which the sample should be copied into. // numSamples: Number of samples of size T that should be copied. targetBuffer is expected to be able to hold "numSampels * incTarget" samples. @@ -314,105 +436,112 @@ // // Template arguments: // SampleConversion: Functor of type SampleConversionFunctor to apply sample conversion (see above for existing functors). -// -// Returns: -// Number of bytes read (including skipped bytes caused by "incSource"). template <typename SampleConversion> -size_t CopySample(void *targetBuffer, size_t numSamples, size_t incTarget, const void *sourceBuffer, size_t sourceSize, size_t incSource) +size_t CopySample(typename SampleConversion::output_t *outBuf, size_t numSamples, size_t incTarget, const typename SampleConversion::input_t *inBuf, size_t sourceSize, size_t incSource) //--------------------------------------------------------------------------------------------------------------------------------------- { - typename SampleConversion::output_t *outBuf = static_cast<typename SampleConversion::output_t *>(targetBuffer); - const typename SampleConversion::input_t *inBuf = static_cast<const typename SampleConversion::input_t *>(sourceBuffer); - - const size_t sampleSize = incSource * sizeof(typename SampleConversion::input_t); + const size_t sampleSize = incSource * SampleConversion::input_inc; LimitMax(numSamples, sourceSize / sampleSize); + const size_t copySize = numSamples * sampleSize; SampleConversion sampleConv; - for(size_t i = numSamples; i != 0; i--) + while(numSamples--) { *outBuf = sampleConv(inBuf); outBuf += incTarget; - inBuf += incSource; + inBuf += incSource * SampleConversion::input_inc; } - return numSamples * sampleSize; + return copySize; } // Copy a mono sample data buffer. template <typename SampleConversion> -size_t CopyMonoSample(ModSample &sample, const uint8 *sourceBuffer, size_t sourceSize) +size_t CopyMonoSample(ModSample &sample, const char *sourceBuffer, size_t sourceSize) //------------------------------------------------------------------------------------ { ASSERT(sample.GetNumChannels() == 1); ASSERT(sample.GetElementarySampleSize() == sizeof(typename SampleConversion::output_t)); - return CopySample<SampleConversion>(sample.pSample, sample.nLength, 1, sourceBuffer, sourceSize, 1); + const size_t frameSize = SampleConversion::input_inc; + const size_t countFrames = std::min<size_t>(sourceSize / frameSize, sample.nLength); + size_t numFrames = countFrames; + SampleConversion sampleConv; + const char * inBuf = sourceBuffer; + typename SampleConversion::output_t * outBuf = reinterpret_cast<typename SampleConversion::output_t *>(sample.pSample); + while(numFrames--) + { + *outBuf = sampleConv(inBuf); + inBuf += SampleConversion::input_inc; + outBuf++; + } + return frameSize * countFrames; } // Copy a stereo interleaved sample data buffer. template <typename SampleConversion> -size_t CopyStereoInterleavedSample(ModSample &sample, const uint8 *sourceBuffer, size_t sourceSize) +size_t CopyStereoInterleavedSample(ModSample &sample, const char *sourceBuffer, size_t sourceSize) //------------------------------------------------------------------------------------------------- { ASSERT(sample.GetNumChannels() == 2); ASSERT(sample.GetElementarySampleSize() == sizeof(typename SampleConversion::output_t)); - if(SampleConversion::hasState == conversionHasState) + const size_t frameSize = 2 * SampleConversion::input_inc; + const size_t countFrames = std::min<size_t>(sourceSize / frameSize, sample.nLength); + size_t numFrames = countFrames; + SampleConversion sampleConvLeft; + SampleConversion sampleConvRight; + const char * inBuf = sourceBuffer; + typename SampleConversion::output_t * outBuf = reinterpret_cast<typename SampleConversion::output_t *>(sample.pSample); + while(numFrames--) { - // Functor has state: We have to load left and right channel independently - // or else the state of the two channels is mixed. - const size_t rightOffset = sizeof(typename SampleConversion::input_t); - if(rightOffset > sourceSize) - { - // Can't even load one sample of the right channel... - return 0; - } - - // Read left channel - CopySample<SampleConversion>(sample.pSample, sample.nLength, 2, sourceBuffer, sourceSize, 2); - // Read right channel - return CopySample<SampleConversion>(static_cast<typename SampleConversion::output_t *>(sample.pSample) + 1, sample.nLength, 2, sourceBuffer + rightOffset, sourceSize - rightOffset, 2); - } else - { - // This is quicker (and smaller), but only possible if the functor doesn't care about what it actually processes: - // Read both interleaved channels at once. - return CopySample<SampleConversion>(sample.pSample, sample.nLength * 2, 1, sourceBuffer, sourceSize, 1); + *outBuf = sampleConvLeft(inBuf); + inBuf += SampleConversion::input_inc; + outBuf++; + *outBuf = sampleConvRight(inBuf); + inBuf += SampleConversion::input_inc; + outBuf++; } + return frameSize * countFrames; } // Copy a stereo split sample data buffer. template <typename SampleConversion> -size_t CopyStereoSplitSample(ModSample &sample, const uint8 *sourceBuffer, size_t sourceSize) +size_t CopyStereoSplitSample(ModSample &sample, const char *sourceBuffer, size_t sourceSize) //------------------------------------------------------------------------------------------- { ASSERT(sample.GetNumChannels() == 2); ASSERT(sample.GetElementarySampleSize() == sizeof(typename SampleConversion::output_t)); - // Read left channel - CopySample<SampleConversion>(sample.pSample, sample.nLength, 2, sourceBuffer, sourceSize, 1); - - const size_t rightOffset = sample.nLength * sizeof(typename SampleConversion::input_t); - if(rightOffset > sourceSize) + const size_t frameSize = 2 * SampleConversion::input_inc; + const size_t countFrames = std::min<size_t>(sourceSize / frameSize, sample.nLength); + size_t numFrames = countFrames; + SampleConversion sampleConvLeft; + SampleConversion sampleConvRight; + const char * inBufLeft = sourceBuffer; + const char * inBufRight = sourceBuffer + sample.nLength * SampleConversion::input_inc; + typename SampleConversion::output_t * outBuf = reinterpret_cast<typename SampleConversion::output_t *>(sample.pSample); + while(numFrames--) { - // Can't even load one sample of the right channel... - return sourceSize; - } else - { - // Read right channel - return rightOffset + CopySample<SampleConversion>(static_cast<typename SampleConversion::output_t *>(sample.pSample) + 1, sample.nLength, 2, sourceBuffer + rightOffset, sourceSize - rightOffset, 1); + *outBuf = sampleConvLeft(inBufLeft); + inBufLeft += SampleConversion::input_inc; + outBuf++; + *outBuf = sampleConvRight(inBufRight); + inBufRight += SampleConversion::input_inc; + outBuf++; } + return frameSize * countFrames; } // Copy a sample data buffer and normalize it. Requires slightly advanced sample conversion functor. template<typename SampleConversion> -size_t CopyAndNormalizeSample(ModSample &sample, const uint8 *sourceBuffer, size_t sourceSize) +size_t CopyAndNormalizeSample(ModSample &sample, const char *sourceBuffer, size_t sourceSize) //-------------------------------------------------------------------------------------------- { - static_assert(SampleConversion::hasState == false, "Implementation of this conversion function is stateless"); const size_t inSize = sizeof(typename SampleConversion::input_t); ASSERT(sample.GetElementarySampleSize() == sizeof(typename SampleConversion::output_t)); @@ -420,28 +549,27 @@ size_t numSamples = sample.nLength * sample.GetNumChannels(); LimitMax(numSamples, sourceSize / inSize); - const typename SampleConversion::input_t *inBuf = reinterpret_cast<const typename SampleConversion::input_t *>(sourceBuffer); - + const char * inBuf = sourceBuffer; // Finding max value SampleConversion sampleConv; for(size_t i = numSamples; i != 0; i--) { sampleConv.FindMax(inBuf); - inBuf++; + inBuf += SampleConversion::input_inc; } // If buffer is silent (maximum is 0), don't bother normalizing the sample - just keep the already silent buffer. if(!sampleConv.IsSilent()) { + const char * inBuf = sourceBuffer; // Copying buffer. typename SampleConversion::output_t *outBuf = static_cast<typename SampleConversion::output_t *>(sample.pSample); - inBuf = reinterpret_cast<const typename SampleConversion::input_t *>(sourceBuffer); for(size_t i = numSamples; i != 0; i--) { *outBuf = sampleConv(inBuf); outBuf++; - inBuf++; + inBuf += SampleConversion::input_inc; } } Modified: trunk/OpenMPT/soundlib/SampleFormats.cpp =================================================================== --- trunk/OpenMPT/soundlib/SampleFormats.cpp 2013-06-30 12:04:38 UTC (rev 2437) +++ trunk/OpenMPT/soundlib/SampleFormats.cpp 2013-06-30 13:13:24 UTC (rev 2438) @@ -2020,16 +2020,16 @@ { if(bps <= 8) { - CopySample<ReadInt8PCM<0> >(sampleData8 + chn, copySamples, modChannels, buffer[chn], srcSize, 4); + CopySample<SC::ConvertShift<int8, int32, 0> >(sampleData8 + chn, copySamples, modChannels, buffer[chn], srcSize, 1); } else if(bps <= 16) { - CopySample<ReadBigIntToInt16PCMNative<0> >(sampleData16 + chn, copySamples, modChannels, buffer[chn], srcSize, 1); + CopySample<SC::ConvertShift<int16, int32, 0> >(sampleData16 + chn, copySamples, modChannels, buffer[chn], srcSize, 1); } else if(bps <= 24) { - CopySample<ReadBigIntToInt16PCMNative<8> >(sampleData16 + chn, copySamples, modChannels, buffer[chn], srcSize, 1); + CopySample<SC::ConvertShift<int16, int32, 8> >(sampleData16 + chn, copySamples, modChannels, buffer[chn], srcSize, 1); } else if(bps <= 32) { - CopySample<ReadBigIntToInt16PCMNative<16> >(sampleData16 + chn, copySamples, modChannels, buffer[chn], srcSize, 1); + CopySample<SC::ConvertShift<int16, int32, 16> >(sampleData16 + chn, copySamples, modChannels, buffer[chn], srcSize, 1); } } Modified: trunk/OpenMPT/soundlib/SampleIO.cpp =================================================================== --- trunk/OpenMPT/soundlib/SampleIO.cpp 2013-06-30 12:04:38 UTC (rev 2437) +++ trunk/OpenMPT/soundlib/SampleIO.cpp 2013-06-30 13:13:24 UTC (rev 2438) @@ -44,7 +44,7 @@ LimitMax(sample.nLength, MAX_SAMPLE_LENGTH); - const uint8 * const sourceBuf = reinterpret_cast<const uint8 *>(file.GetRawData()); + const char * const sourceBuf = file.GetRawData(); const FileReader::off_t fileSize = file.BytesLeft(), filePosition = file.GetPosition(); FileReader::off_t bytesRead = 0; // Amount of memory that has been read from file @@ -67,17 +67,17 @@ switch(GetEncoding()) { case signedPCM: // 8-Bit / Mono / Signed / PCM - bytesRead = CopyMonoSample<ReadInt8PCM<0> >(sample, sourceBuf, fileSize); + bytesRead = CopyMonoSample<SC::DecodeInt8>(sample, sourceBuf, fileSize); break; case unsignedPCM: // 8-Bit / Mono / Unsigned / PCM - bytesRead = CopyMonoSample<ReadInt8PCM<0x80u> >(sample, sourceBuf, fileSize); + bytesRead = CopyMonoSample<SC::DecodeUint8>(sample, sourceBuf, fileSize); break; case deltaPCM: // 8-Bit / Mono / Delta / PCM case MT2: - bytesRead = CopyMonoSample<ReadInt8DeltaPCM>(sample, sourceBuf, fileSize); + bytesRead = CopyMonoSample<SC::DecodeInt8Delta>(sample, sourceBuf, fileSize); break; case PCM7to8: // 7 Bit stored as 8-Bit with highest bit unused / Mono / Signed / PCM - bytesRead = CopyMonoSample<ReadInt7to8PCM<0> >(sample, sourceBuf, fileSize); + bytesRead = CopyMonoSample<SC::DecodeInt7>(sample, sourceBuf, fileSize); break; } } @@ -89,14 +89,14 @@ switch(GetEncoding()) { case signedPCM: // 8-Bit / Stereo Split / Signed / PCM - bytesRead = CopyStereoSplitSample<ReadInt8PCM<0> >(sample, sourceBuf, fileSize); + bytesRead = CopyStereoSplitSample<SC::DecodeInt8>(sample, sourceBuf, fileSize); break; case unsignedPCM: // 8-Bit / Stereo Split / Unsigned / PCM - bytesRead = CopyStereoSplitSample<ReadInt8PCM<0x80u> >(sample, sourceBuf, fileSize); + bytesRead = CopyStereoSplitSample<SC::DecodeUint8>(sample, sourceBuf, fileSize); break; case deltaPCM: // 8-Bit / Stereo Split / Delta / PCM case MT2: - bytesRead = CopyStereoSplitSample<ReadInt8DeltaPCM>(sample, sourceBuf, fileSize); + bytesRead = CopyStereoSplitSample<SC::DecodeInt8Delta>(sample, sourceBuf, fileSize); break; } } @@ -108,13 +108,13 @@ switch(GetEncoding()) { case signedPCM: // 8-Bit / Stereo Interleaved / Signed / PCM - bytesRead = CopyStereoInterleavedSample<ReadInt8PCM<0> >(sample, sourceBuf, fileSize); + bytesRead = CopyStereoInterleavedSample<SC::DecodeInt8>(sample, sourceBuf, fileSize); break; case unsignedPCM: // 8-Bit / Stereo Interleaved / Unsigned / PCM - bytesRead = CopyStereoInterleavedSample<ReadInt8PCM<0x80u> >(sample, sourceBuf, fileSize); + bytesRead = CopyStereoInterleavedSample<SC::DecodeUint8>(sample, sourceBuf, fileSize); break; case deltaPCM: // 8-Bit / Stereo Interleaved / Delta / PCM - bytesRead = CopyStereoInterleavedSample<ReadInt8DeltaPCM>(sample, sourceBuf, fileSize); + bytesRead = CopyStereoInterleavedSample<SC::DecodeInt8Delta>(sample, sourceBuf, fileSize); break; } } @@ -126,14 +126,14 @@ switch(GetEncoding()) { case signedPCM: // 16-Bit / Stereo Interleaved / Signed / PCM - bytesRead = CopyMonoSample<ReadInt16PCM<0, littleEndian16> >(sample, sourceBuf, fileSize); + bytesRead = CopyMonoSample<SC::DecodeInt16<0, littleEndian16> >(sample, sourceBuf, fileSize); break; case unsignedPCM: // 16-Bit / Stereo Interleaved / Unsigned / PCM - bytesRead = CopyMonoSample<ReadInt16PCM<0x8000u, littleEndian16> >(sample, sourceBuf, fileSize); + bytesRead = CopyMonoSample<SC::DecodeInt16<0x8000u, littleEndian16> >(sample, sourceBuf, fileSize); break; case deltaPCM: // 16-Bit / Stereo Interleaved / Delta / PCM case MT2: - bytesRead = CopyMonoSample<ReadInt16DeltaPCM<littleEndian16> >(sample, sourceBuf, fileSize); + bytesRead = CopyMonoSample<SC::DecodeInt16Delta<littleEndian16> >(sample, sourceBuf, fileSize); break; } } @@ -145,13 +145,13 @@ switch(GetEncoding()) { case signedPCM: // 16-Bit / Mono / Signed / PCM - bytesRead = CopyMonoSample<ReadInt16PCM<0, bigEndian16> >(sample, sourceBuf, fileSize); + bytesRead = CopyMonoSample<SC::DecodeInt16<0, bigEndian16> >(sample, sourceBuf, fileSize); break; case unsignedPCM: // 16-Bit / Mono / Unsigned / PCM - bytesRead = CopyMonoSample<ReadInt16PCM<0x8000u, bigEndian16> >(sample, sourceBuf, fileSize); + bytesRead = CopyMonoSample<SC::DecodeInt16<0x8000u, bigEndian16> >(sample, sourceBuf, fileSize); break; case deltaPCM: // 16-Bit / Mono / Delta / PCM - bytesRead = CopyMonoSample<ReadInt16DeltaPCM<bigEndian16> >(sample, sourceBuf, fileSize); + bytesRead = CopyMonoSample<SC::DecodeInt16Delta<bigEndian16> >(sample, sourceBuf, fileSize); break; } } @@ -163,14 +163,14 @@ switch(GetEncoding()) { case signedPCM: // 16-Bit / Stereo Split / Signed / PCM - bytesRead = CopyStereoSplitSample<ReadInt16PCM<0, littleEndian16> >(sample, sourceBuf, fileSize); + bytesRead = CopyStereoSplitSample<SC::DecodeInt16<0, littleEndian16> >(sample, sourceBuf, fileSize); break; case unsignedPCM: // 16-Bit / Stereo Split / Unsigned / PCM - bytesRead = CopyStereoSplitSample<ReadInt16PCM<0x8000u, littleEndian16> >(sample, sourceBuf, fileSize); + bytesRead = CopyStereoSplitSample<SC::DecodeInt16<0x8000u, littleEndian16> >(sample, sourceBuf, fileSize); break; case deltaPCM: // 16-Bit / Stereo Split / Delta / PCM case MT2: - bytesRead = CopyStereoSplitSample<ReadInt16DeltaPCM<littleEndian16> >(sample, sourceBuf, fileSize); + bytesRead = CopyStereoSplitSample<SC::DecodeInt16Delta<littleEndian16> >(sample, sourceBuf, fileSize); break; } } @@ -182,13 +182,13 @@ switch(GetEncoding()) { case signedPCM: // 16-Bit / Stereo Split / Signed / PCM - bytesRead = CopyStereoSplitSample<ReadInt16PCM<0, bigEndian16> >(sample, sourceBuf, fileSize); + bytesRead = CopyStereoSplitSample<SC::DecodeInt16<0, bigEndian16> >(sample, sourceBuf, fileSize); break; case unsignedPCM: // 16-Bit / Stereo Split / Unsigned / PCM - bytesRead = CopyStereoSplitSample<ReadInt16PCM<0x8000u, bigEndian16> >(sample, sourceBuf, fileSize); + bytesRead = CopyStereoSplitSample<SC::DecodeInt16<0x8000u, bigEndian16> >(sample, sourceBuf, fileSize); break; case deltaPCM: // 16-Bit / Stereo Split / Delta / PCM - bytesRead = CopyStereoSplitSample<ReadInt16DeltaPCM<bigEndian16> >(sample, sourceBuf, fileSize); + bytesRead = CopyStereoSplitSample<SC::DecodeInt16Delta<bigEndian16> >(sample, sourceBuf, fileSize); break; } } @@ -200,13 +200,13 @@ switch(GetEncoding()) { case signedPCM: // 16-Bit / Stereo Interleaved / Signed / PCM - bytesRead = CopyStereoInterleavedSample<ReadInt16PCM<0, littleEndian16> >(sample, sourceBuf, fileSize); + bytesRead = CopyStereoInterleavedSample<SC::DecodeInt16<0, littleEndian16> >(sample, sourceBuf, fileSize); break; case unsignedPCM: // 16-Bit / Stereo Interleaved / Unsigned / PCM - bytesRead = CopyStereoInterleavedSample<ReadInt16PCM<0x8000u, littleEndian16> >(sample, sourceBuf, fileSize); + bytesRead = CopyStereoInterleavedSample<SC::DecodeInt16<0x8000u, littleEndian16> >(sample, sourceBuf, fileSize); break; case deltaPCM: // 16-Bit / Stereo Interleaved / Delta / PCM - bytesRead = CopyStereoInterleavedSample<ReadInt16DeltaPCM<littleEndian16> >(sample, sourceBuf, fileSize); + bytesRead = CopyStereoInterleavedSample<SC::DecodeInt16Delta<littleEndian16> >(sample, sourceBuf, fileSize); break; } } @@ -218,13 +218,13 @@ switch(GetEncoding()) { case signedPCM: // 16-Bit / Stereo Interleaved / Signed / PCM - bytesRead = CopyStereoInterleavedSample<ReadInt16PCM<0, bigEndian16> >(sample, sourceBuf, fileSize); + bytesRead = CopyStereoInterleavedSample<SC::DecodeInt16<0, bigEndian16> >(sample, sourceBuf, fileSize); break; case unsignedPCM: // 16-Bit / Stereo Interleaved / Unsigned / PCM - bytesRead = CopyStereoInterleavedSample<ReadInt16PCM<0x8000u, bigEndian16> >(sample, sourceBuf, fileSize); + bytesRead = CopyStereoInterleavedSample<SC::DecodeInt16<0x8000u, bigEndian16> >(sample, sourceBuf, fileSize); break; case deltaPCM: // 16-Bit / Stereo Interleaved / Delta / PCM - bytesRead = CopyStereoInterleavedSample<ReadInt16DeltaPCM<bigEndian16> >(sample, sourceBuf, fileSize); + bytesRead = CopyStereoInterleavedSample<SC::DecodeInt16Delta<bigEndian16> >(sample, sourceBuf, fileSize); break; } } @@ -236,10 +236,12 @@ // Normalize to 16-Bit if(GetEndianness() == littleEndian) { - bytesRead = CopyAndNormalizeSample<ReadBigIntToInt16PCMandNormalize<ReadInt24to32PCM<0, littleEndian24> > >(sample, sourceBuf, fileSize); + bytesRead = CopyAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, littleEndian24> > >(sample, sourceBuf, fileSize); + //bytesRead = CopyMonoSample<SC::ConversionChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, littleEndian24> > >(sample, sourceBuf, fileSize); } else { - bytesRead = CopyAndNormalizeSample<ReadBigIntToInt16PCMandNormalize<ReadInt24to32PCM<0, bigEndian24> > >(sample, sourceBuf, fileSize); + bytesRead = CopyAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, bigEndian24> > >(sample, sourceBuf, fileSize); + //bytesRead = CopyMonoSample<SC::ConversionChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, bigEndian24> > >(sample, sourceBuf, fileSize); } } @@ -250,10 +252,12 @@ // Normalize to 16-Bit if(GetEndianness() == littleEndian) { - bytesRead = CopyAndNormalizeSample<ReadBigIntToInt16PCMandNormalize<ReadInt32PCM<0, littleEndian32> > >(sample, sourceBuf, fileSize); + bytesRead = CopyAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, int32>, SC::DecodeInt32<0, littleEndian32> > >(sample, sourceBuf, fileSize); + //bytesRead = CopyMonoSample<SC::ConversionChain<SC::Convert<int16, int32>, SC::DecodeInt32<0, littleEndian32> > >(sample, sourceBuf, fileSize); } else { - bytesRead = CopyAndNormalizeSample<ReadBigIntToInt16PCMandNormalize<ReadInt32PCM<0, bigEndian32> > >(sample, sourceBuf, fileSize); + bytesRead = CopyAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, int32>, SC::DecodeInt32<0, bigEndian32> > >(sample, sourceBuf, fileSize); + //bytesRead = CopyMonoSample<SC::ConversionChain<SC::Convert<int16, int32>, SC::DecodeInt32<0, bigEndian32> > >(sample, sourceBuf, fileSize); } } @@ -264,10 +268,12 @@ // Normalize to 16-Bit if(GetEndianness() == littleEndian) { - bytesRead = CopyAndNormalizeSample<ReadFloat32to16PCMandNormalize<littleEndian32> >(sample, sourceBuf, fileSize); + bytesRead = CopyAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, float32>, SC::DecodeFloat32<littleEndian32> > >(sample, sourceBuf, fileSize); + //bytesRead = CopyMonoSample<SC::ConversionChain<SC::Convert<int16, float32>, SC::DecodeFloat32<littleEndian32> > >(sample, sourceBuf, fileSize); } else { - bytesRead = CopyAndNormalizeSample<ReadFloat32to16PCMandNormalize<bigEndian32> >(sample, sourceBuf, fileSize); + bytesRead = CopyAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, float32>, SC::DecodeFloat32<bigEndian32> > >(sample, sourceBuf, fileSize); + //bytesRead = CopyMonoSample<SC::ConversionChain<SC::Convert<int16, float32>, SC::DecodeFloat32<bigEndian32> > >(sample, sourceBuf, fileSize); } } @@ -282,7 +288,7 @@ size_t readLength = (sample.nLength + 1) / 2; LimitMax(readLength, file.BytesLeft()); - const uint8 *inBuf = sourceBuf + sizeof(compressionTable); + const uint8 *inBuf = reinterpret_cast<const uint8*>(sourceBuf) + sizeof(compressionTable); int8 *outBuf = static_cast<int8 *>(sample.pSample); int8 delta = 0; @@ -318,7 +324,7 @@ } else if(GetEncoding() == PTM8Dto16 && GetChannelFormat() == mono && GetBitDepth() == 16) { // PTM 8-Bit delta to 16-Bit sample - bytesRead = CopyMonoSample<ReadInt8to16DeltaPCM>(sample, sourceBuf, fileSize); + bytesRead = CopyMonoSample<SC::DecodeInt16Delta8>(sample, sourceBuf, fileSize); } else if(GetEncoding() == MDL && GetChannelFormat() == mono && GetBitDepth() <= 16) { // Huffman MDL compressed samples @@ -328,7 +334,7 @@ uint8 *outBuf8 = static_cast<uint8 *>(sample.pSample); uint16 *outBuf16 = static_cast<uint16 *>(sample.pSample); - const uint8 *inBuf = sourceBuf + 4; + const uint8 *inBuf = reinterpret_cast<const uint8*>(sourceBuf) + 4; uint8 dlt = 0, lowbyte = 0; for(SmpLength j = 0; j < sample.nLength; j++) @@ -367,7 +373,7 @@ // DMF Huffman compression if(fileSize > 4) { - const uint8 *inBuf = sourceBuf; + const uint8 *inBuf = reinterpret_cast<const uint8*>(sourceBuf); const uint8 *inBufMax = inBuf + fileSize; uint8 *outBuf = static_cast<uint8 *>(sample.pSample); bytesRead = DMFUnpack(outBuf, inBuf, inBufMax, sample.GetSampleSizeInBytes()); Modified: trunk/OpenMPT/test/test.cpp =================================================================== --- trunk/OpenMPT/test/test.cpp 2013-06-30 12:04:38 UTC (rev 2437) +++ trunk/OpenMPT/test/test.cpp 2013-06-30 13:13:24 UTC (rev 2438) @@ -1836,9 +1836,9 @@ uint8 *unsigned8 = static_cast<uint8 *>(targetBuf) + 256; int8 *delta8 = static_cast<int8 *>(targetBuf) + 512; int8 delta = 0; - CopySample<ReadInt8PCM<0> >(signed8, 256, 1, source8, 256, 1); - CopySample<ReadInt8PCM<0x80u> >(unsigned8, 256, 1, source8, 256, 1); - CopySample<ReadInt8DeltaPCM>(delta8, 256, 1, source8, 256, 1); + CopySample<SC::DecodeInt8>(signed8, 256, 1, reinterpret_cast<const char *>(source8), 256, 1); + CopySample<SC::DecodeUint8>(reinterpret_cast<int8 *>(unsigned8), 256, 1, reinterpret_cast<const char *>(source8), 256, 1); + CopySample<SC::DecodeInt8Delta>(delta8, 256, 1, reinterpret_cast<const char *>(source8), 256, 1); for(size_t i = 0; i < 256; i++) { @@ -1866,9 +1866,9 @@ uint16 *unsigned16 = static_cast<uint16 *>(targetBuf) + 65536; int16 *delta16 = static_cast<int16 *>(targetBuf) + 65536 * 2; int16 delta = 0; - CopySample<ReadInt16PCM<0, littleEndian16> >(signed16, 65536, 1, source16, 65536 * 2, 1); - CopySample<ReadInt16PCM<0x8000u, littleEndian16> >(unsigned16, 65536, 1, source16, 65536 * 2, 1); - CopySample<ReadInt16DeltaPCM<littleEndian16> >(delta16, 65536, 1, source16, 65536 * 2, 1); + CopySample<SC::DecodeInt16<0, littleEndian16> >(signed16, 65536, 1, reinterpret_cast<const char *>(source16), 65536 * 2, 1); + CopySample<SC::DecodeInt16<0x8000u, littleEndian16> >(reinterpret_cast<int16*>(unsigned16), 65536, 1, reinterpret_cast<const char *>(source16), 65536 * 2, 1); + CopySample<SC::DecodeInt16Delta<littleEndian16> >(delta16, 65536, 1, reinterpret_cast<const char *>(source16), 65536 * 2, 1); for(size_t i = 0; i < 65536; i++) { @@ -1886,9 +1886,9 @@ source16[i * 2 + 1] = static_cast<uint8>(i & 0xFF); } - CopySample<ReadInt16PCM<0, bigEndian16> >(signed16, 65536, 1, source16, 65536 * 2, 1); - CopySample<ReadInt16PCM<0x8000u, bigEndian16> >(unsigned16, 65536, 1, source16, 65536 * 2, 1); - CopySample<ReadInt16DeltaPCM<bigEndian16> >(delta16, 65536, 1, source16, 65536 * 2, 1); + CopySample<SC::DecodeInt16<0, bigEndian16> >(signed16, 65536, 1, reinterpret_cast<const char *>(source16), 65536 * 2, 1); + CopySample<SC::DecodeInt16<0x8000u, bigEndian16> >(reinterpret_cast<int16*>(unsigned16), 65536, 1, reinterpret_cast<const char *>(source16), 65536 * 2, 1); + CopySample<SC::DecodeInt16Delta<bigEndian16> >(delta16, 65536, 1, reinterpret_cast<const char *>(source16), 65536 * 2, 1); delta = 0; for(size_t i = 0; i < 65536; i++) @@ -1917,8 +1917,8 @@ sample.nLength = 65536; sample.uFlags |= CHN_16BIT; sample.pSample = (LPSTR)(static_cast<int16 *>(targetBuf) + 65536); - CopyAndNormalizeSample<ReadBigIntToInt16PCMandNormalize<ReadInt24to32PCM<0, littleEndian24> > >(sample, reinterpret_cast<const uint8 *>(source24), 3*65536); - CopySample<ReadBigIntTo16PCM<3, 1, 2> >(truncated16, 65536, 1, source24, 65536 * 3, 1); + CopyAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, littleEndian24> > >(sample, reinterpret_cast<const char *>(source24), 3*65536); + CopySample<SC::ConversionChain<SC::ConvertShift<int16, int32, 16>, SC::DecodeInt24<0, littleEndian24> > >(truncated16, 65536, 1, reinterpret_cast<const char *>(source24), 65536 * 3, 1); for(size_t i = 0; i < 65536; i++) { @@ -1945,8 +1945,8 @@ sample.nLength = 65536; sample.uFlags |= CHN_16BIT; sample.pSample = (LPSTR)(static_cast<int16 *>(targetBuf) + 65536); - CopyAndNormalizeSample<ReadFloat32to16PCMandNormalize<bigEndian32> >(sample, reinterpret_cast<const uint8 *>(source32), 4*65536); - CopySample<ReadFloat32toInt16PCM<bigEndian32> >(truncated16, 65536, 1, source32, 65536 * 4, 1); + CopyAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, float32>, SC::DecodeFloat32<bigEndian32> > >(sample, reinterpret_cast<const char *>(source32), 4*65536); + CopySample<SC::ConversionChain<SC::Convert<int16, float32>, SC::DecodeFloat32<bigEndian32> > >(truncated16, 65536, 1, reinterpret_cast<const char *>(source32), 65536 * 4, 1); for(size_t i = 0; i < 65536; i++) { @@ -1961,9 +1961,9 @@ // Range checks { int8 oneSample = 1; - int8 *signed8 = static_cast<int8 *>(targetBuf); + char *signed8 = reinterpret_cast<char *>(targetBuf); memset(signed8, 0, 4); - CopySample<ReadInt8PCM<0> >(targetBuf, 4, 1, &oneSample, sizeof(oneSample), 1); + CopySample<SC::DecodeInt8>(reinterpret_cast<int8*>(targetBuf), 4, 1, reinterpret_cast<const char*>(&oneSample), sizeof(oneSample), 1); VERIFY_EQUAL_NONCONT(signed8[0], 1); VERIFY_EQUAL_NONCONT(signed8[1], 0); VERIFY_EQUAL_NONCONT(signed8[2], 0); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-06-30 14:41:51
|
Revision: 2445 http://sourceforge.net/p/modplug/code/2445 Author: manxorist Date: 2013-06-30 14:41:44 +0000 (Sun, 30 Jun 2013) Log Message: ----------- [Ref] Support building without zlib (useful mainly only for simple cross compile tests). Modified Paths: -------------- trunk/OpenMPT/common/BuildSettings.h trunk/OpenMPT/soundlib/load_j2b.cpp Modified: trunk/OpenMPT/common/BuildSettings.h =================================================================== --- trunk/OpenMPT/common/BuildSettings.h 2013-06-30 14:10:14 UTC (rev 2444) +++ trunk/OpenMPT/common/BuildSettings.h 2013-06-30 14:41:44 UTC (rev 2445) @@ -107,6 +107,9 @@ // Define to build without FLAC support //#define NO_FLAC +// Define to build without zlib support +//#define NO_ZLIB + // Define to build without MP3 import support (via mpg123) //#define NO_MP3_SAMPLES @@ -144,6 +147,7 @@ #endif #define NO_DSOUND #define NO_FLAC +//#define NO_ZLIB #define NO_MP3_SAMPLES //#define NO_LIBMODPLUG #if !defined(_WIN32) || (defined(_WIN32) && !defined(_M_IX86)) Modified: trunk/OpenMPT/soundlib/load_j2b.cpp =================================================================== --- trunk/OpenMPT/soundlib/load_j2b.cpp 2013-06-30 14:10:14 UTC (rev 2444) +++ trunk/OpenMPT/soundlib/load_j2b.cpp 2013-06-30 14:41:44 UTC (rev 2445) @@ -14,6 +14,9 @@ #include "stdafx.h" #include "Loaders.h" #include "ChunkReader.h" + +#ifndef NO_ZLIB + #if MPT_COMPILER_MSVC #ifndef ZLIB_WINAPI #define ZLIB_WINAPI @@ -23,7 +26,9 @@ #include <zlib.h> #endif +#endif // ZLIB + // First off, a nice vibrato translation LUT. static const uint8 j2bAutoVibratoTrans[] = { @@ -978,6 +983,13 @@ bool CSoundFile::ReadJ2B(FileReader &file, ModLoadingFlags loadFlags) //------------------------------------------------------------------- { + +#ifdef NO_ZLIB + + return false; + +#else + file.Rewind(); J2BFileHeader fileHeader; if(!file.ReadConvertEndianness(fileHeader)) @@ -1024,4 +1036,7 @@ delete[] amFileData; return result; + +#endif + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2013-06-30 17:39:14
|
Revision: 2449 http://sourceforge.net/p/modplug/code/2449 Author: saga-games Date: 2013-06-30 17:39:01 +0000 (Sun, 30 Jun 2013) Log Message: ----------- [New] Added FT2-compatible extra smooth ramping option in song properties. Set SmoothFT2Ramping=1 in the [Misc] section of mptrack.ini to automatically detect if an XM file was made with FT2 to enable this settings automatically. [Mod] OpenMPT: Version is now 1.22.03.08 Modified Paths: -------------- trunk/OpenMPT/common/versionNumber.h trunk/OpenMPT/mptrack/ModConvert.cpp trunk/OpenMPT/mptrack/ModConvert.h trunk/OpenMPT/mptrack/TrackerSettings.cpp trunk/OpenMPT/mptrack/TrackerSettings.h trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/dlg_misc.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/common/versionNumber.h =================================================================== --- trunk/OpenMPT/common/versionNumber.h 2013-06-30 16:11:29 UTC (rev 2448) +++ trunk/OpenMPT/common/versionNumber.h 2013-06-30 17:39:01 UTC (rev 2449) @@ -17,7 +17,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 22 #define VER_MINOR 03 -#define VER_MINORMINOR 07 +#define VER_MINORMINOR 08 //Version string. For example "1.17.02.28" #define MPT_VERSION_STR VER_STRINGIZE(VER_MAJORMAJOR)"."VER_STRINGIZE(VER_MAJOR)"."VER_STRINGIZE(VER_MINOR)"."VER_STRINGIZE(VER_MINORMINOR) Modified: trunk/OpenMPT/mptrack/ModConvert.cpp =================================================================== --- trunk/OpenMPT/mptrack/ModConvert.cpp 2013-06-30 16:11:29 UTC (rev 2448) +++ trunk/OpenMPT/mptrack/ModConvert.cpp 2013-06-30 17:39:01 UTC (rev 2449) @@ -475,6 +475,11 @@ CHANGEMODTYPE_WARNING(wEditHistory); } + if((nOldType & MOD_TYPE_XM) && m_SndFile.GetModFlag(MSF_VOLRAMP)) + { + CHANGEMODTYPE_WARNING(wVolRamp); + } + CriticalSection cs; m_SndFile.ChangeModTypeTo(nNewType); @@ -566,6 +571,7 @@ CHANGEMODTYPE_CHECK(wLinearSlides, "Linear Frequency Slides not supported by the new format."); CHANGEMODTYPE_CHECK(wEditHistory, "Edit history will not be saved in the new format."); CHANGEMODTYPE_CHECK(wMixmode, "Consider setting the mix levels to \"Compatible\" in the song properties when working with legacy formats."); + CHANGEMODTYPE_CHECK(wVolRamp, "Fasttracker 2 compatible super soft volume ramping gets lost when converting XM files to another type."); CHANGEMODTYPE_CHECK(wCompatibilityMode, "Consider enabling the \"compatible playback\" option in the song properties to increase compatiblity with other players."); CHANGEMODTYPE_CHECK(wGlobalVolumeNotSupported, "Default global volume is not supported by the new format."); Modified: trunk/OpenMPT/mptrack/ModConvert.h =================================================================== --- trunk/OpenMPT/mptrack/ModConvert.h 2013-06-30 16:11:29 UTC (rev 2448) +++ trunk/OpenMPT/mptrack/ModConvert.h 2013-06-30 17:39:01 UTC (rev 2449) @@ -33,6 +33,7 @@ wReleaseNode, wEditHistory, wMixmode, + wVolRamp, wCompatibilityMode, wPitchToTempoLock, wGlobalVolumeNotSupported, Modified: trunk/OpenMPT/mptrack/TrackerSettings.cpp =================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.cpp 2013-06-30 16:11:29 UTC (rev 2448) +++ trunk/OpenMPT/mptrack/TrackerSettings.cpp 2013-06-30 17:39:01 UTC (rev 2449) @@ -460,6 +460,7 @@ gbShowHackControls = (0 != CMainFrame::GetPrivateProfileDWord("Misc", "ShowHackControls", gbShowHackControls ? 1 : 0, iniFile)); DefaultPlugVolumeHandling = static_cast<uint8>(GetPrivateProfileInt("Misc", "DefaultPlugVolumeHandling", DefaultPlugVolumeHandling, iniFile)); if(DefaultPlugVolumeHandling >= PLUGIN_VOLUMEHANDLING_MAX) DefaultPlugVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE; + autoApplySmoothFT2Ramping = (0 != CMainFrame::GetPrivateProfileDWord("Misc", "SmoothFT2Ramping", false, iniFile)); m_nSampleUndoMaxBuffer = CMainFrame::GetPrivateProfileLong("Sample Editor" , "UndoBufferSize", m_nSampleUndoMaxBuffer >> 20, iniFile); m_nSampleUndoMaxBuffer = MAX(1, m_nSampleUndoMaxBuffer) << 20; Modified: trunk/OpenMPT/mptrack/TrackerSettings.h =================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.h 2013-06-30 16:11:29 UTC (rev 2448) +++ trunk/OpenMPT/mptrack/TrackerSettings.h 2013-06-30 17:39:01 UTC (rev 2449) @@ -246,6 +246,8 @@ int gnPlugWindowHeight; int32 gnPlugWindowLast; // Last selected plugin ID + bool autoApplySmoothFT2Ramping; + public: TrackerSettings(); Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2013-06-30 16:11:29 UTC (rev 2448) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2013-06-30 17:39:01 UTC (rev 2449) @@ -137,6 +137,7 @@ CheckDlgButton(IDC_CHK_MIDICCBUG, sndFile.GetModFlag(MSF_MIDICC_BUGEMULATION)); CheckDlgButton(IDC_CHK_OLDRANDOM, sndFile.GetModFlag(MSF_OLDVOLSWING)); CheckDlgButton(IDC_CHK_OLDPITCH, sndFile.GetModFlag(MSF_OLD_MIDI_PITCHBENDS)); + CheckDlgButton(IDC_CHK_FT2VOLRAMP, sndFile.GetModFlag(MSF_VOLRAMP)); // Time signature information @@ -230,6 +231,7 @@ const bool XMorITorMPT = (type & (MOD_TYPE_XM | MOD_TYPE_IT | MOD_TYPE_MPT)) != 0; const bool ITorMPT = (type & (MOD_TYPE_IT | MOD_TYPE_MPT)) != 0; + const bool XM = (type & (MOD_TYPE_XM)) != 0; // Misc Flags if(ITorMPT) @@ -242,8 +244,9 @@ GetDlgItem(IDC_CHK_COMPATPLAY)->ShowWindow(XMorITorMPT); GetDlgItem(IDC_CHK_MIDICCBUG)->ShowWindow(XMorITorMPT); - GetDlgItem(IDC_CHK_OLDRANDOM)->ShowWindow(XMorITorMPT); + GetDlgItem(IDC_CHK_OLDRANDOM)->ShowWindow(ITorMPT); GetDlgItem(IDC_CHK_OLDPITCH)->ShowWindow(XMorITorMPT); + GetDlgItem(IDC_CHK_FT2VOLRAMP)->ShowWindow(XM); // Deprecated flags are greyed out if they are not being used. GetDlgItem(IDC_CHK_MIDICCBUG)->EnableWindow(sndFile.GetModFlag(MSF_MIDICC_BUGEMULATION) ? TRUE : FALSE); @@ -373,6 +376,7 @@ if(IsDlgButtonChecked(IDC_CHK_MIDICCBUG)) sndFile.SetModFlag(MSF_MIDICC_BUGEMULATION, true); if(IsDlgButtonChecked(IDC_CHK_OLDRANDOM)) sndFile.SetModFlag(MSF_OLDVOLSWING, true); if(IsDlgButtonChecked(IDC_CHK_OLDPITCH)) sndFile.SetModFlag(MSF_OLD_MIDI_PITCHBENDS, true); + if(IsDlgButtonChecked(IDC_CHK_FT2VOLRAMP)) sndFile.SetModFlag(MSF_VOLRAMP, true); } sndFile.m_nDefaultRowsPerBeat = GetDlgItemInt(IDC_ROWSPERBEAT); @@ -440,6 +444,9 @@ case IDC_CHK_OLDPITCH: strTipText = "Use old (imprecise) portamento logic for instrument plugins (not recommended)"; break; + case IDC_CHK_FT2VOLRAMP: + strTipText = "Use Fasttracker 2 style super soft volume ramping (recommended for true compatible playback)"; + break; } if(pNMHDR->code == TTN_NEEDTEXTA) Modified: trunk/OpenMPT/mptrack/dlg_misc.h =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.h 2013-06-30 16:11:29 UTC (rev 2448) +++ trunk/OpenMPT/mptrack/dlg_misc.h 2013-06-30 17:39:01 UTC (rev 2449) @@ -20,7 +20,7 @@ { public: CComboBox m_TypeBox, m_ChannelsBox, m_TempoModeBox, m_PlugMixBox; - CButton m_CheckBox1, m_CheckBox2, m_CheckBox3, m_CheckBox4, m_CheckBox5, m_CheckBoxPT1x; + CButton m_CheckBox1, m_CheckBox2, m_CheckBox3, m_CheckBox4, m_CheckBox5, m_CheckBoxPT1x, m_CheckBoxFt2VolRamp; CSoundFile &sndFile; CHANNELINDEX m_nChannels; MODTYPE m_nType; Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2013-06-30 16:11:29 UTC (rev 2448) +++ trunk/OpenMPT/mptrack/mptrack.rc 2013-06-30 17:39:01 UTC (rev 2449) @@ -869,39 +869,41 @@ BEGIN DEFPUSHBUTTON "OK",IDOK,204,6,50,14 PUSHBUTTON "Cancel",IDCANCEL,204,24,50,14 + GROUPBOX "Type",IDC_FRAME_MODTYPE,6,6,192,48 COMBOBOX IDC_COMBO1,12,18,108,51,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_COMBO2,126,18,66,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "&Embed Instrument Parameters in ITP",IDC_CHECK6,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,36,174,8 + GROUPBOX "Playback",IDC_FRAME_MODFLAGS,6,60,246,54 CONTROL "&Linear Frequency Slides",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,72,91,10 CONTROL "&Old Effects (IT)",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,72,66,10 CONTROL "Fast &Volume Slides (S3M)",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,84,96,10 CONTROL "Compatible &Gxx (IT)",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,84,84,10 CONTROL "Extended &filter range",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,96,81,10 CONTROL "&ProTracker 1.x Mode (MOD)",IDC_CHECK_PT1X,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,96,108,10 + GROUPBOX "Extended Playback Options (OpenMPT only)",IDC_FRAME_MPTEXT,6,120,246,84 LTEXT "Mix Levels:",IDC_TEXT_MIXMODE,18,134,42,8 COMBOBOX IDC_COMBO_MIXLEVELS,60,132,84,51,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "More &compatible playback",IDC_CHK_COMPATPLAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,150,222,12 - CONTROL "Plugin volume command &bug emulation",IDC_CHK_MIDICCBUG, + CONTROL "Use &smooth Fasttracker 2 volume ramping",IDC_CHK_FT2VOLRAMP, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,162,222,12 CONTROL "Old &random variation behaviour for instruments",IDC_CHK_OLDRANDOM, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,162,222,12 + CONTROL "Old P&itch Wheel behaviour for instrument plugins",IDC_CHK_OLDPITCH, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,174,222,12 - CONTROL "Old P&itch Wheel behaviour for instrument plugins",IDC_CHK_OLDPITCH, + CONTROL "Plugin volume command &bug emulation",IDC_CHK_MIDICCBUG, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,186,222,12 + GROUPBOX "Tempo",IDC_FRAME_TEMPOMODE,6,210,246,48 LTEXT "Mode:",IDC_TEXT_TEMPOMODE,12,222,21,8 COMBOBOX IDC_COMBO_TEMPOMODE,12,234,108,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Rows per beat",IDC_TEXT_ROWSPERBEAT,162,224,84,8 EDITTEXT IDC_ROWSPERBEAT,132,222,24,12,ES_AUTOHSCROLL | ES_NUMBER - LTEXT "Rows per beat",IDC_TEXT_ROWSPERBEAT,162,224,84,8 + LTEXT "Rows per measure",IDC_TEXT_ROWSPERMEASURE,162,242,84,8 EDITTEXT IDC_ROWSPERMEASURE,132,240,24,12,ES_AUTOHSCROLL | ES_NUMBER - LTEXT "Rows per measure",IDC_TEXT_ROWSPERMEASURE,162,242,84,8 + GROUPBOX "OpenMPT Version Info",IDC_FRAME_MPTVERSION,6,263,246,48 RTEXT "IDC_TEXT_CREATEDWITH",IDC_TEXT_CREATEDWITH,18,279,54,8 EDITTEXT IDC_EDIT_CREATEDWITH,78,277,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE RTEXT "IDC_TEXT_SAVEDWITH",IDC_TEXT_SAVEDWITH,18,295,54,8 EDITTEXT IDC_EDIT_SAVEDWITH,78,295,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE - GROUPBOX "Type",IDC_FRAME_MODTYPE,6,6,192,48 - GROUPBOX "Playback",IDC_FRAME_MODFLAGS,6,60,246,54 - GROUPBOX "Extended Playback Options (OpenMPT only)",IDC_FRAME_MPTEXT,6,120,246,84 - GROUPBOX "Tempo",IDC_FRAME_TEMPOMODE,6,210,246,48 - GROUPBOX "OpenMPT Version Info",IDC_FRAME_MPTVERSION,6,263,246,48 END IDD_SHOWLOG DIALOGEX 0, 0, 300, 149 Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2013-06-30 16:11:29 UTC (rev 2448) +++ trunk/OpenMPT/mptrack/resource.h 2013-06-30 17:39:01 UTC (rev 2449) @@ -820,6 +820,7 @@ #define IDC_CHECKCAPTURE 2324 #define IDC_CHK_OLDPITCH 2324 #define IDC_SPINMOVEMAPPING 2325 +#define IDC_CHK_FT2VOLRAMP 2325 #define IDC_BUTTON_HALF 2326 #define IDC_BUTTON_DOUBLE 2327 #define IDC_GROUPBOX_PITCH_TIME 2328 Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2013-06-30 16:11:29 UTC (rev 2448) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2013-06-30 17:39:01 UTC (rev 2449) @@ -16,6 +16,9 @@ #include "../common/misc_util.h" #include "XMTools.h" #include <algorithm> +#ifdef MODPLUG_TRACKER +#include "../mptrack/TrackerSettings.h" // For super smooth ramping option +#endif // MODPLUG_TRACKER // Allocate samples for an instrument @@ -279,7 +282,7 @@ if(!memcmp(fileHeader.trackerName, "FastTracker ", 12)) { - if(fileHeader.size && !memcmp(fileHeader.trackerName + 12, "v2.00 ", 8)) + if(fileHeader.size == 276 && !memcmp(fileHeader.trackerName + 12, "v2.00 ", 8)) { if(fileHeader.version < 0x0104) madeWith = verFT2Generic | verConfirmed; @@ -382,7 +385,7 @@ madeWith.set(verConfirmed); else if(instrHeader.size != 29 && madeWith[verDigiTracker]) madeWith.reset(verDigiTracker); - else if(madeWith[verFT2Clone |verFT2Generic] && instrHeader.size != 33) + else if(madeWith[verFT2Clone | verFT2Generic] && instrHeader.size != 33) { // Sure isn't FT2. // Note: FT2 NORMALLY writes shdr=40 for all samples, but sometimes it @@ -579,6 +582,16 @@ SetModFlag(MSF_COMPATIBLE_PLAY, false); } + if(madeWith[verFT2Generic] +#ifdef MODPLUG_TRACKER + && TrackerSettings::Instance().autoApplySmoothFT2Ramping +#endif // MODPLUG_TRACKER + ) + { + // apply FT2-style super-soft volume ramping + SetModFlag(MSF_VOLRAMP, true); + } + if(madeWithTracker.empty()) { if(madeWith[verDigiTracker] && sampleReserved == 0 && (instrType ? instrType : -1) == -1) Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2013-06-30 16:11:29 UTC (rev 2448) +++ trunk/OpenMPT/soundlib/Sndfile.h 2013-06-30 17:39:01 UTC (rev 2449) @@ -176,6 +176,7 @@ MSF_OLDVOLSWING = 2, //IT/MPT MSF_MIDICC_BUGEMULATION = 4, //IT/MPT/XM MSF_OLD_MIDI_PITCHBENDS = 8, //IT/MPT/XM + MSF_VOLRAMP = 16, //XM(FT2) }; DECLARE_FLAGSET(ModSpecificFlag) Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2013-06-30 16:11:29 UTC (rev 2448) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2013-06-30 17:39:01 UTC (rev 2449) @@ -1605,6 +1605,12 @@ int32 rampLength, globalRampLength, instrRampLength = 0; rampLength = globalRampLength = (rampUp ? m_MixerSettings.glVolumeRampUpSamples : m_MixerSettings.glVolumeRampDownSamples); //XXXih: add real support for bidi ramping here + + if(GetModFlag(MSF_VOLRAMP) && (GetType() & MOD_TYPE_XM)) + { + // apply FT2-style super-soft volume ramping (5ms), overriding openmpt settings + rampLength = globalRampLength = Util::muldivr(5, m_MixerSettings.gdwMixingFreq, 1000); + } if(pChn->pModInstrument != nullptr && rampUp) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-06-30 17:48:09
|
Revision: 2450 http://sourceforge.net/p/modplug/code/2450 Author: manxorist Date: 2013-06-30 17:47:59 +0000 (Sun, 30 Jun 2013) Log Message: ----------- [Fix] Make ReadSampleAsInstrument() work on big-endian. [Ref] Convert ReadSampleAsInstrument() to use FileReader. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/soundlib/Load_umx.cpp trunk/OpenMPT/soundlib/SampleFormats.cpp trunk/OpenMPT/soundlib/Sndfile.h Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2013-06-30 17:39:01 UTC (rev 2449) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2013-06-30 17:47:59 UTC (rev 2450) @@ -753,7 +753,8 @@ { m_modDoc.GetSampleUndo().PrepareUndo(m_nSample, sundo_replace); - bOk = m_sndFile.ReadSampleFromFile(m_nSample, lpFile, len); + FileReader file(lpFile, len); + bOk = m_sndFile.ReadSampleFromFile(m_nSample, file); } if (!bOk) Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2013-06-30 17:39:01 UTC (rev 2449) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2013-06-30 17:47:59 UTC (rev 2450) @@ -1580,7 +1580,8 @@ if(!ok) { // Try reading as sample if reading as instrument fails - ok = m_WaveFile.ReadSampleFromFile(1, p, dwLen); + FileReader file(p, dwLen); + ok = m_WaveFile.ReadSampleFromFile(1, file); m_WaveFile.AllocateInstrument(1, 1); } } Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2013-06-30 17:39:01 UTC (rev 2449) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2013-06-30 17:47:59 UTC (rev 2450) @@ -23,6 +23,7 @@ #include "SampleEditorDialogs.h" #include "modsmp_ctrl.h" #include "Wav.h" +#include "../soundlib/FileReader.h" #define new DEBUG_NEW @@ -2000,7 +2001,8 @@ memcpy(s, pSndFile->m_szNames[m_nSample], 32); memcpy(s2, sample.filename, 22); - pSndFile->ReadSampleFromFile(m_nSample, p, dwMemSize); + FileReader file(p, dwMemSize); + pSndFile->ReadSampleFromFile(m_nSample, file); if (!pSndFile->m_szNames[m_nSample][0]) { memcpy(pSndFile->m_szNames[m_nSample], s, 32); Modified: trunk/OpenMPT/soundlib/Load_umx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_umx.cpp 2013-06-30 17:39:01 UTC (rev 2449) +++ trunk/OpenMPT/soundlib/Load_umx.cpp 2013-06-30 17:47:59 UTC (rev 2450) @@ -291,7 +291,7 @@ } else if(isSound && GetNumSamples() < MAX_SAMPLES - 1) { // Read as sample - if(ReadSampleFromFile(GetNumSamples() + 1, (LPBYTE)fileChunk.GetRawData(), fileChunk.GetLength())) + if(ReadSampleFromFile(GetNumSamples() + 1, fileChunk)) { m_nSamples++; if(static_cast<size_t>(objName) < names.size()) Modified: trunk/OpenMPT/soundlib/SampleFormats.cpp =================================================================== --- trunk/OpenMPT/soundlib/SampleFormats.cpp 2013-06-30 17:39:01 UTC (rev 2449) +++ trunk/OpenMPT/soundlib/SampleFormats.cpp 2013-06-30 17:47:59 UTC (rev 2450) @@ -27,28 +27,52 @@ #ifndef NO_MP3_SAMPLES // Check for valid MPEG header -static bool IsMPEG(const void *data) -//---------------------------------- +static bool IsMPEG(const uint8 (&header)[3]) +//------------------------------------------ { - const uint8 *header = static_cast<const uint8 *>(data); return header[0] == 0xFF && (header[1] & 0xE0) == 0xE0 && (header[1] & 0x18) != 0x08 && (header[1] & 0x06) != 0x00 && (header[2] & 0xF0) != 0xF0; } +static bool IsMPEG(FileReader file) +//--------------------------------- +{ + uint8 header[3]; + if(!file.CanRead(3)) + return false; + file.ReadArrayLE(header); + file.SkipBack(3); + return IsMPEG(header); +} + +static bool IsID3(FileReader file) +//-------------------------------- +{ + char header[3]; + if(!file.CanRead(3)) + return false; + file.ReadArrayLE(header); + file.SkipBack(3); + return header[0] == 'I' && header[1] == 'D' && header[2] == '3'; +} #endif // NO_MP3_SAMPLES -bool CSoundFile::ReadSampleFromFile(SAMPLEINDEX nSample, const LPBYTE lpMemFile, DWORD dwFileLength) -//-------------------------------------------------------------------------------------------------- +bool CSoundFile::ReadSampleFromFile(SAMPLEINDEX nSample, FileReader &file) +//------------------------------------------------------------------------ { - FileReader file(lpMemFile, dwFileLength); + file.Rewind(); + + const BYTE * const lpMemFile = reinterpret_cast<const BYTE*>(file.GetRawData()); + const DWORD dwFileLength = file.GetLength(); + if(!nSample || nSample >= MAX_SAMPLES) return false; if(!ReadWAVSample(nSample, file) && !ReadXISample(nSample, file) && !ReadITISample(nSample, file) && !ReadAIFFSample(nSample, file) && !ReadITSSample(nSample, file) - && !ReadPATSample(nSample, lpMemFile, dwFileLength) - && !Read8SVXSample(nSample, lpMemFile, dwFileLength) - && !ReadS3ISample(nSample, lpMemFile, dwFileLength) + && !ReadPATSample(nSample, const_cast<BYTE*>(lpMemFile), dwFileLength) + && !Read8SVXSample(nSample, const_cast<BYTE*>(lpMemFile), dwFileLength) + && !ReadS3ISample(nSample, const_cast<BYTE*>(lpMemFile), dwFileLength) && !ReadFLACSample(nSample, file) && !ReadMP3Sample(nSample, file)) { @@ -72,18 +96,23 @@ && (!ReadPATInstrument(nInstr, lpMemFile, dwFileLength)) && (!ReadITIInstrument(nInstr, file)) // Generic read - && (!ReadSampleAsInstrument(nInstr, lpMemFile, dwFileLength))) return false; + && (!ReadSampleAsInstrument(nInstr, file))) return false; if(nInstr > GetNumInstruments()) m_nInstruments = nInstr; return true; } -bool CSoundFile::ReadSampleAsInstrument(INSTRUMENTINDEX nInstr, const LPBYTE lpMemFile, DWORD dwFileLength) -//--------------------------------------------------------------------------------------------------------- +bool CSoundFile::ReadSampleAsInstrument(INSTRUMENTINDEX nInstr, FileReader &file) +//------------------------------------------------------------------------------- { - const uint32 *psig = reinterpret_cast<const uint32 *>(lpMemFile); - if((!lpMemFile) || (dwFileLength < 80)) return false; + file.Rewind(); + + if(!file.CanRead(80)) + return false; + uint32 psig[20]; + file.ReadArrayLE(psig); + file.SkipBack(80); if((psig[0] == LittleEndian(0x46464952) && psig[2] == LittleEndian(0x45564157)) // RIFF....WAVE signature || (psig[0] == LittleEndian(0x5453494C) && psig[2] == LittleEndian(0x65766177)) // LIST....wave || psig[76/4] == LittleEndian(0x53524353) // S3I signature @@ -95,8 +124,8 @@ || psig[0] == LittleEndian('CaLf') // FLAC signature #endif // NO_FLAC #ifndef NO_MP3_SAMPLES - || IsMPEG(lpMemFile) // MPEG signature - || (lpMemFile[0] == 'I' && lpMemFile[1] == 'D' && lpMemFile[2] == '3') // MP3 signature + || IsMPEG(file) // MPEG signature + || IsID3(file) // MP3 signature #endif // NO_MP3_SAMPLES ) { @@ -122,7 +151,7 @@ DestroyInstrument(nInstr, deleteAssociatedSamples); Instruments[nInstr] = pIns; - ReadSampleFromFile(nSample, lpMemFile, dwFileLength); + ReadSampleFromFile(nSample, file); return true; } return false; Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2013-06-30 17:39:01 UTC (rev 2449) +++ trunk/OpenMPT/soundlib/Sndfile.h 2013-06-30 17:47:59 UTC (rev 2450) @@ -783,7 +783,7 @@ static void AdjustSampleLoop(ModSample &sample); // Samples file I/O - bool ReadSampleFromFile(SAMPLEINDEX nSample, const LPBYTE lpMemFile, DWORD dwFileLength); + bool ReadSampleFromFile(SAMPLEINDEX nSample, FileReader &file); bool ReadWAVSample(SAMPLEINDEX nSample, FileReader &file, FileReader *wsmpChunk = nullptr); bool ReadPATSample(SAMPLEINDEX nSample, const LPBYTE lpMemFile, DWORD dwFileLength); bool ReadS3ISample(SAMPLEINDEX nSample, const LPBYTE lpMemFile, DWORD dwFileLength); @@ -805,7 +805,7 @@ bool ReadXIInstrument(INSTRUMENTINDEX nInstr, FileReader &file); bool ReadITIInstrument(INSTRUMENTINDEX nInstr, FileReader &file); bool ReadPATInstrument(INSTRUMENTINDEX nInstr, const LPBYTE lpMemFile, DWORD dwFileLength); - bool ReadSampleAsInstrument(INSTRUMENTINDEX nInstr, const LPBYTE lpMemFile, DWORD dwFileLength); + bool ReadSampleAsInstrument(INSTRUMENTINDEX nInstr, FileReader &file); #ifndef MODPLUG_NO_FILESAVE bool SaveXIInstrument(INSTRUMENTINDEX nInstr, const LPCSTR lpszFileName) const; bool SaveITIInstrument(INSTRUMENTINDEX nInstr, const LPCSTR lpszFileName, bool compress) const; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2013-06-30 18:20:37
|
Revision: 2452 http://sourceforge.net/p/modplug/code/2452 Author: saga-games Date: 2013-06-30 18:20:28 +0000 (Sun, 30 Jun 2013) Log Message: ----------- [Ref] S3I loader uses existing code from S3M loader now. Modified Paths: -------------- trunk/OpenMPT/mptrack/mptrack_08.vcproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/SampleFormats.cpp trunk/OpenMPT/soundlib/Sndfile.h Added Paths: ----------- trunk/OpenMPT/soundlib/S3MTools.cpp trunk/OpenMPT/soundlib/S3MTools.h Modified: trunk/OpenMPT/mptrack/mptrack_08.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_08.vcproj 2013-06-30 17:53:24 UTC (rev 2451) +++ trunk/OpenMPT/mptrack/mptrack_08.vcproj 2013-06-30 18:20:28 UTC (rev 2452) @@ -1449,6 +1449,14 @@ > </File> <File + RelativePath="..\soundlib\S3MTools.cpp" + > + </File> + <File + RelativePath="..\soundlib\S3MTools.h" + > + </File> + <File RelativePath="..\soundlib\WAVTools.cpp" > </File> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2013-06-30 17:53:24 UTC (rev 2451) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2013-06-30 18:20:28 UTC (rev 2452) @@ -287,6 +287,7 @@ <ClCompile Include="..\soundlib\patternContainer.cpp" /> <ClCompile Include="..\soundlib\plugins\JBridge.cpp" /> <ClCompile Include="..\soundlib\RowVisitor.cpp" /> + <ClCompile Include="..\soundlib\S3MTools.cpp" /> <ClCompile Include="..\soundlib\SampleFormats.cpp" /> <ClCompile Include="..\soundlib\SampleIO.cpp" /> <ClCompile Include="..\soundlib\Sndfile.cpp" /> @@ -506,6 +507,7 @@ <ClInclude Include="..\soundlib\plugins\PlugInterface.h" /> <ClInclude Include="..\soundlib\Resampler.h" /> <ClInclude Include="..\soundlib\RowVisitor.h" /> + <ClInclude Include="..\soundlib\S3MTools.h" /> <ClInclude Include="..\soundlib\SampleFormatConverters.h" /> <ClInclude Include="..\soundlib\SampleIO.h" /> <ClInclude Include="..\soundlib\Sndfile.h" /> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2013-06-30 17:53:24 UTC (rev 2451) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2013-06-30 18:20:28 UTC (rev 2452) @@ -478,6 +478,9 @@ <ClCompile Include="MPTrackUtil.cpp"> <Filter>Source Files\mptrack</Filter> </ClCompile> + <ClCompile Include="..\soundlib\S3MTools.cpp"> + <Filter>Source Files\soundlib\Module Loaders</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="..\soundlib\Loaders.h"> @@ -879,6 +882,9 @@ <ClInclude Include="MPTrackUtil.h"> <Filter>Header Files\mptrack</Filter> </ClInclude> + <ClInclude Include="..\soundlib\S3MTools.h"> + <Filter>Source Files\soundlib\Module Loaders</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <None Include="res\bitmap1.bmp"> Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2013-06-30 17:53:24 UTC (rev 2451) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2013-06-30 18:20:28 UTC (rev 2452) @@ -10,6 +10,7 @@ #include "stdafx.h" #include "Loaders.h" +#include "S3MTools.h" #include "../common/version.h" #ifdef MODPLUG_TRACKER #include "../mptrack/moddoc.h" // Logging @@ -149,246 +150,6 @@ } -#ifdef NEEDS_PRAGMA_PACK -#pragma pack(push, 1) -#endif - -// S3M File Header -struct PACKED S3MFileHeader -{ - // Magic Bytes - enum S3MMagic - { - idSCRM = 0x4D524353, - idEOF = 0x1A, - idS3MType = 0x10, - idPanning = 0xFC, - }; - - // Tracker Versions in the cwtv field - enum S3MTrackerVersions - { - trackerMask = 0xF000, - versionMask = 0x0FFF, - - trkScreamTracker = 0x1000, - trkImagoOrpheus = 0x2000, - trkImpulseTracker = 0x3000, - trkSchismTracker = 0x4000, - trkOpenMPT = 0x5000, - trkBeRoTracker = 0x6000, - trkCreamTracker = 0x7000, - - trkST3_20 = 0x1320, - trkIT2_14 = 0x3214, - trkBeRoTrackerOld = 0x4100, // Used from 2004 to 2012 - }; - - // Flags - enum S3MHeaderFlags - { - zeroVolOptim = 0x08, // Volume 0 optimisations - amigaLimits = 0x10, // Enforce Amiga limits - fastVolumeSlides = 0x40, // Fast volume slides (like in ST3.00) - }; - - // S3M Format Versions - enum S3MFormatVersion - { - oldVersion = 0x01, // Old Version, signed samples - newVersion = 0x02, // New Version, unsigned samples - }; - - char name[28]; // Song Title - uint8 dosEof; // Supposed to be 0x1A, but even ST3 seems to ignore this sometimes (see STRSHINE.S3M by Purple Motion) - uint8 fileType; // File Type, 0x10 = ST3 module - char reserved1[2]; // Reserved - uint16 ordNum; // Number of order items - uint16 smpNum; // Number of sample parapointers - uint16 patNum; // Number of pattern parapointers - uint16 flags; // Flags, see S3MHeaderFlags - uint16 cwtv; // "Made With" Tracker ID, see S3MTrackerVersions - uint16 formatVersion; // Format Version, see S3MFormatVersion - uint32 magic; // "SCRM" magic bytes - uint8 globalVol; // Default Global Volume (0...64) - uint8 speed; // Default Speed (1...254) - uint8 tempo; // Default Tempo (33...255) - uint8 masterVolume; // Sample Volume (0...127, stereo if high bit is set) - uint8 ultraClicks; // Number of channels used for ultra click removal - uint8 usePanningTable; // 0xFC => read extended panning table - char reserved2[8]; // More reserved bytes - uint16 special; // Pointer to special custom data (unused) - uint8 channels[32]; // Channel setup - - // Convert all multi-byte numeric values to current platform's endianness or vice versa. - void ConvertEndianness() - { - SwapBytesLE(ordNum); - SwapBytesLE(smpNum); - SwapBytesLE(patNum); - SwapBytesLE(flags); - SwapBytesLE(cwtv); - SwapBytesLE(formatVersion); - SwapBytesLE(magic); - } -}; - -STATIC_ASSERT(sizeof(S3MFileHeader) == 96); - - -// S3M Sample Header -struct PACKED S3MSampleHeader -{ - enum SampleMagic - { - idSCRS = 0x53524353, - }; - - enum SampleType - { - typeNone = 0, - typePCM = 1, - typeAdMel = 2, - }; - - enum SampleFlags - { - smpLoop = 0x01, - smpStereo = 0x02, - smp16Bit = 0x04, - }; - - enum SamplePacking - { - pUnpacked = 0x00, // PCM - pDP30ADPCM = 0x01, // Unused packing type - pADPCM = 0x04, // MODPlugin ADPCM :( - }; - - uint8 sampleType; // Sample type, see SampleType - char filename[12]; // Sample filename - uint8 dataPointer[3]; // Pointer to sample data (divided by 16) - uint32 length; // Sample length, in samples - uint32 loopStart; // Loop start, in samples - uint32 loopEnd; // Loop end, in samples - uint8 defaultVolume; // Default volume (0...64) - char reserved1; // Reserved - uint8 pack; // Packing algorithm, SamplePacking - uint8 flags; // Sample flags - uint32 c5speed; // Middle-C frequency - char reserved2[12]; // Reserved + Internal ST3 stuff - char name[28]; // Sample name - uint32 magic; // "SCRS" magic bytes ("SCRI" for Adlib instruments) - - // Convert all multi-byte numeric values to current platform's endianness or vice versa. - void ConvertEndianness() - { - SwapBytesLE(length); - SwapBytesLE(loopStart); - SwapBytesLE(loopEnd); - SwapBytesLE(c5speed); - SwapBytesLE(magic); - } - - // Convert an S3M sample header to OpenMPT's internal sample header. - void ConvertToMPT(ModSample &mptSmp) const - { - mptSmp.Initialize(MOD_TYPE_S3M); - mpt::String::Read<mpt::String::maybeNullTerminated>(mptSmp.filename, filename); - - if((sampleType == typePCM || sampleType == typeNone) && magic == idSCRS) - { - // Sample Length and Loops - if(sampleType == typePCM) - { - mptSmp.nLength = length; - mptSmp.nLoopStart = MIN(loopStart, mptSmp.nLength - 1); - mptSmp.nLoopEnd = MIN(loopEnd, mptSmp.nLength); - mptSmp.uFlags.set(CHN_LOOP, (flags & smpLoop) != 0); - } - - if(mptSmp.nLoopEnd < 2 || mptSmp.nLoopStart >= mptSmp.nLoopEnd || mptSmp.nLoopEnd - mptSmp.nLoopStart < 1) - { - mptSmp.nLoopStart = mptSmp.nLoopEnd = 0; - mptSmp.uFlags.reset(); - } - - // Volume / Panning - mptSmp.nVolume = MIN(defaultVolume, 64) * 4; - - // C-5 frequency - mptSmp.nC5Speed = c5speed; - if(mptSmp.nC5Speed == 0) - { - mptSmp.nC5Speed = 8363; - } else if(mptSmp.nC5Speed < 1024) - { - mptSmp.nC5Speed = 1024; - } - } - } - - // Convert OpenMPT's internal sample header to an S3M sample header. - SmpLength ConvertToS3M(const ModSample &mptSmp) - { - SmpLength smpLength = 0; - mpt::String::Write<mpt::String::maybeNullTerminated>(filename, mptSmp.filename); - - if(mptSmp.pSample != nullptr) - { - sampleType = typePCM; - length = static_cast<uint32>(MIN(mptSmp.nLength, uint32_max)); - loopStart = static_cast<uint32>(MIN(mptSmp.nLoopStart, uint32_max)); - loopEnd = static_cast<uint32>(MIN(mptSmp.nLoopEnd, uint32_max)); - - smpLength = length; - - flags = (mptSmp.uFlags & CHN_LOOP) ? smpLoop : 0; - if(mptSmp.uFlags & CHN_16BIT) - { - flags |= smp16Bit; - } - if(mptSmp.uFlags & CHN_STEREO) - { - flags |= smpStereo; - } - } else - { - sampleType = typeNone; - } - - defaultVolume = static_cast<uint8>(MIN(mptSmp.nVolume / 4, 64)); - if(mptSmp.nC5Speed != 0) - { - c5speed = mptSmp.nC5Speed; - } else - { - c5speed = ModSample::TransposeToFrequency(mptSmp.RelativeTone, mptSmp.nFineTune); - } - magic = idSCRS; - - return smpLength; - } - - // Retrieve the internal sample format flags for this sample. - SampleIO GetSampleFormat(bool signedSamples) const - { - if(pack == S3MSampleHeader::pADPCM && !(flags & S3MSampleHeader::smp16Bit) && !(flags & S3MSampleHeader::smpStereo)) - { - // MODPlugin :( - return SampleIO(SampleIO::_8bit, SampleIO::mono, SampleIO::littleEndian, SampleIO::ADPCM); - } else - { - return SampleIO( - (flags & S3MSampleHeader::smp16Bit) ? SampleIO::_16bit : SampleIO::_8bit, - (flags & S3MSampleHeader::smpStereo) ? SampleIO::stereoSplit : SampleIO::mono, - SampleIO::littleEndian, - signedSamples ? SampleIO::signedPCM : SampleIO::unsignedPCM); - } - } -}; - - // Pattern decoding flags enum S3MPattern { @@ -403,14 +164,7 @@ s3mNoteNone = 0xFF, }; -STATIC_ASSERT(sizeof(S3MSampleHeader) == 80); - -#ifdef NEEDS_PRAGMA_PACK -#pragma pack(pop) -#endif - - // Functor for fixing PixPlay 4-Bit Zxx panning commands struct FixPixPlayPanning //====================== @@ -628,8 +382,8 @@ continue; } + sampleHeader.ConvertToMPT(Samples[smp + 1]); mpt::String::Read<mpt::String::nullTerminated>(m_szNames[smp + 1], sampleHeader.name); - sampleHeader.ConvertToMPT(Samples[smp + 1]); if(sampleHeader.sampleType >= S3MSampleHeader::typeAdMel) { Added: trunk/OpenMPT/soundlib/S3MTools.cpp =================================================================== --- trunk/OpenMPT/soundlib/S3MTools.cpp (rev 0) +++ trunk/OpenMPT/soundlib/S3MTools.cpp 2013-06-30 18:20:28 UTC (rev 2452) @@ -0,0 +1,143 @@ +/* + * S3MTools.cpp + * ------------ + * Purpose: Definition of S3M file structures and helper functions + * Notes : (currently none) + * Authors: OpenMPT Devs + * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. + */ + + +#include "stdafx.h" +#include "Loaders.h" +#include "S3MTools.h" +#include "../common/StringFixer.h" + + +// Convert all multi-byte numeric values to current platform's endianness or vice versa. +void S3MFileHeader::ConvertEndianness() +//------------------------------------- +{ + SwapBytesLE(ordNum); + SwapBytesLE(smpNum); + SwapBytesLE(patNum); + SwapBytesLE(flags); + SwapBytesLE(cwtv); + SwapBytesLE(formatVersion); + SwapBytesLE(magic); +} + + +// Convert all multi-byte numeric values to current platform's endianness or vice versa. +void S3MSampleHeader::ConvertEndianness() +//--------------------------------------- +{ + SwapBytesLE(length); + SwapBytesLE(loopStart); + SwapBytesLE(loopEnd); + SwapBytesLE(c5speed); + SwapBytesLE(magic); +} + + +// Convert an S3M sample header to OpenMPT's internal sample header. +void S3MSampleHeader::ConvertToMPT(ModSample &mptSmp) const +//--------------------------------------------------------- +{ + mptSmp.Initialize(MOD_TYPE_S3M); + mpt::String::Read<mpt::String::maybeNullTerminated>(mptSmp.filename, filename); + + if((sampleType == typePCM || sampleType == typeNone) && magic == idSCRS) + { + // Sample Length and Loops + if(sampleType == typePCM) + { + mptSmp.nLength = length; + mptSmp.nLoopStart = MIN(loopStart, mptSmp.nLength - 1); + mptSmp.nLoopEnd = MIN(loopEnd, mptSmp.nLength); + mptSmp.uFlags.set(CHN_LOOP, (flags & smpLoop) != 0); + } + + if(mptSmp.nLoopEnd < 2 || mptSmp.nLoopStart >= mptSmp.nLoopEnd || mptSmp.nLoopEnd - mptSmp.nLoopStart < 1) + { + mptSmp.nLoopStart = mptSmp.nLoopEnd = 0; + mptSmp.uFlags.reset(); + } + + // Volume / Panning + mptSmp.nVolume = MIN(defaultVolume, 64) * 4; + + // C-5 frequency + mptSmp.nC5Speed = c5speed; + if(mptSmp.nC5Speed == 0) + { + mptSmp.nC5Speed = 8363; + } else if(mptSmp.nC5Speed < 1024) + { + mptSmp.nC5Speed = 1024; + } + } +} + + +// Convert OpenMPT's internal sample header to an S3M sample header. +SmpLength S3MSampleHeader::ConvertToS3M(const ModSample &mptSmp) +//-------------------------------------------------------------- +{ + SmpLength smpLength = 0; + mpt::String::Write<mpt::String::maybeNullTerminated>(filename, mptSmp.filename); + + if(mptSmp.pSample != nullptr) + { + sampleType = typePCM; + length = static_cast<uint32>(MIN(mptSmp.nLength, uint32_max)); + loopStart = static_cast<uint32>(MIN(mptSmp.nLoopStart, uint32_max)); + loopEnd = static_cast<uint32>(MIN(mptSmp.nLoopEnd, uint32_max)); + + smpLength = length; + + flags = (mptSmp.uFlags & CHN_LOOP) ? smpLoop : 0; + if(mptSmp.uFlags & CHN_16BIT) + { + flags |= smp16Bit; + } + if(mptSmp.uFlags & CHN_STEREO) + { + flags |= smpStereo; + } + } else + { + sampleType = typeNone; + } + + defaultVolume = static_cast<uint8>(MIN(mptSmp.nVolume / 4, 64)); + if(mptSmp.nC5Speed != 0) + { + c5speed = mptSmp.nC5Speed; + } else + { + c5speed = ModSample::TransposeToFrequency(mptSmp.RelativeTone, mptSmp.nFineTune); + } + magic = idSCRS; + + return smpLength; +} + + +// Retrieve the internal sample format flags for this sample. +SampleIO S3MSampleHeader::GetSampleFormat(bool signedSamples) const +//----------------------------------------------------------------- +{ + if(pack == S3MSampleHeader::pADPCM && !(flags & S3MSampleHeader::smp16Bit) && !(flags & S3MSampleHeader::smpStereo)) + { + // MODPlugin :( + return SampleIO(SampleIO::_8bit, SampleIO::mono, SampleIO::littleEndian, SampleIO::ADPCM); + } else + { + return SampleIO( + (flags & S3MSampleHeader::smp16Bit) ? SampleIO::_16bit : SampleIO::_8bit, + (flags & S3MSampleHeader::smpStereo) ? SampleIO::stereoSplit : SampleIO::mono, + SampleIO::littleEndian, + signedSamples ? SampleIO::signedPCM : SampleIO::unsignedPCM); + } +} \ No newline at end of file Added: trunk/OpenMPT/soundlib/S3MTools.h =================================================================== --- trunk/OpenMPT/soundlib/S3MTools.h (rev 0) +++ trunk/OpenMPT/soundlib/S3MTools.h 2013-06-30 18:20:28 UTC (rev 2452) @@ -0,0 +1,154 @@ +/* + * S3MTools.h + * ---------- + * Purpose: Definition of S3M file structures and helper functions + * Notes : (currently none) + * Authors: OpenMPT Devs + * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. + */ + + +#pragma once + +#include "../soundlib/ModSample.h" +#include "../soundlib/SampleIO.h" + + +#ifdef NEEDS_PRAGMA_PACK +#pragma pack(push, 1) +#endif + +// S3M File Header +struct PACKED S3MFileHeader +{ + // Magic Bytes + enum S3MMagic + { + idSCRM = 0x4D524353, + idEOF = 0x1A, + idS3MType = 0x10, + idPanning = 0xFC, + }; + + // Tracker Versions in the cwtv field + enum S3MTrackerVersions + { + trackerMask = 0xF000, + versionMask = 0x0FFF, + + trkScreamTracker = 0x1000, + trkImagoOrpheus = 0x2000, + trkImpulseTracker = 0x3000, + trkSchismTracker = 0x4000, + trkOpenMPT = 0x5000, + trkBeRoTracker = 0x6000, + trkCreamTracker = 0x7000, + + trkST3_20 = 0x1320, + trkIT2_14 = 0x3214, + trkBeRoTrackerOld = 0x4100, // Used from 2004 to 2012 + }; + + // Flags + enum S3MHeaderFlags + { + zeroVolOptim = 0x08, // Volume 0 optimisations + amigaLimits = 0x10, // Enforce Amiga limits + fastVolumeSlides = 0x40, // Fast volume slides (like in ST3.00) + }; + + // S3M Format Versions + enum S3MFormatVersion + { + oldVersion = 0x01, // Old Version, signed samples + newVersion = 0x02, // New Version, unsigned samples + }; + + char name[28]; // Song Title + uint8 dosEof; // Supposed to be 0x1A, but even ST3 seems to ignore this sometimes (see STRSHINE.S3M by Purple Motion) + uint8 fileType; // File Type, 0x10 = ST3 module + char reserved1[2]; // Reserved + uint16 ordNum; // Number of order items + uint16 smpNum; // Number of sample parapointers + uint16 patNum; // Number of pattern parapointers + uint16 flags; // Flags, see S3MHeaderFlags + uint16 cwtv; // "Made With" Tracker ID, see S3MTrackerVersions + uint16 formatVersion; // Format Version, see S3MFormatVersion + uint32 magic; // "SCRM" magic bytes + uint8 globalVol; // Default Global Volume (0...64) + uint8 speed; // Default Speed (1...254) + uint8 tempo; // Default Tempo (33...255) + uint8 masterVolume; // Sample Volume (0...127, stereo if high bit is set) + uint8 ultraClicks; // Number of channels used for ultra click removal + uint8 usePanningTable; // 0xFC => read extended panning table + char reserved2[8]; // More reserved bytes + uint16 special; // Pointer to special custom data (unused) + uint8 channels[32]; // Channel setup + + // Convert all multi-byte numeric values to current platform's endianness or vice versa. + void ConvertEndianness(); +}; + +STATIC_ASSERT(sizeof(S3MFileHeader) == 96); + + +// S3M Sample Header +struct PACKED S3MSampleHeader +{ + enum SampleMagic + { + idSCRS = 0x53524353, + }; + + enum SampleType + { + typeNone = 0, + typePCM = 1, + typeAdMel = 2, + }; + + enum SampleFlags + { + smpLoop = 0x01, + smpStereo = 0x02, + smp16Bit = 0x04, + }; + + enum SamplePacking + { + pUnpacked = 0x00, // PCM + pDP30ADPCM = 0x01, // Unused packing type + pADPCM = 0x04, // MODPlugin ADPCM :( + }; + + uint8 sampleType; // Sample type, see SampleType + char filename[12]; // Sample filename + uint8 dataPointer[3]; // Pointer to sample data (divided by 16) + uint32 length; // Sample length, in samples + uint32 loopStart; // Loop start, in samples + uint32 loopEnd; // Loop end, in samples + uint8 defaultVolume; // Default volume (0...64) + char reserved1; // Reserved + uint8 pack; // Packing algorithm, SamplePacking + uint8 flags; // Sample flags + uint32 c5speed; // Middle-C frequency + char reserved2[12]; // Reserved + Internal ST3 stuff + char name[28]; // Sample name + uint32 magic; // "SCRS" magic bytes ("SCRI" for Adlib instruments) + + // Convert all multi-byte numeric values to current platform's endianness or vice versa. + void ConvertEndianness(); + // Convert an S3M sample header to OpenMPT's internal sample header. + void ConvertToMPT(ModSample &mptSmp) const; + // Convert OpenMPT's internal sample header to an S3M sample header. + SmpLength ConvertToS3M(const ModSample &mptSmp); + // Retrieve the internal sample format flags for this sample. + SampleIO GetSampleFormat(bool signedSamples) const; +}; + +STATIC_ASSERT(sizeof(S3MSampleHeader) == 80); + + +#ifdef NEEDS_PRAGMA_PACK +#pragma pack(pop) +#endif Modified: trunk/OpenMPT/soundlib/SampleFormats.cpp =================================================================== --- trunk/OpenMPT/soundlib/SampleFormats.cpp 2013-06-30 17:53:24 UTC (rev 2451) +++ trunk/OpenMPT/soundlib/SampleFormats.cpp 2013-06-30 18:20:28 UTC (rev 2452) @@ -20,6 +20,7 @@ #include "Wav.h" #include "ITTools.h" #include "XMTools.h" +#include "S3MTools.h" #include "WAVTools.h" #include "../common/version.h" #include "ChunkReader.h" @@ -72,7 +73,7 @@ && !ReadITSSample(nSample, file) && !ReadPATSample(nSample, const_cast<BYTE*>(lpMemFile), dwFileLength) && !Read8SVXSample(nSample, const_cast<BYTE*>(lpMemFile), dwFileLength) - && !ReadS3ISample(nSample, const_cast<BYTE*>(lpMemFile), dwFileLength) + && !ReadS3ISample(nSample, file) && !ReadFLACSample(nSample, file) && !ReadMP3Sample(nSample, file)) { @@ -113,21 +114,22 @@ uint32 psig[20]; file.ReadArrayLE(psig); file.SkipBack(80); - if((psig[0] == LittleEndian(0x46464952) && psig[2] == LittleEndian(0x45564157)) // RIFF....WAVE signature - || (psig[0] == LittleEndian(0x5453494C) && psig[2] == LittleEndian(0x65766177)) // LIST....wave - || psig[76/4] == LittleEndian(0x53524353) // S3I signature - || (psig[0] == BigEndian(0x464F524D) && psig[2] == LittleEndian(0x46464941)) // AIFF signature - || (psig[0] == BigEndian(0x464F524D) && psig[2] == LittleEndian(0x43464941)) // AIFF-C signature - || (psig[0] == BigEndian(0x464F524D) && psig[2] == LittleEndian(0x58565338)) // 8SVX signature - || psig[0] == LittleEndian(ITSample::magic) // ITS signature + if( (!memcmp(&psig[0], "RIFF", 4) && !memcmp(&psig[2], "WAVE", 4)) // RIFF....WAVE signature + || (!memcmp(&psig[0], "LIST", 4) && !memcmp(&psig[2], "wave", 4)) // LIST....wave + || !memcmp(&psig[76 / 4], "SCRS", 4) // S3I signature + || (!memcmp(&psig[0], "FORM", 4) && + (!memcmp(&psig[2], "AIFF", 4) // AIFF signature + || !memcmp(&psig[2], "AIFC", 4) // AIFF-C signature + || !memcmp(&psig[2], "8SVX", 4))) // 8SVX signature + || psig[0] == LittleEndian(ITSample::magic) // ITS signature #ifndef NO_FLAC - || psig[0] == LittleEndian('CaLf') // FLAC signature + || !memcmp(&psig[0], "fLaC", 4) // FLAC signature #endif // NO_FLAC #ifndef NO_MP3_SAMPLES - || IsMPEG(file) // MPEG signature - || IsID3(file) // MP3 signature + || IsMPEG(file) // MPEG signature + || IsID3(file) // MP3 signature #endif // NO_MP3_SAMPLES - ) + ) { // Scanning free sample SAMPLEINDEX nSample = GetNextFreeSample(nInstr); @@ -906,74 +908,28 @@ ///////////////////////////////////////////////////////////// // S3I Samples -#ifdef NEEDS_PRAGMA_PACK -#pragma pack(push, 1) -#endif -typedef struct PACKED S3ISAMPLESTRUCT +bool CSoundFile::ReadS3ISample(SAMPLEINDEX nSample, FileReader &file) +//------------------------------------------------------------------- { - BYTE id; - char filename[12]; - BYTE reserved1; - WORD offset; - DWORD length; - DWORD loopstart; - DWORD loopend; - BYTE volume; - BYTE reserved2; - BYTE pack; - BYTE flags; - DWORD nC5Speed; - DWORD reserved3; - DWORD reserved4; - DWORD date; - char name[28]; - DWORD scrs; -} S3ISAMPLESTRUCT; + file.Rewind(); -STATIC_ASSERT(sizeof(S3ISAMPLESTRUCT) == 80); + S3MSampleHeader sampleHeader; + if(!file.ReadConvertEndianness(sampleHeader) + || sampleHeader.sampleType != S3MSampleHeader::typePCM + || sampleHeader.magic != S3MSampleHeader::idSCRS + || !file.Seek((sampleHeader.dataPointer[1] << 4) | (sampleHeader.dataPointer[2] << 12) | (sampleHeader.dataPointer[0] << 20))) + { + return false; + } -#ifdef NEEDS_PRAGMA_PACK -#pragma pack(pop) -#endif + DestroySampleThreadsafe(nSample); -bool CSoundFile::ReadS3ISample(SAMPLEINDEX nSample, const LPBYTE lpMemFile, DWORD dwFileLength) -//--------------------------------------------------------------------------------------------- -{ - // TODO: Rewrite using already existing structs from Load_s3m.cpp - S3ISAMPLESTRUCT *pss = (S3ISAMPLESTRUCT *)lpMemFile; ModSample &sample = Samples[nSample]; - DWORD dwMemPos; - SampleIO flags; - - if ((!lpMemFile) || (dwFileLength < sizeof(S3ISAMPLESTRUCT)) - || (pss->id != 0x01) || (((DWORD)pss->offset << 4) >= dwFileLength) - || (pss->scrs != 0x53524353)) return false; - - DestroySampleThreadsafe(nSample); - dwMemPos = pss->offset << 4; - - sample.Initialize(); - mpt::String::Read<mpt::String::maybeNullTerminated>(sample.filename, pss->filename); - mpt::String::Read<mpt::String::nullTerminated>(m_szNames[nSample], pss->name); - - sample.nLength = pss->length; - sample.nLoopStart = pss->loopstart; - sample.nLoopEnd = pss->loopend; - sample.nVolume = pss->volume << 2; - sample.nC5Speed = pss->nC5Speed; - if(pss->flags & 0x01) sample.uFlags |= CHN_LOOP; - + sampleHeader.ConvertToMPT(sample); + mpt::String::Read<mpt::String::nullTerminated>(m_szNames[nSample], sampleHeader.name); + sampleHeader.GetSampleFormat(false).ReadSample(sample, file); sample.Convert(MOD_TYPE_S3M, GetType()); - - FileReader chunk(lpMemFile + dwMemPos, dwFileLength - dwMemPos); - SampleIO( - (pss->flags & 0x04) ? SampleIO::_16bit : SampleIO::_8bit, - (pss->flags & 0x02) ? SampleIO::stereoSplit : SampleIO::mono, - SampleIO::littleEndian, - SampleIO::unsignedPCM) - .ReadSample(sample, chunk); - return true; } Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2013-06-30 17:53:24 UTC (rev 2451) +++ trunk/OpenMPT/soundlib/Sndfile.h 2013-06-30 18:20:28 UTC (rev 2452) @@ -786,7 +786,7 @@ bool ReadSampleFromFile(SAMPLEINDEX nSample, FileReader &file); bool ReadWAVSample(SAMPLEINDEX nSample, FileReader &file, FileReader *wsmpChunk = nullptr); bool ReadPATSample(SAMPLEINDEX nSample, const LPBYTE lpMemFile, DWORD dwFileLength); - bool ReadS3ISample(SAMPLEINDEX nSample, const LPBYTE lpMemFile, DWORD dwFileLength); + bool ReadS3ISample(SAMPLEINDEX nSample, FileReader &file); bool ReadAIFFSample(SAMPLEINDEX nSample, FileReader &file); bool ReadXISample(SAMPLEINDEX nSample, FileReader &file); bool ReadITSSample(SAMPLEINDEX nSample, FileReader &file, bool rewind = true); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-06-30 20:23:49
|
Revision: 2455 http://sourceforge.net/p/modplug/code/2455 Author: manxorist Date: 2013-06-30 20:23:42 +0000 (Sun, 30 Jun 2013) Log Message: ----------- [Ref] Rename common/svn_verion directory to common/svn_version_subwcrev which way better reflects its semantics. Modified Paths: -------------- trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj trunk/OpenMPT/mptrack/mptrack_08.vcproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters Added Paths: ----------- trunk/OpenMPT/common/svn_version_subwcrev/ Removed Paths: ------------- trunk/OpenMPT/common/svn_version/ Modified: trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj 2013-06-30 18:26:34 UTC (rev 2454) +++ trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj 2013-06-30 20:23:42 UTC (rev 2455) @@ -124,7 +124,7 @@ <ClCompile> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> - <AdditionalIncludeDirectories>..;../common;../common/svn_version;../common/svn_version_default;../include;../include/modplug/include;../include/pugixml/src</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..;../common;../common/svn_version_subwcrev;../common/svn_version_default;../include;../include/modplug/include;../include/pugixml/src</AdditionalIncludeDirectories> <PreprocessorDefinitions>_WINDLL;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> </ClCompile> @@ -133,7 +133,7 @@ <DelayLoadDLLs>libopenmpt_settings.dll</DelayLoadDLLs> </Link> <PreBuildEvent> - <Command>subwcrev .. ..\common\svn_version\svn_version.template.h ..\common\svn_version\svn_version.h || del ..\common\svn_version\svn_version.h || true</Command> + <Command>subwcrev .. ..\common\svn_version_subwcrev\svn_version.template.h ..\common\svn_version_subwcrev\svn_version.h || del ..\common\svn_version_subwcrev\svn_version.h || true</Command> </PreBuildEvent> <PostBuildEvent> <Command> @@ -144,7 +144,7 @@ <ClCompile> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> - <AdditionalIncludeDirectories>..;../common;../common/svn_version;../common/svn_version_default;../include;../include/modplug/include;../include/pugixml/src</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..;../common;../common/svn_version_subwcrev;../common/svn_version_default;../include;../include/modplug/include;../include/pugixml/src</AdditionalIncludeDirectories> <PreprocessorDefinitions>_WINDLL;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> </ClCompile> @@ -153,7 +153,7 @@ <DelayLoadDLLs>libopenmpt_settings.dll</DelayLoadDLLs> </Link> <PreBuildEvent> - <Command>subwcrev .. ..\common\svn_version\svn_version.template.h ..\common\svn_version\svn_version.h || del ..\common\svn_version\svn_version.h || true</Command> + <Command>subwcrev .. ..\common\svn_version_subwcrev\svn_version.template.h ..\common\svn_version_subwcrev\svn_version.h || del ..\common\svn_version_subwcrev\svn_version.h || true</Command> </PreBuildEvent> <PostBuildEvent> <Command> @@ -164,7 +164,7 @@ <ClCompile> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> - <AdditionalIncludeDirectories>..;../common;../common/svn_version;../common/svn_version_default;../include;../include/modplug/include;../include/pugixml/src</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..;../common;../common/svn_version_subwcrev;../common/svn_version_default;../include;../include/modplug/include;../include/pugixml/src</AdditionalIncludeDirectories> <PreprocessorDefinitions>LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> </ClCompile> @@ -172,7 +172,7 @@ <GenerateDebugInformation>true</GenerateDebugInformation> </Link> <PreBuildEvent> - <Command>subwcrev .. ..\common\svn_version\svn_version.template.h ..\common\svn_version\svn_version.h || del ..\common\svn_version\svn_version.h || true</Command> + <Command>subwcrev .. ..\common\svn_version_subwcrev\svn_version.template.h ..\common\svn_version_subwcrev\svn_version.h || del ..\common\svn_version_subwcrev\svn_version.h || true</Command> </PreBuildEvent> <Lib> <AdditionalOptions>/ignore:4221 %(AdditionalOptions)</AdditionalOptions> @@ -182,7 +182,7 @@ <ClCompile> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> - <AdditionalIncludeDirectories>..;../common;../common/svn_version;../common/svn_version_default;../include;../include/modplug/include;../include/pugixml/src</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..;../common;../common/svn_version_subwcrev;../common/svn_version_default;../include;../include/modplug/include;../include/pugixml/src</AdditionalIncludeDirectories> <PreprocessorDefinitions>LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> </ClCompile> @@ -190,7 +190,7 @@ <GenerateDebugInformation>true</GenerateDebugInformation> </Link> <PreBuildEvent> - <Command>subwcrev .. ..\common\svn_version\svn_version.template.h ..\common\svn_version\svn_version.h || del ..\common\svn_version\svn_version.h || true</Command> + <Command>subwcrev .. ..\common\svn_version_subwcrev\svn_version.template.h ..\common\svn_version_subwcrev\svn_version.h || del ..\common\svn_version_subwcrev\svn_version.h || true</Command> </PreBuildEvent> <Lib> <AdditionalOptions>/ignore:4221 %(AdditionalOptions)</AdditionalOptions> @@ -205,7 +205,7 @@ <MultiProcessorCompilation>true</MultiProcessorCompilation> <FloatingPointModel>Fast</FloatingPointModel> <PreprocessorDefinitions>_WINDLL;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>..;../common;../common/svn_version;../common/svn_version_default;../include;../include/modplug/include;../include/pugixml/src</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..;../common;../common/svn_version_subwcrev;../common/svn_version_default;../include;../include/modplug/include;../include/pugixml/src</AdditionalIncludeDirectories> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> @@ -219,7 +219,7 @@ <DelayLoadDLLs>libopenmpt_settings.dll</DelayLoadDLLs> </Link> <PreBuildEvent> - <Command>subwcrev .. ..\common\svn_version\svn_version.template.h ..\common\svn_version\svn_version.h || del ..\common\svn_version\svn_version.h || true</Command> + <Command>subwcrev .. ..\common\svn_version_subwcrev\svn_version.template.h ..\common\svn_version_subwcrev\svn_version.h || del ..\common\svn_version_subwcrev\svn_version.h || true</Command> </PreBuildEvent> <PostBuildEvent> <Command>copy /y bin\libopenmpt.dll bin\in_openmpt.dll @@ -237,7 +237,7 @@ <MultiProcessorCompilation>true</MultiProcessorCompilation> <FloatingPointModel>Fast</FloatingPointModel> <PreprocessorDefinitions>_WINDLL;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>..;../common;../common/svn_version;../common/svn_version_default;../include;../include/modplug/include;../include/pugixml/src</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..;../common;../common/svn_version_subwcrev;../common/svn_version_default;../include;../include/modplug/include;../include/pugixml/src</AdditionalIncludeDirectories> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> @@ -251,7 +251,7 @@ <DelayLoadDLLs>libopenmpt_settings.dll</DelayLoadDLLs> </Link> <PreBuildEvent> - <Command>subwcrev .. ..\common\svn_version\svn_version.template.h ..\common\svn_version\svn_version.h || del ..\common\svn_version\svn_version.h || true</Command> + <Command>subwcrev .. ..\common\svn_version_subwcrev\svn_version.template.h ..\common\svn_version_subwcrev\svn_version.h || del ..\common\svn_version_subwcrev\svn_version.h || true</Command> </PreBuildEvent> <PostBuildEvent> <Command>copy /y bin\libopenmpt64.dll bin\libmodplug64.dll @@ -267,7 +267,7 @@ <MultiProcessorCompilation>true</MultiProcessorCompilation> <FloatingPointModel>Fast</FloatingPointModel> <PreprocessorDefinitions>LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>..;../common;../common/svn_version;../common/svn_version_default;../include;../include/modplug/include;../include/pugixml/src</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..;../common;../common/svn_version_subwcrev;../common/svn_version_default;../include;../include/modplug/include;../include/pugixml/src</AdditionalIncludeDirectories> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> @@ -279,7 +279,7 @@ <OptimizeReferences>true</OptimizeReferences> </Link> <PreBuildEvent> - <Command>subwcrev .. ..\common\svn_version\svn_version.template.h ..\common\svn_version\svn_version.h || del ..\common\svn_version\svn_version.h || true</Command> + <Command>subwcrev .. ..\common\svn_version_subwcrev\svn_version.template.h ..\common\svn_version_subwcrev\svn_version.h || del ..\common\svn_version_subwcrev\svn_version.h || true</Command> </PreBuildEvent> <Lib> <AdditionalOptions>/ignore:4221 %(AdditionalOptions)</AdditionalOptions> @@ -294,7 +294,7 @@ <MultiProcessorCompilation>true</MultiProcessorCompilation> <FloatingPointModel>Fast</FloatingPointModel> <PreprocessorDefinitions>LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>..;../common;../common/svn_version;../common/svn_version_default;../include;../include/modplug/include;../include/pugixml/src</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..;../common;../common/svn_version_subwcrev;../common/svn_version_default;../include;../include/modplug/include;../include/pugixml/src</AdditionalIncludeDirectories> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> @@ -306,7 +306,7 @@ <OptimizeReferences>true</OptimizeReferences> </Link> <PreBuildEvent> - <Command>subwcrev .. ..\common\svn_version\svn_version.template.h ..\common\svn_version\svn_version.h || del ..\common\svn_version\svn_version.h || true</Command> + <Command>subwcrev .. ..\common\svn_version_subwcrev\svn_version.template.h ..\common\svn_version_subwcrev\svn_version.h || del ..\common\svn_version_subwcrev\svn_version.h || true</Command> </PreBuildEvent> <Lib> <AdditionalOptions>/ignore:4221 %(AdditionalOptions)</AdditionalOptions> Modified: trunk/OpenMPT/mptrack/mptrack_08.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_08.vcproj 2013-06-30 18:26:34 UTC (rev 2454) +++ trunk/OpenMPT/mptrack/mptrack_08.vcproj 2013-06-30 20:23:42 UTC (rev 2455) @@ -27,7 +27,7 @@ > <Tool Name="VCPreBuildEventTool" - CommandLine="subwcrev .. ..\common\svn_version\svn_version.template.h ..\common\svn_version\svn_version.h || del ..\common\svn_version\svn_version.h || true" + CommandLine="subwcrev .. ..\common\svn_version_subwcrev\svn_version.template.h ..\common\svn_version_subwcrev\svn_version.h || del ..\common\svn_version_subwcrev\svn_version.h || true" /> <Tool Name="VCCustomBuildTool" @@ -49,7 +49,7 @@ <Tool Name="VCCLCompilerTool" Optimization="0" - AdditionalIncludeDirectories="..\common;..\soundlib;..\include\msinttypes\stdint;..\include\msinttypes\inttypes;..\include;..\include\vstsdk2.4\;..\include\ASIOSDK2\common\;..\include\lhasa\lib\public;..\include\zlib;..\;..\common\svn_version;..\common\svn_version_default" + AdditionalIncludeDirectories="..\common;..\soundlib;..\include\msinttypes\stdint;..\include\msinttypes\inttypes;..\include;..\include\vstsdk2.4\;..\include\ASIOSDK2\common\;..\include\lhasa\lib\public;..\include\zlib;..\;..\common\svn_version_subwcrev;..\common\svn_version_default" PreprocessorDefinitions="_DEBUG,WIN32,_WINDOWS,MODPLUG_TRACKER" StringPooling="true" ExceptionHandling="2" @@ -135,7 +135,7 @@ > <Tool Name="VCPreBuildEventTool" - CommandLine="subwcrev .. ..\common\svn_version\svn_version.template.h ..\common\svn_version\svn_version.h || del ..\common\svn_version\svn_version.h || true" + CommandLine="subwcrev .. ..\common\svn_version_subwcrev\svn_version.template.h ..\common\svn_version_subwcrev\svn_version.h || del ..\common\svn_version_subwcrev\svn_version.h || true" /> <Tool Name="VCCustomBuildTool" @@ -158,7 +158,7 @@ Name="VCCLCompilerTool" Optimization="2" InlineFunctionExpansion="2" - AdditionalIncludeDirectories="..\common;..\soundlib;..\include\msinttypes\stdint;..\include\msinttypes\inttypes;..\include;..\include\vstsdk2.4\;..\include\ASIOSDK2\common\;..\include\lhasa\lib\public;..\include\zlib;..\;..\common\svn_version;..\common\svn_version_default" + AdditionalIncludeDirectories="..\common;..\soundlib;..\include\msinttypes\stdint;..\include\msinttypes\inttypes;..\include;..\include\vstsdk2.4\;..\include\ASIOSDK2\common\;..\include\lhasa\lib\public;..\include\zlib;..\;..\common\svn_version_subwcrev;..\common\svn_version_default" PreprocessorDefinitions="NDEBUG,WIN32,_WINDOWS,MODPLUG_TRACKER" StringPooling="true" ExceptionHandling="2" @@ -1121,7 +1121,7 @@ > </File> <File - RelativePath="..\common\svn_version\svn_version.template.h" + RelativePath="..\common\svn_version_subwcrev\svn_version.template.h" > </File> <File Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2013-06-30 18:26:34 UTC (rev 2454) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2013-06-30 20:23:42 UTC (rev 2455) @@ -77,7 +77,7 @@ <ClCompile> <AdditionalOptions>/EHsc %(AdditionalOptions)</AdditionalOptions> <Optimization>Disabled</Optimization> - <AdditionalIncludeDirectories>..\common;..\soundlib;..\include;..\include\msinttypes\inttypes;..\include\vstsdk2.4\;..\include\ASIOSDK2\common\;..\include\lhasa\lib\public;..\include\zlib;..\;..\common\svn_version;..\common\svn_version_default;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..\common;..\soundlib;..\include;..\include\msinttypes\inttypes;..\include\vstsdk2.4\;..\include\ASIOSDK2\common\;..\include\lhasa\lib\public;..\include\zlib;..\;..\common\svn_version_subwcrev;..\common\svn_version_default;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>_DEBUG;WIN32;_WINDOWS;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions> <StringPooling>true</StringPooling> <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> @@ -122,7 +122,7 @@ <AdditionalManifestFiles>$(ProjectDir)res/rt_manif.bin;%(AdditionalManifestFiles)</AdditionalManifestFiles> </Manifest> <PreBuildEvent> - <Command>subwcrev .. ..\common\svn_version\svn_version.template.h ..\common\svn_version\svn_version.h || del ..\common\svn_version\svn_version.h || true</Command> + <Command>subwcrev .. ..\common\svn_version_subwcrev\svn_version.template.h ..\common\svn_version_subwcrev\svn_version.h || del ..\common\svn_version_subwcrev\svn_version.h || true</Command> </PreBuildEvent> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> @@ -136,7 +136,7 @@ <ClCompile> <Optimization>MaxSpeed</Optimization> <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion> - <AdditionalIncludeDirectories>..\common;..\soundlib;..\include;..\include\msinttypes\inttypes;..\include\vstsdk2.4\;..\include\ASIOSDK2\common\;..\include\lhasa\lib\public;..\include\zlib;..\;..\common\svn_version;..\common\svn_version_default;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..\common;..\soundlib;..\include;..\include\msinttypes\inttypes;..\include\vstsdk2.4\;..\include\ASIOSDK2\common\;..\include\lhasa\lib\public;..\include\zlib;..\;..\common\svn_version_subwcrev;..\common\svn_version_default;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>NDEBUG;WIN32;_WINDOWS;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions> <StringPooling>true</StringPooling> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> @@ -185,7 +185,7 @@ <AdditionalManifestFiles>$(ProjectDir)res/rt_manif.bin;%(AdditionalManifestFiles)</AdditionalManifestFiles> </Manifest> <PreBuildEvent> - <Command>subwcrev .. ..\common\svn_version\svn_version.template.h ..\common\svn_version\svn_version.h || del ..\common\svn_version\svn_version.h || true</Command> + <Command>subwcrev .. ..\common\svn_version_subwcrev\svn_version.template.h ..\common\svn_version_subwcrev\svn_version.h || del ..\common\svn_version_subwcrev\svn_version.h || true</Command> </PreBuildEvent> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseLTCG|Win32'"> @@ -199,7 +199,7 @@ <ClCompile> <Optimization>MaxSpeed</Optimization> <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion> - <AdditionalIncludeDirectories>..\common;..\soundlib;..\include;..\include\msinttypes\inttypes;..\include\vstsdk2.4\;..\include\ASIOSDK2\common\;..\include\lhasa\lib\public;..\include\zlib;..\;..\common\svn_version;..\common\svn_version_default;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..\common;..\soundlib;..\include;..\include\msinttypes\inttypes;..\include\vstsdk2.4\;..\include\ASIOSDK2\common\;..\include\lhasa\lib\public;..\include\zlib;..\;..\common\svn_version_subwcrev;..\common\svn_version_default;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>NDEBUG;WIN32;_WINDOWS;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions> <StringPooling>true</StringPooling> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> @@ -249,7 +249,7 @@ <AdditionalManifestFiles>$(ProjectDir)res/rt_manif.bin;%(AdditionalManifestFiles)</AdditionalManifestFiles> </Manifest> <PreBuildEvent> - <Command>subwcrev .. ..\common\svn_version\svn_version.template.h ..\common\svn_version\svn_version.h || del ..\common\svn_version\svn_version.h || true</Command> + <Command>subwcrev .. ..\common\svn_version_subwcrev\svn_version.template.h ..\common\svn_version_subwcrev\svn_version.h || del ..\common\svn_version_subwcrev\svn_version.h || true</Command> </PreBuildEvent> </ItemDefinitionGroup> <ItemGroup> @@ -471,8 +471,8 @@ <ClInclude Include="..\common\Profiler.h" /> <ClInclude Include="..\common\serialization_utils.h" /> <ClInclude Include="..\common\StringFixer.h" /> - <ClInclude Include="..\common\svn_version\svn_version.template.h" /> <ClInclude Include="..\common\svn_version_default\svn_version.h" /> + <ClInclude Include="..\common\svn_version_subwcrev\svn_version.template.h" /> <ClInclude Include="..\common\typedefs.h" /> <ClInclude Include="..\common\version.h" /> <ClInclude Include="..\common\versionNumber.h" /> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2013-06-30 18:26:34 UTC (rev 2454) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2013-06-30 20:23:42 UTC (rev 2455) @@ -840,9 +840,6 @@ <ClInclude Include="Reporting.h"> <Filter>Header Files\mptrack</Filter> </ClInclude> - <ClInclude Include="..\common\svn_version\svn_version.template.h"> - <Filter>Header Files\common</Filter> - </ClInclude> <ClInclude Include="..\common\svn_version_default\svn_version.h"> <Filter>Header Files\common</Filter> </ClInclude> @@ -885,6 +882,9 @@ <ClInclude Include="..\soundlib\S3MTools.h"> <Filter>Source Files\soundlib\Module Loaders</Filter> </ClInclude> + <ClInclude Include="..\common\svn_version_subwcrev\svn_version.template.h"> + <Filter>Header Files\common</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <None Include="res\bitmap1.bmp"> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-07-01 11:14:56
|
Revision: 2459 http://sourceforge.net/p/modplug/code/2459 Author: manxorist Date: 2013-07-01 11:14:47 +0000 (Mon, 01 Jul 2013) Log Message: ----------- [Ref] Rename xsoundlib/ to include/smbPitchShift/. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/MPTRACK_08.sln trunk/OpenMPT/mptrack/MPTRACK_10.sln trunk/OpenMPT/mptrack/mptrack_10.vcxproj Added Paths: ----------- trunk/OpenMPT/include/smbPitchShift/ Removed Paths: ------------- trunk/OpenMPT/xsoundlib/ Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2013-06-30 23:30:51 UTC (rev 2458) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2013-07-01 11:14:47 UTC (rev 2459) @@ -23,7 +23,7 @@ #include "soundtouch/SoundTouch.h" #include "soundtouch/TDStretch.h" #include "soundtouch/SoundTouchDLL.h" -#include "xsoundlib/smbPitchShift.h" +#include "smbPitchShift/smbPitchShift.h" #include "modsmp_ctrl.h" #include "Autotune.h" #include "../common/StringFixer.h" Modified: trunk/OpenMPT/mptrack/MPTRACK_08.sln =================================================================== --- trunk/OpenMPT/mptrack/MPTRACK_08.sln 2013-06-30 23:30:51 UTC (rev 2458) +++ trunk/OpenMPT/mptrack/MPTRACK_08.sln 2013-07-01 11:14:47 UTC (rev 2459) @@ -10,7 +10,7 @@ {CF3C2CA5-5D45-4635-BBA4-C1F435E10896} = {CF3C2CA5-5D45-4635-BBA4-C1F435E10896} EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xsoundlib", "..\xsoundlib\xsoundlib_08.vcproj", "{DCC2BB2F-6778-4FD3-9C00-D6CD8DC917B8}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xsoundlib", "..\include\smbPitchShift\xsoundlib_08.vcproj", "{DCC2BB2F-6778-4FD3-9C00-D6CD8DC917B8}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SoundTouch", "..\soundtouch\soundtouch_08.vcproj", "{CF3C2CA5-5D45-4635-BBA4-C1F435E10896}" EndProject Modified: trunk/OpenMPT/mptrack/MPTRACK_10.sln =================================================================== --- trunk/OpenMPT/mptrack/MPTRACK_10.sln 2013-06-30 23:30:51 UTC (rev 2458) +++ trunk/OpenMPT/mptrack/MPTRACK_10.sln 2013-07-01 11:14:47 UTC (rev 2459) @@ -5,7 +5,7 @@ {4CEFBC84-C215-11DB-8314-0800200C9A66} = {4CEFBC84-C215-11DB-8314-0800200C9A66} EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xsoundlib", "..\xsoundlib\xsoundlib_10.vcxproj", "{DCC2BB2F-6778-4FD3-9C00-D6CD8DC917B8}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xsoundlib", "..\include\smbPitchShift\xsoundlib_10.vcxproj", "{DCC2BB2F-6778-4FD3-9C00-D6CD8DC917B8}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SoundTouch", "..\soundtouch\soundtouch_10.vcxproj", "{CF3C2CA5-5D45-4635-BBA4-C1F435E10896}" EndProject Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2013-06-30 23:30:51 UTC (rev 2458) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2013-07-01 11:14:47 UTC (rev 2459) @@ -642,7 +642,7 @@ <Project>{cf3c2ca5-5d45-4635-bba4-c1f435e10896}</Project> <ReferenceOutputAssembly>false</ReferenceOutputAssembly> </ProjectReference> - <ProjectReference Include="..\xsoundlib\xsoundlib_10.vcxproj"> + <ProjectReference Include="..\include\smbPitchShift\xsoundlib_10.vcxproj"> <Project>{dcc2bb2f-6778-4fd3-9c00-d6cd8dc917b8}</Project> </ProjectReference> </ItemGroup> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-07-01 17:38:31
|
Revision: 2473 http://sourceforge.net/p/modplug/code/2473 Author: manxorist Date: 2013-07-01 17:38:20 +0000 (Mon, 01 Jul 2013) Log Message: ----------- [Mod] Remove QUALITY render param. [Mod] Remove openmpt123 --quality option. It was a bad idea and just an alias for filter length anyway. [Mod] Remove MAXMIXCHANNELS render param. [Mod] Remove polyphony options from libopenmpt plugins. [Mod] Reorder render param indices. [New] Add generic ctl API to libopenmpt. [Fix] Correct path to svn_version_template.h in libopenmpt vs2010 project file, so it does not try to rebuild always. [Fix] Properly disable C++ API with unsupported compiler settings. [Fix] Make libopenmpt_modplug build on win64 again. [Ref] Minor tweaks to libopenmpt windows build. Modified Paths: -------------- trunk/OpenMPT/libopenmpt/SettingsForm.h trunk/OpenMPT/libopenmpt/libopenmpt.h trunk/OpenMPT/libopenmpt/libopenmpt.hpp trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj.filters trunk/OpenMPT/libopenmpt/libopenmpt_c.cpp trunk/OpenMPT/libopenmpt/libopenmpt_cxx.cpp trunk/OpenMPT/libopenmpt/libopenmpt_impl.cpp trunk/OpenMPT/libopenmpt/libopenmpt_impl.hpp trunk/OpenMPT/libopenmpt/libopenmpt_modplug.c trunk/OpenMPT/libopenmpt/libopenmpt_settings.cpp trunk/OpenMPT/libopenmpt/libopenmpt_settings.h trunk/OpenMPT/libopenmpt/libopenmpt_settings.vcxproj trunk/OpenMPT/libopenmpt/libopenmpt_winamp.cpp trunk/OpenMPT/libopenmpt/libopenmpt_xmplay.cpp trunk/OpenMPT/openmpt123/openmpt123.cpp Modified: trunk/OpenMPT/libopenmpt/SettingsForm.h =================================================================== --- trunk/OpenMPT/libopenmpt/SettingsForm.h 2013-07-01 13:56:47 UTC (rev 2472) +++ trunk/OpenMPT/libopenmpt/SettingsForm.h 2013-07-01 17:38:20 UTC (rev 2473) @@ -57,8 +57,6 @@ trackBarGain->Value = settings->mastergain_millibel; - trackBarMaxPolyphony->Value = settings->maxmixchannels; - if ( settings->interpolationfilterlength == 0 ) { comboBoxInterpolation->SelectedIndex = 3; } else if ( settings->interpolationfilterlength >= 8 ) { @@ -102,8 +100,8 @@ private: System::Windows::Forms::ComboBox^ comboBoxChannels; private: System::Windows::Forms::Label^ labelGain; private: System::Windows::Forms::TrackBar^ trackBarGain; - private: System::Windows::Forms::Label^ labelMaxPolyphony; - private: System::Windows::Forms::TrackBar^ trackBarMaxPolyphony; + + private: System::Windows::Forms::Label^ labelInterpolation; private: System::Windows::Forms::ComboBox^ comboBoxInterpolation; private: System::Windows::Forms::Label^ labelRepeat; @@ -138,8 +136,6 @@ this->comboBoxChannels = (gcnew System::Windows::Forms::ComboBox()); this->labelGain = (gcnew System::Windows::Forms::Label()); this->trackBarGain = (gcnew System::Windows::Forms::TrackBar()); - this->labelMaxPolyphony = (gcnew System::Windows::Forms::Label()); - this->trackBarMaxPolyphony = (gcnew System::Windows::Forms::TrackBar()); this->labelInterpolation = (gcnew System::Windows::Forms::Label()); this->comboBoxInterpolation = (gcnew System::Windows::Forms::ComboBox()); this->labelRepeat = (gcnew System::Windows::Forms::Label()); @@ -151,7 +147,6 @@ this->trackBarVolrampin = (gcnew System::Windows::Forms::TrackBar()); this->trackBarVolrampout = (gcnew System::Windows::Forms::TrackBar()); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->trackBarGain))->BeginInit(); - (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->trackBarMaxPolyphony))->BeginInit(); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->trackBarStereoSeparation))->BeginInit(); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->trackBarVolrampin))->BeginInit(); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->trackBarVolrampout))->BeginInit(); @@ -178,7 +173,7 @@ // // buttonOK // - this->buttonOK->Location = System::Drawing::Point(15, 357); + this->buttonOK->Location = System::Drawing::Point(15, 309); this->buttonOK->Name = L"buttonOK"; this->buttonOK->Size = System::Drawing::Size(212, 23); this->buttonOK->TabIndex = 2; @@ -228,33 +223,10 @@ this->trackBarGain->TickStyle = System::Windows::Forms::TickStyle::Both; this->trackBarGain->Scroll += gcnew System::EventHandler(this, &SettingsForm::trackBarGain_Scroll); // - // labelMaxPolyphony - // - this->labelMaxPolyphony->AutoSize = true; - this->labelMaxPolyphony->Location = System::Drawing::Point(12, 124); - this->labelMaxPolyphony->Name = L"labelMaxPolyphony"; - this->labelMaxPolyphony->Size = System::Drawing::Size(77, 13); - this->labelMaxPolyphony->TabIndex = 7; - this->labelMaxPolyphony->Text = L"max polyphony"; - // - // trackBarMaxPolyphony - // - this->trackBarMaxPolyphony->LargeChange = 16; - this->trackBarMaxPolyphony->Location = System::Drawing::Point(106, 111); - this->trackBarMaxPolyphony->Maximum = 256; - this->trackBarMaxPolyphony->Minimum = 16; - this->trackBarMaxPolyphony->Name = L"trackBarMaxPolyphony"; - this->trackBarMaxPolyphony->Size = System::Drawing::Size(121, 42); - this->trackBarMaxPolyphony->TabIndex = 8; - this->trackBarMaxPolyphony->TickFrequency = 16; - this->trackBarMaxPolyphony->TickStyle = System::Windows::Forms::TickStyle::Both; - this->trackBarMaxPolyphony->Value = 256; - this->trackBarMaxPolyphony->Scroll += gcnew System::EventHandler(this, &SettingsForm::trackBarMaxPolyphony_Scroll); - // // labelInterpolation // this->labelInterpolation->AutoSize = true; - this->labelInterpolation->Location = System::Drawing::Point(12, 162); + this->labelInterpolation->Location = System::Drawing::Point(12, 114); this->labelInterpolation->Name = L"labelInterpolation"; this->labelInterpolation->Size = System::Drawing::Size(64, 13); this->labelInterpolation->TabIndex = 9; @@ -266,7 +238,7 @@ this->comboBoxInterpolation->FormattingEnabled = true; this->comboBoxInterpolation->Items->AddRange(gcnew cli::array< System::Object^ >(4) {L"1 tap (nearest)", L"2 tap (linear)", L"4 tap (cubic)", L"8 tap (polyphase fir)"}); - this->comboBoxInterpolation->Location = System::Drawing::Point(106, 159); + this->comboBoxInterpolation->Location = System::Drawing::Point(106, 111); this->comboBoxInterpolation->Name = L"comboBoxInterpolation"; this->comboBoxInterpolation->Size = System::Drawing::Size(121, 21); this->comboBoxInterpolation->TabIndex = 10; @@ -275,7 +247,7 @@ // labelRepeat // this->labelRepeat->AutoSize = true; - this->labelRepeat->Location = System::Drawing::Point(12, 189); + this->labelRepeat->Location = System::Drawing::Point(12, 141); this->labelRepeat->Name = L"labelRepeat"; this->labelRepeat->Size = System::Drawing::Size(37, 13); this->labelRepeat->TabIndex = 11; @@ -286,7 +258,7 @@ this->comboBoxRepeat->DropDownStyle = System::Windows::Forms::ComboBoxStyle::DropDownList; this->comboBoxRepeat->FormattingEnabled = true; this->comboBoxRepeat->Items->AddRange(gcnew cli::array< System::Object^ >(3) {L"forever", L"never", L"once"}); - this->comboBoxRepeat->Location = System::Drawing::Point(106, 186); + this->comboBoxRepeat->Location = System::Drawing::Point(106, 138); this->comboBoxRepeat->Name = L"comboBoxRepeat"; this->comboBoxRepeat->Size = System::Drawing::Size(121, 21); this->comboBoxRepeat->TabIndex = 12; @@ -295,7 +267,7 @@ // labelStereoSeparation // this->labelStereoSeparation->AutoSize = true; - this->labelStereoSeparation->Location = System::Drawing::Point(12, 226); + this->labelStereoSeparation->Location = System::Drawing::Point(12, 178); this->labelStereoSeparation->Name = L"labelStereoSeparation"; this->labelStereoSeparation->Size = System::Drawing::Size(88, 13); this->labelStereoSeparation->TabIndex = 13; @@ -304,7 +276,7 @@ // trackBarStereoSeparation // this->trackBarStereoSeparation->LargeChange = 100; - this->trackBarStereoSeparation->Location = System::Drawing::Point(106, 213); + this->trackBarStereoSeparation->Location = System::Drawing::Point(106, 165); this->trackBarStereoSeparation->Maximum = 400; this->trackBarStereoSeparation->Name = L"trackBarStereoSeparation"; this->trackBarStereoSeparation->Size = System::Drawing::Size(121, 42); @@ -318,7 +290,7 @@ // labelVolrampin // this->labelVolrampin->AutoSize = true; - this->labelVolrampin->Location = System::Drawing::Point(12, 274); + this->labelVolrampin->Location = System::Drawing::Point(12, 226); this->labelVolrampin->Name = L"labelVolrampin"; this->labelVolrampin->Size = System::Drawing::Size(78, 13); this->labelVolrampin->TabIndex = 15; @@ -327,7 +299,7 @@ // labelVolrampout // this->labelVolrampout->AutoSize = true; - this->labelVolrampout->Location = System::Drawing::Point(12, 321); + this->labelVolrampout->Location = System::Drawing::Point(12, 273); this->labelVolrampout->Name = L"labelVolrampout"; this->labelVolrampout->Size = System::Drawing::Size(85, 13); this->labelVolrampout->TabIndex = 16; @@ -336,7 +308,7 @@ // trackBarVolrampin // this->trackBarVolrampin->LargeChange = 1000; - this->trackBarVolrampin->Location = System::Drawing::Point(106, 261); + this->trackBarVolrampin->Location = System::Drawing::Point(106, 213); this->trackBarVolrampin->Maximum = 10000; this->trackBarVolrampin->Name = L"trackBarVolrampin"; this->trackBarVolrampin->Size = System::Drawing::Size(121, 42); @@ -349,7 +321,7 @@ // trackBarVolrampout // this->trackBarVolrampout->LargeChange = 1000; - this->trackBarVolrampout->Location = System::Drawing::Point(106, 309); + this->trackBarVolrampout->Location = System::Drawing::Point(106, 261); this->trackBarVolrampout->Maximum = 10000; this->trackBarVolrampout->Name = L"trackBarVolrampout"; this->trackBarVolrampout->Size = System::Drawing::Size(121, 42); @@ -376,8 +348,6 @@ this->Controls->Add(this->labelRepeat); this->Controls->Add(this->comboBoxInterpolation); this->Controls->Add(this->labelInterpolation); - this->Controls->Add(this->trackBarMaxPolyphony); - this->Controls->Add(this->labelMaxPolyphony); this->Controls->Add(this->trackBarGain); this->Controls->Add(this->labelGain); this->Controls->Add(this->comboBoxChannels); @@ -394,7 +364,6 @@ this->StartPosition = System::Windows::Forms::FormStartPosition::CenterParent; this->Text = L"SettingsForm"; (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->trackBarGain))->EndInit(); - (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->trackBarMaxPolyphony))->EndInit(); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->trackBarStereoSeparation))->EndInit(); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->trackBarVolrampin))->EndInit(); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->trackBarVolrampout))->EndInit(); @@ -450,10 +419,6 @@ } settings->changed(); } -private: System::Void trackBarMaxPolyphony_Scroll(System::Object^ sender, System::EventArgs^ e) { - settings->maxmixchannels = (int)trackBarMaxPolyphony->Value; - settings->changed(); - } private: System::Void comboBoxRepeat_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) { settings->repeatcount = (int)comboBoxRepeat->SelectedIndex - 1; settings->changed(); Modified: trunk/OpenMPT/libopenmpt/libopenmpt.h =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt.h 2013-07-01 13:56:47 UTC (rev 2472) +++ trunk/OpenMPT/libopenmpt/libopenmpt.h 2013-07-01 17:38:20 UTC (rev 2473) @@ -64,14 +64,12 @@ LIBOPENMPT_API void openmpt_module_destroy( openmpt_module * mod ); -#define OPENMPT_MODULE_RENDER_MASTERGAIN_MILLIBEL 1 -#define OPENMPT_MODULE_RENDER_STEREOSEPARATION_PERCENT 2 -#define OPENMPT_MODULE_RENDER_REPEATCOUNT 3 -#define OPENMPT_MODULE_RENDER_QUALITY_PERCENT 4 -#define OPENMPT_MODULE_RENDER_MAXMIXCHANNELS 5 -#define OPENMPT_MODULE_RENDER_INTERPOLATION_FILTER_LENGTH 6 -#define OPENMPT_MODULE_RENDER_VOLUMERAMP_UP_MICROSECONDS 7 -#define OPENMPT_MODULE_RENDER_VOLUMERAMP_DOWN_MICROSECONDS 8 +#define OPENMPT_MODULE_RENDER_REPEATCOUNT 1 +#define OPENMPT_MODULE_RENDER_MASTERGAIN_MILLIBEL 2 +#define OPENMPT_MODULE_RENDER_STEREOSEPARATION_PERCENT 3 +#define OPENMPT_MODULE_RENDER_INTERPOLATION_FILTER_LENGTH 4 +#define OPENMPT_MODULE_RENDER_VOLUMERAMP_UP_MICROSECONDS 5 +#define OPENMPT_MODULE_RENDER_VOLUMERAMP_DOWN_MICROSECONDS 6 #define OPENMPT_MODULE_COMMAND_NOTE 0 #define OPENMPT_MODULE_COMMAND_INSTRUMENT 1 @@ -80,8 +78,8 @@ #define OPENMPT_MODULE_COMMAND_VOLUME 4 #define OPENMPT_MODULE_COMMAND_PARAMETER 5 -LIBOPENMPT_API int openmpt_module_get_render_param( openmpt_module * mod, int command, int32_t * value ); -LIBOPENMPT_API int openmpt_module_set_render_param( openmpt_module * mod, int command, int32_t value ); +LIBOPENMPT_API int openmpt_module_get_render_param( openmpt_module * mod, int param, int32_t * value ); +LIBOPENMPT_API int openmpt_module_set_render_param( openmpt_module * mod, int param, int32_t value ); LIBOPENMPT_API int openmpt_module_select_subsong( openmpt_module * mod, int32_t subsong ); @@ -127,6 +125,14 @@ LIBOPENMPT_API uint8_t openmpt_module_get_pattern_row_channel_command( openmpt_module * mod, int32_t pattern, int32_t row, int32_t channel, int command ); +LIBOPENMPT_API const char * openmpt_module_get_ctls( openmpt_module * mod ); +LIBOPENMPT_API const char * openmpt_module_ctl_get_string( openmpt_module * mod, const char * ctl ); +LIBOPENMPT_API int openmpt_module_ctl_get_double( openmpt_module * mod, const char * ctl, double * value ); +LIBOPENMPT_API int openmpt_module_ctl_get_int64( openmpt_module * mod, const char * ctl, int64_t * value ); +LIBOPENMPT_API int openmpt_module_ctl_set_string( openmpt_module * mod, const char * ctl, const char * value ); +LIBOPENMPT_API int openmpt_module_ctl_set_double( openmpt_module * mod, const char * ctl, double value ); +LIBOPENMPT_API int openmpt_module_ctl_set_int64( openmpt_module * mod, const char * ctl, int64_t value ); + /* remember to add new functions to both C and C++ interfaces and to increase OPENMPT_API_VERSION_MINOR */ #ifdef __cplusplus Modified: trunk/OpenMPT/libopenmpt/libopenmpt.hpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt.hpp 2013-07-01 13:56:47 UTC (rev 2472) +++ trunk/OpenMPT/libopenmpt/libopenmpt.hpp 2013-07-01 17:38:20 UTC (rev 2473) @@ -77,14 +77,12 @@ public: enum render_param { - RENDER_MASTERGAIN_MILLIBEL = 1, - RENDER_STEREOSEPARATION_PERCENT = 2, - RENDER_REPEATCOUNT = 3, - RENDER_QUALITY_PERCENT = 4, - RENDER_MAXMIXCHANNELS = 5, - RENDER_INTERPOLATION_FILTER_LENGTH = 6, - RENDER_VOLUMERAMP_UP_MICROSECONDS = 7, - RENDER_VOLUMERAMP_DOWN_MICROSECONDS = 8 + RENDER_REPEATCOUNT = 1, + RENDER_MASTERGAIN_MILLIBEL = 2, + RENDER_STEREOSEPARATION_PERCENT = 3, + RENDER_INTERPOLATION_FILTER_LENGTH = 4, + RENDER_VOLUMERAMP_UP_MICROSECONDS = 5, + RENDER_VOLUMERAMP_DOWN_MICROSECONDS = 6 }; enum command_index { @@ -118,8 +116,8 @@ virtual ~module(); public: - std::int32_t get_render_param( int command ) const; - void set_render_param( int command, std::int32_t value ); + std::int32_t get_render_param( int param ) const; + void set_render_param( int param, std::int32_t value ); void select_subsong( std::int32_t subsong ); @@ -166,6 +164,16 @@ std::uint8_t get_pattern_row_channel_command( std::int32_t pattern, std::int32_t row, std::int32_t channel, int command ) const; + std::vector<std::string> get_ctls() const; + + std::string ctl_get_string( const std::string & ctl ) const; + double ctl_get_double( const std::string & ctl ) const; + std::int64_t ctl_get_int64( const std::string & ctl ) const; + + void ctl_set( const std::string & ctl, const std::string & value ); + void ctl_set( const std::string & ctl, double value ); + void ctl_set( const std::string & ctl, std::int64_t value ); + // remember to add new functions to both C and C++ interfaces and to increase OPENMPT_API_VERSION_MINOR }; // class module Modified: trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj 2013-07-01 13:56:47 UTC (rev 2472) +++ trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj 2013-07-01 17:38:20 UTC (rev 2473) @@ -325,8 +325,8 @@ <ClInclude Include="..\common\serialization_utils.h" /> <ClInclude Include="..\common\stdafx.h" /> <ClInclude Include="..\common\StringFixer.h" /> - <ClInclude Include="..\common\svn_version\svn_version.template.h" /> <ClInclude Include="..\common\svn_version_default\svn_version.h" /> + <ClInclude Include="..\common\svn_version_subwcrev\svn_version.template.h" /> <ClInclude Include="..\common\typedefs.h" /> <ClInclude Include="..\common\version.h" /> <ClInclude Include="..\common\versionNumber.h" /> Modified: trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj.filters =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj.filters 2013-07-01 13:56:47 UTC (rev 2472) +++ trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj.filters 2013-07-01 17:38:20 UTC (rev 2473) @@ -9,10 +9,6 @@ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> </Filter> - <Filter Include="Resource Files"> - <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> - <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> - </Filter> <Filter Include="Source Files\soundlib"> <UniqueIdentifier>{31765892-63ca-4ab1-8fba-cd7a44e7b6cc}</UniqueIdentifier> </Filter> @@ -195,9 +191,6 @@ <ClInclude Include="..\common\svn_version_default\svn_version.h"> <Filter>Header Files\common</Filter> </ClInclude> - <ClInclude Include="..\common\svn_version\svn_version.template.h"> - <Filter>Header Files\common</Filter> - </ClInclude> <ClInclude Include="..\common\version.h"> <Filter>Header Files\common</Filter> </ClInclude> @@ -237,6 +230,9 @@ <ClInclude Include="..\soundlib\S3MTools.h"> <Filter>Header Files\soundlib</Filter> </ClInclude> + <ClInclude Include="..\common\svn_version_subwcrev\svn_version.template.h"> + <Filter>Header Files\common</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <ClCompile Include="..\common\AudioCriticalSection.cpp"> Modified: trunk/OpenMPT/libopenmpt/libopenmpt_c.cpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_c.cpp 2013-07-01 13:56:47 UTC (rev 2472) +++ trunk/OpenMPT/libopenmpt/libopenmpt_c.cpp 2013-07-01 17:38:20 UTC (rev 2473) @@ -23,7 +23,7 @@ #include <cstdlib> #include <cstring> -//#ifndef NO_LIBOPENMPT_C +#ifndef NO_LIBOPENMPT_C namespace openmpt { @@ -333,20 +333,20 @@ return; } -int openmpt_module_get_render_param( openmpt_module * mod, int command, int32_t * value ) { +int openmpt_module_get_render_param( openmpt_module * mod, int param, int32_t * value ) { try { OPENMPT_INTERFACE_CHECK_SOUNDFILE( mod ); OPENMPT_INTERFACE_CHECK_POINTER( value ); - *value = mod->impl->get_render_param( (openmpt::module::render_param)command ); + *value = mod->impl->get_render_param( (openmpt::module::render_param)param ); return 1; } OPENMPT_INTERFACE_CATCH_TO_LOG; return 0; } -int openmpt_module_set_render_param( openmpt_module * mod, int command, int32_t value ) { +int openmpt_module_set_render_param( openmpt_module * mod, int param, int32_t value ) { try { OPENMPT_INTERFACE_CHECK_SOUNDFILE( mod ); - mod->impl->set_render_param( (openmpt::module::render_param)command, value ); + mod->impl->set_render_param( (openmpt::module::render_param)param, value ); return 1; } OPENMPT_INTERFACE_CATCH_TO_LOG; return 0; @@ -650,6 +650,83 @@ return 0; } +const char * openmpt_module_get_ctls( openmpt_module * mod ) { + try { + OPENMPT_INTERFACE_CHECK_SOUNDFILE( mod ); + std::string retval; + bool first = true; + std::vector<std::string> ctls = mod->impl->get_ctls(); + for ( std::vector<std::string>::iterator i = ctls.begin(); i != ctls.end(); ++i ) { + if ( first ) { + first = false; + } else { + retval += ";"; + } + retval += *i; + } + return openmpt::strdup( retval.c_str() ); + } OPENMPT_INTERFACE_CATCH_TO_LOG; + return NULL; +} + +const char * openmpt_module_ctl_get_string( openmpt_module * mod, const char * ctl ) { + try { + OPENMPT_INTERFACE_CHECK_SOUNDFILE( mod ); + OPENMPT_INTERFACE_CHECK_POINTER( ctl ); + return openmpt::strdup( mod->impl->ctl_get_string( ctl ).c_str() ); + } OPENMPT_INTERFACE_CATCH_TO_LOG; + return NULL; +} + +int openmpt_module_ctl_get_double( openmpt_module * mod, const char * ctl, double * value ) { + try { + OPENMPT_INTERFACE_CHECK_SOUNDFILE( mod ); + OPENMPT_INTERFACE_CHECK_POINTER( ctl ); + OPENMPT_INTERFACE_CHECK_POINTER( value ); + *value = mod->impl->ctl_get_double( ctl ); + return 1; + } OPENMPT_INTERFACE_CATCH_TO_LOG; + return 0; +} +int openmpt_module_ctl_get_int64( openmpt_module * mod, const char * ctl, int64_t * value ) { + try { + OPENMPT_INTERFACE_CHECK_SOUNDFILE( mod ); + OPENMPT_INTERFACE_CHECK_POINTER( ctl ); + OPENMPT_INTERFACE_CHECK_POINTER( value ); + *value = mod->impl->ctl_get_int64( ctl ); + return 1; + } OPENMPT_INTERFACE_CATCH_TO_LOG; + return 0; +} +int openmpt_module_ctl_set_string( openmpt_module * mod, const char * ctl, const char * value ) { + try { + OPENMPT_INTERFACE_CHECK_SOUNDFILE( mod ); + OPENMPT_INTERFACE_CHECK_POINTER( ctl ); + OPENMPT_INTERFACE_CHECK_POINTER( value ); + mod->impl->ctl_set( ctl, value ); + return 1; + } OPENMPT_INTERFACE_CATCH_TO_LOG; + return 0; +} +int openmpt_module_ctl_set_double( openmpt_module * mod, const char * ctl, double value ) { + try { + OPENMPT_INTERFACE_CHECK_SOUNDFILE( mod ); + OPENMPT_INTERFACE_CHECK_POINTER( ctl ); + mod->impl->ctl_set( ctl, value ); + return 1; + } OPENMPT_INTERFACE_CATCH_TO_LOG; + return 0; +} +int openmpt_module_ctl_set_int64( openmpt_module * mod, const char * ctl, int64_t value ) { + try { + OPENMPT_INTERFACE_CHECK_SOUNDFILE( mod ); + OPENMPT_INTERFACE_CHECK_POINTER( ctl ); + mod->impl->ctl_set( ctl, value ); + return 1; + } OPENMPT_INTERFACE_CATCH_TO_LOG; + return 0; +} + #undef OPENMPT_INTERFACE_CHECK_POINTER #undef OPENMPT_INTERFACE_CHECK_SOUNDFILE #undef OPENMPT_INTERFACE_CATCH_TO_LOG @@ -659,4 +736,4 @@ } // extern "C" -//#endif // NO_LIBOPENMPT_C +#endif // NO_LIBOPENMPT_C Modified: trunk/OpenMPT/libopenmpt/libopenmpt_cxx.cpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_cxx.cpp 2013-07-01 13:56:47 UTC (rev 2472) +++ trunk/OpenMPT/libopenmpt/libopenmpt_cxx.cpp 2013-07-01 17:38:20 UTC (rev 2473) @@ -17,7 +17,7 @@ #include <algorithm> #include <stdexcept> -//#ifndef NO_LIBOPENMPT_CXX +#ifndef NO_LIBOPENMPT_CXX namespace openmpt { @@ -110,12 +110,12 @@ impl = 0; } -std::int32_t module::get_render_param( int command ) const { - return impl->get_render_param( command ); +std::int32_t module::get_render_param( int param ) const { + return impl->get_render_param( param ); } -void module::set_render_param( int command, std::int32_t value ) { - impl->set_render_param( command, value ); +void module::set_render_param( int param, std::int32_t value ) { + impl->set_render_param( param, value ); } void module::select_subsong( std::int32_t subsong ) { @@ -228,6 +228,28 @@ return impl->get_pattern_row_channel_command( pattern, row, channel, command ); } +std::vector<std::string> module::get_ctls() const { + return impl->get_ctls(); +} +std::string module::ctl_get_string( const std::string & ctl ) const { + return impl->ctl_get_string( ctl ); +} +double module::ctl_get_double( const std::string & ctl ) const { + return impl->ctl_get_double( ctl ); +} +std::int64_t module::ctl_get_int64( const std::string & ctl ) const { + return impl->ctl_get_int64( ctl ); +} +void module::ctl_set( const std::string & ctl, const std::string & value ) { + impl->ctl_set( ctl, value ); +} +void module::ctl_set( const std::string & ctl, double value ) { + impl->ctl_set( ctl, value ); +} +void module::ctl_set( const std::string & ctl, std::int64_t value ) { + impl->ctl_set( ctl, value ); +} + } // namespace openmpt -//#endif // NO_LIBOPENMPT_CXX +#endif // NO_LIBOPENMPT_CXX Modified: trunk/OpenMPT/libopenmpt/libopenmpt_impl.cpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_impl.cpp 2013-07-01 13:56:47 UTC (rev 2472) +++ trunk/OpenMPT/libopenmpt/libopenmpt_impl.cpp 2013-07-01 17:38:20 UTC (rev 2473) @@ -78,12 +78,6 @@ static float fx16_to_float( std::int32_t x ) { return static_cast<float>( x * (1.0f/(1<<16)) ); } -template < typename T > static T scale_percent( T percent, T min, T max ) { - return Clamp( min + ( percent * ( max - min ) ) / 100, min, max ); -} -template < typename T > static T unscale_percent( T value, T min, T max ) { - return Clamp( ( value - min ) * 100 / ( max - min ), 0, 100 ); -} class loader_log : public ILog { private: @@ -145,16 +139,6 @@ } } -std::int32_t module_impl::get_quality() const { - return unscale_percent<int>( resamplingmode_to_filterlength( m_sndFile->m_Resampler.m_Settings.SrcMode ), 1, 8 ); -} -void module_impl::set_quality( std::int32_t value ) { - CResamplerSettings resamplersettings = m_sndFile->m_Resampler.m_Settings; - resamplersettings.SrcMode = filterlength_to_resamplingmode( scale_percent<int>( value, 1, 8 ) ); - resamplersettings.gdWFIRCutoff = CResamplerSettings().gdWFIRCutoff; // use default - resamplersettings.gbWFIRType = CResamplerSettings().gbWFIRType; // use default - m_sndFile->SetResamplerSettings( resamplersettings ); -} void module_impl::apply_mixer_settings( std::int32_t samplerate, int channels, bool format_float ) { SampleFormat format = ( format_float ? SampleFormatFloat32 : SampleFormatInt16 ); if ( @@ -175,7 +159,6 @@ } void module_impl::apply_libopenmpt_defaults() { set_render_param( module::RENDER_STEREOSEPARATION_PERCENT, 100 ); - set_render_param( module::RENDER_QUALITY_PERCENT, 100 ); } void module_impl::init() { m_sndFile = std::unique_ptr<CSoundFile>(new CSoundFile()); @@ -313,8 +296,8 @@ m_sndFile->Destroy(); } -std::int32_t module_impl::get_render_param( int command ) const { - switch ( command ) { +std::int32_t module_impl::get_render_param( int param ) const { + switch ( param ) { case module::RENDER_MASTERGAIN_MILLIBEL: { return static_cast<std::int32_t>( 1000.0f * 2.0f * std::log10( fx16_to_float( m_sndFile->m_MixerSettings.m_FinalOutputGain ) ) ); } break; @@ -324,12 +307,6 @@ case module::RENDER_REPEATCOUNT: { return m_sndFile->m_nRepeatCount; } break; - case module::RENDER_QUALITY_PERCENT: { - return get_quality(); - } break; - case module::RENDER_MAXMIXCHANNELS: { - return m_sndFile->m_MixerSettings.m_nMaxMixChannels; - } break; case module::RENDER_INTERPOLATION_FILTER_LENGTH: { return resamplingmode_to_filterlength( m_sndFile->m_Resampler.m_Settings.SrcMode ); } break; @@ -339,12 +316,12 @@ case module::RENDER_VOLUMERAMP_DOWN_MICROSECONDS: { return m_sndFile->m_MixerSettings.GetVolumeRampDownMicroseconds(); } break; - default: throw openmpt::exception_message("unknown command"); break; + default: throw openmpt::exception_message("unknown render param"); break; } return 0; } -void module_impl::set_render_param( int command, std::int32_t value ) { - switch ( command ) { +void module_impl::set_render_param( int param, std::int32_t value ) { + switch ( param ) { case module::RENDER_MASTERGAIN_MILLIBEL: { float gainFactor = static_cast<float>( std::pow( 10.0f, value * 0.001f * 0.5f ) ); if ( static_cast<std::int32_t>( m_sndFile->m_MixerSettings.m_FinalOutputGain ) != float_to_fx16( gainFactor ) ) { @@ -364,16 +341,6 @@ case module::RENDER_REPEATCOUNT: { m_sndFile->SetRepeatCount( value ); } break; - case module::RENDER_QUALITY_PERCENT: { - set_quality( value ); - } break; - case module::RENDER_MAXMIXCHANNELS: { - if ( value != static_cast<std::int32_t>( m_sndFile->m_MixerSettings.m_nMaxMixChannels ) ) { - MixerSettings settings = m_sndFile->m_MixerSettings; - settings.m_nMaxMixChannels = value; - m_sndFile->SetMixerSettings( settings ); - } - } break; case module::RENDER_INTERPOLATION_FILTER_LENGTH: { CResamplerSettings newsettings; newsettings.SrcMode = filterlength_to_resamplingmode( value ); @@ -395,9 +362,10 @@ m_sndFile->SetMixerSettings( newsettings ); } } break; - default: throw openmpt::exception_message("unknown command"); break; + default: throw openmpt::exception_message("unknown render param"); break; } } + std::size_t module_impl::read( std::int32_t samplerate, std::size_t count, std::int16_t * mono ) { if ( !mono ) { throw openmpt::exception_message("null pointer"); @@ -672,4 +640,45 @@ return 0; } +std::vector<std::string> module_impl::get_ctls() const { + std::vector<std::string> retval; + return retval; +} +std::string module_impl::ctl_get_string( const std::string & ctl ) const { + if ( ctl == "" ) { + throw openmpt::exception_message("unknown ctl"); + } + throw openmpt::exception_message("unknown ctl"); +} +double module_impl::ctl_get_double( const std::string & ctl ) const { + if ( ctl == "" ) { + throw openmpt::exception_message("unknown ctl"); + } + throw openmpt::exception_message("unknown ctl"); +} +std::int64_t module_impl::ctl_get_int64( const std::string & ctl ) const { + if ( ctl == "" ) { + throw openmpt::exception_message("unknown ctl"); + } + throw openmpt::exception_message("unknown ctl"); +} +void module_impl::ctl_set( const std::string & ctl, const std::string & value ) { + if ( ctl == "" ) { + throw openmpt::exception_message("unknown ctl"); + } + throw openmpt::exception_message("unknown ctl"); +} +void module_impl::ctl_set( const std::string & ctl, double value ) { + if ( ctl == "" ) { + throw openmpt::exception_message("unknown ctl"); + } + throw openmpt::exception_message("unknown ctl"); +} +void module_impl::ctl_set( const std::string & ctl, std::int64_t value ) { + if ( ctl == "" ) { + throw openmpt::exception_message("unknown ctl"); + } + throw openmpt::exception_message("unknown ctl"); +} + } // namespace openmpt Modified: trunk/OpenMPT/libopenmpt/libopenmpt_impl.hpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_impl.hpp 2013-07-01 13:56:47 UTC (rev 2472) +++ trunk/OpenMPT/libopenmpt/libopenmpt_impl.hpp 2013-07-01 17:38:20 UTC (rev 2473) @@ -72,8 +72,6 @@ void PushToCSoundFileLog( const std::string & text ) const; void PushToCSoundFileLog( int loglevel, const std::string & text ) const; private: - std::int32_t get_quality() const; - void set_quality( std::int32_t value ); void apply_mixer_settings( std::int32_t samplerate, int channels, bool format_float ); void apply_libopenmpt_defaults(); void init(); @@ -93,8 +91,8 @@ module_impl( const void * data, std::size_t size, std::shared_ptr<log_interface> log ); ~module_impl(); public: - std::int32_t get_render_param( int command ) const; - void set_render_param( int command, std::int32_t value ); + std::int32_t get_render_param( int param ) const; + void set_render_param( int param, std::int32_t value ); std::size_t read( std::int32_t samplerate, std::size_t count, std::int16_t * mono ); std::size_t read( std::int32_t samplerate, std::size_t count, std::int16_t * left, std::int16_t * right ); std::size_t read( std::int32_t samplerate, std::size_t count, std::int16_t * left, std::int16_t * right, std::int16_t * rear_left, std::int16_t * rear_right ); @@ -128,6 +126,13 @@ std::int32_t get_order_pattern( std::int32_t o ) const; std::int32_t get_pattern_num_rows( std::int32_t p ) const; std::uint8_t get_pattern_row_channel_command( std::int32_t p, std::int32_t r, std::int32_t c, int cmd ) const; + std::vector<std::string> get_ctls() const; + std::string ctl_get_string( const std::string & ctl ) const; + double ctl_get_double( const std::string & ctl ) const; + std::int64_t ctl_get_int64( const std::string & ctl ) const; + void ctl_set( const std::string & ctl, const std::string & value ); + void ctl_set( const std::string & ctl, double value ); + void ctl_set( const std::string & ctl, std::int64_t value ); }; // class module_impl } // namespace openmpt Modified: trunk/OpenMPT/libopenmpt/libopenmpt_modplug.c =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_modplug.c 2013-07-01 13:56:47 UTC (rev 2472) +++ trunk/OpenMPT/libopenmpt/libopenmpt_modplug.c 2013-07-01 17:38:20 UTC (rev 2473) @@ -131,7 +131,6 @@ file->name = openmpt_module_get_metadata(file->mod,"title"); file->message = openmpt_module_get_metadata(file->mod,"message"); openmpt_module_set_render_param(file->mod,OPENMPT_MODULE_RENDER_STEREOSEPARATION_PERCENT,file->settings.mStereoSeparation*100/128); - openmpt_module_set_render_param(file->mod,OPENMPT_MODULE_RENDER_MAXMIXCHANNELS,file->settings.mMaxMixChannels); openmpt_module_set_render_param(file->mod,OPENMPT_MODULE_RENDER_INTERPOLATION_FILTER_LENGTH,modplugresamplingmode_to_filterlength(file->settings.mResamplingMode)); return file; } @@ -582,6 +581,7 @@ } #ifdef _MSC_VER +#ifdef _M_IX86 #pragma comment(linker, "/EXPORT:ModPlug_Load=_ModPlug_Load") #pragma comment(linker, "/EXPORT:ModPlug_Unload=_ModPlug_Unload") #pragma comment(linker, "/EXPORT:ModPlug_Read=_ModPlug_Read") @@ -614,6 +614,40 @@ #pragma comment(linker, "/EXPORT:ModPlug_ExportXM=_ModPlug_ExportXM") #pragma comment(linker, "/EXPORT:ModPlug_ExportMOD=_ModPlug_ExportMOD") #pragma comment(linker, "/EXPORT:ModPlug_ExportIT=_ModPlug_ExportIT") +#else /* !_M_IX86 */ +#pragma comment(linker, "/EXPORT:ModPlug_Load") +#pragma comment(linker, "/EXPORT:ModPlug_Unload") +#pragma comment(linker, "/EXPORT:ModPlug_Read") +#pragma comment(linker, "/EXPORT:ModPlug_GetName") +#pragma comment(linker, "/EXPORT:ModPlug_GetLength") +#pragma comment(linker, "/EXPORT:ModPlug_Seek") +#pragma comment(linker, "/EXPORT:ModPlug_GetSettings") +#pragma comment(linker, "/EXPORT:ModPlug_SetSettings") +#pragma comment(linker, "/EXPORT:ModPlug_GetMasterVolume") +#pragma comment(linker, "/EXPORT:ModPlug_SetMasterVolume") +#pragma comment(linker, "/EXPORT:ModPlug_GetCurrentSpeed") +#pragma comment(linker, "/EXPORT:ModPlug_GetCurrentTempo") +#pragma comment(linker, "/EXPORT:ModPlug_GetCurrentOrder") +#pragma comment(linker, "/EXPORT:ModPlug_GetCurrentPattern") +#pragma comment(linker, "/EXPORT:ModPlug_GetCurrentRow") +#pragma comment(linker, "/EXPORT:ModPlug_GetPlayingChannels") +#pragma comment(linker, "/EXPORT:ModPlug_SeekOrder") +#pragma comment(linker, "/EXPORT:ModPlug_GetModuleType") +#pragma comment(linker, "/EXPORT:ModPlug_GetMessage") +#pragma comment(linker, "/EXPORT:ModPlug_NumInstruments") +#pragma comment(linker, "/EXPORT:ModPlug_NumSamples") +#pragma comment(linker, "/EXPORT:ModPlug_NumPatterns") +#pragma comment(linker, "/EXPORT:ModPlug_NumChannels") +#pragma comment(linker, "/EXPORT:ModPlug_SampleName") +#pragma comment(linker, "/EXPORT:ModPlug_InstrumentName") +#pragma comment(linker, "/EXPORT:ModPlug_GetPattern") +#pragma comment(linker, "/EXPORT:ModPlug_InitMixerCallback") +#pragma comment(linker, "/EXPORT:ModPlug_UnloadMixerCallback") +#pragma comment(linker, "/EXPORT:ModPlug_ExportS3M") +#pragma comment(linker, "/EXPORT:ModPlug_ExportXM") +#pragma comment(linker, "/EXPORT:ModPlug_ExportMOD") +#pragma comment(linker, "/EXPORT:ModPlug_ExportIT") +#endif /* _M_IX86 */ #endif /* _MSC_VER */ #endif /* NO_LIBMODPLUG */ Modified: trunk/OpenMPT/libopenmpt/libopenmpt_settings.cpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_settings.cpp 2013-07-01 13:56:47 UTC (rev 2472) +++ trunk/OpenMPT/libopenmpt/libopenmpt_settings.cpp 2013-07-01 17:38:20 UTC (rev 2473) @@ -41,7 +41,6 @@ read_setting( subkey, "MasterGain_milliBel", s.mastergain_millibel ); read_setting( subkey, "SeteroSeparation_Percent", s.stereoseparation ); read_setting( subkey, "RepeatCount", s.repeatcount ); - read_setting( subkey, "MixerChannels", s.maxmixchannels ); read_setting( subkey, "InterpolationFilterLength", s.interpolationfilterlength ); read_setting( subkey, "VolumeRampingIn_microseconds", s.volrampinus ); read_setting( subkey, "VolumeRampingOut_microseconds", s.volrampoutus ); @@ -53,7 +52,6 @@ write_setting( subkey, "MasterGain_milliBel", s.mastergain_millibel ); write_setting( subkey, "SeteroSeparation_Percent", s.stereoseparation ); write_setting( subkey, "RepeatCount", s.repeatcount ); - write_setting( subkey, "MixerChannels", s.maxmixchannels ); write_setting( subkey, "InterpolationFilterLength", s.interpolationfilterlength ); write_setting( subkey, "VolumeRampingIn_microseconds", s.volrampinus ); write_setting( subkey, "VolumeRampingOut_microseconds", s.volrampoutus ); Modified: trunk/OpenMPT/libopenmpt/libopenmpt_settings.h =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_settings.h 2013-07-01 13:56:47 UTC (rev 2472) +++ trunk/OpenMPT/libopenmpt/libopenmpt_settings.h 2013-07-01 17:38:20 UTC (rev 2473) @@ -37,7 +37,6 @@ int mastergain_millibel; int stereoseparation; int repeatcount; - int maxmixchannels; int interpolationfilterlength; int volrampinus; int volrampoutus; @@ -51,7 +50,6 @@ s.mastergain_millibel = 0; s.stereoseparation = 100; s.repeatcount = 0; - s.maxmixchannels = 256; s.interpolationfilterlength = 8; s.volrampinus = 363; s.volrampoutus = 952; Modified: trunk/OpenMPT/libopenmpt/libopenmpt_settings.vcxproj =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_settings.vcxproj 2013-07-01 13:56:47 UTC (rev 2472) +++ trunk/OpenMPT/libopenmpt/libopenmpt_settings.vcxproj 2013-07-01 17:38:20 UTC (rev 2473) @@ -23,7 +23,6 @@ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <ConfigurationType>DynamicLibrary</ConfigurationType> <UseDebugLibraries>false</UseDebugLibraries> - <WholeProgramOptimization>true</WholeProgramOptimization> <CharacterSet>NotSet</CharacterSet> </PropertyGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> Modified: trunk/OpenMPT/libopenmpt/libopenmpt_winamp.cpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_winamp.cpp 2013-07-01 13:56:47 UTC (rev 2472) +++ trunk/OpenMPT/libopenmpt/libopenmpt_winamp.cpp 2013-07-01 17:38:20 UTC (rev 2473) @@ -99,7 +99,6 @@ self->mod->set_render_param( openmpt::module::RENDER_MASTERGAIN_MILLIBEL, self->settings.mastergain_millibel ); self->mod->set_render_param( openmpt::module::RENDER_STEREOSEPARATION_PERCENT, self->settings.stereoseparation ); self->mod->set_render_param( openmpt::module::RENDER_REPEATCOUNT, self->settings.repeatcount ); - self->mod->set_render_param( openmpt::module::RENDER_MAXMIXCHANNELS, self->settings.maxmixchannels ); self->mod->set_render_param( openmpt::module::RENDER_INTERPOLATION_FILTER_LENGTH, self->settings.interpolationfilterlength ); self->mod->set_render_param( openmpt::module::RENDER_VOLUMERAMP_UP_MICROSECONDS, self->settings.volrampinus ); self->mod->set_render_param( openmpt::module::RENDER_VOLUMERAMP_DOWN_MICROSECONDS, self->settings.volrampoutus ); Modified: trunk/OpenMPT/libopenmpt/libopenmpt_xmplay.cpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_xmplay.cpp 2013-07-01 13:56:47 UTC (rev 2472) +++ trunk/OpenMPT/libopenmpt/libopenmpt_xmplay.cpp 2013-07-01 17:38:20 UTC (rev 2473) @@ -83,7 +83,6 @@ result[ "MasterGain_milliBel" ] = s.mastergain_millibel; result[ "SeteroSeparation_Percent" ] = s.stereoseparation; result[ "RepeatCount" ] = s.repeatcount; - result[ "MixerChannels" ] = s.maxmixchannels; result[ "InterpolationFilterLength" ] = s.interpolationfilterlength; result[ "VolumeRampingIn_microseconds" ] = s.volrampinus; result[ "VolumeRampingOut_microseconds" ] = s.volrampoutus; @@ -102,7 +101,6 @@ load_map_setting( map, "MasterGain_milliBel", s.mastergain_millibel ); load_map_setting( map, "SeteroSeparation_Percent", s.stereoseparation ); load_map_setting( map, "RepeatCount", s.repeatcount ); - load_map_setting( map, "MixerChannels", s.maxmixchannels ); load_map_setting( map, "InterpolationFilterLength", s.interpolationfilterlength ); load_map_setting( map, "VolumeRampingIn_microseconds", s.volrampinus ); load_map_setting( map, "VolumeRampingOut_microseconds", s.volrampoutus ); @@ -137,7 +135,6 @@ self->mod->set_render_param( openmpt::module::RENDER_MASTERGAIN_MILLIBEL, self->settings.mastergain_millibel ); self->mod->set_render_param( openmpt::module::RENDER_STEREOSEPARATION_PERCENT, self->settings.stereoseparation ); self->mod->set_render_param( openmpt::module::RENDER_REPEATCOUNT, self->settings.repeatcount ); - self->mod->set_render_param( openmpt::module::RENDER_MAXMIXCHANNELS, self->settings.maxmixchannels ); self->mod->set_render_param( openmpt::module::RENDER_INTERPOLATION_FILTER_LENGTH, self->settings.interpolationfilterlength ); self->mod->set_render_param( openmpt::module::RENDER_VOLUMERAMP_UP_MICROSECONDS, self->settings.volrampinus ); self->mod->set_render_param( openmpt::module::RENDER_VOLUMERAMP_DOWN_MICROSECONDS, self->settings.volrampoutus ); Modified: trunk/OpenMPT/openmpt123/openmpt123.cpp =================================================================== --- trunk/OpenMPT/openmpt123/openmpt123.cpp 2013-07-01 13:56:47 UTC (rev 2472) +++ trunk/OpenMPT/openmpt123/openmpt123.cpp 2013-07-01 17:38:20 UTC (rev 2473) @@ -69,7 +69,6 @@ s << "Repeat count: " << flags.repeatcount << std::endl; s << "Sample rate: " << flags.samplerate << std::endl; s << "Gain: " << flags.gain / 100.0 << std::endl; - s << "Quality: " << flags.quality << std::endl; s << "Filter taps: " << flags.filtertaps << std::endl; s << "Seek target: " << flags.seek_target << std::endl; s << "Float: " << flags.use_float << std::endl; @@ -196,7 +195,6 @@ std::clog << " --samplerate n Set samplerate to n Hz [default: " << commandlineflags().samplerate << "]" << std::endl; std::clog << " --gain n Set output gain to n dB [default: " << commandlineflags().gain / 100.0 << "]" << std::endl; std::clog << " --repeat n Repeat song n times (-1 means forever) [default: " << commandlineflags().repeatcount << "]" << std::endl; - std::clog << " --quality n Set rendering quality to n % [default: " << commandlineflags().quality << "]" << std::endl; std::clog << " --filtertaps n Set interpolation filter taps to n % [default: " << commandlineflags().filtertaps << "]" << std::endl; std::clog << " --seek n Seek to n seconds on start [default: " << commandlineflags().seek_target << "]" << std::endl; std::clog << " --volrampup n Use n microseconds volume ramping up [default: " << commandlineflags().rampupus << "]" << std::endl; @@ -378,7 +376,6 @@ openmpt::module mod( data_stream ); mod.set_render_param( openmpt::module::RENDER_REPEATCOUNT, flags.repeatcount ); - mod.set_render_param( openmpt::module::RENDER_QUALITY_PERCENT, flags.quality ); mod.set_render_param( openmpt::module::RENDER_INTERPOLATION_FILTER_LENGTH, flags.filtertaps ); mod.set_render_param( openmpt::module::RENDER_MASTERGAIN_MILLIBEL, flags.gain ); mod.set_render_param( openmpt::module::RENDER_VOLUMERAMP_UP_MICROSECONDS, flags.rampupus ); @@ -532,10 +529,6 @@ std::istringstream istr( nextarg ); istr >> flags.repeatcount; ++i; - } else if ( arg == "--quality" && nextarg != "" ) { - std::istringstream istr( nextarg ); - istr >> flags.quality; - ++i; } else if ( arg == "--filtertaps" && nextarg != "" ) { std::istringstream istr( nextarg ); istr >> flags.filtertaps; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2013-07-01 21:49:10
|
Revision: 2474 http://sourceforge.net/p/modplug/code/2474 Author: saga-games Date: 2013-07-01 21:49:02 +0000 (Mon, 01 Jul 2013) Log Message: ----------- [Imp] PTM: Directly support PTM's Nxx (reverse sample + offset) command without any workarounds Modified Paths: -------------- trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/EffectInfo.cpp trunk/OpenMPT/soundlib/Load_ptm.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/mod_specifications.cpp trunk/OpenMPT/soundlib/modcommand.cpp trunk/OpenMPT/soundlib/modcommand.h Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2013-07-01 17:38:20 UTC (rev 2473) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2013-07-01 21:49:02 UTC (rev 2474) @@ -124,7 +124,7 @@ MODCOLOR_GLOBALS, 0, MODCOLOR_PITCH, MODCOLOR_PANNING, MODCOLOR_PITCH, MODCOLOR_PANNING, 0, 0, 0, 0, 0, MODCOLOR_PITCH, - MODCOLOR_PITCH, + MODCOLOR_PITCH, 0, }; STATIC_ASSERT(CountOf(effectColors) == MAX_EFFECTS); Modified: trunk/OpenMPT/mptrack/EffectInfo.cpp =================================================================== --- trunk/OpenMPT/mptrack/EffectInfo.cpp 2013-07-01 17:38:20 UTC (rev 2473) +++ trunk/OpenMPT/mptrack/EffectInfo.cpp 2013-07-01 21:49:02 UTC (rev 2474) @@ -116,6 +116,7 @@ // -! NEW_FEATURE#0010 {CMD_NOTESLIDEUP, 0x00,0x00, 0, MOD_TYPE_NONE, "Note Slide Up"}, // .IMF effect {CMD_NOTESLIDEDOWN, 0x00,0x00, 0, MOD_TYPE_NONE, "Note Slide Down"}, // .IMF effect + {CMD_REVERSEOFFSET, 0x00,0x00, 0, MOD_TYPE_NONE, "Revert Sample + Offset"}, // .PTM effect }; Modified: trunk/OpenMPT/soundlib/Load_ptm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ptm.cpp 2013-07-01 17:38:20 UTC (rev 2473) +++ trunk/OpenMPT/soundlib/Load_ptm.cpp 2013-07-01 21:49:02 UTC (rev 2474) @@ -229,36 +229,18 @@ { m.command = file.ReadUint8(); m.param = file.ReadUint8(); + + const ModCommand::COMMAND effTrans[] = { CMD_GLOBALVOLUME, CMD_RETRIG, CMD_FINEVIBRATO, CMD_NONE, CMD_NONE, CMD_NONE, CMD_NONE, CMD_REVERSEOFFSET }; if(m.command < 0x10) { // Beware: Effect letters are as in MOD, but portamento and volume slides behave like in S3M (i.e. fine slides share the same effect letters) ConvertModCommand(m); + } else if(m.command < 0x10 + CountOf(effTrans)) + { + m.command = effTrans[m.command - 0x10]; } else { - switch(m.command) - { - case 0x10: - m.command = CMD_GLOBALVOLUME; - break; - case 0x11: - m.command = CMD_RETRIG; - break; - case 0x12: - m.command = CMD_FINEVIBRATO; - break; - case 0x17: - // Reverse sample + offset (start with offset 256 * xx bytes) -- is this an offset from the sample end...? - if(m.param) - { - m.volcmd = VOLCMD_OFFSET; - m.vol = m.param >> 3; - } - m.command = CMD_S3MCMDEX; - m.param = 0x9F; - break; - default: - m.command = CMD_NONE; - } + m.command = CMD_NONE; } } if(b & 0x80) Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-07-01 17:38:20 UTC (rev 2473) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-07-01 21:49:02 UTC (rev 2474) @@ -2623,6 +2623,17 @@ case CMD_NOTESLIDEDOWN: NoteSlide(pChn, param, false); break; + + // PTM Reverse sample + offset (executed on every tick) + case CMD_REVERSEOFFSET: + if(pChn->pModSample != nullptr) + { + pChn->dwFlags.set(CHN_PINGPONGFLAG); + pChn->dwFlags.reset(CHN_LOOP); + pChn->nPos = (pChn->pModSample->nLength - 1) - std::min<SmpLength>(SmpLength(pChn->rowCommand.param) << 8, pChn->pModSample->nLength); + pChn->nPosLo = 0; + } + break; } if(GetType() == MOD_TYPE_S3M && param != 0) Modified: trunk/OpenMPT/soundlib/mod_specifications.cpp =================================================================== --- trunk/OpenMPT/soundlib/mod_specifications.cpp 2013-07-01 17:38:20 UTC (rev 2473) +++ trunk/OpenMPT/soundlib/mod_specifications.cpp 2013-07-01 21:49:02 UTC (rev 2474) @@ -52,7 +52,7 @@ true, // Has song comments MAX_ENVPOINTS, // Envelope point count true, // Has envelope release node - " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\:#??", // Supported Effects + " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\:#???", // Supported Effects " vpcdabuhlrgfe?o", // Supported Volume Column commands true, // Has "+++" pattern true, // Has "---" pattern @@ -97,7 +97,7 @@ false, // No song comments 0, // No instrument envelopes false, // No envelope release node - " 0123456789ABCD?FF?E?????????????????", // Supported Effects + " 0123456789ABCD?FF?E??????????????????", // Supported Effects " ???????????????", // Supported Volume Column commands false, // Doesn't have "+++" pattern false, // Doesn't have "---" pattern @@ -140,7 +140,7 @@ false, // No song comments 12, // Envelope point count false, // No envelope release node - " 0123456789ABCDRFFTE???GHK??XPL??????", // Supported Effects + " 0123456789ABCDRFFTE???GHK??XPL???????", // Supported Effects " vpcdabuhlrg????", // Supported Volume Column commands false, // Doesn't have "+++" pattern false, // Doesn't have "---" pattern @@ -183,7 +183,7 @@ true, // Has song comments 12, // Envelope point count false, // No envelope release node - " 0123456789ABCDRFFTE???GHK?YXPLZ\\?#??", // Supported Effects + " 0123456789ABCDRFFTE???GHK?YXPLZ\\?#???", // Supported Effects " vpcdabuhlrgfe?o", // Supported Volume Column commands false, // Doesn't have "+++" pattern false, // Doesn't have "---" pattern @@ -225,7 +225,7 @@ false, // No song comments 0, // No instrument envelopes false, // No envelope release node - " JFEGHLKRXODB?CQATI?SMNVW?U??????????", // Supported Effects + " JFEGHLKRXODB?CQATI?SMNVW?U???????????", // Supported Effects " vp?????????????", // Supported Volume Column commands true, // Has "+++" pattern true, // Has "---" pattern @@ -268,7 +268,7 @@ false, // No song comments 0, // No instrument envelopes false, // No envelope release node - " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z?????", // Supported Effects + " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z??????", // Supported Effects " vp?????????????", // Supported Volume Column commands true, // Has "+++" pattern true, // Has "---" pattern @@ -310,7 +310,7 @@ true, // Has song comments 25, // Envelope point count false, // No envelope release node - " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z?????", // Supported Effects + " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z??????", // Supported Effects " vpcdab?h??gfe??", // Supported Volume Column commands true, // Has "+++" pattern true, // Has "--" pattern @@ -352,7 +352,7 @@ true, // Has song comments 25, // Envelope point count false, // No envelope release node - " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\?#??", // Supported Effects + " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\?#???", // Supported Effects " vpcdab?h??gfe?o", // Supported Volume Column commands true, // Has "+++" pattern true, // Has "---" pattern Modified: trunk/OpenMPT/soundlib/modcommand.cpp =================================================================== --- trunk/OpenMPT/soundlib/modcommand.cpp 2013-07-01 17:38:20 UTC (rev 2473) +++ trunk/OpenMPT/soundlib/modcommand.cpp 2013-07-01 21:49:02 UTC (rev 2474) @@ -773,6 +773,7 @@ CMD_VOLUMESLIDE, CMD_VIBRATOVOL, CMD_VOLUME, + CMD_REVERSEOFFSET, CMD_OFFSET, CMD_TREMOR, CMD_RETRIG, Modified: trunk/OpenMPT/soundlib/modcommand.h =================================================================== --- trunk/OpenMPT/soundlib/modcommand.h 2013-07-01 17:38:20 UTC (rev 2473) +++ trunk/OpenMPT/soundlib/modcommand.h 2013-07-01 21:49:02 UTC (rev 2474) @@ -91,7 +91,8 @@ CMD_XPARAM = 34, // -> CODE#0010 -> DESC="add extended parameter mechanism to pattern effects" -! NEW_FEATURE#0010 CMD_NOTESLIDEUP = 35, // IMF Gxy CMD_NOTESLIDEDOWN = 36, // IMF Hxy - MAX_EFFECTS = 37 + CMD_REVERSEOFFSET = 37, // PTM Revert sample + offset + MAX_EFFECTS = 38 }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2013-07-01 23:48:56
|
Revision: 2477 http://sourceforge.net/p/modplug/code/2477 Author: saga-games Date: 2013-07-01 23:48:48 +0000 (Mon, 01 Jul 2013) Log Message: ----------- [Imp] PTM: Semi-working note slides (seems to be slightly buggy in PolyTracker, but luckily noone seems to have used them for precise slides anyway) Modified Paths: -------------- trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/EffectInfo.cpp trunk/OpenMPT/soundlib/Load_ptm.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/mod_specifications.cpp trunk/OpenMPT/soundlib/modcommand.cpp trunk/OpenMPT/soundlib/modcommand.h Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2013-07-01 23:35:46 UTC (rev 2476) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2013-07-01 23:48:48 UTC (rev 2477) @@ -124,7 +124,7 @@ MODCOLOR_GLOBALS, 0, MODCOLOR_PITCH, MODCOLOR_PANNING, MODCOLOR_PITCH, MODCOLOR_PANNING, 0, 0, 0, 0, 0, MODCOLOR_PITCH, - MODCOLOR_PITCH, 0, + MODCOLOR_PITCH, MODCOLOR_PITCH, MODCOLOR_PITCH, 0, }; STATIC_ASSERT(CountOf(effectColors) == MAX_EFFECTS); Modified: trunk/OpenMPT/mptrack/EffectInfo.cpp =================================================================== --- trunk/OpenMPT/mptrack/EffectInfo.cpp 2013-07-01 23:35:46 UTC (rev 2476) +++ trunk/OpenMPT/mptrack/EffectInfo.cpp 2013-07-01 23:48:48 UTC (rev 2477) @@ -114,9 +114,11 @@ // -> DESC="add extended parameter mechanism to pattern effects" {CMD_XPARAM, 0x00,0x00, 0, MOD_TYPE_XMITMPT, "Parameter Extension"}, // -! NEW_FEATURE#0010 - {CMD_NOTESLIDEUP, 0x00,0x00, 0, MOD_TYPE_NONE, "Note Slide Up"}, // .IMF effect - {CMD_NOTESLIDEDOWN, 0x00,0x00, 0, MOD_TYPE_NONE, "Note Slide Down"}, // .IMF effect - {CMD_REVERSEOFFSET, 0x00,0x00, 0, MOD_TYPE_NONE, "Revert Sample + Offset"}, // .PTM effect + {CMD_NOTESLIDEUP, 0x00,0x00, 0, MOD_TYPE_NONE, "Note Slide Up"}, // IMF / PTM effect + {CMD_NOTESLIDEDOWN, 0x00,0x00, 0, MOD_TYPE_NONE, "Note Slide Down"}, // IMF / PTM effect + {CMD_NOTESLIDEUPRETRIG, 0x00,0x00, 0, MOD_TYPE_NONE, "Note Slide Up + Retrigger Note"}, // PTM effect + {CMD_NOTESLIDEDOWNRETRIG, 0x00,0x00, 0, MOD_TYPE_NONE, "Note Slide Down+ Retrigger Note"}, // PTM effect + {CMD_REVERSEOFFSET, 0x00,0x00, 0, MOD_TYPE_NONE, "Revert Sample + Offset"}, // PTM effect }; Modified: trunk/OpenMPT/soundlib/Load_ptm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ptm.cpp 2013-07-01 23:35:46 UTC (rev 2476) +++ trunk/OpenMPT/soundlib/Load_ptm.cpp 2013-07-01 23:48:48 UTC (rev 2477) @@ -179,7 +179,7 @@ mpt::String::Read<mpt::String::maybeNullTerminated>(m_szNames[smp + 1], sampleHeader.samplename); SampleIO sampleIO = sampleHeader.ConvertToMPT(sample); - if((loadFlags & loadSampleData) && sample.nLength && sampleHeader.dataOffset && file.Seek(sampleHeader.dataOffset)) + if((loadFlags & loadSampleData) && sample.nLength && file.Seek(sampleHeader.dataOffset)) { sampleIO.ReadSample(sample, file); } @@ -230,7 +230,7 @@ m.command = file.ReadUint8(); m.param = file.ReadUint8(); - const ModCommand::COMMAND effTrans[] = { CMD_GLOBALVOLUME, CMD_RETRIG, CMD_FINEVIBRATO, CMD_NONE, CMD_NONE, CMD_NONE, CMD_NONE, CMD_REVERSEOFFSET }; + const ModCommand::COMMAND effTrans[] = { CMD_GLOBALVOLUME, CMD_RETRIG, CMD_FINEVIBRATO, CMD_NOTESLIDEUP, CMD_NOTESLIDEDOWN, CMD_NOTESLIDEUPRETRIG, CMD_NOTESLIDEDOWNRETRIG, CMD_REVERSEOFFSET }; if(m.command < 0x10) { // Beware: Effect letters are as in MOD, but portamento and volume slides behave like in S3M (i.e. fine slides share the same effect letters) Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-07-01 23:35:46 UTC (rev 2476) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-07-01 23:48:48 UTC (rev 2477) @@ -2615,13 +2615,14 @@ } break; - // IMF Commands + // IMF / PTM Note Slides case CMD_NOTESLIDEUP: - NoteSlide(pChn, param, true); - break; - case CMD_NOTESLIDEDOWN: - NoteSlide(pChn, param, false); + case CMD_NOTESLIDEUPRETRIG: + case CMD_NOTESLIDEDOWNRETRIG: + // Note that this command seems to be a bit buggy in Polytracker... Luckily, no tune seems to seriously use this + // (Vic uses it e.g. in Spaceman or Perfect Reason to slide effect samples, noone will notice the difference :) + NoteSlide(pChn, param, cmd == CMD_NOTESLIDEUP || cmd == CMD_NOTESLIDEUPRETRIG, cmd == CMD_NOTESLIDEUPRETRIG || cmd == CMD_NOTESLIDEDOWNRETRIG); break; // PTM Reverse sample + offset (executed on every tick) @@ -2631,7 +2632,7 @@ pChn->dwFlags.set(CHN_PINGPONGFLAG); pChn->dwFlags.reset(CHN_LOOP); pChn->nLength = pChn->pModSample->nLength; // If there was a loop, extend sample to whole length. - pChn->nPos = (pChn->nLength - 1) - std::min<SmpLength>(SmpLength(pChn->rowCommand.param) << 8, pChn->nLength - 1); + pChn->nPos = (pChn->nLength - 1) - std::min<SmpLength>(SmpLength(param) << 8, pChn->nLength - 1); pChn->nPosLo = 0; } break; @@ -3007,8 +3008,8 @@ // Implemented for IMF compatibility, can't actually save this in any formats // sign should be 1 (up) or -1 (down) -void CSoundFile::NoteSlide(ModChannel *pChn, UINT param, bool slideUp) -//-------------------------------------------------------------------- +void CSoundFile::NoteSlide(ModChannel *pChn, UINT param, bool slideUp, bool retrig) +//--------------------------------------------------------------------------------- { uint8 x, y; if(m_SongFlags[SONG_FIRSTTICK]) @@ -3028,6 +3029,11 @@ // update it pChn->nPeriod = GetPeriodFromNote ((slideUp ? 1 : -1) * pChn->nNoteSlideStep + GetNoteFromPeriod(pChn->nPeriod), 8363, 0); + + if(retrig) + { + pChn->nPos = pChn->nPosLo = 0; + } } } } Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2013-07-01 23:35:46 UTC (rev 2476) +++ trunk/OpenMPT/soundlib/Sndfile.h 2013-07-01 23:48:48 UTC (rev 2477) @@ -725,7 +725,7 @@ void FinePortamentoDown(ModChannel *pChn, UINT param); void ExtraFinePortamentoUp(ModChannel *pChn, UINT param); void ExtraFinePortamentoDown(ModChannel *pChn, UINT param); - void NoteSlide(ModChannel *pChn, UINT param, bool slideUp); + void NoteSlide(ModChannel *pChn, UINT param, bool slideUp, bool retrig); void TonePortamento(ModChannel *pChn, UINT param); void Vibrato(ModChannel *pChn, UINT param); void FineVibrato(ModChannel *pChn, UINT param); Modified: trunk/OpenMPT/soundlib/mod_specifications.cpp =================================================================== --- trunk/OpenMPT/soundlib/mod_specifications.cpp 2013-07-01 23:35:46 UTC (rev 2476) +++ trunk/OpenMPT/soundlib/mod_specifications.cpp 2013-07-01 23:48:48 UTC (rev 2477) @@ -52,7 +52,7 @@ true, // Has song comments MAX_ENVPOINTS, // Envelope point count true, // Has envelope release node - " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\:#???", // Supported Effects + " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\:#?????", // Supported Effects " vpcdabuhlrgfe?o", // Supported Volume Column commands true, // Has "+++" pattern true, // Has "---" pattern @@ -97,7 +97,7 @@ false, // No song comments 0, // No instrument envelopes false, // No envelope release node - " 0123456789ABCD?FF?E??????????????????", // Supported Effects + " 0123456789ABCD?FF?E????????????????????", // Supported Effects " ???????????????", // Supported Volume Column commands false, // Doesn't have "+++" pattern false, // Doesn't have "---" pattern @@ -140,7 +140,7 @@ false, // No song comments 12, // Envelope point count false, // No envelope release node - " 0123456789ABCDRFFTE???GHK??XPL???????", // Supported Effects + " 0123456789ABCDRFFTE???GHK??XPL?????????", // Supported Effects " vpcdabuhlrg????", // Supported Volume Column commands false, // Doesn't have "+++" pattern false, // Doesn't have "---" pattern @@ -183,7 +183,7 @@ true, // Has song comments 12, // Envelope point count false, // No envelope release node - " 0123456789ABCDRFFTE???GHK?YXPLZ\\?#???", // Supported Effects + " 0123456789ABCDRFFTE???GHK?YXPLZ\\?#?????", // Supported Effects " vpcdabuhlrgfe?o", // Supported Volume Column commands false, // Doesn't have "+++" pattern false, // Doesn't have "---" pattern @@ -225,7 +225,7 @@ false, // No song comments 0, // No instrument envelopes false, // No envelope release node - " JFEGHLKRXODB?CQATI?SMNVW?U???????????", // Supported Effects + " JFEGHLKRXODB?CQATI?SMNVW?U?????????????", // Supported Effects " vp?????????????", // Supported Volume Column commands true, // Has "+++" pattern true, // Has "---" pattern @@ -268,7 +268,7 @@ false, // No song comments 0, // No instrument envelopes false, // No envelope release node - " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z??????", // Supported Effects + " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z????????", // Supported Effects " vp?????????????", // Supported Volume Column commands true, // Has "+++" pattern true, // Has "---" pattern @@ -310,7 +310,7 @@ true, // Has song comments 25, // Envelope point count false, // No envelope release node - " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z??????", // Supported Effects + " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z????????", // Supported Effects " vpcdab?h??gfe??", // Supported Volume Column commands true, // Has "+++" pattern true, // Has "--" pattern @@ -352,7 +352,7 @@ true, // Has song comments 25, // Envelope point count false, // No envelope release node - " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\?#???", // Supported Effects + " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\?#?????", // Supported Effects " vpcdab?h??gfe?o", // Supported Volume Column commands true, // Has "+++" pattern true, // Has "---" pattern Modified: trunk/OpenMPT/soundlib/modcommand.cpp =================================================================== --- trunk/OpenMPT/soundlib/modcommand.cpp 2013-07-01 23:35:46 UTC (rev 2476) +++ trunk/OpenMPT/soundlib/modcommand.cpp 2013-07-01 23:48:48 UTC (rev 2477) @@ -766,7 +766,9 @@ CMD_SMOOTHMIDI, CMD_PANNINGSLIDE, CMD_PANNING8, + CMD_NOTESLIDEUPRETRIG, CMD_NOTESLIDEUP, + CMD_NOTESLIDEDOWNRETRIG, CMD_NOTESLIDEDOWN, CMD_PORTAMENTOUP, CMD_PORTAMENTODOWN, Modified: trunk/OpenMPT/soundlib/modcommand.h =================================================================== --- trunk/OpenMPT/soundlib/modcommand.h 2013-07-01 23:35:46 UTC (rev 2476) +++ trunk/OpenMPT/soundlib/modcommand.h 2013-07-01 23:48:48 UTC (rev 2477) @@ -89,10 +89,12 @@ CMD_SMOOTHMIDI = 32, //rewbs.smoothVST CMD_DELAYCUT = 33, CMD_XPARAM = 34, // -> CODE#0010 -> DESC="add extended parameter mechanism to pattern effects" -! NEW_FEATURE#0010 - CMD_NOTESLIDEUP = 35, // IMF Gxy - CMD_NOTESLIDEDOWN = 36, // IMF Hxy - CMD_REVERSEOFFSET = 37, // PTM Revert sample + offset - MAX_EFFECTS = 38 + CMD_NOTESLIDEUP = 35, // IMF Gxy / PTM Jxy (Slide y notes up every ticks) + CMD_NOTESLIDEDOWN = 36, // IMF Hxy / PTM Kxy (Slide y notes down every ticks) + CMD_NOTESLIDEUPRETRIG = 37, // PTM Lxy (Slide y notes up every ticks + retrigger note) + CMD_NOTESLIDEDOWNRETRIG = 38, // PTM Mxy (Slide y notes down every ticks + retrigger note) + CMD_REVERSEOFFSET = 39, // PTM Nxx Revert sample + offset + MAX_EFFECTS = 40 }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-07-03 00:32:14
|
Revision: 2481 http://sourceforge.net/p/modplug/code/2481 Author: manxorist Date: 2013-07-03 00:32:07 +0000 (Wed, 03 Jul 2013) Log Message: ----------- [Ref] libopenmpt: Simplify openmpt::exception. Modified Paths: -------------- trunk/OpenMPT/libopenmpt/libopenmpt.hpp trunk/OpenMPT/libopenmpt/libopenmpt_c.cpp trunk/OpenMPT/libopenmpt/libopenmpt_cxx.cpp trunk/OpenMPT/libopenmpt/libopenmpt_impl.cpp trunk/OpenMPT/libopenmpt/libopenmpt_impl.hpp trunk/OpenMPT/libopenmpt/libopenmpt_version.cpp trunk/OpenMPT/openmpt123/openmpt123.hpp Modified: trunk/OpenMPT/libopenmpt/libopenmpt.hpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt.hpp 2013-07-02 23:46:46 UTC (rev 2480) +++ trunk/OpenMPT/libopenmpt/libopenmpt.hpp 2013-07-03 00:32:07 UTC (rev 2481) @@ -12,10 +12,10 @@ #include "libopenmpt_config.h" -#include <exception> #include <iostream> #include <istream> #include <ostream> +#include <stdexcept> #include <string> #include <vector> @@ -23,12 +23,9 @@ namespace openmpt { -class LIBOPENMPT_CXX_API exception : public std::exception { +class LIBOPENMPT_CXX_API exception : public std::runtime_error { public: - exception() throw(); - virtual ~exception() throw(); -public: - virtual const char * what() const throw(); + exception( const std::string & text ); }; // class exception LIBOPENMPT_CXX_API std::uint32_t get_library_version(); Modified: trunk/OpenMPT/libopenmpt/libopenmpt_c.cpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_c.cpp 2013-07-02 23:46:46 UTC (rev 2480) +++ trunk/OpenMPT/libopenmpt/libopenmpt_c.cpp 2013-07-03 00:32:07 UTC (rev 2481) @@ -182,7 +182,7 @@ #define OPENMPT_INTERFACE_CHECK_SOUNDFILE( mod ) \ do { \ if ( !(mod) ) { \ - throw openmpt::exception_message("module * not valid"); \ + throw openmpt::exception("module * not valid"); \ } \ } while(0) \ /**/ @@ -190,7 +190,7 @@ #define OPENMPT_INTERFACE_CHECK_POINTER( value ) \ do { \ if ( !(value) ) { \ - throw openmpt::exception_message("null pointer"); \ + throw openmpt::exception("null pointer"); \ } \ } while(0) \ /**/ Modified: trunk/OpenMPT/libopenmpt/libopenmpt_cxx.cpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_cxx.cpp 2013-07-02 23:46:46 UTC (rev 2480) +++ trunk/OpenMPT/libopenmpt/libopenmpt_cxx.cpp 2013-07-03 00:32:07 UTC (rev 2481) @@ -21,18 +21,10 @@ namespace openmpt { -exception::exception() throw() { +exception::exception( const std::string & text ) : std::runtime_error( text ) { return; } -exception::~exception() throw() { - return; -} - -const char * exception::what() const throw() { - return ""; -} - std::uint32_t get_library_version() { return openmpt::version::get_library_version(); } Modified: trunk/OpenMPT/libopenmpt/libopenmpt_impl.cpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_impl.cpp 2013-07-02 23:46:46 UTC (rev 2480) +++ trunk/OpenMPT/libopenmpt/libopenmpt_impl.cpp 2013-07-03 00:32:07 UTC (rev 2481) @@ -27,16 +27,6 @@ namespace openmpt { -exception_message::exception_message( const char * text_ ) throw() : text(text_) { - return; -} -exception_message::~exception_message() throw() { - return; -} -const char * exception_message::what() const throw() { - return text; -} - log_interface::log_interface() { return; } @@ -114,7 +104,7 @@ } else if ( length >= 1 ) { return SRCMODE_NEAREST; } else { - throw openmpt::exception_message("negative filter length"); + throw openmpt::exception("negative filter length"); return SRCMODE_POLYPHASE; } } @@ -134,7 +124,7 @@ case SRCMODE_DEFAULT: return 8; default: - throw openmpt::exception_message("unknown interpolation filter length set internally"); + throw openmpt::exception("unknown interpolation filter length set internally"); break; } } @@ -168,7 +158,7 @@ } void module_impl::load( CSoundFile & sndFile, const FileReader & file ) { if ( !sndFile.Create( file, CSoundFile::loadCompleteModule ) ) { - throw openmpt::exception_message("error loading file"); + throw openmpt::exception("error loading file"); } } void module_impl::load( const FileReader & file ) { @@ -316,7 +306,7 @@ case module::RENDER_VOLUMERAMP_DOWN_MICROSECONDS: { return m_sndFile->m_MixerSettings.GetVolumeRampDownMicroseconds(); } break; - default: throw openmpt::exception_message("unknown render param"); break; + default: throw openmpt::exception("unknown render param"); break; } return 0; } @@ -362,13 +352,13 @@ m_sndFile->SetMixerSettings( newsettings ); } } break; - default: throw openmpt::exception_message("unknown render param"); break; + default: throw openmpt::exception("unknown render param"); break; } } std::size_t module_impl::read( std::int32_t samplerate, std::size_t count, std::int16_t * mono ) { if ( !mono ) { - throw openmpt::exception_message("null pointer"); + throw openmpt::exception("null pointer"); } apply_mixer_settings( samplerate, 1, false ); count = read_wrapper( count, mono, 0, 0, 0 ); @@ -377,7 +367,7 @@ } std::size_t module_impl::read( std::int32_t samplerate, std::size_t count, std::int16_t * left, std::int16_t * right ) { if ( !left || !right ) { - throw openmpt::exception_message("null pointer"); + throw openmpt::exception("null pointer"); } apply_mixer_settings( samplerate, 2, false ); count = read_wrapper( count, left, right, 0, 0 ); @@ -386,7 +376,7 @@ } std::size_t module_impl::read( std::int32_t samplerate, std::size_t count, std::int16_t * left, std::int16_t * right, std::int16_t * rear_left, std::int16_t * rear_right ) { if ( !left || !right || !rear_left || !rear_right ) { - throw openmpt::exception_message("null pointer"); + throw openmpt::exception("null pointer"); } apply_mixer_settings( samplerate, 4, false ); count = read_wrapper( count, left, right, rear_left, rear_right ); @@ -395,7 +385,7 @@ } std::size_t module_impl::read( std::int32_t samplerate, std::size_t count, float * mono ) { if ( !mono ) { - throw openmpt::exception_message("null pointer"); + throw openmpt::exception("null pointer"); } apply_mixer_settings( samplerate, 1, true ); count = read_wrapper( count, mono, 0, 0, 0 ); @@ -404,7 +394,7 @@ } std::size_t module_impl::read( std::int32_t samplerate, std::size_t count, float * left, float * right ) { if ( !left || !right ) { - throw openmpt::exception_message("null pointer"); + throw openmpt::exception("null pointer"); } apply_mixer_settings( samplerate, 2, true ); count = read_wrapper( count, left, right, 0, 0 ); @@ -413,7 +403,7 @@ } std::size_t module_impl::read( std::int32_t samplerate, std::size_t count, float * left, float * right, float * rear_left, float * rear_right ) { if ( !left || !right || !rear_left || !rear_right ) { - throw openmpt::exception_message("null pointer"); + throw openmpt::exception("null pointer"); } apply_mixer_settings( samplerate, 4, true ); count = read_wrapper( count, left, right, rear_left, rear_right ); @@ -646,39 +636,45 @@ } std::string module_impl::ctl_get_string( const std::string & ctl ) const { if ( ctl == "" ) { - throw openmpt::exception_message("unknown ctl"); + throw openmpt::exception("unknown ctl"); } - throw openmpt::exception_message("unknown ctl"); + throw openmpt::exception("unknown ctl"); } double module_impl::ctl_get_double( const std::string & ctl ) const { if ( ctl == "" ) { - throw openmpt::exception_message("unknown ctl"); + throw openmpt::exception("unknown ctl"); } - throw openmpt::exception_message("unknown ctl"); + throw openmpt::exception("unknown ctl"); } std::int64_t module_impl::ctl_get_int64( const std::string & ctl ) const { if ( ctl == "" ) { - throw openmpt::exception_message("unknown ctl"); + throw openmpt::exception("unknown ctl"); } - throw openmpt::exception_message("unknown ctl"); + throw openmpt::exception("unknown ctl"); } void module_impl::ctl_set( const std::string & ctl, const std::string & value ) { if ( ctl == "" ) { - throw openmpt::exception_message("unknown ctl"); + throw openmpt::exception("unknown ctl: " + ctl + " := " + value); } - throw openmpt::exception_message("unknown ctl"); + throw openmpt::exception("unknown ctl: " + ctl + " := " + value); } void module_impl::ctl_set( const std::string & ctl, double value ) { + std::ostringstream str; + str << value; + std::string strval = str.str(); if ( ctl == "" ) { - throw openmpt::exception_message("unknown ctl"); + throw openmpt::exception("unknown ctl: " + ctl + " := " + strval); } - throw openmpt::exception_message("unknown ctl"); + throw openmpt::exception("unknown ctl: " + ctl + " := " + strval); } void module_impl::ctl_set( const std::string & ctl, std::int64_t value ) { + std::ostringstream str; + str << value; + std::string strval = str.str(); if ( ctl == "" ) { - throw openmpt::exception_message("unknown ctl"); + throw openmpt::exception("unknown ctl: " + ctl + " := " + strval); } - throw openmpt::exception_message("unknown ctl"); + throw openmpt::exception("unknown ctl: " + ctl + " := " + strval); } } // namespace openmpt Modified: trunk/OpenMPT/libopenmpt/libopenmpt_impl.hpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_impl.hpp 2013-07-02 23:46:46 UTC (rev 2480) +++ trunk/OpenMPT/libopenmpt/libopenmpt_impl.hpp 2013-07-03 00:32:07 UTC (rev 2481) @@ -31,17 +31,6 @@ } // namespace version -// has to be exported for type_info lookup to work -class LIBOPENMPT_CXX_API exception_message : public exception { -public: - exception_message( const char * text_ ) throw(); - virtual ~exception_message() throw(); -public: - virtual const char * what() const throw(); -private: - const char * text; -}; // class exception_message - class log_interface { protected: log_interface(); Modified: trunk/OpenMPT/libopenmpt/libopenmpt_version.cpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_version.cpp 2013-07-02 23:46:46 UTC (rev 2480) +++ trunk/OpenMPT/libopenmpt/libopenmpt_version.cpp 2013-07-03 00:32:07 UTC (rev 2481) @@ -110,11 +110,7 @@ // has to be exported for type_info lookup to work class LIBOPENMPT_CXX_API version_mismatch : public openmpt::exception { public: - version_mismatch() throw() { } - virtual ~version_mismatch() throw() { } - virtual const char * what() const throw() { - return "API and header version mismatch"; - } + version_mismatch() : openmpt::exception("API and header version mismatch") { } }; // class version_mismatch void version_compatible_or_throw( std::int32_t api_version ) { Modified: trunk/OpenMPT/openmpt123/openmpt123.hpp =================================================================== --- trunk/OpenMPT/openmpt123/openmpt123.hpp 2013-07-02 23:46:46 UTC (rev 2480) +++ trunk/OpenMPT/openmpt123/openmpt123.hpp 2013-07-03 00:32:07 UTC (rev 2481) @@ -15,11 +15,7 @@ namespace openmpt123 { struct exception : public openmpt::exception { - exception( const char * text_ ) throw() : text(text_) { } - virtual const char * what() const throw() { - return text; - } - const char * text; + exception( const char * text ) : openmpt::exception(text) { } }; struct show_help_exception { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2013-07-03 19:56:52
|
Revision: 2483 http://sourceforge.net/p/modplug/code/2483 Author: saga-games Date: 2013-07-03 19:56:44 +0000 (Wed, 03 Jul 2013) Log Message: ----------- [Imp] Import PTM as IT instead of S3M, so that effect memory works more reliably. [Imp] Handle PTM command 8xx (panning) more correctly [Imp] Pattern Editor: Also show name of unsupported commands in status text [Ref] Unify CSoundFile::GetBestSaveFormat and format conversion in CModDoc::OnOpenDocument [Mod] OpenMPT: Version is now 1.22.03.09 Modified Paths: -------------- trunk/OpenMPT/common/versionNumber.h trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Moptions.cpp trunk/OpenMPT/soundlib/Load_ptm.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp Modified: trunk/OpenMPT/common/versionNumber.h =================================================================== --- trunk/OpenMPT/common/versionNumber.h 2013-07-03 18:40:57 UTC (rev 2482) +++ trunk/OpenMPT/common/versionNumber.h 2013-07-03 19:56:44 UTC (rev 2483) @@ -17,7 +17,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 22 #define VER_MINOR 03 -#define VER_MINORMINOR 08 +#define VER_MINORMINOR 09 //Version string. For example "1.17.02.28" #define MPT_VERSION_STR VER_STRINGIZE(VER_MAJORMAJOR)"."VER_STRINGIZE(VER_MAJOR)"."VER_STRINGIZE(VER_MINOR)"."VER_STRINGIZE(VER_MINORMINOR) Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2013-07-03 18:40:57 UTC (rev 2482) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2013-07-03 19:56:44 UTC (rev 2483) @@ -1648,7 +1648,7 @@ } else { // "normal" volume command - if (!effectInfo.GetVolCmdInfo(effectInfo.GetIndexFromVolCmd(m->volcmd), s)) s[0] = 0; + effectInfo.GetVolCmdInfo(effectInfo.GetIndexFromVolCmd(m->volcmd), s); } break; @@ -1657,7 +1657,7 @@ // display effect command if(!m->IsPcNote()) { - if (!effectInfo.GetEffectName(s, m->command, m->param, false, nChn)) s[0] = 0; + effectInfo.GetEffectName(s, m->command, m->param, false, nChn); } break; } Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2013-07-03 18:40:57 UTC (rev 2482) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2013-07-03 19:56:44 UTC (rev 2483) @@ -379,42 +379,8 @@ case MOD_TYPE_MPT: bModified = FALSE; break; - case MOD_TYPE_AMF0: - case MOD_TYPE_DIGI: - m_SndFile.ChangeModTypeTo(MOD_TYPE_MOD); - break; - case MOD_TYPE_MED: - m_SndFile.ChangeModTypeTo(MOD_TYPE_XM); - if ((m_SndFile.m_nDefaultTempo == 125) && (m_SndFile.m_nDefaultSpeed == 6) && (!m_SndFile.m_nInstruments)) - { - m_SndFile.m_nType = MOD_TYPE_MOD; - for (UINT i=0; i<m_SndFile.Patterns.Size(); i++) - if ((m_SndFile.Patterns[i]) && (m_SndFile.Patterns[i].GetNumRows() != 64)) - m_SndFile.m_nType = MOD_TYPE_XM; - } - break; - case MOD_TYPE_669: - case MOD_TYPE_FAR: - case MOD_TYPE_PTM: - case MOD_TYPE_STM: - case MOD_TYPE_DSM: - case MOD_TYPE_AMF: - case MOD_TYPE_MTM: - m_SndFile.ChangeModTypeTo(MOD_TYPE_S3M); - break; - case MOD_TYPE_AMS: - case MOD_TYPE_AMS2: - case MOD_TYPE_DMF: - case MOD_TYPE_DBM: - case MOD_TYPE_IMF: - case MOD_TYPE_PSM: - case MOD_TYPE_J2B: - case MOD_TYPE_ULT: - case MOD_TYPE_OKT: - case MOD_TYPE_MT2: - case MOD_TYPE_MDL: default: - m_SndFile.ChangeModTypeTo(MOD_TYPE_IT); + m_SndFile.ChangeModTypeTo(m_SndFile.GetBestSaveFormat()); } // -> CODE#0015 @@ -2286,16 +2252,16 @@ switch(m_SndFile.m_nTempoMode) { - case tempo_mode_alternative: + case tempo_mode_alternative: Message.Format("Using alternative tempo interpretation.\n\nAssuming:\n. %d ticks per second\n. %d ticks per row\n. %d rows per beat\nthe tempo is approximately: %.8g BPM", m_SndFile.m_nMusicTempo, m_SndFile.m_nMusicSpeed, m_SndFile.m_nCurrentRowsPerBeat, bpm); break; - case tempo_mode_modern: + case tempo_mode_modern: Message.Format("Using modern tempo interpretation.\n\nThe tempo is: %.8g BPM", bpm); break; - case tempo_mode_classic: + case tempo_mode_classic: default: Message.Format("Using standard tempo interpretation.\n\nAssuming:\n. A mod tempo (tick duration factor) of %d\n. %d ticks per row\n. %d rows per beat\nthe tempo is approximately: %.8g BPM", m_SndFile.m_nMusicTempo, m_SndFile.m_nMusicSpeed, m_SndFile.m_nCurrentRowsPerBeat, bpm); Modified: trunk/OpenMPT/mptrack/Moptions.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moptions.cpp 2013-07-03 18:40:57 UTC (rev 2482) +++ trunk/OpenMPT/mptrack/Moptions.cpp 2013-07-03 19:56:44 UTC (rev 2483) @@ -553,7 +553,7 @@ {PATTERN_FLATBUTTONS, "Flat Buttons", "Use flat buttons in toolbars"}, {PATTERN_SINGLEEXPAND, "Single click to expand tree", "Single-clicking in the left tree view will expand a node."}, {PATTERN_MUTECHNMODE, "Ignored muted channels", "Notes will not be played on muted channels (unmuting will only start on a new note)."}, - {PATTERN_NOEXTRALOUD, "No loud sample preview", "Disable loud playback of samples in the sample/instrument editor. Sample volume depends on the sample volume slider on the general tab when activated (if disabled, a sample volume of 256 is used)."}, + {PATTERN_NOEXTRALOUD, "No loud sample preview", "Disable loud playback of samples in the sample/instrument editor. Sample volume depends on the sample volume slider on the general tab when activated (if disabled, samples are previewed at 0 dB)."}, {PATTERN_SHOWPREVIOUS, "Show Prev/Next patterns", "Displays grayed-out version of the previous/next patterns in the pattern editor. Does not work if \"always center active row\" is disabled."}, {PATTERN_CONTSCROLL, "Continuous scroll", "Jumps to the next pattern when moving past the end of a pattern"}, {PATTERN_KBDNOTEOFF, "Record note off", "Record note off when a key is released on the PC keyboard."}, @@ -564,7 +564,7 @@ {PATTERN_AUTODELAY, "Automatic delay commands", "Automatically insert appropriate note-delay commands when recording notes during live playback."}, {PATTERN_NOTEFADE, "Note fade on key up", "Enable to fade / stop notes on key up in pattern tab."}, {PATTERN_OVERFLOWPASTE, "Overflow paste mode", "Wrap pasted pattern data into next pattern. This is useful for creating echo channels."}, - {PATTERN_RESETCHANNELS, "Reset channels on loop", "If enabled, channels will be reset to their initial state when song looping is enabled.\nNote: This does not affect manual song loops (i.e. triggered by pattern commands) and is recommended to be enabled."}, + {PATTERN_RESETCHANNELS, "Reset channels on loop", "If enabled, channels will be reset to their initial state when song looping is enabled.\nNote: This does not affect manual song loops (i.e. triggered by pattern commands) and is not recommended to be enabled."}, {PATTERN_LIVEUPDATETREE,"Update sample status in tree", "If enabled, active samples and instruments will be indicated by a different icon in the treeview."}, {PATTERN_NOCLOSEDIALOG, "Disable modern close dialog", "When closing the main window, a confirmation window is shown for every unsaved document instead of one single window with a list of unsaved documents."}, {PATTERN_DBLCLICKSELECT, "Double-click to select channel", "Instead of showing the note properties, double-clicking a pattern cell selects the whole channel."}, Modified: trunk/OpenMPT/soundlib/Load_ptm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ptm.cpp 2013-07-03 18:40:57 UTC (rev 2482) +++ trunk/OpenMPT/soundlib/Load_ptm.cpp 2013-07-03 19:56:44 UTC (rev 2483) @@ -106,6 +106,8 @@ mptSmp.nLength = length; mptSmp.nLoopStart = loopStart; mptSmp.nLoopEnd = loopEnd; + if(mptSmp.nLoopEnd > mptSmp.nLoopStart) + mptSmp.nLoopEnd--; if(flags & smpLoop) mptSmp.uFlags.set(CHN_LOOP); if(flags & smpPingPong) mptSmp.uFlags.set(CHN_PINGPONGLOOP); @@ -157,6 +159,8 @@ InitializeGlobals(); madeWithTracker = mpt::String::Format("PolyTracker %d.%02x", fileHeader.versionHi, fileHeader.versionLo); m_nType = MOD_TYPE_PTM; + SetModFlag(MSF_COMPATIBLE_PLAY, true); + m_SongFlags = SONG_ITCOMPATGXX | SONG_ITOLDEFFECTS; m_nChannels = fileHeader.numChannels; m_nSamples = std::min<SAMPLEINDEX>(fileHeader.numSamples, MAX_SAMPLES - 1); Order.ReadFromArray(fileHeader.orders, fileHeader.numOrders); @@ -242,6 +246,26 @@ { m.command = CMD_NONE; } + switch(m.command) + { + case CMD_PANNING8: + // My observations of this weird command... + // 800...80F and 880...88F are panned dead centre. + // 810...87F and 890...8FF pan from hard left to hard right. + // A default center panning or using 800 is a bit louder than using 848, for whatever reason. + m.param &= 0x7F; + if(m.param < 0x10) + { + m.param = 0x80; + } else + { + m.param = (m.param - 0x10) * 0xFF / 0x6F; + } + break; + case CMD_GLOBALVOLUME: + m.param = std::min(m.param, uint8(0x40)) * 2u; + break; + } } if(b & 0x80) { Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-07-03 18:40:57 UTC (rev 2482) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-07-03 19:56:44 UTC (rev 2483) @@ -27,6 +27,10 @@ #endif +// Formats which have 7-bit (0...128) instead of 6-bit (0...64) global volume commands, or which are imported to this range (mostly formats which are converted to IT internally) +#define GLOBALVOL_7BIT_FORMATS (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_MT2 | MOD_TYPE_IMF | MOD_TYPE_J2B | MOD_TYPE_MID | MOD_TYPE_AMS | MOD_TYPE_AMS2 | MOD_TYPE_DBM | MOD_TYPE_PTM) + + //////////////////////////////////////////////////////////// // Length @@ -466,7 +470,7 @@ // break; // } - if(!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_MT2 | MOD_TYPE_IMF | MOD_TYPE_J2B | MOD_TYPE_MID | MOD_TYPE_AMS | MOD_TYPE_AMS2 | MOD_TYPE_DBM))) param <<= 1; + if(!(GetType() & GLOBALVOL_7BIT_FORMATS)) param <<= 1; // IT compatibility 16. FT2, ST3 and IT ignore out-of-range values if(param <= 128) { @@ -486,25 +490,25 @@ if (((param & 0x0F) == 0x0F) && (param & 0xF0)) { param >>= 4; - if (!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_IMF | MOD_TYPE_J2B | MOD_TYPE_MID | MOD_TYPE_AMS | MOD_TYPE_AMS2 | MOD_TYPE_DBM))) param <<= 1; + if (!(GetType() & GLOBALVOL_7BIT_FORMATS)) param <<= 1; memory.glbVol += param << 1; } else if (((param & 0xF0) == 0xF0) && (param & 0x0F)) { param = (param & 0x0F) << 1; - if (!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_IMF | MOD_TYPE_J2B | MOD_TYPE_MID | MOD_TYPE_AMS | MOD_TYPE_AMS2 | MOD_TYPE_DBM))) param <<= 1; + if (!(GetType() & GLOBALVOL_7BIT_FORMATS)) param <<= 1; memory.glbVol -= param; } else if (param & 0xF0) { param >>= 4; param <<= 1; - if (!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_IMF | MOD_TYPE_J2B | MOD_TYPE_MID | MOD_TYPE_AMS | MOD_TYPE_AMS2 | MOD_TYPE_DBM))) param <<= 1; + if (!(GetType() & GLOBALVOL_7BIT_FORMATS)) param <<= 1; memory.glbVol += param * memory.musicSpeed; } else { param = (param & 0x0F) << 1; - if (!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_IMF | MOD_TYPE_J2B | MOD_TYPE_MID | MOD_TYPE_AMS | MOD_TYPE_AMS2 | MOD_TYPE_DBM))) param <<= 1; + if (!(GetType() & GLOBALVOL_7BIT_FORMATS)) param <<= 1; memory.glbVol -= param * memory.musicSpeed; } memory.glbVol = CLAMP(memory.glbVol, 0, 256); @@ -2388,7 +2392,7 @@ // break; // } - if (!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_MT2 | MOD_TYPE_IMF | MOD_TYPE_J2B | MOD_TYPE_MID | MOD_TYPE_AMS | MOD_TYPE_AMS2 | MOD_TYPE_DBM))) param *= 2; + if (!(GetType() & GLOBALVOL_7BIT_FORMATS)) param *= 2; // IT compatibility 16. FT2, ST3 and IT ignore out-of-range values. // Test case: globalvol-invalid.it @@ -2419,7 +2423,7 @@ { pChn->dwFlags.reset(CHN_SURROUND); } - if(!(GetType() & (MOD_TYPE_S3M | MOD_TYPE_PTM | MOD_TYPE_DSM | MOD_TYPE_AMF | MOD_TYPE_MTM))) + if(!(GetType() & (MOD_TYPE_S3M | MOD_TYPE_DSM | MOD_TYPE_AMF | MOD_TYPE_MTM))) { // Real 8-bit panning pChn->nPan = param; Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2013-07-03 18:40:57 UTC (rev 2482) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2013-07-03 19:56:44 UTC (rev 2483) @@ -1334,16 +1334,50 @@ MODTYPE CSoundFile::GetBestSaveFormat() const //------------------------------------------- { - if ((!m_nSamples) || (!m_nChannels) || GetType() == MOD_TYPE_NONE) return MOD_TYPE_NONE; - if (GetType() & (MOD_TYPE_MOD|MOD_TYPE_DIGI)) + switch(GetType()) + { + case MOD_TYPE_MOD: + case MOD_TYPE_S3M: + case MOD_TYPE_XM: + case MOD_TYPE_IT: + case MOD_TYPE_MPT: + return GetType(); + case MOD_TYPE_AMF0: + case MOD_TYPE_DIGI: return MOD_TYPE_MOD; - if (GetType() & (MOD_TYPE_S3M|MOD_TYPE_STM|MOD_TYPE_ULT|MOD_TYPE_FAR|MOD_TYPE_PTM|MOD_TYPE_MTM)) + case MOD_TYPE_MED: + if(m_nDefaultTempo == 125 && m_nDefaultSpeed == 6 && !m_nInstruments) + { + for(PATTERNINDEX i = 0; i < Patterns.Size(); i++) + { + if(Patterns.IsValidPat(i) && Patterns[i].GetNumRows() != 64) + return MOD_TYPE_XM; + } + return MOD_TYPE_MOD; + } + return MOD_TYPE_XM; + case MOD_TYPE_669: + case MOD_TYPE_FAR: + case MOD_TYPE_STM: + case MOD_TYPE_DSM: + case MOD_TYPE_AMF: + case MOD_TYPE_MTM: return MOD_TYPE_S3M; - if (GetType() & (MOD_TYPE_XM|MOD_TYPE_MED/*|MOD_TYPE_MT2*/)) - return MOD_TYPE_XM; - if(GetType() & MOD_TYPE_MPT) - return MOD_TYPE_MPT; - return MOD_TYPE_IT; + case MOD_TYPE_AMS: + case MOD_TYPE_AMS2: + case MOD_TYPE_DMF: + case MOD_TYPE_DBM: + case MOD_TYPE_IMF: + case MOD_TYPE_PSM: + case MOD_TYPE_J2B: + case MOD_TYPE_ULT: + case MOD_TYPE_OKT: + case MOD_TYPE_MT2: + case MOD_TYPE_MDL: + case MOD_TYPE_PTM: + default: + return MOD_TYPE_IT; + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-07-03 22:17:21
|
Revision: 2486 http://sourceforge.net/p/modplug/code/2486 Author: manxorist Date: 2013-07-03 22:17:11 +0000 (Wed, 03 Jul 2013) Log Message: ----------- [Mod] libopenmpt: Seperate repeat count from the other render params. [Fix] libopenmpt_modplug: Actually set repeat count. Modified Paths: -------------- trunk/OpenMPT/libopenmpt/libopenmpt.h trunk/OpenMPT/libopenmpt/libopenmpt.hpp trunk/OpenMPT/libopenmpt/libopenmpt_c.cpp trunk/OpenMPT/libopenmpt/libopenmpt_cxx.cpp trunk/OpenMPT/libopenmpt/libopenmpt_impl.cpp trunk/OpenMPT/libopenmpt/libopenmpt_impl.hpp trunk/OpenMPT/libopenmpt/libopenmpt_modplug.c trunk/OpenMPT/libopenmpt/libopenmpt_winamp.cpp trunk/OpenMPT/libopenmpt/libopenmpt_xmplay.cpp trunk/OpenMPT/openmpt123/openmpt123.cpp Modified: trunk/OpenMPT/libopenmpt/libopenmpt.h =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt.h 2013-07-03 21:58:52 UTC (rev 2485) +++ trunk/OpenMPT/libopenmpt/libopenmpt.h 2013-07-03 22:17:11 UTC (rev 2486) @@ -64,12 +64,11 @@ LIBOPENMPT_API void openmpt_module_destroy( openmpt_module * mod ); -#define OPENMPT_MODULE_RENDER_REPEATCOUNT 1 -#define OPENMPT_MODULE_RENDER_MASTERGAIN_MILLIBEL 2 -#define OPENMPT_MODULE_RENDER_STEREOSEPARATION_PERCENT 3 -#define OPENMPT_MODULE_RENDER_INTERPOLATION_FILTER_LENGTH 4 -#define OPENMPT_MODULE_RENDER_VOLUMERAMP_UP_MICROSECONDS 5 -#define OPENMPT_MODULE_RENDER_VOLUMERAMP_DOWN_MICROSECONDS 6 +#define OPENMPT_MODULE_RENDER_MASTERGAIN_MILLIBEL 1 +#define OPENMPT_MODULE_RENDER_STEREOSEPARATION_PERCENT 2 +#define OPENMPT_MODULE_RENDER_INTERPOLATION_FILTER_LENGTH 3 +#define OPENMPT_MODULE_RENDER_VOLUMERAMP_UP_MICROSECONDS 4 +#define OPENMPT_MODULE_RENDER_VOLUMERAMP_DOWN_MICROSECONDS 5 #define OPENMPT_MODULE_COMMAND_NOTE 0 #define OPENMPT_MODULE_COMMAND_INSTRUMENT 1 @@ -82,6 +81,8 @@ LIBOPENMPT_API int openmpt_module_set_render_param( openmpt_module * mod, int param, int32_t value ); LIBOPENMPT_API int openmpt_module_select_subsong( openmpt_module * mod, int32_t subsong ); +LIBOPENMPT_API int openmpt_module_set_repeat_count( openmpt_module * mod, int32_t repeat_count ); +LIBOPENMPT_API int32_t openmpt_module_get_repeat_count( openmpt_module * mod ); LIBOPENMPT_API double openmpt_module_seek_seconds( openmpt_module * mod, double seconds ); Modified: trunk/OpenMPT/libopenmpt/libopenmpt.hpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt.hpp 2013-07-03 21:58:52 UTC (rev 2485) +++ trunk/OpenMPT/libopenmpt/libopenmpt.hpp 2013-07-03 22:17:11 UTC (rev 2486) @@ -74,12 +74,11 @@ public: enum render_param { - RENDER_REPEATCOUNT = 1, - RENDER_MASTERGAIN_MILLIBEL = 2, - RENDER_STEREOSEPARATION_PERCENT = 3, - RENDER_INTERPOLATION_FILTER_LENGTH = 4, - RENDER_VOLUMERAMP_UP_MICROSECONDS = 5, - RENDER_VOLUMERAMP_DOWN_MICROSECONDS = 6 + RENDER_MASTERGAIN_MILLIBEL = 1, + RENDER_STEREOSEPARATION_PERCENT = 2, + RENDER_INTERPOLATION_FILTER_LENGTH = 3, + RENDER_VOLUMERAMP_UP_MICROSECONDS = 4, + RENDER_VOLUMERAMP_DOWN_MICROSECONDS = 5 }; enum command_index { @@ -117,6 +116,8 @@ void set_render_param( int param, std::int32_t value ); void select_subsong( std::int32_t subsong ); + void set_repeat_count( std::int32_t repeat_count ); + std::int32_t get_repeat_count() const; double seek_seconds( double seconds ); Modified: trunk/OpenMPT/libopenmpt/libopenmpt_c.cpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_c.cpp 2013-07-03 21:58:52 UTC (rev 2485) +++ trunk/OpenMPT/libopenmpt/libopenmpt_c.cpp 2013-07-03 22:17:11 UTC (rev 2486) @@ -361,6 +361,22 @@ return 0; } +int openmpt_module_set_repeat_count( openmpt_module * mod, int32_t repeat_count ) { + try { + OPENMPT_INTERFACE_CHECK_SOUNDFILE( mod ); + mod->impl->set_repeat_count( repeat_count ); + return 1; + } OPENMPT_INTERFACE_CATCH_TO_LOG; + return 0; +} +int32_t openmpt_module_get_repeat_count( openmpt_module * mod ) { + try { + OPENMPT_INTERFACE_CHECK_SOUNDFILE( mod ); + return mod->impl->get_repeat_count(); + } OPENMPT_INTERFACE_CATCH_TO_LOG; + return 0; +} + double openmpt_module_seek_seconds( openmpt_module * mod, double seconds ) { try { OPENMPT_INTERFACE_CHECK_SOUNDFILE( mod ); Modified: trunk/OpenMPT/libopenmpt/libopenmpt_cxx.cpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_cxx.cpp 2013-07-03 21:58:52 UTC (rev 2485) +++ trunk/OpenMPT/libopenmpt/libopenmpt_cxx.cpp 2013-07-03 22:17:11 UTC (rev 2486) @@ -114,6 +114,13 @@ impl->select_subsong( subsong ); } +void module::set_repeat_count( std::int32_t repeat_count ) { + impl->set_repeat_count( repeat_count ); +} +std::int32_t module::get_repeat_count() const { + return impl->get_repeat_count(); +} + double module::seek_seconds( double seconds ) { return impl->seek_seconds( seconds ); } Modified: trunk/OpenMPT/libopenmpt/libopenmpt_impl.cpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_impl.cpp 2013-07-03 21:58:52 UTC (rev 2485) +++ trunk/OpenMPT/libopenmpt/libopenmpt_impl.cpp 2013-07-03 22:17:11 UTC (rev 2486) @@ -294,9 +294,6 @@ case module::RENDER_STEREOSEPARATION_PERCENT: { return m_sndFile->m_MixerSettings.m_nStereoSeparation * 100 / 128; } break; - case module::RENDER_REPEATCOUNT: { - return m_sndFile->m_nRepeatCount; - } break; case module::RENDER_INTERPOLATION_FILTER_LENGTH: { return resamplingmode_to_filterlength( m_sndFile->m_Resampler.m_Settings.SrcMode ); } break; @@ -328,9 +325,6 @@ m_sndFile->SetMixerSettings( settings ); } } break; - case module::RENDER_REPEATCOUNT: { - m_sndFile->SetRepeatCount( value ); - } break; case module::RENDER_INTERPOLATION_FILTER_LENGTH: { CResamplerSettings newsettings; newsettings.SrcMode = filterlength_to_resamplingmode( value ); @@ -427,6 +421,12 @@ } m_sndFile->Order.SetSequence( subsong ); } +void module_impl::set_repeat_count( std::int32_t repeat_count ) { + m_sndFile->SetRepeatCount( repeat_count ); +} +std::int32_t module_impl::get_repeat_count() const { + return m_sndFile->GetRepeatCount(); +} double module_impl::seek_seconds( double seconds ) { GetLengthType t = m_sndFile->GetLength( eNoAdjust, GetLengthTarget( seconds ) ); m_sndFile->InitializeVisitedRows(); Modified: trunk/OpenMPT/libopenmpt/libopenmpt_impl.hpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_impl.hpp 2013-07-03 21:58:52 UTC (rev 2485) +++ trunk/OpenMPT/libopenmpt/libopenmpt_impl.hpp 2013-07-03 22:17:11 UTC (rev 2486) @@ -91,6 +91,8 @@ double get_duration_seconds() const; double get_current_position_seconds() const; void select_subsong( std::int32_t subsong ); + void set_repeat_count( std::int32_t repeat_count ); + std::int32_t get_repeat_count() const; double seek_seconds( double seconds ); std::vector<std::string> get_metadata_keys() const; std::string get_metadata( const std::string & key ) const; Modified: trunk/OpenMPT/libopenmpt/libopenmpt_modplug.c =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_modplug.c 2013-07-03 21:58:52 UTC (rev 2485) +++ trunk/OpenMPT/libopenmpt/libopenmpt_modplug.c 2013-07-03 22:17:11 UTC (rev 2486) @@ -128,6 +128,7 @@ free(file); return NULL; } + openmpt_module_set_repeat_count(file->mod,file->settings.mLoopCount); file->name = openmpt_module_get_metadata(file->mod,"title"); file->message = openmpt_module_get_metadata(file->mod,"message"); openmpt_module_set_render_param(file->mod,OPENMPT_MODULE_RENDER_STEREOSEPARATION_PERCENT,file->settings.mStereoSeparation*100/128); Modified: trunk/OpenMPT/libopenmpt/libopenmpt_winamp.cpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_winamp.cpp 2013-07-03 21:58:52 UTC (rev 2485) +++ trunk/OpenMPT/libopenmpt/libopenmpt_winamp.cpp 2013-07-03 22:17:11 UTC (rev 2486) @@ -96,9 +96,9 @@ static void apply_options() { if ( self->mod ) { + self->mod->set_repeat_count( self->settings.repeatcount ); self->mod->set_render_param( openmpt::module::RENDER_MASTERGAIN_MILLIBEL, self->settings.mastergain_millibel ); self->mod->set_render_param( openmpt::module::RENDER_STEREOSEPARATION_PERCENT, self->settings.stereoseparation ); - self->mod->set_render_param( openmpt::module::RENDER_REPEATCOUNT, self->settings.repeatcount ); self->mod->set_render_param( openmpt::module::RENDER_INTERPOLATION_FILTER_LENGTH, self->settings.interpolationfilterlength ); self->mod->set_render_param( openmpt::module::RENDER_VOLUMERAMP_UP_MICROSECONDS, self->settings.volrampinus ); self->mod->set_render_param( openmpt::module::RENDER_VOLUMERAMP_DOWN_MICROSECONDS, self->settings.volrampoutus ); Modified: trunk/OpenMPT/libopenmpt/libopenmpt_xmplay.cpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_xmplay.cpp 2013-07-03 21:58:52 UTC (rev 2485) +++ trunk/OpenMPT/libopenmpt/libopenmpt_xmplay.cpp 2013-07-03 22:17:11 UTC (rev 2486) @@ -133,9 +133,9 @@ static void apply_options() { if ( self->mod ) { + self->mod->set_repeat_count( self->settings.repeatcount ); self->mod->set_render_param( openmpt::module::RENDER_MASTERGAIN_MILLIBEL, self->settings.mastergain_millibel ); self->mod->set_render_param( openmpt::module::RENDER_STEREOSEPARATION_PERCENT, self->settings.stereoseparation ); - self->mod->set_render_param( openmpt::module::RENDER_REPEATCOUNT, self->settings.repeatcount ); self->mod->set_render_param( openmpt::module::RENDER_INTERPOLATION_FILTER_LENGTH, self->settings.interpolationfilterlength ); self->mod->set_render_param( openmpt::module::RENDER_VOLUMERAMP_UP_MICROSECONDS, self->settings.volrampinus ); self->mod->set_render_param( openmpt::module::RENDER_VOLUMERAMP_DOWN_MICROSECONDS, self->settings.volrampoutus ); Modified: trunk/OpenMPT/openmpt123/openmpt123.cpp =================================================================== --- trunk/OpenMPT/openmpt123/openmpt123.cpp 2013-07-03 21:58:52 UTC (rev 2485) +++ trunk/OpenMPT/openmpt123/openmpt123.cpp 2013-07-03 22:17:11 UTC (rev 2486) @@ -377,7 +377,8 @@ openmpt::module mod( data_stream ); - mod.set_render_param( openmpt::module::RENDER_REPEATCOUNT, flags.repeatcount ); + mod.set_repeat_count( flags.repeatcount ); + mod.set_render_param( openmpt::module::RENDER_INTERPOLATION_FILTER_LENGTH, flags.filtertaps ); mod.set_render_param( openmpt::module::RENDER_MASTERGAIN_MILLIBEL, flags.gain ); mod.set_render_param( openmpt::module::RENDER_VOLUMERAMP_UP_MICROSECONDS, flags.rampupus ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2013-07-03 23:11:10
|
Revision: 2488 http://sourceforge.net/p/modplug/code/2488 Author: saga-games Date: 2013-07-03 23:10:59 +0000 (Wed, 03 Jul 2013) Log Message: ----------- [Ref] Use unified WAVWriter class for mod export, sample saving and sample copying. Modified Paths: -------------- trunk/OpenMPT/mptrack/Mod2wave.cpp trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/soundlib/SampleFormats.cpp trunk/OpenMPT/soundlib/SampleIO.cpp trunk/OpenMPT/soundlib/WAVTools.cpp trunk/OpenMPT/soundlib/WAVTools.h trunk/OpenMPT/soundlib/Wav.h Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mod2wave.cpp 2013-07-03 22:45:08 UTC (rev 2487) +++ trunk/OpenMPT/mptrack/Mod2wave.cpp 2013-07-03 23:10:59 UTC (rev 2488) @@ -17,6 +17,8 @@ #include "vstplug.h" #include "mod2wave.h" #include "Wav.h" +#include "WAVTools.h" +#include "../common/version.h" #include "ACMConvert.h" extern UINT nMixingRates[NUMMIXRATE]; @@ -596,16 +598,12 @@ void CDoWaveConvert::OnButton1() //------------------------------ { - FILE *f; - WAVEFILEHEADER header; - WAVEDATAHEADER datahdr, fmthdr; MSG msg; BYTE buffer[WAVECONVERTBUFSIZE]; CHAR s[80]; HWND progress = ::GetDlgItem(m_hWnd, IDC_PROGRESS1); UINT ok = IDOK, pos = 0; uint64 ullSamples = 0, ullMaxSamples; - DWORD dwDataOffset; LONG lMax = 256; if (!m_pSndFile || !m_lpszFileName) @@ -614,13 +612,15 @@ return; } - while((f = fopen(m_lpszFileName, "w+b")) == NULL) + WAVWriter file(m_lpszFileName); + while(!file.IsValid()) { if(Reporting::RetryCancel("Could not open file for writing. Is it open in another application?") == rtyCancel) { EndDialog(IDCANCEL); return; } + file.Open(m_lpszFileName); } MixerSettings oldmixersettings = m_pSndFile->m_MixerSettings; @@ -647,26 +647,11 @@ m_pSndFile->InitPlayer(TRUE); if ((!m_dwFileLimit) || (m_dwFileLimit > 2047*1024)) m_dwFileLimit = 2047*1024; // 2GB m_dwFileLimit <<= 10; - // File Header - header.id_RIFF = IFFID_RIFF; - header.filesize = sizeof(WAVEFILEHEADER) - 8; - header.id_WAVE = IFFID_WAVE; - // Wave Format Header - fmthdr.id_data = IFFID_fmt; - fmthdr.length = 16; - if (m_pWaveFormat->cbSize) fmthdr.length += 2 + m_pWaveFormat->cbSize; - header.filesize += sizeof(fmthdr) + fmthdr.length; - // Data header - datahdr.id_data = IFFID_data; - datahdr.length = 0; - header.filesize += sizeof(datahdr); - // Writing Headers - fwrite(&header, 1, sizeof(header), f); - fwrite(&fmthdr, 1, sizeof(fmthdr), f); - fwrite(m_pWaveFormat, 1, fmthdr.length, f); - fwrite(&datahdr, 1, sizeof(datahdr), f); - dwDataOffset = ftell(f); - ullSamples = 0; + + file.WriteFormat(m_pWaveFormat->nSamplesPerSec, m_pWaveFormat->wBitsPerSample, m_pWaveFormat->nChannels, m_pWaveFormat->wBitsPerSample == 32 ? WAVFormatChunk::fmtFloat : WAVFormatChunk::fmtPCM); + + file.StartChunk(RIFFChunk::iddata); + ullMaxSamples = m_dwFileLimit / (m_pWaveFormat->nChannels * m_pWaveFormat->wBitsPerSample / 8); if (m_dwSongLimit) { @@ -701,6 +686,10 @@ // For giving away some processing time every now and then DWORD dwSleepTime = dwStartTime; + size_t bytesWritten = 0; + + CMainFrame::GetMainFrame()->PauseMod(); + m_pSndFile->m_SongFlags.reset(SONG_STEP | SONG_PATTERNLOOP); CMainFrame::GetMainFrame()->InitRenderer(m_pSndFile); //rewbs.VSTTimeInfo for (UINT n = 0; ; n++) { @@ -739,18 +728,19 @@ } } - UINT lWrite = fwrite(buffer, 1, lRead*nBytesPerSample, f); + UINT lWrite = fwrite(buffer, 1, lRead * nBytesPerSample, file.GetFile()); if (!lWrite) break; - datahdr.length += lWrite; + bytesWritten += lWrite; + if (m_bNormalize) { - ULONGLONG d = ((ULONGLONG)datahdr.length * m_pWaveFormat->wBitsPerSample) / 24; + ULONGLONG d = ((ULONGLONG)bytesWritten * m_pWaveFormat->wBitsPerSample) / 24; if (d >= m_dwFileLimit) break; } else { - if (datahdr.length >= m_dwFileLimit) + if (bytesWritten >= m_dwFileLimit) break; } if (ullSamples >= ullMaxSamples) @@ -766,7 +756,7 @@ timeRemaining = static_cast<DWORD>(((dwCurrentTime - dwStartTime) * (max - ullSamples) / ullSamples) / 1000); } - wsprintf(s, "Writing file... (%uKB, %umn%02us, %umn%02us remaining)", datahdr.length >> 10, l / 60, l % 60, timeRemaining / 60, timeRemaining % 60); + wsprintf(s, "Writing file... (%uKB, %umn%02us, %umn%02us remaining)", bytesWritten >> 10, l / 60, l % 60, timeRemaining / 60, timeRemaining % 60); SetDlgItemText(IDC_TEXT1, s); // Give windows some time to redraw the window, if necessary (else, the infamous "OpenMPT does not respond" will pop up) @@ -798,25 +788,25 @@ if (m_bNormalize) { - DWORD dwLength = datahdr.length; + DWORD dwLength = bytesWritten; DWORD percent = 0xFF, dwPos, dwSize, dwCount; DWORD dwBitSize, dwOutPos; - dwPos = dwOutPos = dwDataOffset; + dwPos = dwOutPos = file.GetPosition(); dwBitSize = m_pWaveFormat->wBitsPerSample / 8; - datahdr.length = 0; + bytesWritten = 0; ::SendMessage(progress, PBM_SETRANGE, 0, MAKELPARAM(0, 100)); dwCount = dwLength; while (dwCount >= 3) { dwSize = (sizeof(buffer) / 3) * 3; if (dwSize > dwCount) dwSize = dwCount; - fseek(f, dwPos, SEEK_SET); - if (fread(buffer, 1, dwSize, f) != dwSize) break; + fseek(file.GetFile(), dwPos, SEEK_SET); + if (fread(buffer, 1, dwSize, file.GetFile()) != dwSize) break; m_pSndFile->Normalize24BitBuffer(buffer, dwSize, lMax, dwBitSize); - fseek(f, dwOutPos, SEEK_SET); - datahdr.length += (dwSize/3)*dwBitSize; - fwrite(buffer, 1, (dwSize/3)*dwBitSize, f); + fseek(file.GetFile(), dwOutPos, SEEK_SET); + bytesWritten += (dwSize / 3) * dwBitSize; + fwrite(buffer, 1, (dwSize / 3) * dwBitSize, file.GetFile()); dwCount -= dwSize; dwPos += dwSize; dwOutPos += (dwSize * m_pWaveFormat->wBitsPerSample) / 24; @@ -831,43 +821,43 @@ } } + file.Skip(bytesWritten); + file.Truncate(); + // Write cue points - DWORD cuePointLength = 0; if(m_pSndFile->m_PatternCuePoints.size() > 0) { // Cue point header - WavCueHeader cuehdr; - cuehdr.id = IFFID_cue; - cuehdr.numPoints = m_pSndFile->m_PatternCuePoints.size(); - cuehdr.length = 4 + cuehdr.numPoints * sizeof(WavCuePoint); - cuePointLength = 8 + cuehdr.length; - cuehdr.ConvertEndianness(); - fwrite(&cuehdr, 1, sizeof(WavCueHeader), f); + file.StartChunk(RIFFChunk::idcue_); + uint32 numPoints = m_pSndFile->m_PatternCuePoints.size(); + SwapBytesLE(numPoints); + file.Write(numPoints); // Write all cue points std::vector<PatternCuePoint>::const_iterator iter; - DWORD num = 0; - for(iter = m_pSndFile->m_PatternCuePoints.begin(); iter != m_pSndFile->m_PatternCuePoints.end(); ++iter, num++) + uint32 index = 0; + for(iter = m_pSndFile->m_PatternCuePoints.begin(); iter != m_pSndFile->m_PatternCuePoints.end(); iter++) { - WavCuePoint cuepoint; - cuepoint.id = num; - cuepoint.pos = (uint32)iter->offset; - cuepoint.chunkID = IFFID_data; - cuepoint.chunkStart = 0; // we use no Wave List Chunk (wavl) as we have only one data block, so this should be 0. - cuepoint.blockStart = 0; // dito - cuepoint.offset = (uint32)iter->offset; - cuepoint.ConvertEndianness(); - fwrite(&cuepoint, 1, sizeof(WavCuePoint), f); + WAVCuePoint cuePoint; + cuePoint.id = index++; + cuePoint.position = static_cast<uint32>(iter->offset); + cuePoint.riffChunkID = static_cast<uint32>(RIFFChunk::iddata); + cuePoint.chunkStart = 0; // we use no Wave List Chunk (wavl) as we have only one data block, so this should be 0. + cuePoint.blockStart = 0; // dito + cuePoint.offset = cuePoint.position; + cuePoint.ConvertEndianness(); + file.Write(cuePoint); } m_pSndFile->m_PatternCuePoints.clear(); } - header.filesize = (sizeof(WAVEFILEHEADER) - 8) + (8 + fmthdr.length) + (8 + datahdr.length) + (cuePointLength); - fseek(f, 0, SEEK_SET); - fwrite(&header, sizeof(header), 1, f); - fseek(f, dwDataOffset-sizeof(datahdr), SEEK_SET); - fwrite(&datahdr, sizeof(datahdr), 1, f); - fclose(f); + WAVWriter::Metatags tags; + tags.push_back(WAVWriter::Metatag(RIFFChunk::idINAM, m_pSndFile->GetTitle())); + tags.push_back(WAVWriter::Metatag(RIFFChunk::idISFT, MptVersion::GetOpenMPTVersionStr())); + file.WriteMetatags(tags); + + size_t fileSize = file.Finalize(); + m_pSndFile->m_nMaxOrderPosition = 0; if (m_bNormalize) { @@ -875,7 +865,7 @@ CFile fw; if (fw.Open(m_lpszFileName, CFile::modeReadWrite | CFile::modeNoTruncate)) { - fw.SetLength(header.filesize+8); + fw.SetLength(fileSize); fw.Close(); } } Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2013-07-03 22:45:08 UTC (rev 2487) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2013-07-03 23:10:59 UTC (rev 2488) @@ -21,14 +21,12 @@ #include "view_smp.h" #include "../soundlib/MIDIEvents.h" #include "SampleEditorDialogs.h" -#include "modsmp_ctrl.h" -#include "Wav.h" +#include "../soundlib/WAVTools.h" #include "../soundlib/FileReader.h" #define new DEBUG_NEW - // Non-client toolbar #define SMP_LEFTBAR_CY 29 #define SMP_LEFTBAR_CXSEP 14 @@ -1862,117 +1860,86 @@ //---------------------------- { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); - CModDoc *pModDoc = GetDocument(); - CSoundFile *pSndFile; - DWORD dwMemSize, dwSmpLen, dwSmpOffset; - HGLOBAL hCpy; - BOOL bExtra = TRUE; + if(pMainFrm == nullptr || GetDocument() == nullptr) + { + return; + } - if ((!pMainFrm) || (!pModDoc)) return; - pSndFile = pModDoc->GetSoundFile(); - const ModSample &sample = pSndFile->GetSample(m_nSample); - if ((!sample.nLength) || (!sample.pSample)) return; - dwMemSize = sample.nLength; - dwSmpOffset = 0; - if (m_dwEndSel > sample.nLength) m_dwEndSel = sample.nLength; - if (m_dwEndSel > m_dwBeginSel) { dwMemSize = m_dwEndSel - m_dwBeginSel; dwSmpOffset = m_dwBeginSel; bExtra = FALSE; } - if (sample.uFlags & CHN_16BIT) { dwMemSize <<= 1; dwSmpOffset <<= 1; } - if (sample.uFlags & CHN_STEREO) { dwMemSize <<= 1; dwSmpOffset <<= 1; } - dwSmpLen = dwMemSize; - dwMemSize += sizeof(WAVEFILEHEADER) + sizeof(WAVEFORMATHEADER) + sizeof(WAVEDATAHEADER) - + sizeof(WAVEEXTRAHEADER) + sizeof(WAVESAMPLERINFO); - // For name + fname - dwMemSize += 32 * 2; - BeginWaitCursor(); - if ((pMainFrm->OpenClipboard()) && ((hCpy = GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE, dwMemSize))!=NULL)) + const CSoundFile &sndFile = GetDocument()->GetrSoundFile(); + const ModSample &sample = sndFile.GetSample(m_nSample); + + bool addLoopInfo = true; + size_t smpSize = sample.nLength; + size_t smpOffset = 0; + + // First things first: Calculate sample size, taking partial selections into account. + LimitMax(m_dwEndSel, sample.nLength); + if(m_dwEndSel > m_dwBeginSel) { - EmptyClipboard(); - LPBYTE p = (LPBYTE)GlobalLock(hCpy); - WAVEFILEHEADER *phdr = (WAVEFILEHEADER *)p; - WAVEFORMATHEADER *pfmt = (WAVEFORMATHEADER *)(p + sizeof(WAVEFILEHEADER)); - WAVEDATAHEADER *pdata = (WAVEDATAHEADER *)(p + sizeof(WAVEFILEHEADER) + sizeof(WAVEFORMATHEADER)); - phdr->id_RIFF = IFFID_RIFF; - phdr->filesize = sizeof(WAVEFILEHEADER) + sizeof(WAVEFORMATHEADER) + sizeof(WAVEDATAHEADER) - 8; - phdr->id_WAVE = IFFID_WAVE; - pfmt->id_fmt = IFFID_fmt; - pfmt->hdrlen = 16; - pfmt->format = 1; - pfmt->freqHz = sample.nC5Speed; - if (pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) - { - pfmt->freqHz = ModSample::TransposeToFrequency(sample.RelativeTone, sample.nFineTune); + smpSize = m_dwEndSel - m_dwBeginSel; + smpOffset = m_dwBeginSel; + addLoopInfo = false; } - pfmt->channels = (sample.uFlags & CHN_STEREO) ? (WORD)2 : (WORD)1; - pfmt->bitspersample = (sample.uFlags & CHN_16BIT) ? (WORD)16 : (WORD)8; - pfmt->samplesize = pfmt->channels * pfmt->bitspersample / 8; - pfmt->bytessec = pfmt->freqHz*pfmt->samplesize; - pdata->id_data = IFFID_data; - pdata->length = dwSmpLen; - phdr->filesize += pdata->length; - LPBYTE psamples = p + sizeof(WAVEFILEHEADER) + sizeof(WAVEFORMATHEADER) + sizeof(WAVEDATAHEADER); - memcpy(psamples, static_cast<const char *>(sample.pSample) + dwSmpOffset, dwSmpLen); - if (pfmt->bitspersample == 8) + + smpSize *= sample.GetBytesPerSample(); + smpOffset *= sample.GetBytesPerSample(); + + // Ok, now calculate size of the resulting WAV file. + size_t memSize = sizeof(RIFFHeader) // RIFF Header + + sizeof(RIFFChunk) + sizeof(WAVFormatChunk) // Sample format + + sizeof(RIFFChunk) + ((smpSize + 1) & ~1) // Sample data + + sizeof(RIFFChunk) + sizeof(WAVExtraChunk) // Sample metadata + + MAX_SAMPLENAME + MAX_SAMPLEFILENAME; // Sample name + STATIC_ASSERT((sizeof(WAVExtraChunk) % 2u) == 0); + STATIC_ASSERT((MAX_SAMPLENAME % 2u) == 0); + STATIC_ASSERT((MAX_SAMPLEFILENAME % 2u) == 0); + + if(addLoopInfo) { - for (UINT i = 0; i < dwSmpLen; i++) psamples[i] += 0x80; + // We want to store some loop metadata as well. + memSize += sizeof(RIFFChunk) + sizeof(WAVSampleInfoChunk) + 2 * sizeof(WAVSampleLoop); } - if (bExtra) - { - WAVESMPLHEADER *psh = (WAVESMPLHEADER *)(psamples+dwSmpLen); - MemsetZero(*psh); - psh->smpl_id = 0x6C706D73; - psh->smpl_len = sizeof(WAVESMPLHEADER) - 8; - psh->dwSamplePeriod = 22675; - if (sample.nC5Speed > 256) psh->dwSamplePeriod = 1000000000 / sample.nC5Speed; - psh->dwBaseNote = 60; - // Write loops - WAVESAMPLERINFO *psmpl = (WAVESAMPLERINFO *)psh; - MemsetZero(psmpl->wsiLoops); - if((sample.uFlags & CHN_SUSTAINLOOP) != 0) + ASSERT((memSize % 2u) == 0); + + BeginWaitCursor(); + HGLOBAL hCpy; + if(pMainFrm->OpenClipboard() && (hCpy = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, memSize)) != nullptr) { - psmpl->wsiLoops[psmpl->wsiHdr.dwSampleLoops++].SetLoop(sample.nSustainStart, sample.nSustainEnd, (sample.uFlags & CHN_PINGPONGSUSTAIN) != 0); - psmpl->wsiHdr.smpl_len += sizeof(SAMPLELOOPSTRUCT); - } - if((sample.uFlags & CHN_LOOP) != 0) - { - psmpl->wsiLoops[psmpl->wsiHdr.dwSampleLoops++].SetLoop(sample.nLoopStart, sample.nLoopEnd, (sample.uFlags & CHN_PINGPONGLOOP) != 0); - psmpl->wsiHdr.smpl_len += sizeof(SAMPLELOOPSTRUCT); - } + EmptyClipboard(); - WAVEEXTRAHEADER *pxh = (WAVEEXTRAHEADER *)(psamples+dwSmpLen+psh->smpl_len+8); - pxh->xtra_id = IFFID_xtra; - pxh->xtra_len = sizeof(WAVEEXTRAHEADER)-8; + void *p = GlobalLock(hCpy); + WAVWriter file(p, memSize); - pxh->dwFlags = sample.uFlags; - pxh->wPan = sample.nPan; - pxh->wVolume = sample.nVolume; - pxh->wGlobalVol = sample.nGlobalVol; + // Write sample format + file.WriteFormat(sample.GetSampleRate(sndFile.GetType()), sample.GetElementarySampleSize() * 8, sample.GetNumChannels(), WAVFormatChunk::fmtPCM); - pxh->nVibType = sample.nVibType; - pxh->nVibSweep = sample.nVibSweep; - pxh->nVibDepth = sample.nVibDepth; - pxh->nVibRate = sample.nVibRate; - if((pSndFile->GetType() & MOD_TYPE_XM) && (pxh->nVibDepth | pxh->nVibRate)) - { - // XM vibrato is upside down - pxh->nVibSweep = 255 - pxh->nVibSweep; - } + // Write sample data + file.StartChunk(RIFFChunk::iddata); - if ((pSndFile->m_szNames[m_nSample][0]) || (sample.filename[0])) + uint8 *sampleData = static_cast<uint8 *>(p) + file.GetPosition(); + memcpy(sampleData, static_cast<const char *>(sample.pSample) + smpOffset, smpSize); + if(sample.GetElementarySampleSize() == 1) { - LPSTR pszText = (LPSTR)(pxh+1); - memcpy(pszText, pSndFile->m_szNames[m_nSample], MAX_SAMPLENAME); - pxh->xtra_len += MAX_SAMPLENAME; - if (sample.filename[0]) + // 8-Bit samples have to be unsigned. + for(size_t i = smpSize; i != 0; i--) { - memcpy(pszText + MAX_SAMPLENAME, sample.filename, MAX_SAMPLEFILENAME); - pxh->xtra_len += MAX_SAMPLEFILENAME; + *(sampleData++) += 0x80u; } } - phdr->filesize += (psh->smpl_len + 8) + (pxh->xtra_len + 8); + + file.Skip(smpSize); + + if(addLoopInfo) + { + file.WriteLoopInformation(sample); } + file.WriteExtraInformation(sample, sndFile.GetType(), sndFile.GetSampleName(m_nSample)); + + file.Finalize(); + GlobalUnlock(hCpy); - SetClipboardData (CF_WAVE, (HANDLE) hCpy); + SetClipboardData (CF_WAVE, (HANDLE)hCpy); CloseClipboard(); } EndWaitCursor(); Modified: trunk/OpenMPT/soundlib/SampleFormats.cpp =================================================================== --- trunk/OpenMPT/soundlib/SampleFormats.cpp 2013-07-03 22:45:08 UTC (rev 2487) +++ trunk/OpenMPT/soundlib/SampleFormats.cpp 2013-07-03 23:10:59 UTC (rev 2488) @@ -430,144 +430,33 @@ bool CSoundFile::SaveWAVSample(SAMPLEINDEX nSample, const LPCSTR lpszFileName) const //---------------------------------------------------------------------------------- { - std::string softwareIdString = MptVersion::GetOpenMPTVersionStr(); - const char *softwareId = softwareIdString.c_str(); - size_t softwareIdLength = strlen(softwareId) + 1; + WAVWriter file(lpszFileName); - WAVEFILEHEADER header; - WAVEFORMATHEADER format; - WAVEDATAHEADER data; - WAVESAMPLERINFO smpl; - WAVELISTHEADER list; - WAVEEXTRAHEADER extra; - const ModSample &sample = Samples[nSample]; - FILE *f; - - if ((f = fopen(lpszFileName, "wb")) == NULL) return false; - MemsetZero(extra); - MemsetZero(smpl); - header.id_RIFF = LittleEndian(IFFID_RIFF); - header.filesize = sizeof(header) - 8 + sizeof(format) + sizeof(data) + sizeof(extra) - + sizeof(list) + 8 + softwareIdLength + 8 + 32; // LIST(INAM, ISFT) - header.id_WAVE = LittleEndian(IFFID_WAVE); - format.id_fmt = LittleEndian(IFFID_fmt); - format.hdrlen = LittleEndian(16); - format.format = LittleEndianW(1); - if(!(GetType() & (MOD_TYPE_MOD | MOD_TYPE_XM))) - format.freqHz = LittleEndian(sample.nC5Speed); - else - format.freqHz = LittleEndian(ModSample::TransposeToFrequency(sample.RelativeTone, sample.nFineTune)); - format.channels = LittleEndianW(sample.GetNumChannels()); - format.bitspersample = LittleEndianW(sample.GetElementarySampleSize() * 8); - format.samplesize = LittleEndianW(sample.GetBytesPerSample()); - format.bytessec = LittleEndian(format.freqHz * format.samplesize); - - data.id_data = LittleEndian(IFFID_data); - data.length = sample.GetSampleSizeInBytes(); - - header.filesize += data.length; - if((data.length % 2u) != 0) + if(!file.IsValid()) { - // Write padding byte if sample size is odd. - header.filesize++; + return false; } - if((softwareIdLength % 2u) != 0) - { - header.filesize++; - } - // "smpl" field - smpl.wsiHdr.smpl_id = LittleEndian(IFFID_smpl); - smpl.wsiHdr.smpl_len = sizeof(WAVESMPLHEADER) - 8; - if (sample.nC5Speed >= 256) - smpl.wsiHdr.dwSamplePeriod = LittleEndian(1000000000 / sample.nC5Speed); - else - smpl.wsiHdr.dwSamplePeriod = LittleEndian(22675); // 44100 Hz + const ModSample &sample = Samples[nSample]; + file.WriteFormat(sample.GetSampleRate(GetType()), sample.GetElementarySampleSize() * 8, sample.GetNumChannels(), WAVFormatChunk::fmtPCM); - smpl.wsiHdr.dwBaseNote = LittleEndian(NOTE_MIDDLEC - NOTE_MIN); - - // Write loops - if((sample.uFlags & CHN_SUSTAINLOOP) != 0) - { - smpl.wsiLoops[smpl.wsiHdr.dwSampleLoops++].SetLoop(sample.nSustainStart, sample.nSustainEnd, (sample.uFlags & CHN_PINGPONGSUSTAIN) != 0); - smpl.wsiHdr.smpl_len += sizeof(SAMPLELOOPSTRUCT); - } - if((sample.uFlags & CHN_LOOP) != 0) - { - smpl.wsiLoops[smpl.wsiHdr.dwSampleLoops++].SetLoop(sample.nLoopStart, sample.nLoopEnd, (sample.uFlags & CHN_PINGPONGLOOP) != 0); - smpl.wsiHdr.smpl_len += sizeof(SAMPLELOOPSTRUCT); - } - - // Update file length in header - header.filesize += smpl.wsiHdr.smpl_len + 8; - - header.filesize = LittleEndian(header.filesize); - data.length = LittleEndian(data.length); - smpl.wsiHdr.smpl_len = LittleEndian(smpl.wsiHdr.smpl_len); - fwrite(&header, 1, sizeof(header), f); - fwrite(&format, 1, sizeof(format), f); - fwrite(&data, 1, sizeof(data), f); - - SampleIO( - (sample.uFlags & CHN_16BIT) ? SampleIO::_16bit : SampleIO::_8bit, - (sample.uFlags & CHN_STEREO) ? SampleIO::stereoInterleaved : SampleIO::mono, + // Write sample data + file.StartChunk(RIFFChunk::iddata); + file.Skip(SampleIO( + sample.uFlags[CHN_16BIT] ? SampleIO::_16bit : SampleIO::_8bit, + sample.uFlags[CHN_STEREO] ? SampleIO::stereoInterleaved : SampleIO::mono, SampleIO::littleEndian, - (sample.uFlags & CHN_16BIT) ? SampleIO::signedPCM : SampleIO::unsignedPCM) - .WriteSample(f, sample); + sample.uFlags[CHN_16BIT] ? SampleIO::signedPCM : SampleIO::unsignedPCM) + .WriteSample(file.GetFile(), sample)); - if((data.length % 2u) != 0) - { - // Write padding byte if sample size is odd. - int8 padding = 0; - fwrite(&padding, 1, 1, f); - } - fwrite(&smpl, 1, smpl.wsiHdr.smpl_len + 8, f); + file.WriteLoopInformation(sample); + file.WriteExtraInformation(sample, GetType()); - // "LIST" field - list.list_id = LittleEndian(IFFID_LIST); - list.list_len = LittleEndian(sizeof(list) - 8 // LIST - + 8 + 32 // "INAM".dwLen.szSampleName - + 8 + softwareIdLength); // "ISFT".dwLen.softwareId.0 - list.info = LittleEndian(IFFID_INFO); - fwrite(&list, 1, sizeof(list), f); - - list.list_id = LittleEndian(IFFID_INAM); // "INAM" - list.list_len = LittleEndian(32); - fwrite(&list, 1, 8, f); - fwrite(m_szNames[nSample], 1, 32, f); - - list.list_id = LittleEndian(IFFID_ISFT); // "ISFT" - list.list_len = LittleEndian(softwareIdLength); - fwrite(&list, 1, 8, f); - fwrite(softwareId, 1, list.list_len, f); - if((softwareIdLength % 2u) != 0) - { - int8 padding = 0; - fwrite(&padding, 1, 1, f); - } - - // "xtra" field - extra.xtra_id = LittleEndian(IFFID_xtra); - extra.xtra_len = LittleEndian(sizeof(extra) - 8); - - extra.dwFlags = LittleEndian(sample.uFlags); - extra.wPan = LittleEndianW(sample.nPan); - extra.wVolume = LittleEndianW(sample.nVolume); - extra.wGlobalVol = LittleEndianW(sample.nGlobalVol); - extra.wReserved = 0; - - extra.nVibType = sample.nVibType; - extra.nVibSweep = sample.nVibSweep; - extra.nVibDepth = sample.nVibDepth; - extra.nVibRate = sample.nVibRate; - if((GetType() & MOD_TYPE_XM) && (extra.nVibDepth | extra.nVibRate)) - { - // XM vibrato is upside down - extra.nVibSweep = 255 - extra.nVibSweep; - } - - fwrite(&extra, 1, sizeof(extra), f); - fclose(f); + WAVWriter::Metatags tags; + tags.push_back(WAVWriter::Metatag(RIFFChunk::idINAM, m_szNames[nSample])); + tags.push_back(WAVWriter::Metatag(RIFFChunk::idISFT, MptVersion::GetOpenMPTVersionStr())); + file.WriteMetatags(tags); + return true; } @@ -609,8 +498,7 @@ typedef struct PACKED GF1PATCHFILEHEADER { - DWORD gf1p; // "GF1P" - DWORD atch; // "ATCH" + char magic[8]; // "GF1PATCH" CHAR version[4]; // "100", or "110" CHAR id[10]; // "ID#000002" CHAR copyright[60]; // Copyright @@ -776,7 +664,7 @@ GF1INSTRUMENT *pinshdr = (GF1INSTRUMENT *)(lpStream+sizeof(GF1PATCHFILEHEADER)); if ((!lpStream) || (dwMemLength < 512) - || (phdr->gf1p != 0x50314647) || (phdr->atch != 0x48435441) + || memcmp(phdr->magic, "GF1PATCH", 8) || (phdr->version[3] != 0) || (phdr->id[9] != 0) || (phdr->instrum < 1) || (!phdr->samples) || (!pinshdr->layers)) return false; @@ -803,7 +691,7 @@ UINT nSamples; if ((!lpStream) || (dwMemLength < 512) - || (phdr->gf1p != 0x50314647) || (phdr->atch != 0x48435441) + || memcmp(phdr->magic, "GF1PATCH", 8) || (phdr->version[3] != 0) || (phdr->id[9] != 0) || (phdr->instrum < 1) || (!phdr->samples) || (!pih->layers) || (!plh->samples)) return false; @@ -1928,8 +1816,7 @@ { FileReader::off_t readBytes = *bytes; LimitMax(readBytes, file.BytesLeft()); - memcpy(buffer, file.GetRawData(), readBytes); - file.Skip(readBytes); + file.ReadRaw(reinterpret_cast<char *>(buffer), readBytes); *bytes = readBytes; if(*bytes == 0) return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; @@ -2080,7 +1967,7 @@ { #ifndef NO_FLAC // Check if we're dealing with FLAC in an OGG container. - // We won't check for the "fLaC" signature but let libFLAC decide whether a file is valid or not, as some FLAC files might have e.g. leading ID3v2 data. + // <del>We won't check for the "fLaC" signature but let libFLAC decide whether a file is valid or not, as some FLAC files might have e.g. leading ID3v2 data.</del> Apparently we do that now. file.Rewind(); if(!file.ReadMagic("fLaC")) { @@ -2312,8 +2199,7 @@ { FileReader &file = *static_cast<FileReader *>(fp); size_t readBytes = std::min(count, static_cast<size_t>(file.BytesLeft())); - memcpy(buf, file.GetRawData(), readBytes); - file.Skip(readBytes); + file.ReadRaw(static_cast<char *>(buf), readBytes); return readBytes; } Modified: trunk/OpenMPT/soundlib/SampleIO.cpp =================================================================== --- trunk/OpenMPT/soundlib/SampleIO.cpp 2013-07-03 22:45:08 UTC (rev 2487) +++ trunk/OpenMPT/soundlib/SampleIO.cpp 2013-07-03 23:10:59 UTC (rev 2488) @@ -539,7 +539,8 @@ else if((GetBitDepth() == 8 || (GetBitDepth() == 16 && GetEndianness() == littleEndian)) && GetChannelFormat() == stereoInterleaved && GetEncoding() == signedPCM) { // Stereo signed interleaved - if(f) fwrite(pSample, 1, sample.GetSampleSizeInBytes(), f); + len = sample.GetSampleSizeInBytes(); + if(f) fwrite(pSample, 1, len, f); } else if(GetBitDepth() == 8 && GetChannelFormat() == stereoInterleaved && GetEncoding() == unsignedPCM) Modified: trunk/OpenMPT/soundlib/WAVTools.cpp =================================================================== --- trunk/OpenMPT/soundlib/WAVTools.cpp 2013-07-03 22:45:08 UTC (rev 2487) +++ trunk/OpenMPT/soundlib/WAVTools.cpp 2013-07-03 23:10:59 UTC (rev 2488) @@ -222,3 +222,310 @@ fraction = 0; playCount = 0; } + + +/////////////////////////////////////////////////////////// +// WAV Writing + + +// Output to file: Initialize with filename. +WAVWriter::WAVWriter(const char *filename) : f(nullptr), memory(nullptr), memSize(0) +//---------------------------------------------------------------------------------- +{ + Open(filename); +} + + +// Output to clipboard: Initialize with pointer to memory and size of reserved memory. +WAVWriter::WAVWriter(void *mem, size_t size) : f(nullptr), memory(static_cast<uint8 *>(mem)), memSize(size) +//--------------------------------------------------------------------------------------------------------- +{ + Init(); +} + + +WAVWriter::~WAVWriter() +//--------------------- +{ + Finalize(); +} + + +// Open a file for writing. +void WAVWriter::Open(const char *filename) +//---------------------------------------- +{ + f = fopen(filename, "w+b"); + Init(); +} + + +// Reset all file variables. +void WAVWriter::Init() +//-------------------- +{ + chunkStartPos = 0; + position = 0; + totalSize = 0; + + // Skip file header for now + Seek(sizeof(RIFFHeader)); +} + + +// Finalize the file by closing the last open chunk and updating the file header. Returns total size of file. +size_t WAVWriter::Finalize() +//-------------------------- +{ + FinalizeChunk(); + + RIFFHeader fileHeader; + fileHeader.magic = RIFFHeader::idRIFF; + fileHeader.length = static_cast<uint32>(totalSize - 8); + fileHeader.type = RIFFHeader::idWAVE; + fileHeader.ConvertEndianness(); + + Seek(0); + Write(fileHeader); + + if(f != nullptr) + { +#ifdef _DEBUG + fseek(f, 0, SEEK_END); + size_t realSize = static_cast<size_t>(ftell(f)); + ASSERT(totalSize == realSize); +#endif + fclose(f); + } + + f = nullptr; + memory = nullptr; + + return totalSize; +} + + +// Write a new chunk header to the file. +void WAVWriter::StartChunk(RIFFChunk::id_type id) +//----------------------------------------------- +{ + FinalizeChunk(); + + chunkStartPos = position; + chunkHeader.id = id; + Skip(sizeof(chunkHeader)); +} + + +// End current chunk by updating the chunk header and writing a padding byte if necessary. +void WAVWriter::FinalizeChunk() +//----------------------------- +{ + if(chunkStartPos != 0) + { + const size_t chunkSize = position - (chunkStartPos + sizeof(RIFFChunk)); + chunkHeader.length = chunkSize; + chunkHeader.ConvertEndianness(); + + size_t curPos = position; + Seek(chunkStartPos); + Write(chunkHeader); + + Seek(curPos); + if((chunkSize % 2u) != 0) + { + // Write padding + uint8 padding = 0; + Write(padding); + } + + chunkStartPos = 0; + } +} + + +// Seek to a position in file. +void WAVWriter::Seek(size_t pos) +//------------------------------ +{ + position = pos; + totalSize = std::max(totalSize, position); + + if(f != nullptr) + { + fseek(f, position, SEEK_SET); + } +} + + +// Write some data to the file. +void WAVWriter::Write(const void *data, size_t numBytes) +//------------------------------------------------------ +{ + if(f != nullptr) + { + fwrite(data, numBytes, 1, f); + } else if(memory != nullptr) + { + if(position <= memSize && numBytes <= memSize - position) + { + memcpy(memory + position, data, numBytes); + } else + { + // Should never happen - did we calculate a wrong memory size? + ASSERT(false); + } + } + position += numBytes; + totalSize = std::max(totalSize, position); +} + + +// Write the WAV format to the file. +void WAVWriter::WriteFormat(uint32 sampleRate, uint16 bitDepth, uint16 numChannels, WAVFormatChunk::SampleFormats encoding) +//------------------------------------------------------------------------------------------------------------------------- +{ + StartChunk(RIFFChunk::idfmt_); + WAVFormatChunk wavFormat; + + bool extensible = (numChannels > 2); + + wavFormat.format = static_cast<uint16>(extensible ? WAVFormatChunk::fmtExtensible : encoding); + wavFormat.numChannels = numChannels; + wavFormat.sampleRate = sampleRate; + wavFormat.blockAlign = (bitDepth * numChannels + 7) / 8; + wavFormat.byteRate = wavFormat.sampleRate * wavFormat.blockAlign; + wavFormat.bitsPerSample = bitDepth; + + wavFormat.ConvertEndianness(); + Write(wavFormat); + + if(extensible) + { + WAVFormatChunkExtension extFormat; + extFormat.size = sizeof(WAVFormatChunkExtension) - sizeof(uint16); + extFormat.validBitsPerSample = bitDepth; + switch(numChannels) + { + case 1: + extFormat.channelMask = 0x0004; // FRONT_CENTER + break; + case 2: + extFormat.channelMask = 0x0003; // FRONT_LEFT | FRONT_RIGHT + break; + case 3: + extFormat.channelMask = 0x0103; // FRONT_LEFT | FRONT_RIGHT | BACK_CENTER + break; + case 4: + extFormat.channelMask = 0x0033; // FRONT_LEFT | FRONT_RIGHT | BACK_LEFT | BACK_RIGHT + break; + default: + extFormat.channelMask = 0; + break; + } + extFormat.subFormat = static_cast<uint16>(encoding); + const uint8 guid[] = { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 }; + MemCopy<uint8[14]>(extFormat.guid, guid); + + extFormat.ConvertEndianness(); + Write(extFormat); + } +} + + +// Write text tags to the file. +void WAVWriter::WriteMetatags(const Metatags &tags) +//------------------------------------------------- +{ + StartChunk(RIFFChunk::idLIST); + const char info[] = { 'I', 'N', 'F', 'O' }; + WriteArray(info); + + for(Metatags::const_iterator iter = tags.begin(); iter != tags.end(); iter++) + { + const size_t length = iter->text.length() + 1; + if(length == 1) + { + continue; + } + + RIFFChunk chunk; + chunk.id = static_cast<uint32>(iter->id); + chunk.length = length; + chunk.ConvertEndianness(); + Write(chunk); + Write(iter->text.c_str(), length); + + if((length % 2u) != 0) + { + uint8 padding = 0; + Write(padding); + } + } +} + + +// Write a sample loop information chunk to the file. +void WAVWriter::WriteLoopInformation(const ModSample &sample) +//----------------------------------------------------------- +{ + if(!sample.uFlags[CHN_LOOP | CHN_SUSTAINLOOP]) + { + return; + } + + StartChunk(RIFFChunk::idsmpl); + WAVSampleInfoChunk info; + + uint32 sampleRate = sample.nC5Speed; + if(sampleRate == 0) + { + sampleRate = ModSample::TransposeToFrequency(sample.RelativeTone, sample.nFineTune); + } + + info.ConvertToWAV(sampleRate); + + // Set up loops + WAVSampleLoop loops[2]; + if(sample.uFlags[CHN_SUSTAINLOOP]) + { + loops[info.numLoops++].ConvertToWAV(sample.nSustainStart, sample.nSustainEnd, sample.uFlags[CHN_PINGPONGSUSTAIN]); + } + if(sample.uFlags[CHN_LOOP]) + { + loops[info.numLoops++].ConvertToWAV(sample.nLoopStart, sample.nLoopEnd, sample.uFlags[CHN_PINGPONGLOOP]); + } + + info.ConvertEndianness(); + Write(info); + for(size_t i = 0; i < info.numLoops; i++) + { + loops[i].ConvertEndianness(); + Write(loops[i]); + } +} + + +// Write MPT's sample information chunk to the file. +void WAVWriter::WriteExtraInformation(const ModSample &sample, MODTYPE modType, const char *sampleName) +//----------------------------------------------------------------------------------------------------- +{ + StartChunk(RIFFChunk::idxtra); + WAVExtraChunk mptInfo; + + mptInfo.ConvertToWAV(sample, modType); + mptInfo.ConvertEndianness(); + Write(mptInfo); + + if(sampleName != nullptr) + { + // Write sample name (clipboard only) + char name[MAX_SAMPLENAME]; + mpt::String::Write<mpt::String::nullTerminated>(name, sampleName, MAX_SAMPLENAME); + WriteArray(name); + + char filename[MAX_SAMPLEFILENAME]; + mpt::String::Write<mpt::String::nullTerminated>(filename, sample.filename); + WriteArray(filename); + } +} Modified: trunk/OpenMPT/soundlib/WAVTools.h =================================================================== --- trunk/OpenMPT/soundlib/WAVTools.h 2013-07-03 22:45:08 UTC (rev 2487) +++ trunk/OpenMPT/soundlib/WAVTools.h 2013-07-03 23:10:59 UTC (rev 2488) @@ -360,3 +360,101 @@ // Apply sample settings from file (loop points, MPT extra settings, ...) to a sample. void ApplySampleSettings(ModSample &sample, char (&sampleName)[MAX_SAMPLENAME]); }; + + +//============= +class WAVWriter +//============= +{ +protected: + // When writing to file: File handle + FILE *f; + // When writing to memory: Memory address + length + uint8 *memory; + size_t memSize; + + // Cursor position + size_t position; + // Total number of bytes written to file / memory + size_t totalSize; + + // Currently written chunk + size_t chunkStartPos; + RIFFChunk chunkHeader; + +public: + + //============ + struct Metatag + //============ + { + Metatag(RIFFChunk::id_type tagID, std::string tagText) : id(tagID), text(tagText) { } + + RIFFChunk::id_type id; + std::string text; + }; + + typedef std::vector<Metatag> Metatags; + +public: + // Output to file: Initialize with filename. + WAVWriter(const char *filename); + // Output to clipboard: Initialize with pointer to memory and size of reserved memory. + WAVWriter(void *mem, size_t size); + + ~WAVWriter(); + + // Open a file for writing. + void Open(const char *filename); + + // Check if anything can be written to the file. + bool IsValid() const { return f != nullptr || memory != nullptr; } + + // Finalize the file by closing the last open chunk and updating the file header. Returns total size of file. + size_t Finalize(); + // Begin writing a new chunk to the file. + void StartChunk(RIFFChunk::id_type id); + + // Skip some bytes... For example after writing sample data. + void Skip(size_t numBytes) { Seek(position + numBytes); } + // Get file handle + FILE *GetFile() { return f; } + // Get position in file (not counting any changes done to the file from outside this class, i.e. through GetFile()) + size_t GetPosition() const { return position; } + + // Shrink file size to current position. + void Truncate() { totalSize = position; } + + // Write some data to the file. + template<typename T> + void Write(const T &data) + { + Write(&data, sizeof(T)); + } + + // Write an array to the file. + template<typename T, size_t size> + void WriteArray(const T (&data)[size]) + { + Write(data, sizeof(T) * size); + } + + // Write the WAV format to the file. + void WriteFormat(uint32 sampleRate, uint16 bitDepth, uint16 numChannels, WAVFormatChunk::SampleFormats encoding); + // Write text tags to the file. + void WriteMetatags(const Metatags &tags); + // Write a sample loop information chunk to the file. + void WriteLoopInformation(const ModSample &sample); + // Write MPT's sample information chunk to the file. + void WriteExtraInformation(const ModSample &sample, MODTYPE modType, const char *sampleName = nullptr); + +protected: + void Init(); + // Seek to a position in file. + void Seek(size_t pos); + // End current chunk by updating the chunk header and writing a padding byte if necessary. + void FinalizeChunk(); + + // Write some data to the file. + void Write(const void *data, size_t numBytes); +}; Modified: trunk/OpenMPT/soundlib/Wav.h =================================================================== --- trunk/OpenMPT/soundlib/Wav.h 2013-07-03 22:45:08 UTC (rev 2487) +++ trunk/OpenMPT/soundlib/Wav.h 2013-07-03 23:10:59 UTC (rev 2488) @@ -36,182 +36,29 @@ #define IFFID_wave 0x65766177 #define IFFID_fmt 0x20746D66 #define IFFID_wsmp 0x706D7377 -#define IFFID_pcm 0x206d6370 #define IFFID_data 0x61746164 -#define IFFID_smpl 0x6C706D73 -#define IFFID_xtra 0x61727478 -#define IFFID_cue 0x20657563 #ifdef NEEDS_PRAGMA_PACK #pragma pack(push, 1) #endif - -typedef struct PACKED WAVEFILEHEADER +struct PACKED WAVEFILEHEADER { DWORD id_RIFF; // "RIFF" DWORD filesize; // file length-8 DWORD id_WAVE; -} WAVEFILEHEADER; +}; STATIC_ASSERT(sizeof(WAVEFILEHEADER) == 12); - -typedef struct PACKED WAVEFORMATHEADER +struct PACKED WAVEDATAHEADER { - DWORD id_fmt; // "fmt " - DWORD hdrlen; // 16 - WORD format; // 1 - WORD channels; // 1:mono, 2:stereo - DWORD freqHz; // sampling freq - DWORD bytessec; // bytes/sec=freqHz*samplesize - WORD samplesize; // sizeof(sample) - WORD bitspersample; // bits per sample (8/16) -} WAVEFORMATHEADER; - -STATIC_ASSERT(sizeof(WAVEFORMATHEADER) == 24); - - -typedef struct PACKED WAVEDATAHEADER -{ DWORD id_data; // "data" DWORD length; // length of data -} WAVEDATAHEADER; +}; STATIC_ASSERT(sizeof(WAVEDATAHEADER) == 8); - - -typedef struct PACKED WAVESMPLHEADER -{ - // SMPL - DWORD smpl_id; // "smpl" -> 0x6C706D73 - DWORD smpl_len; // length of smpl: 3Ch (54h with sustain loop) - DWORD dwManufacturer; - DWORD dwProduct; - DWORD dwSamplePeriod; // 1000000000/freqHz - DWORD dwBaseNote; // 3Ch = C-4 -> 60 + RelativeTone - DWORD dwPitchFraction; - DWORD dwSMPTEFormat; - DWORD dwSMPTEOffset; - DWORD dwSampleLoops; // number of loops - DWORD cbSamplerData; -} WAVESMPLHEADER; - -STATIC_ASSERT(sizeof(WAVESMPLHEADER) == 44); - - -typedef struct PACKED SAMPLELOOPSTRUCT -{ - DWORD dwIdentifier; - DWORD dwLoopType; // 0=normal, 1=bidi - DWORD dwLoopStart; - DWORD dwLoopEnd; // Byte offset ? - DWORD dwFraction; - DWORD dwPlayCount; // Loop Count, 0=infinite - - // Set up a loop struct. - void SetLoop(DWORD loopStart, DWORD loopEnd, bool bidi) - { - dwIdentifier = 0; - dwLoopType = LittleEndian(bidi ? 1 : 0); - dwLoopStart = LittleEndian(loopStart); - // Loop ends are *inclusive* in the RIFF standard, while they're *exclusive* in OpenMPT. - if(loopEnd > loopStart) - { - dwLoopEnd = LittleEndian(loopEnd - 1); - } else - { - dwLoopEnd = LittleEndian(loopStart); - } - dwFraction = 0; - dwPlayCount = 0; - } - -} SAMPLELOOPSTRUCT; - -STATIC_ASSERT(sizeof(SAMPLELOOPSTRUCT) == 24); - - -typedef struct PACKED WAVESAMPLERINFO -{ - WAVESMPLHEADER wsiHdr; - SAMPLELOOPSTRUCT wsiLoops[2]; -} WAVESAMPLERINFO; - -STATIC_ASSERT(sizeof(WAVESAMPLERINFO) == 92); - - -typedef struct PACKED WAVELISTHEADER -{ - DWORD list_id; // "LIST" -> 0x5453494C - DWORD list_len; - DWORD info; // "INFO" -} WAVELISTHEADER; - -STATIC_ASSERT(sizeof(WAVELISTHEADER) == 12); - - -typedef struct PACKED WAVEEXTRAHEADER -{ - DWORD xtra_id; // "xtra" -> 0x61727478 - DWORD xtra_len; - DWORD dwFlags; - WORD wPan; - WORD wVolume; - WORD wGlobalVol; - WORD wReserved; - BYTE nVibType; - BYTE nVibSweep; - BYTE nVibDepth; - BYTE nVibRate; -} WAVEEXTRAHEADER; - -STATIC_ASSERT(sizeof(WAVEEXTRAHEADER) == 24); - - -struct PACKED WavCueHeader -{ - uint32 id; // "cue " -> 0x20657563 - uint32 length; - uint32 numPoints; - - // Convert all multi-byte numeric values to current platform's endianness or vice versa. - void ConvertEndianness() - { - SwapBytesLE(id); - SwapBytesLE(length); - SwapBytesLE(numPoints); - } -}; - -STATIC_ASSERT(sizeof(WavCueHeader) == 12); - - -struct PACKED WavCuePoint -{ - uint32 id; // Unique identification value - uint32 pos; // Play order position - uint32 chunkID; // RIFF ID of corresponding data chunk - uint32 chunkStart; // Byte Offset of Data Chunk - uint32 blockStart; // Byte Offset to sample of First Channel - uint32 offset; // Byte Offset to sample byte of First Channel - - // Convert all multi-byte numeric values to current platform's endianness or vice versa. - void ConvertEndianness() - { - SwapBytesLE(id); - SwapBytesLE(pos); - SwapBytesLE(chunkID); - SwapBytesLE(chunkStart); - SwapBytesLE(blockStart); - SwapBytesLE(offset); - } -}; - -STATIC_ASSERT(sizeof(WavCuePoint) == 24); - - #ifdef NEEDS_PRAGMA_PACK #pragma pack(pop) #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-07-04 00:13:46
|
Revision: 2490 http://sourceforge.net/p/modplug/code/2490 Author: manxorist Date: 2013-07-04 00:13:36 +0000 (Thu, 04 Jul 2013) Log Message: ----------- Merged revision(s) 2462-2463 from branches/manx/stdstring-song-name: [Ref] Store song name in std::string CSoundFile::songName instead of in the fixed size sample name of unused sample 0. [Mod] .itp file format was prepared to support variable length song name but the code was always saving 27 characters. Actually save fewer bytes now if the song name is not that long. It is, however, still limited to max 25 chars via .it ModSpecifications. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_gen.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/soundlib/LOAD_AMF.CPP trunk/OpenMPT/soundlib/LOAD_DBM.CPP trunk/OpenMPT/soundlib/LOAD_DMF.CPP trunk/OpenMPT/soundlib/LOAD_DSM.CPP trunk/OpenMPT/soundlib/Load_669.cpp trunk/OpenMPT/soundlib/Load_ams.cpp trunk/OpenMPT/soundlib/Load_digi.cpp trunk/OpenMPT/soundlib/Load_far.cpp trunk/OpenMPT/soundlib/Load_gdm.cpp trunk/OpenMPT/soundlib/Load_imf.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_itp.cpp trunk/OpenMPT/soundlib/Load_mdl.cpp trunk/OpenMPT/soundlib/Load_med.cpp trunk/OpenMPT/soundlib/Load_mid.cpp trunk/OpenMPT/soundlib/Load_mod.cpp trunk/OpenMPT/soundlib/Load_mt2.cpp trunk/OpenMPT/soundlib/Load_mtm.cpp trunk/OpenMPT/soundlib/Load_okt.cpp trunk/OpenMPT/soundlib/Load_psm.cpp trunk/OpenMPT/soundlib/Load_ptm.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Load_stm.cpp trunk/OpenMPT/soundlib/Load_ult.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/load_j2b.cpp trunk/OpenMPT/soundlib/pattern.cpp trunk/OpenMPT/soundlib/pattern.h trunk/OpenMPT/test/test.cpp Property Changed: ---------------- trunk/OpenMPT/ Index: trunk/OpenMPT =================================================================== --- trunk/OpenMPT 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT 2013-07-04 00:13:36 UTC (rev 2490) Property changes on: trunk/OpenMPT ___________________________________________________________________ Modified: svn:mergeinfo ## -8,4 +8,6 ## /branches/manx/project-files-cleanups:1378-1382 /branches/manx/serialization-utils-cleanup:2382-2386,2395 /branches/manx/snddev-fixes:1605-1713 +/branches/manx/stdstring-names:2223,2228 +/branches/manx/stdstring-song-name:2462-2463 /branches/manx/unarchiver:1887-1888 \ No newline at end of property Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -174,7 +174,7 @@ { if (!m_bEditsLocked) { - m_EditTitle.SetWindowText(m_sndFile.m_szNames[0]); + m_EditTitle.SetWindowText(m_sndFile.GetTitle().c_str()); wsprintf(s, "%d", m_sndFile.m_nDefaultTempo); m_EditTempo.SetWindowText(s); wsprintf(s, "%d", m_sndFile.m_nDefaultSpeed); Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -683,7 +683,7 @@ } MemsetZero(m_SndFile.m_szNames); - //strcpy(m_SndFile.m_szNames[0], "untitled"); + //m_SndFile.SetTitle("untitled"); m_SndFile.m_nMusicTempo = m_SndFile.m_nDefaultTempo = 125; m_SndFile.m_nMusicSpeed = m_SndFile.m_nDefaultSpeed = 6; @@ -1868,7 +1868,7 @@ strcat(s, fext); } CLayer3Convert wsdlg(&m_SndFile, pMainFrm, acmConvert); - if (m_SndFile.m_szNames[0][0]) wsdlg.m_bSaveInfoField = TRUE; + if(!m_SndFile.GetTitle().empty()) wsdlg.m_bSaveInfoField = TRUE; if (wsdlg.DoModal() != IDOK) return; wsdlg.GetFormat(&wfx, &hadid); // Saving as mpeg file @@ -2847,7 +2847,7 @@ //---------------------------- { // Song title - mpt::String::FixNullString(m_SndFile.m_szNames[0]); + mpt::String::FixNullString(m_SndFile.songName); // Sample names + filenames for(SAMPLEINDEX nSmp = 1; nSmp <= m_SndFile.GetNumSamples(); nSmp++) Modified: trunk/OpenMPT/soundlib/LOAD_AMF.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_AMF.CPP 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/LOAD_AMF.CPP 2013-07-04 00:13:36 UTC (rev 2490) @@ -128,7 +128,7 @@ { m_nRestartPos = fileHeader.restartPos; } - m_szNames[0][0] = '\0'; + songName = ""; Order.ReadAsByte(file, 256, fileHeader.numOrders); @@ -385,7 +385,7 @@ m_nChannels = fileHeader.numChannels; m_nSamples = fileHeader.numSamples; - mpt::String::Read<mpt::String::maybeNullTerminated>(m_szNames[0], fileHeader.title); + mpt::String::Read<mpt::String::maybeNullTerminated>(songName, fileHeader.title); if(fileHeader.version < 10) { Modified: trunk/OpenMPT/soundlib/LOAD_DBM.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2013-07-04 00:13:36 UTC (rev 2490) @@ -227,10 +227,10 @@ if(pfh->songname[0]) { - mpt::String::Read<mpt::String::maybeNullTerminated>(m_szNames[0], pfh->songname); + mpt::String::Read<mpt::String::maybeNullTerminated>(songName, pfh->songname); } else { - mpt::String::Read<mpt::String::maybeNullTerminated>(m_szNames[0], pfh->songname2); + mpt::String::Read<mpt::String::maybeNullTerminated>(songName, pfh->songname2); } Modified: trunk/OpenMPT/soundlib/LOAD_DMF.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2013-07-04 00:13:36 UTC (rev 2490) @@ -975,7 +975,7 @@ } InitializeGlobals(); - mpt::String::Read<mpt::String::spacePadded>(m_szNames[0], fileHeader.songname); + mpt::String::Read<mpt::String::spacePadded>(songName, fileHeader.songname); #ifdef MODPLUG_TRACKER if(GetpModDoc() != nullptr) Modified: trunk/OpenMPT/soundlib/LOAD_DSM.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DSM.CPP 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/LOAD_DSM.CPP 2013-07-04 00:13:36 UTC (rev 2490) @@ -146,7 +146,7 @@ } } - mpt::String::Read<mpt::String::maybeNullTerminated>(m_szNames[0], psong->songname); + mpt::String::Read<mpt::String::maybeNullTerminated>(songName, psong->songname); nPat = 0; nSmp = 1; Modified: trunk/OpenMPT/soundlib/Load_669.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_669.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/Load_669.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -134,7 +134,7 @@ } // Copy first song message line into song title - mpt::String::Read<mpt::String::spacePadded>(m_szNames[0], fileHeader.songMessage, 36); + mpt::String::Read<mpt::String::spacePadded>(songName, fileHeader.songMessage, 36); // Song Message songMessage.ReadFixedLineLength(fileHeader.songMessage, 108, 36, 0); Modified: trunk/OpenMPT/soundlib/Load_ams.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ams.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/Load_ams.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -46,7 +46,15 @@ return file.ReadString<mpt::String::spacePadded>(destBuffer, length); } +// Read variable-length AMS string (we ignore the maximum text length specified by the AMS specs and accept any length). +bool ReadAMSString(std::string &dest, FileReader &file) +//----------------------------------------------------- +{ + const size_t length = file.ReadUint8(); + return file.ReadString<mpt::String::spacePadded>(dest, length); +} + // Read AMS or AMS2 (newVersion = true) pattern. At least this part of the format is more or less identical between the two trackers... void ReadAMSPattern(CPattern &pattern, bool newVersion, FileReader &patternChunk, CSoundFile &sndFile) //---------------------------------------------------------------------------------------------------- @@ -417,7 +425,7 @@ } // Texts - ReadAMSString(m_szNames[0], file); + ReadAMSString(songName, file); // Read sample names for(SAMPLEINDEX smp = 1; smp <= GetNumSamples(); smp++) @@ -749,7 +757,7 @@ AMS2FileHeader fileHeader; if(!file.ReadMagic("AMShdr\x1A") - || !ReadAMSString(m_szNames[0], file) + || !ReadAMSString(songName, file) || !file.ReadConvertEndianness(fileHeader)) { return false; Modified: trunk/OpenMPT/soundlib/Load_digi.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_digi.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/Load_digi.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -139,7 +139,7 @@ } // Read song + sample names - file.ReadString<mpt::String::maybeNullTerminated>(m_szNames[0], 32); + file.ReadString<mpt::String::maybeNullTerminated>(songName, 32); for(SAMPLEINDEX smp = 1; smp <= 31; smp++) { file.ReadString<mpt::String::maybeNullTerminated>(m_szNames[smp], 30); Modified: trunk/OpenMPT/soundlib/Load_far.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_far.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/Load_far.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -158,7 +158,7 @@ m_nDefaultTempo = 80; m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME; - mpt::String::Read<mpt::String::maybeNullTerminated>(m_szNames[0], fileHeader.songName); + mpt::String::Read<mpt::String::maybeNullTerminated>(songName, fileHeader.songName); // Read channel settings for(CHANNELINDEX chn = 0; chn < 16; chn++) Modified: trunk/OpenMPT/soundlib/Load_gdm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_gdm.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/Load_gdm.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -161,7 +161,7 @@ madeWithTracker = mpt::String::Format("BWSB 2GDM %d.%d (converted from %s)", fileHeader.trackerMajorVer, fileHeader.formatMinorVer, ModTypeToTracker(GetType()).c_str()); // Song name - mpt::String::Read<mpt::String::maybeNullTerminated>(m_szNames[0], fileHeader.songTitle); + mpt::String::Read<mpt::String::maybeNullTerminated>(songName, fileHeader.songTitle); // Read channel pan map... 0...15 = channel panning, 16 = surround channel, 255 = channel does not exist m_nChannels = 32; Modified: trunk/OpenMPT/soundlib/Load_imf.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_imf.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/Load_imf.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -461,7 +461,7 @@ SetModFlag(MSF_COMPATIBLE_PLAY, true); // Song Name - mpt::String::Read<mpt::String::nullTerminated>(m_szNames[0], fileHeader.title); + mpt::String::Read<mpt::String::nullTerminated>(songName, fileHeader.title); m_SongFlags = (fileHeader.flags & IMFFileHeader::linearSlides) ? SONG_LINEARSLIDES : SongFlags(0); m_nDefaultSpeed = fileHeader.tempo; Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -441,7 +441,7 @@ m_SongFlags.set(SONG_EMBEDMIDICFG, (fileHeader.flags & ITFileHeader::reqEmbeddedMIDIConfig) || (fileHeader.special & ITFileHeader::embedMIDIConfiguration)); m_SongFlags.set(SONG_EXFILTERRANGE, (fileHeader.flags & ITFileHeader::extendedFilterRange) != 0); - mpt::String::Read<mpt::String::spacePadded>(m_szNames[0], fileHeader.songname); + mpt::String::Read<mpt::String::spacePadded>(songName, fileHeader.songname); // Global Volume m_nDefaultGlobalVolume = fileHeader.globalvol << 1; @@ -1121,7 +1121,7 @@ MemsetZero(itHeader); dwChnNamLen = 0; itHeader.id = ITFileHeader::itMagic; - mpt::String::Write<mpt::String::nullTerminated>(itHeader.songname, m_szNames[0]); + mpt::String::Write<mpt::String::nullTerminated>(itHeader.songname, songName); itHeader.highlight_minor = (uint8)std::min(m_nDefaultRowsPerBeat, ROWINDEX(uint8_max)); itHeader.highlight_major = (uint8)std::min(m_nDefaultRowsPerMeasure, ROWINDEX(uint8_max)); Modified: trunk/OpenMPT/soundlib/Load_itp.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_itp.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/Load_itp.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -35,6 +35,14 @@ } +// Read variable-length ITP string. +static inline bool ReadITPString(std::string &dest, FileReader &file) +//------------------------------------------------------------------- +{ + return file.ReadString<mpt::String::maybeNullTerminated>(dest, file.ReadUint32LE()); +} + + bool CSoundFile::ReadITProject(FileReader &file, ModLoadingFlags loadFlags) //------------------------------------------------------------------------- { @@ -53,7 +61,7 @@ if(!file.CanRead(12 + 4 + 24 + 4) || file.ReadUint32LE() != ITP_FILE_ID // Magic bytes || (version = file.ReadUint32LE()) > ITP_VERSION // Format version - || !ReadITPString(m_szNames[0], file)) // Song name + || !ReadITPString(songName, file)) // Song name { return false; } else if(loadFlags == onlyVerifyHeader) @@ -304,13 +312,13 @@ fwrite(&id, 1, sizeof(id), f); // Song name - + std::vector<char> tempSongName(songName.length() + 1); // name string length - id = 27; + id = tempSongName.size(); fwrite(&id, 1, sizeof(id), f); - // song name - fwrite(&m_szNames[0], 1, 27, f); + mpt::String::Write<mpt::String::maybeNullTerminated>(tempSongName, songName); + fwrite(&tempSongName[0], 1, tempSongName.size(), f); // Song comments Modified: trunk/OpenMPT/soundlib/Load_mdl.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mdl.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/Load_mdl.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -338,7 +338,7 @@ Log("infoblock: %d bytes\n", blocklen); #endif pmib = (MDLInfoBlock *)(lpStream+dwMemPos); - mpt::String::Read<mpt::String::maybeNullTerminated>(m_szNames[0], pmib->songname); + mpt::String::Read<mpt::String::maybeNullTerminated>(songName, pmib->songname); norders = pmib->norders; if (norders > MAX_ORDERS) norders = MAX_ORDERS; Modified: trunk/OpenMPT/soundlib/Load_med.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_med.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/Load_med.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -11,6 +11,7 @@ #include "stdafx.h" #include "Loaders.h" +#include "../common/StringFixer.h" //#define MED_LOG @@ -231,7 +232,7 @@ // Each offset points to the play sequence itself. typedef struct PACKED tagMMD2PLAYSEQ { - CHAR name[32]; + char name[32]; DWORD command_offs; // filepos of command table DWORD reserved; WORD length; @@ -704,7 +705,7 @@ if ((pseq) && (pseq < dwMemLength - sizeof(MMD2PLAYSEQ))) { MMD2PLAYSEQ *pmps = (MMD2PLAYSEQ *)(lpStream + pseq); - if (!m_szNames[0][0]) memcpy(m_szNames[0], pmps->name, 31); + if(songName.empty()) mpt::String::Read<mpt::String::maybeNullTerminated>(songName, pmps->name); uint16 n = BigEndianW(pmps->length); if (pseq+n <= dwMemLength) { @@ -746,7 +747,7 @@ UINT songnamelen = BigEndian(pmex->songnamelen); if ((songname) && (songnamelen) && (songname <= dwMemLength) && (songnamelen <= dwMemLength-songname)) { - mpt::String::Read<mpt::String::maybeNullTerminated>(m_szNames[0], reinterpret_cast<const char *>(lpStream + songname), songnamelen); + mpt::String::Read<mpt::String::maybeNullTerminated>(songName, reinterpret_cast<const char *>(lpStream + songname), songnamelen); } // Sample Names DWORD smpinfoex = BigEndian(pmex->iinfo); Modified: trunk/OpenMPT/soundlib/Load_mid.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mid.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/Load_mid.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -530,7 +530,7 @@ m_nType = MOD_TYPE_MID; m_nChannels = 32; m_SongFlags = SONG_LINEARSLIDES; - m_szNames[0][0] = 0; + songName = ""; // MIDI->MOD Tempo Conversion division = BigEndianW(pmfh->wDivision); @@ -714,10 +714,9 @@ // FF.01 [text]: Song Information case 0x01: if (!len) break; - if ((len < 32) && (!m_szNames[0][0])) + if ((len < 32) && songName.empty()) { - memcpy(m_szNames[0], ptrk->ptracks, len); - m_szNames[0][len] = 0; + mpt::String::Read<mpt::String::maybeNullTerminated>(songName, reinterpret_cast<const char*>(ptrk->ptracks), len); } else if (songMessage.empty() && (ptrk->ptracks[0]) && (ptrk->ptracks[0] < 0x7F)) { @@ -738,14 +737,12 @@ case 0x06: if ((len > 1) && (!trk)) { - UINT k = (len < 32) ? len : 31; - CHAR s[32]; - memcpy(s, ptrk->ptracks, k); - s[k] = 0; - if ((!mpt::strnicmp(s, "Copyri", 6)) || (!s[0])) break; + std::string s; + mpt::String::Read<mpt::String::maybeNullTerminated>(s, reinterpret_cast<const char*>(ptrk->ptracks), len); + if ((!mpt::strnicmp(s.c_str(), "Copyri", 6)) || s.empty()) break; if (i == 0x03) { - if (!m_szNames[0][0]) strcpy(m_szNames[0], s); + if(songName.empty()) mpt::String::Copy(songName, s); } else if (!trk) { Modified: trunk/OpenMPT/soundlib/Load_mod.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mod.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/Load_mod.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -540,7 +540,7 @@ // Reading song title file.Seek(0); - file.ReadString<mpt::String::spacePadded>(m_szNames[0], 20); + file.ReadString<mpt::String::spacePadded>(songName, 20); // Load Samples size_t totalSampleLen = 0; @@ -892,7 +892,7 @@ m_nMaxPeriod = 3424 * 4; m_nSamplePreAmp = 64; m_SongFlags.reset(); - mpt::String::Read<mpt::String::spacePadded>(m_szNames[0], songname); + mpt::String::Read<mpt::String::spacePadded>(songName, songname); // Setup channel pan positions and volume SetupMODPanning(); @@ -1103,7 +1103,7 @@ // Write song title { char name[20]; - mpt::String::Write<mpt::String::maybeNullTerminated>(name, m_szNames[0]); + mpt::String::Write<mpt::String::maybeNullTerminated>(name, songName); fwrite(name, 20, 1, f); } Modified: trunk/OpenMPT/soundlib/Load_mt2.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mt2.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/Load_mt2.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -259,7 +259,7 @@ Order[iOrd] = (PATTERNINDEX)pfh->Orders[iOrd]; } - mpt::String::Read<mpt::String::maybeNullTerminated>(m_szNames[0], pfh->szSongName); + mpt::String::Read<mpt::String::maybeNullTerminated>(songName, pfh->szSongName); dwMemPos = sizeof(MT2FILEHEADER); nDrumDataLen = *(WORD *)(lpStream + dwMemPos); @@ -267,7 +267,7 @@ if (nDrumDataLen >= 2) pdd = (MT2DRUMSDATA *)(lpStream+dwDrumDataPos); dwMemPos += 2 + nDrumDataLen; #ifdef MT2DEBUG - Log("MT2 v%03X: \"%s\" (flags=%04X)\n", pfh->wVersion, m_szNames[0], pfh->fulFlags); + Log("MT2 v%03X: \"%s\" (flags=%04X)\n", pfh->wVersion, songName.c_str(), pfh->fulFlags); Log("%d Channels, %d Patterns, %d Instruments, %d Samples\n", pfh->wChannels, pfh->wPatterns, pfh->wInstruments, pfh->wSamples); Log("Drum Data: %d bytes @%04X\n", nDrumDataLen, dwDrumDataPos); #endif Modified: trunk/OpenMPT/soundlib/Load_mtm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mtm.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/Load_mtm.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -119,7 +119,7 @@ } InitializeGlobals(); - mpt::String::Read<mpt::String::maybeNullTerminated>(m_szNames[0], fileHeader.songName); + mpt::String::Read<mpt::String::maybeNullTerminated>(songName, fileHeader.songName); m_nType = MOD_TYPE_MTM; m_nSamples = fileHeader.numSamples; m_nChannels = fileHeader.numChannels; Modified: trunk/OpenMPT/soundlib/Load_okt.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_okt.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/Load_okt.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -295,7 +295,7 @@ ORDERINDEX nOrders = 0; InitializeGlobals(); - m_szNames[0][0] = '\0'; + songName = ""; // Go through IFF chunks... while(file.AreBytesLeft()) Modified: trunk/OpenMPT/soundlib/Load_psm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_psm.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/Load_psm.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -310,7 +310,7 @@ // "TITL" - Song Title FileReader titleChunk = chunks.GetChunk(PSMChunk::idTITL); - titleChunk.ReadString<mpt::String::spacePadded>(m_szNames[0], titleChunk.GetLength()); + titleChunk.ReadString<mpt::String::spacePadded>(songName, titleChunk.GetLength()); // "SDFT" - Format info (song data starts here) if(!chunks.GetChunk(PSMChunk::idSDFT).ReadMagic("MAINSONG")) @@ -1174,7 +1174,7 @@ m_nDefaultSpeed = fileHeader.songSpeed; m_nDefaultTempo = fileHeader.songTempo; - mpt::String::Read<mpt::String::spacePadded>(m_szNames[0], fileHeader.songName); + mpt::String::Read<mpt::String::spacePadded>(songName, fileHeader.songName); // Read orders if(fileHeader.orderOffset > 4 && file.Seek(fileHeader.orderOffset - 4) && file.ReadUint32LE() == PSM16FileHeader::idPORD) Modified: trunk/OpenMPT/soundlib/Load_ptm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ptm.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/Load_ptm.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -154,7 +154,7 @@ return true; } - mpt::String::Read<mpt::String::maybeNullTerminated>(m_szNames[0], fileHeader.songname); + mpt::String::Read<mpt::String::maybeNullTerminated>(songName, fileHeader.songname); InitializeGlobals(); madeWithTracker = mpt::String::Format("PolyTracker %d.%02x", fileHeader.versionHi, fileHeader.versionLo); Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -272,7 +272,7 @@ } m_nType = MOD_TYPE_S3M; - mpt::String::Read<mpt::String::nullTerminated>(m_szNames[0], fileHeader.name); + mpt::String::Read<mpt::String::nullTerminated>(songName, fileHeader.name); m_nMinPeriod = 64; m_nMaxPeriod = 32767; @@ -555,7 +555,7 @@ S3MFileHeader fileHeader; MemsetZero(fileHeader); - mpt::String::Write<mpt::String::nullTerminated>(fileHeader.name, m_szNames[0]); + mpt::String::Write<mpt::String::nullTerminated>(fileHeader.name, songName); fileHeader.dosEof = S3MFileHeader::idEOF; fileHeader.fileType = S3MFileHeader::idS3MType; Modified: trunk/OpenMPT/soundlib/Load_stm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_stm.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/Load_stm.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -132,7 +132,7 @@ return true; } - mpt::String::Read<mpt::String::maybeNullTerminated>(m_szNames[0], fileHeader.songname); + mpt::String::Read<mpt::String::maybeNullTerminated>(songName, fileHeader.songname); // Read STM header InitializeGlobals(); Modified: trunk/OpenMPT/soundlib/Load_ult.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ult.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/Load_ult.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -393,7 +393,7 @@ } InitializeGlobals(); - mpt::String::Read<mpt::String::maybeNullTerminated>(m_szNames[0], fileHeader.songName); + mpt::String::Read<mpt::String::maybeNullTerminated>(songName, fileHeader.songName); const char *versions[] = {"<1.4", "1.4", "1.5", "1.6"}; madeWithTracker = "UltraTracker "; Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -310,7 +310,7 @@ madeWithTracker = mpt::String::RTrim(madeWithTracker); } - mpt::String::Read<mpt::String::spacePadded>(m_szNames[0], fileHeader.songName); + mpt::String::Read<mpt::String::spacePadded>(songName, fileHeader.songName); m_nMinPeriod = 27; m_nMaxPeriod = 54784; @@ -666,7 +666,7 @@ MemsetZero(fileHeader); memcpy(fileHeader.signature, "Extended Module: ", 17); - mpt::String::Write<mpt::String::spacePadded>(fileHeader.songName, m_szNames[0]); + mpt::String::Write<mpt::String::spacePadded>(fileHeader.songName, songName); fileHeader.eof = 0x1A; std::string openMptTrackerName = MptVersion::GetOpenMPTVersionStr(); mpt::String::Write<mpt::String::spacePadded>(fileHeader.trackerName, openMptTrackerName); Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -1823,9 +1823,9 @@ bool CSoundFile::SetTitle(const std::string & newTitle) //----------------------------------------------------- { - if(m_szNames[0] != newTitle) + if(songName != newTitle) { - mpt::String::CopyN(m_szNames[0], &newTitle[0], newTitle.length()); + mpt::String::Copy(songName, newTitle); return true; } return false; Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/Sndfile.h 2013-07-04 00:13:36 UTC (rev 2490) @@ -443,6 +443,9 @@ RowVisitor visitedSongRows; public: + + std::string songName; + // Song message SongMessage songMessage; std::string madeWithTracker; @@ -520,7 +523,7 @@ void DontLoopPattern(PATTERNINDEX nPat, ROWINDEX nRow = 0); //rewbs.playSongFromCursor void SetCurrentPos(UINT nPos); void SetCurrentOrder(ORDERINDEX nOrder); - std::string GetTitle() const { return m_szNames[0]; } + std::string GetTitle() const { return songName; } bool SetTitle(const std::string &newTitle); // Return true if title was changed. LPCTSTR GetSampleName(UINT nSample) const; const char *GetInstrumentName(INSTRUMENTINDEX nInstr) const; Modified: trunk/OpenMPT/soundlib/load_j2b.cpp =================================================================== --- trunk/OpenMPT/soundlib/load_j2b.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/load_j2b.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -793,7 +793,7 @@ ASSERT(mainChunk.unknown == LittleEndian(0xFF0001C5) || mainChunk.unknown == LittleEndian(0x35800716) || mainChunk.unknown == LittleEndian(0xFF00FFFF)); - mpt::String::Read<mpt::String::maybeNullTerminated>(m_szNames[0], mainChunk.songname); + mpt::String::Read<mpt::String::maybeNullTerminated>(songName, mainChunk.songname); // It seems like there's no way to differentiate between // Muted and Surround channels (they're all 0xA0) - might Modified: trunk/OpenMPT/soundlib/pattern.cpp =================================================================== --- trunk/OpenMPT/soundlib/pattern.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/pattern.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -210,6 +210,14 @@ } +bool CPattern::SetName(const std::string &newName) +//------------------------------------------------ +{ + m_PatternName.assign(newName); + return true; +} + + bool CPattern::SetName(const char *newName, size_t maxChars) //---------------------------------------------------------- { Modified: trunk/OpenMPT/soundlib/pattern.h =================================================================== --- trunk/OpenMPT/soundlib/pattern.h 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/soundlib/pattern.h 2013-07-04 00:13:36 UTC (rev 2490) @@ -89,6 +89,7 @@ void RemoveSignature() { m_RowsPerBeat = m_RowsPerMeasure = 0; } // Pattern name functions - bool functions return true on success. + bool SetName(const std::string &newName); bool SetName(const char *newName, size_t maxChars = MAX_PATTERNNAME); template<size_t bufferSize> bool SetName(const char (&buffer)[bufferSize]) Modified: trunk/OpenMPT/test/test.cpp =================================================================== --- trunk/OpenMPT/test/test.cpp 2013-07-03 23:57:30 UTC (rev 2489) +++ trunk/OpenMPT/test/test.cpp 2013-07-04 00:13:36 UTC (rev 2490) @@ -627,7 +627,7 @@ #endif // MODPLUG_TRACKER // Global Variables - VERIFY_EQUAL_NONCONT(strcmp(sndFile.m_szNames[0], "Test Module"), 0); + VERIFY_EQUAL_NONCONT(sndFile.GetTitle(), "Test Module"); VERIFY_EQUAL_NONCONT(sndFile.songMessage.at(0), 'O'); VERIFY_EQUAL_NONCONT(sndFile.m_nDefaultTempo, 139); VERIFY_EQUAL_NONCONT(sndFile.m_nDefaultSpeed, 5); @@ -826,7 +826,7 @@ #endif // MODPLUG_TRACKER // Global Variables - VERIFY_EQUAL_NONCONT(strcmp(sndFile.m_szNames[0], "Test Module_____________X"), 0); + VERIFY_EQUAL_NONCONT(sndFile.GetTitle(), "Test Module_____________X"); VERIFY_EQUAL_NONCONT(sndFile.songMessage.at(0), 'O'); VERIFY_EQUAL_NONCONT(sndFile.m_nDefaultTempo, 139); VERIFY_EQUAL_NONCONT(sndFile.m_nDefaultSpeed, 5); @@ -1085,7 +1085,7 @@ { // Global Variables - VERIFY_EQUAL_NONCONT(strcmp(sndFile.m_szNames[0], "S3M_Test__________________X"), 0); + VERIFY_EQUAL_NONCONT(sndFile.GetTitle(), "S3M_Test__________________X"); VERIFY_EQUAL_NONCONT(sndFile.m_nDefaultTempo, 33); VERIFY_EQUAL_NONCONT(sndFile.m_nDefaultSpeed, 254); VERIFY_EQUAL_NONCONT(sndFile.m_nGlobalVolume, 32 * 4); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-07-04 00:40:09
|
Revision: 2492 http://sourceforge.net/p/modplug/code/2492 Author: manxorist Date: 2013-07-04 00:40:04 +0000 (Thu, 04 Jul 2013) Log Message: ----------- [Ref] Add saturate_cast for floating point source types. Modified Paths: -------------- trunk/OpenMPT/common/misc_util.h trunk/OpenMPT/test/test.cpp Modified: trunk/OpenMPT/common/misc_util.h =================================================================== --- trunk/OpenMPT/common/misc_util.h 2013-07-04 00:21:34 UTC (rev 2491) +++ trunk/OpenMPT/common/misc_util.h 2013-07-04 00:40:04 UTC (rev 2492) @@ -131,6 +131,36 @@ } } +template <typename Tdst> +inline Tdst saturate_cast(double src) +//----------------------------------- +{ + if(src >= std::numeric_limits<Tdst>::max()) + { + return std::numeric_limits<Tdst>::max(); + } + if(src <= std::numeric_limits<Tdst>::min()) + { + return std::numeric_limits<Tdst>::min(); + } + return static_cast<Tdst>(src); +} + +template <typename Tdst> +inline Tdst saturate_cast(float src) +//---------------------------------- +{ + if(src >= std::numeric_limits<Tdst>::max()) + { + return std::numeric_limits<Tdst>::max(); + } + if(src <= std::numeric_limits<Tdst>::min()) + { + return std::numeric_limits<Tdst>::min(); + } + return static_cast<Tdst>(src); +} + } // namespace mpt Modified: trunk/OpenMPT/test/test.cpp =================================================================== --- trunk/OpenMPT/test/test.cpp 2013-07-04 00:21:34 UTC (rev 2491) +++ trunk/OpenMPT/test/test.cpp 2013-07-04 00:40:04 UTC (rev 2492) @@ -547,6 +547,8 @@ VERIFY_EQUAL( mpt::saturate_cast<uint32>(std::numeric_limits<int32>::min() - int64(1)), std::numeric_limits<uint32>::min() ); VERIFY_EQUAL( mpt::saturate_cast<uint32>(std::numeric_limits<int32>::max() + int64(1)), (uint32)std::numeric_limits<int32>::max() + 1 ); + VERIFY_EQUAL( mpt::saturate_cast<uint32>(static_cast<double>(std::numeric_limits<int64>::max())), std::numeric_limits<uint32>::max() ); + VERIFY_EQUAL( mpt::String::LTrim(" "), "" ); VERIFY_EQUAL( mpt::String::RTrim(" "), "" ); VERIFY_EQUAL( mpt::String::Trim(" "), "" ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-07-04 15:02:01
|
Revision: 2496 http://sourceforge.net/p/modplug/code/2496 Author: manxorist Date: 2013-07-04 15:01:53 +0000 (Thu, 04 Jul 2013) Log Message: ----------- [Ref] WAV export: Rewrite normalization. [Fix] WAV export: Do not clamp rendered output before normalizing. [Imp] WAV export: Also support normalization for 32bit float output files. [Fix] WAV export: Properly dither normalized output files. [Ref] Remove soundlib/Waveform.cpp which is not needed anymore. [Ref] Remove deprecated DitherStateless. Modified Paths: -------------- trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj.filters trunk/OpenMPT/mptrack/Mod2wave.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/mptrack_08.vcproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters trunk/OpenMPT/soundlib/Fastmix.cpp trunk/OpenMPT/soundlib/Sndfile.h Removed Paths: ------------- trunk/OpenMPT/soundlib/Waveform.cpp Modified: trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj 2013-07-04 13:26:51 UTC (rev 2495) +++ trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj 2013-07-04 15:01:53 UTC (rev 2496) @@ -450,7 +450,6 @@ <ClCompile Include="..\soundlib\tuning.cpp" /> <ClCompile Include="..\soundlib\tuningbase.cpp" /> <ClCompile Include="..\soundlib\tuningCollection.cpp" /> - <ClCompile Include="..\soundlib\Waveform.cpp" /> <ClCompile Include="..\soundlib\WAVTools.cpp" /> <ClCompile Include="..\soundlib\WindowedFIR.cpp" /> <ClCompile Include="..\soundlib\XMTools.cpp" /> Modified: trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj.filters =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj.filters 2013-07-04 13:26:51 UTC (rev 2495) +++ trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj.filters 2013-07-04 15:01:53 UTC (rev 2496) @@ -439,9 +439,6 @@ <ClCompile Include="..\soundlib\tuningCollection.cpp"> <Filter>Source Files\soundlib</Filter> </ClCompile> - <ClCompile Include="..\soundlib\Waveform.cpp"> - <Filter>Source Files\soundlib</Filter> - </ClCompile> <ClCompile Include="..\soundlib\WAVTools.cpp"> <Filter>Source Files\soundlib</Filter> </ClCompile> Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mod2wave.cpp 2013-07-04 13:26:51 UTC (rev 2495) +++ trunk/OpenMPT/mptrack/Mod2wave.cpp 2013-07-04 15:01:53 UTC (rev 2496) @@ -26,6 +26,9 @@ extern UINT nMixingRates[NUMMIXRATE]; extern LPCSTR gszChnCfgNames[3]; +static const GUID guid_MEDIASUBTYPE_PCM = {0x00000001, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71}; +static const GUID guid_MEDIASUBTYPE_IEEE_FLOAT = {0x00000003, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71}; + /////////////////////////////////////////////////////////////////////////////////////////////////// // ID3v1 Genres @@ -185,8 +188,7 @@ //---------------------------------- { DWORD dwFormat = m_CbnSampleFormat.GetItemData(m_CbnSampleFormat.GetCurSel()); - UINT nBits = dwFormat & 0xFF; - ::EnableWindow( ::GetDlgItem(m_hWnd, IDC_CHECK5), (nBits <= 24) ? TRUE : FALSE ); + (void)dwFormat; } @@ -310,7 +312,6 @@ // MultiChannel configuration if ((WaveFormat.Format.wBitsPerSample == 32) || (WaveFormat.Format.nChannels > 2)) { - const GUID guid_MEDIASUBTYPE_PCM = {0x00000001, 0x0000, 0x0010, 0x80, 0x00, 0x0, 0xAA, 0x0, 0x38, 0x9B, 0x71}; WaveFormat.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; WaveFormat.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX); WaveFormat.Samples.wValidBitsPerSample = WaveFormat.Format.wBitsPerSample; @@ -601,12 +602,13 @@ //------------------------------ { static char buffer[MIXBUFFERSIZE * 4 * 4]; // channels * sizeof(biggestsample) + static float floatbuffer[MIXBUFFERSIZE * 4]; // channels + static int mixbuffer[MIXBUFFERSIZE * 4]; // channels MSG msg; CHAR s[80]; HWND progress = ::GetDlgItem(m_hWnd, IDC_PROGRESS1); UINT ok = IDOK, pos = 0; uint64 ullSamples = 0, ullMaxSamples; - LONG lMax = 256; if (!m_pSndFile || !m_lpszFileName) { @@ -614,6 +616,7 @@ return; } + float normalizePeak = 0.0f; std::string normalizeFileName = _tempnam("", "OpenMPT_mod2wave"); std::fstream normalizeFile; if(m_bNormalize) @@ -638,16 +641,13 @@ mixersettings.m_SampleFormat = (m_pWaveFormat->wFormatTag == WAVE_FORMAT_IEEE_FLOAT) ? SampleFormatFloat32 : (SampleFormat)m_pWaveFormat->wBitsPerSample; mixersettings.gnChannels = m_pWaveFormat->nChannels; m_pSndFile->m_SongFlags.reset(SONG_PAUSED | SONG_STEP); - if ((m_bNormalize) && (m_pWaveFormat->wBitsPerSample <= 24)) + if(m_bNormalize) { - mixersettings.m_SampleFormat = SampleFormatInt24; + mixersettings.m_SampleFormat = SampleFormatFloat32; #ifndef NO_AGC mixersettings.DSPMask &= ~SNDDSP_AGC; #endif if(mixersettings.m_nPreAmp > 128) mixersettings.m_nPreAmp = 128; - } else - { - m_bNormalize = false; } m_pSndFile->ResetChannels(); @@ -689,7 +689,7 @@ m_pSndFile->m_PatternCuePoints.reserve(m_pSndFile->Order.GetLength()); // Process the conversion - UINT nBytesPerSample = (m_pSndFile->m_MixerSettings.GetBitsPerSample() * m_pSndFile->m_MixerSettings.gnChannels) / 8; + // For calculating the remaining time DWORD dwStartTime = timeGetTime(); // For giving away some processing time every now and then @@ -702,7 +702,14 @@ CMainFrame::GetMainFrame()->InitRenderer(m_pSndFile); //rewbs.VSTTimeInfo for (UINT n = 0; ; n++) { - UINT lRead = m_pSndFile->ReadInterleaved(buffer, MIXBUFFERSIZE); + UINT lRead = 0; + if(m_bNormalize) + { + lRead = m_pSndFile->ReadInterleaved(floatbuffer, MIXBUFFERSIZE); + } else + { + lRead = m_pSndFile->ReadInterleaved(buffer, MIXBUFFERSIZE); + } // Process cue points (add base offset), if there are any to process. std::vector<PatternCuePoint>::reverse_iterator iter; @@ -729,23 +736,24 @@ if (m_bNormalize) { - UINT imax = lRead*3*m_pSndFile->m_MixerSettings.gnChannels; - for (UINT i=0; i<imax; i+=3) + std::size_t countSamples = lRead * m_pSndFile->m_MixerSettings.gnChannels; + const float *src = floatbuffer; + while(countSamples--) { - LONG l = ((((buffer[i+2] << 8) + buffer[i+1]) << 8) + buffer[i]) << 8; - l /= 256; - if (l > lMax) lMax = l; - if (-l > lMax) lMax = -l; + const float val = *src; + if(val > normalizePeak) normalizePeak = val; + else if(0.0f - val >= normalizePeak) normalizePeak = 0.0f - val; + src++; } - normalizeFile.write(buffer, lRead * nBytesPerSample); - if(normalizeFile.gcount() != lRead * nBytesPerSample) + normalizeFile.write(reinterpret_cast<const char*>(floatbuffer), lRead * sizeof(float)); + if(!normalizeFile) break; } else { - UINT lWrite = fwrite(buffer, 1, lRead * nBytesPerSample, file.GetFile()); + UINT lWrite = fwrite(buffer, 1, lRead * m_pSndFile->m_MixerSettings.gnChannels * (m_pSndFile->m_MixerSettings.GetBitsPerSample()/8), file.GetFile()); if (!lWrite) break; bytesWritten += lWrite; @@ -806,6 +814,9 @@ { ::SendMessage(progress, PBM_SETRANGE, 0, MAKELPARAM(0, 100)); + const float normalizeFactor = (normalizePeak != 0.0f) ? (1.0f / normalizePeak) : 1.0f; + Dither dither; + const DWORD dwBitSize = m_pWaveFormat->wBitsPerSample / 8; const uint64 framesTotal = ullSamples; int lastPercent = -1; @@ -816,16 +827,43 @@ uint64 framesToProcess = framesTotal; while(framesToProcess) { - const uint64 framesChunk = std::min<uint64>(framesToProcess, MIXBUFFERSIZE); + const std::size_t framesChunk = std::min<std::size_t>(mpt::saturate_cast<std::size_t>(framesToProcess), MIXBUFFERSIZE); + const std::size_t samplesChunk = framesChunk * m_pWaveFormat->nChannels; - normalizeFile.read(buffer, framesChunk * nBytesPerSample); - if(normalizeFile.gcount() != framesChunk * nBytesPerSample) + normalizeFile.read(reinterpret_cast<char*>(floatbuffer), framesChunk * sizeof(float)); + if(normalizeFile.gcount() != framesChunk * sizeof(float)) break; - m_pSndFile->Normalize24BitBuffer((LPBYTE)buffer, framesChunk * nBytesPerSample, lMax, dwBitSize); + for(std::size_t i = 0; i < samplesChunk; ++i) + { + floatbuffer[i] *= normalizeFactor; + } + if( + m_pWaveFormat->wFormatTag == WAVE_FORMAT_IEEE_FLOAT + || (m_pWaveFormat->wFormatTag == WAVE_FORMAT_EXTENSIBLE && reinterpret_cast<const WAVEFORMATEXTENSIBLE*>(m_pWaveFormat)->SubFormat == guid_MEDIASUBTYPE_IEEE_FLOAT) + ) + { + // Do not dither for 32bit float output. + ASSERT(sizeof(float) == dwBitSize); + std::memcpy(buffer, floatbuffer, samplesChunk * sizeof(float)); + } else + { + // Convert float buffer to mixbuffer format so we can apply dither. + // This can probably be changed in the future when dither supports floating point input directly. + FloatToMonoMix(floatbuffer, mixbuffer, samplesChunk, MIXING_SCALEF); + dither.Process(mixbuffer, framesChunk, m_pWaveFormat->nChannels, m_pWaveFormat->wBitsPerSample); + switch(dwBitSize) + { + case 1: Convert32ToInterleaved(reinterpret_cast<uint8*>(buffer), mixbuffer, samplesChunk); break; + case 2: Convert32ToInterleaved(reinterpret_cast<int16*>(buffer), mixbuffer, samplesChunk); break; + case 3: Convert32ToInterleaved(reinterpret_cast<int24*>(buffer), mixbuffer, samplesChunk); break; + case 4: Convert32ToInterleaved(reinterpret_cast<int32*>(buffer), mixbuffer, samplesChunk); break; + default: ASSERT(false); break; + } + } - fwrite(buffer, 1, framesChunk * dwBitSize * m_pWaveFormat->nChannels, file.GetFile()); - bytesWritten += framesChunk * dwBitSize * m_pWaveFormat->nChannels; + fwrite(buffer, 1, samplesChunk * dwBitSize, file.GetFile()); + bytesWritten += samplesChunk * dwBitSize; { int percent = static_cast<int>(100 * framesProcessed / framesTotal); Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2013-07-04 13:26:51 UTC (rev 2495) +++ trunk/OpenMPT/mptrack/mptrack.rc 2013-07-04 15:01:53 UTC (rev 2496) @@ -463,7 +463,7 @@ CONTROL "&Channel mode (one file per channel)",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,54,168,12 CONTROL "&Instrument mode (one file per instrument)",IDC_CHECK6, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,66,168,12 - CONTROL "&Normalize Output (experimental)",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,84,168,12 + CONTROL "&Normalize Output",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,84,168,12 CONTROL "Slow &render (for Kontakt+DFD)",IDC_GIVEPLUGSIDLETIME, "Button",BS_AUTOCHECKBOX | BS_LEFT | BS_MULTILINE | WS_TABSTOP,18,97,168,12 CONTROL "Limit file &size to: (KBytes)",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,138,111,11 Modified: trunk/OpenMPT/mptrack/mptrack_08.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_08.vcproj 2013-07-04 13:26:51 UTC (rev 2495) +++ trunk/OpenMPT/mptrack/mptrack_08.vcproj 2013-07-04 15:01:53 UTC (rev 2496) @@ -615,10 +615,6 @@ > </File> <File - RelativePath="..\soundlib\Waveform.cpp" - > - </File> - <File RelativePath="..\soundlib\WindowedFIR.cpp" > </File> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2013-07-04 13:26:51 UTC (rev 2495) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2013-07-04 15:01:53 UTC (rev 2496) @@ -296,7 +296,6 @@ <ClCompile Include="..\soundlib\Snd_fx.cpp" /> <ClCompile Include="..\soundlib\SoundFilePlayConfig.cpp" /> <ClCompile Include="..\soundlib\Tables.cpp" /> - <ClCompile Include="..\soundlib\Waveform.cpp" /> <ClCompile Include="..\soundlib\WAVTools.cpp" /> <ClCompile Include="..\soundlib\WindowedFIR.cpp" /> <ClCompile Include="..\soundlib\XMTools.cpp" /> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2013-07-04 13:26:51 UTC (rev 2495) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2013-07-04 15:01:53 UTC (rev 2496) @@ -253,9 +253,6 @@ <ClCompile Include="..\soundlib\Tables.cpp"> <Filter>Source Files\soundlib</Filter> </ClCompile> - <ClCompile Include="..\soundlib\Waveform.cpp"> - <Filter>Source Files\soundlib</Filter> - </ClCompile> <ClCompile Include="TuningDialog.cpp"> <Filter>Source Files\mptrack\Tuning</Filter> </ClCompile> Modified: trunk/OpenMPT/soundlib/Fastmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Fastmix.cpp 2013-07-04 13:26:51 UTC (rev 2495) +++ trunk/OpenMPT/soundlib/Fastmix.cpp 2013-07-04 15:01:53 UTC (rev 2496) @@ -2175,17 +2175,6 @@ } -void DitherStateless(int *pBuffer, UINT nSamples, UINT nBits) -//----------------------------------------------------------- -{ - #if defined(ENABLE_X86) - X86_Dither(pBuffer, nSamples, nBits, nullptr); - #else - C_Dither(pBuffer, nSamples, nBits, nullptr); - #endif -} - - #ifdef ENABLE_X86 static void X86_InterleaveFrontRear(int *pFrontBuf, int *pRearBuf, DWORD nFrames) //------------------------------------------------------------------------------- Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2013-07-04 13:26:51 UTC (rev 2495) +++ trunk/OpenMPT/soundlib/Sndfile.h 2013-07-04 15:01:53 UTC (rev 2496) @@ -221,9 +221,7 @@ void Process(int *mixbuffer, std::size_t count, std::size_t channels, int bits); }; -DEPRECATED void DitherStateless(int *pBuffer, UINT nSamples, UINT nBits); - void StereoMixToFloat(const int *pSrc, float *pOut1, float *pOut2, UINT nCount, const float _i2fc); void FloatToStereoMix(const float *pIn1, const float *pIn2, int *pOut, UINT nCount, const float _f2ic); void MonoMixToFloat(const int *pSrc, float *pOut, UINT nCount, const float _i2fc); @@ -850,9 +848,6 @@ ModInstrument *AllocateInstrument(INSTRUMENTINDEX instr, SAMPLEINDEX assignedSample = 0); - // WAV export - UINT Normalize24BitBuffer(LPBYTE pbuffer, UINT cbsizebytes, DWORD lmax24, DWORD dwByteInc); - private: PLUGINDEX GetChannelPlugin(CHANNELINDEX nChn, PluginMutePriority respectMutes) const; PLUGINDEX GetActiveInstrumentPlugin(CHANNELINDEX, PluginMutePriority respectMutes) const; Deleted: trunk/OpenMPT/soundlib/Waveform.cpp =================================================================== --- trunk/OpenMPT/soundlib/Waveform.cpp 2013-07-04 13:26:51 UTC (rev 2495) +++ trunk/OpenMPT/soundlib/Waveform.cpp 2013-07-04 15:01:53 UTC (rev 2496) @@ -1,96 +0,0 @@ -/* - * Waveform.cpp - * ------------ - * Purpose: Common audio buffer conversion functions. - * Notes : (currently none) - * Authors: Olivier Lapicque - * OpenMPT Devs - * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. - */ - - -#include "stdafx.h" -#include "Sndfile.h" - -#ifdef ENABLE_X86 - -#pragma warning(disable:4100) -#pragma warning(disable:4731) - -static void X86_Normalize24BitBuffer(LPBYTE pbuffer, UINT dwSize, DWORD lmax24, int *poutput) -{ - _asm { - mov esi, pbuffer // esi = edi = pbuffer - mov edx, dwSize // edx = dwSize - mov ebx, lmax24 // ebx = max - mov edi, poutput // edi = output 32-bit buffer - push ebp - mov ebp, edx // ebp = dwSize - cmp ebx, 256 - jg normloop - mov ebx, 256 -normloop: - movsx eax, byte ptr [esi+2] - movzx edx, byte ptr [esi+1] - shl eax, 8 - or eax, edx - movzx edx, byte ptr [esi] - shl eax, 8 - or eax, edx // eax = 24-bit sample - mov edx, 1 << (31-MIXING_ATTENUATION) - add esi, 3 - imul edx - add edi, 4 - idiv ebx // eax = 28-bit normalized sample - dec ebp - mov dword ptr [edi-4], eax - jnz normloop - pop ebp - } -} - -#pragma warning(default:4100) - -#endif - - -UINT CSoundFile::Normalize24BitBuffer(LPBYTE pbuffer, UINT dwSize, DWORD lmax24, DWORD dwByteInc) -//----------------------------------------------------------------------------------------------- -{ -#ifdef ENABLE_X86 - int * const tempbuf = MixSoundBuffer; - int n = dwSize / 3; - while (n > 0) - { - int nbuf = (n > MIXBUFFERSIZE * 2) ? MIXBUFFERSIZE * 2 : n; - X86_Normalize24BitBuffer(pbuffer, nbuf, lmax24, tempbuf); - DitherStateless(tempbuf, nbuf, 8 * dwByteInc); - switch(dwByteInc) - { - case 1: Convert32ToInterleaved((uint8*)pbuffer, tempbuf, nbuf); break; - case 2: Convert32ToInterleaved((int16*)pbuffer, tempbuf, nbuf); break; - case 3: Convert32ToInterleaved((int24*)pbuffer, tempbuf, nbuf); break; - } - n -= nbuf; - pbuffer += dwByteInc * nbuf; - } - return (dwSize/3) * dwByteInc; -#else - LONG lMax = (lmax24 / 128) + 1; - UINT i = 0; - for (UINT j=0; j<dwSize; j+=3, i+=dwByteInc) - { - LONG l = ((((pbuffer[j+2] << 8) + pbuffer[j+1]) << 8) + pbuffer[j]) << 8; - l /= lMax; - if (dwByteInc > 1) - { - pbuffer[i] = (BYTE)(l & 0xFF); - pbuffer[i+1] = (BYTE)(l >> 8); - } else - { - pbuffer[i] = (BYTE)((l + 0x8000) >> 8); - } - } - return i; -#endif -} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2013-07-04 23:15:26
|
Revision: 2498 http://sourceforge.net/p/modplug/code/2498 Author: saga-games Date: 2013-07-04 23:15:17 +0000 (Thu, 04 Jul 2013) Log Message: ----------- [Ref] Small changes here and there. Modified Paths: -------------- trunk/OpenMPT/common/StringFixer.h trunk/OpenMPT/mptrack/Autotune.cpp trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/soundlib/ModChannel.h trunk/OpenMPT/soundlib/RowVisitor.cpp Modified: trunk/OpenMPT/common/StringFixer.h =================================================================== --- trunk/OpenMPT/common/StringFixer.h 2013-07-04 17:24:55 UTC (rev 2497) +++ trunk/OpenMPT/common/StringFixer.h 2013-07-04 23:15:17 UTC (rev 2498) @@ -163,7 +163,7 @@ //---------------------------------------------------------------------------------- { STATIC_ASSERT(destSize > 0); - ASSERT(srcSize > 0); + //ASSERT(srcSize > 0); const size_t maxSize = MIN(destSize, srcSize); char *dst = destBuffer; Modified: trunk/OpenMPT/mptrack/Autotune.cpp =================================================================== --- trunk/OpenMPT/mptrack/Autotune.cpp 2013-07-04 17:24:55 UTC (rev 2497) +++ trunk/OpenMPT/mptrack/Autotune.cpp 2013-07-04 23:15:17 UTC (rev 2498) @@ -235,7 +235,7 @@ const double newFundamentalFreq = NoteToFrequency(static_cast<double>(69 - targetNote) + static_cast<double>(minimumBin) / BINS_PER_NOTE, pitchReference); - sample.nC5Speed = (UINT)Util::Round(sample.nC5Speed * pitchReference / newFundamentalFreq); + sample.nC5Speed = Util::Round<uint32>(sample.nC5Speed * pitchReference / newFundamentalFreq); if((modType & (MOD_TYPE_XM | MOD_TYPE_MOD)) != 0) { Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2013-07-04 17:24:55 UTC (rev 2497) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2013-07-04 23:15:17 UTC (rev 2498) @@ -785,27 +785,27 @@ void CCtrlPatterns::OnPatternNew() //-------------------------------- { - ORDERINDEX nCurOrd = m_OrderList.GetCurSel(true).firstOrd; - PATTERNINDEX nCurPat = m_sndFile.Order[nCurOrd]; + ORDERINDEX curOrd = m_OrderList.GetCurSel(true).firstOrd; + PATTERNINDEX curPat = m_sndFile.Order[curOrd]; ROWINDEX rows = 64; - if(m_sndFile.Patterns.IsValidPat(nCurPat)) + if(m_sndFile.Patterns.IsValidPat(curPat)) { - nCurOrd++; // only if the current oder is already occupied, create a new pattern at the next position. - rows = m_sndFile.Patterns[nCurPat].GetNumRows(); + curOrd++; // only if the current oder is already occupied, create a new pattern at the next position. + rows = m_sndFile.Patterns[curPat].GetNumRows(); rows = Clamp(rows, m_sndFile.GetModSpecifications().patternRowsMin, m_sndFile.GetModSpecifications().patternRowsMax); } - PATTERNINDEX nNewPat = m_modDoc.InsertPattern(nCurOrd, rows); - if ((nNewPat != PATTERNINDEX_INVALID) && (nNewPat < m_sndFile.Patterns.Size())) + PATTERNINDEX newPat = m_modDoc.InsertPattern(curOrd, rows); + if ((newPat != PATTERNINDEX_INVALID) && (newPat < m_sndFile.Patterns.Size())) { // update time signature - if(m_sndFile.Patterns.IsValidIndex(nCurPat) && m_sndFile.Patterns[nCurPat].GetOverrideSignature()) + if(m_sndFile.Patterns.IsValidIndex(curPat) && m_sndFile.Patterns[curPat].GetOverrideSignature()) { - m_sndFile.Patterns[nNewPat].SetSignature(m_sndFile.Patterns[nCurPat].GetRowsPerBeat(), m_sndFile.Patterns[nCurPat].GetRowsPerMeasure()); + m_sndFile.Patterns[newPat].SetSignature(m_sndFile.Patterns[curPat].GetRowsPerBeat(), m_sndFile.Patterns[curPat].GetRowsPerMeasure()); } // move to new pattern - m_OrderList.SetCurSel(nCurOrd); + m_OrderList.SetCurSel(curOrd); m_OrderList.InvalidateRect(NULL, FALSE); - SetCurrentPattern(nNewPat); + SetCurrentPattern(newPat); m_modDoc.SetModified(); m_modDoc.UpdateAllViews(NULL, HINT_MODSEQUENCE|HINT_PATNAMES, this); } @@ -817,46 +817,44 @@ void CCtrlPatterns::OnPatternDuplicate() //-------------------------------------- { - CSoundFile &sndFile = m_modDoc.GetrSoundFile(); - OrdSelection selection = m_OrderList.GetCurSel(false); const ORDERINDEX insertCount = selection.lastOrd - selection.firstOrd; const ORDERINDEX insertWhere = selection.firstOrd + insertCount + 1; - if (insertWhere >= sndFile.GetModSpecifications().ordersMax) + if(insertWhere >= m_sndFile.GetModSpecifications().ordersMax) return; bool success = false; // Has this pattern been duplicated already? (for multiselect) - std::vector<PATTERNINDEX> patReplaceIndex(sndFile.Patterns.Size(), PATTERNINDEX_INVALID); + std::vector<PATTERNINDEX> patReplaceIndex(m_sndFile.Patterns.Size(), PATTERNINDEX_INVALID); for(ORDERINDEX i = 0; i <= insertCount; i++) { - PATTERNINDEX nCurPat = sndFile.Order[selection.firstOrd + i]; - if (sndFile.Patterns.IsValidIndex(nCurPat) && patReplaceIndex[nCurPat] == PATTERNINDEX_INVALID) + PATTERNINDEX curPat = m_sndFile.Order[selection.firstOrd + i]; + if(m_sndFile.Patterns.IsValidIndex(curPat) && patReplaceIndex[curPat] == PATTERNINDEX_INVALID) { - ROWINDEX rows = sndFile.Patterns[nCurPat].GetNumRows(); - Limit(rows, sndFile.GetModSpecifications().patternRowsMin, sndFile.GetModSpecifications().patternRowsMax); + ROWINDEX rows = m_sndFile.Patterns[curPat].GetNumRows(); + Limit(rows, m_sndFile.GetModSpecifications().patternRowsMin, m_sndFile.GetModSpecifications().patternRowsMax); - PATTERNINDEX nNewPat = m_modDoc.InsertPattern(insertWhere + i, rows); - if ((nNewPat != PATTERNINDEX_INVALID) && (nNewPat < sndFile.Patterns.Size()) && (sndFile.Patterns[nCurPat] != nullptr)) + PATTERNINDEX newPat = m_modDoc.InsertPattern(insertWhere + i, rows); + if((newPat != PATTERNINDEX_INVALID) && (newPat < m_sndFile.Patterns.Size()) && (m_sndFile.Patterns[curPat] != nullptr)) { // Update time signature and pattern name - if(sndFile.Patterns[nCurPat].GetOverrideSignature()) + if(m_sndFile.Patterns[curPat].GetOverrideSignature()) { - sndFile.Patterns[nNewPat].SetSignature(sndFile.Patterns[nCurPat].GetRowsPerBeat(), sndFile.Patterns[nCurPat].GetRowsPerMeasure()); + m_sndFile.Patterns[newPat].SetSignature(m_sndFile.Patterns[curPat].GetRowsPerBeat(), m_sndFile.Patterns[curPat].GetRowsPerMeasure()); } - sndFile.Patterns[nNewPat].SetName(sndFile.Patterns[nCurPat].GetName()); + m_sndFile.Patterns[newPat].SetName(m_sndFile.Patterns[curPat].GetName()); // Copy pattern data - size_t n = sndFile.Patterns[nCurPat].GetNumRows(); - if (sndFile.Patterns[nNewPat].GetNumRows() < n) n = sndFile.Patterns[nNewPat].GetNumRows(); - n *= sndFile.GetNumChannels(); + size_t n = m_sndFile.Patterns[curPat].GetNumRows(); + if (m_sndFile.Patterns[newPat].GetNumRows() < n) n = m_sndFile.Patterns[newPat].GetNumRows(); + n *= m_sndFile.GetNumChannels(); if(n) { - memcpy(sndFile.Patterns[nNewPat], sndFile.Patterns[nCurPat], n * sizeof(ModCommand)); + memcpy(m_sndFile.Patterns[newPat], m_sndFile.Patterns[curPat], n * sizeof(ModCommand)); } success = true; // Mark as duplicated, so if this pattern is to be duplicated again, the same new pattern number is inserted into the order list. - patReplaceIndex[nCurPat] = nNewPat; + patReplaceIndex[curPat] = newPat; } else { continue; @@ -864,21 +862,21 @@ } else { // Invalid pattern, or it has been duplicated before (multiselect) - for (int j = sndFile.Order.size() - 1; j > selection.firstOrd + i + insertCount + 1; j--) sndFile.Order[j] = sndFile.Order[j - 1]; + for (int j = m_sndFile.Order.size() - 1; j > selection.firstOrd + i + insertCount + 1; j--) m_sndFile.Order[j] = m_sndFile.Order[j - 1]; - PATTERNINDEX nNewPat; - if(nCurPat < sndFile.Patterns.Size() && patReplaceIndex[nCurPat] != PATTERNINDEX_INVALID) + PATTERNINDEX newPat; + if(curPat < m_sndFile.Patterns.Size() && patReplaceIndex[curPat] != PATTERNINDEX_INVALID) { // Take care of patterns that have been duplicated before - nNewPat = patReplaceIndex[nCurPat]; + newPat = patReplaceIndex[curPat]; } else { - nNewPat = sndFile.Order[selection.firstOrd + i]; + newPat = m_sndFile.Order[selection.firstOrd + i]; } - if (selection.firstOrd + i + insertCount + 1 < sndFile.Order.GetLength()) + if (selection.firstOrd + i + insertCount + 1 < m_sndFile.Order.GetLength()) { - sndFile.Order[selection.firstOrd + i + insertCount + 1] = nNewPat; + m_sndFile.Order[selection.firstOrd + i + insertCount + 1] = newPat; } success = true; @@ -891,12 +889,12 @@ m_OrderList.SetCurSel(insertWhere); // If the first duplicated order is e.g. a +++ item, we need to move the pattern display on or else we'll still edit the previously shown pattern. - ORDERINDEX showPattern = std::min(insertWhere, sndFile.Order.GetLastIndex()); - while(!sndFile.Patterns.IsValidPat(sndFile.Order[showPattern]) && showPattern < sndFile.Order.GetLastIndex()) + ORDERINDEX showPattern = std::min(insertWhere, m_sndFile.Order.GetLastIndex()); + while(!m_sndFile.Patterns.IsValidPat(m_sndFile.Order[showPattern]) && showPattern < m_sndFile.Order.GetLastIndex()) { showPattern++; } - SetCurrentPattern(sndFile.Order[showPattern]); + SetCurrentPattern(m_sndFile.Order[showPattern]); m_modDoc.SetModified(); m_modDoc.UpdateAllViews(NULL, HINT_MODSEQUENCE | HINT_PATNAMES, this); Modified: trunk/OpenMPT/soundlib/ModChannel.h =================================================================== --- trunk/OpenMPT/soundlib/ModChannel.h 2013-07-04 17:24:55 UTC (rev 2497) +++ trunk/OpenMPT/soundlib/ModChannel.h 2013-07-04 23:15:17 UTC (rev 2498) @@ -79,7 +79,6 @@ uint32 nOldGlobalVolSlide; uint32 nEFxOffset; // offset memory for Invert Loop (EFx, .MOD only) int32 nRetrigCount, nRetrigParam; - uint32 nNoteSlideCounter, nNoteSlideSpeed, nNoteSlideStep; ROWINDEX nPatternLoop; CHANNELINDEX nMasterChn; // 8-bit members @@ -103,6 +102,7 @@ uint8 nLeftVU, nRightVU; uint8 nActiveMacro, nFilterMode; uint8 nEFxSpeed, nEFxDelay; // memory for Invert Loop (EFx, .MOD only) + uint8 nNoteSlideCounter, nNoteSlideSpeed, nNoteSlideStep; // IMF / PTM Note Slide ModCommand rowCommand; Modified: trunk/OpenMPT/soundlib/RowVisitor.cpp =================================================================== --- trunk/OpenMPT/soundlib/RowVisitor.cpp 2013-07-04 17:24:55 UTC (rev 2497) +++ trunk/OpenMPT/soundlib/RowVisitor.cpp 2013-07-04 23:15:17 UTC (rev 2498) @@ -173,7 +173,7 @@ void RowVisitor::ResetPatternLoop(ORDERINDEX order, ROWINDEX startRow) //-------------------------------------------------------------------- { - ASSERT(order == currentOrder); // Should never trigger. + ASSERT(order == currentOrder); // Shouldn't trigger, unless we're jumping around in the GUI during a pattern loop. // Unvisit all rows that are in the visited row buffer, until we hit the start row for this pattern loop. ROWINDEX row = ROWINDEX_INVALID; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2013-07-04 23:22:08
|
Revision: 2499 http://sourceforge.net/p/modplug/code/2499 Author: saga-games Date: 2013-07-04 23:22:02 +0000 (Thu, 04 Jul 2013) Log Message: ----------- [Mod] Pattern Clipboard Manager: Better handling of lost focus in renaming box [Mod] Don't save some superfluous extended song properties, depending on output format. [Fix] Song Length Estimation: Pattern loop duration was still off. Modified Paths: -------------- trunk/OpenMPT/mptrack/PatternClipboard.cpp trunk/OpenMPT/mptrack/PatternClipboard.h trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp Modified: trunk/OpenMPT/mptrack/PatternClipboard.cpp =================================================================== --- trunk/OpenMPT/mptrack/PatternClipboard.cpp 2013-07-04 23:15:17 UTC (rev 2498) +++ trunk/OpenMPT/mptrack/PatternClipboard.cpp 2013-07-04 23:22:02 UTC (rev 2499) @@ -908,7 +908,7 @@ PatternClipboardDialog PatternClipboardDialog::instance; -void PatternClipboardDialog::DoDataExchange(CDataExchange* pDX) +void PatternClipboardDialog::DoDataExchange(CDataExchange *pDX) //------------------------------------------------------------- { DDX_Control(pDX, IDC_SPIN1, numClipboardsSpin); @@ -916,8 +916,8 @@ } -PatternClipboardDialog::PatternClipboardDialog() : isLocked(true), isCreated(false), posX(-1) -//------------------------------------------------------------------------------------------- +PatternClipboardDialog::PatternClipboardDialog() : isLocked(true), isCreated(false), posX(-1), editNameBox(*this) +//--------------------------------------------------------------------------------------------------------------- { } @@ -962,7 +962,7 @@ } instance.clipList.ResetContent(); PatternClipboard::clipindex_t i = 0; - for(std::deque<PatternClipboardElement>::const_iterator clip = PatternClipboard::instance.clipboards.begin(); clip != PatternClipboard::instance.clipboards.end(); clip++, i++) + for(std::vector<PatternClipboardElement>::const_iterator clip = PatternClipboard::instance.clipboards.begin(); clip != PatternClipboard::instance.clipboards.end(); clip++, i++) { const int item = instance.clipList.AddString(clip->description); instance.clipList.SetItemDataPtr(item, reinterpret_cast<void *>(i)); @@ -1083,3 +1083,23 @@ UpdateList(); } + + +BEGIN_MESSAGE_MAP(PatternClipboardDialog::CInlineEdit, CEdit) + ON_WM_KILLFOCUS() +END_MESSAGE_MAP() + + +PatternClipboardDialog::CInlineEdit::CInlineEdit(PatternClipboardDialog &dlg) : parent(dlg) +//----------------------------------------------------------------------------------------- +{ + CEdit::CEdit(); +} + + +void PatternClipboardDialog::CInlineEdit::OnKillFocus(CWnd *newWnd) +//----------------------------------------------------------------- +{ + parent.OnEndEdit(true); + CEdit::OnKillFocus(newWnd); +} Modified: trunk/OpenMPT/mptrack/PatternClipboard.h =================================================================== --- trunk/OpenMPT/mptrack/PatternClipboard.h 2013-07-04 23:15:17 UTC (rev 2498) +++ trunk/OpenMPT/mptrack/PatternClipboard.h 2013-07-04 23:22:02 UTC (rev 2499) @@ -10,7 +10,6 @@ #pragma once -#include <deque> #include "Snd_defs.h" #include "PatternCursor.h" @@ -61,7 +60,7 @@ // Active internal clipboard index clipindex_t activeClipboard; // Internal clipboard collection - std::deque<PatternClipboardElement> clipboards; + std::vector<PatternClipboardElement> clipboards; public: @@ -114,9 +113,22 @@ // The one and only pattern clipboard dialog object static PatternClipboardDialog instance; + // Edit class for clipboard name editing + class CInlineEdit : public CEdit + { + protected: + PatternClipboardDialog &parent; + public: + CInlineEdit(PatternClipboardDialog &dlg); + + DECLARE_MESSAGE_MAP(); + + afx_msg void OnKillFocus(CWnd *newWnd); + }; + CSpinButtonCtrl numClipboardsSpin; CListBox clipList; - CEdit editNameBox; + CInlineEdit editNameBox; int posX, posY; bool isLocked, isCreated; Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2013-07-04 23:15:17 UTC (rev 2498) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2013-07-04 23:22:02 UTC (rev 2499) @@ -1971,40 +1971,46 @@ //-------------------------------------------------------- { //Extra song data - Yet Another Hack. - int16 size; + uint16 size; uint32 code = MULTICHAR4_LE_MSVC('M','P','T','S'); //Extra song file data fwrite(&code, 1, sizeof(uint32), f); - code = MULTICHAR4_LE_MSVC('D','T','.','.'); //write m_nDefaultTempo field code - fwrite(&code, 1, sizeof(uint32), f); - size = sizeof(m_nDefaultTempo); //write m_nDefaultTempo field size - fwrite(&size, 1, sizeof(int16), f); - fwrite(&m_nDefaultTempo, 1, size, f); //write m_nDefaultTempo + if(m_nDefaultTempo > 255) + { + code = MULTICHAR4_LE_MSVC('D','T','.','.'); //write m_nDefaultTempo field code + fwrite(&code, 1, sizeof(uint32), f); + size = sizeof(m_nDefaultTempo); //write m_nDefaultTempo field size + fwrite(&size, 1, sizeof(uint16), f); + fwrite(&m_nDefaultTempo, 1, size, f); //write m_nDefaultTempo + } code = MULTICHAR4_LE_MSVC('R','P','B','.'); //write m_nRowsPerBeat fwrite(&code, 1, sizeof(uint32), f); size = sizeof(m_nDefaultRowsPerBeat); - fwrite(&size, 1, sizeof(int16), f); + fwrite(&size, 1, sizeof(uint16), f); fwrite(&m_nDefaultRowsPerBeat, 1, size, f); code = MULTICHAR4_LE_MSVC('R','P','M','.'); //write m_nRowsPerMeasure fwrite(&code, 1, sizeof(uint32), f); size = sizeof(m_nDefaultRowsPerMeasure); - fwrite(&size, 1, sizeof(int16), f); + fwrite(&size, 1, sizeof(uint16), f); fwrite(&m_nDefaultRowsPerMeasure, 1, size, f); - code = MULTICHAR4_LE_MSVC('C','.','.','.'); //write m_nChannels - fwrite(&code, 1, sizeof(uint32), f); - size = sizeof(m_nChannels); - fwrite(&size, 1, sizeof(int16), f); - fwrite(&m_nChannels, 1, size, f); + if(GetType() != MOD_TYPE_XM) + { + code = MULTICHAR4_LE_MSVC('C','.','.','.'); //write m_nChannels + fwrite(&code, 1, sizeof(uint32), f); + size = sizeof(m_nChannels); + fwrite(&size, 1, sizeof(uint16), f); + fwrite(&m_nChannels, 1, size, f); + } if(TypeIsIT_MPT() && GetNumChannels() > 64) //IT header has room only for 64 channels. Save the { //settings that do not fit to the header here as an extension. code = MULTICHAR4_LE_MSVC('C','h','n','S'); fwrite(&code, 1, sizeof(uint32), f); size = (GetNumChannels() - 64) * 2; - fwrite(&size, 1, sizeof(int16), f); + fwrite(&size, 1, sizeof(uint16), f); for(CHANNELINDEX chn = 64; chn < GetNumChannels(); chn++) { uint8 panvol[2]; @@ -2019,59 +2025,67 @@ code = MULTICHAR4_LE_MSVC('T','M','.','.'); //write m_nTempoMode fwrite(&code, 1, sizeof(uint32), f); size = sizeof(m_nTempoMode); - fwrite(&size, 1, sizeof(int16), f); + fwrite(&size, 1, sizeof(uint16), f); fwrite(&m_nTempoMode, 1, size, f); code = MULTICHAR4_LE_MSVC('P','M','M','.'); //write m_nMixLevels fwrite(&code, 1, sizeof(uint32), f); size = sizeof(m_nMixLevels); - fwrite(&size, 1, sizeof(int16), f); + fwrite(&size, 1, sizeof(uint16), f); fwrite(&m_nMixLevels, 1, size, f); - code = MULTICHAR4_LE_MSVC('C','W','V','.'); //write m_dwCreatedWithVersion - fwrite(&code, 1, sizeof(uint32), f); - size = sizeof(m_dwCreatedWithVersion); - fwrite(&size, 1, sizeof(int16), f); - fwrite(&m_dwCreatedWithVersion, 1, size, f); + if(m_dwCreatedWithVersion) + { + code = MULTICHAR4_LE_MSVC('C','W','V','.'); //write m_dwCreatedWithVersion + fwrite(&code, 1, sizeof(uint32), f); + size = sizeof(m_dwCreatedWithVersion); + fwrite(&size, 1, sizeof(uint16), f); + fwrite(&m_dwCreatedWithVersion, 1, size, f); + } code = MULTICHAR4_LE_MSVC('L','S','W','V'); //write m_dwLastSavedWithVersion fwrite(&code, 1, sizeof(uint32), f); size = sizeof(m_dwLastSavedWithVersion); - fwrite(&size, 1, sizeof(int16), f); + fwrite(&size, 1, sizeof(uint16), f); fwrite(&m_dwLastSavedWithVersion, 1, size, f); code = MULTICHAR4_LE_MSVC('S','P','A','.'); //write m_nSamplePreAmp fwrite(&code, 1, sizeof(uint32), f); size = sizeof(m_nSamplePreAmp); - fwrite(&size, 1, sizeof(int16), f); + fwrite(&size, 1, sizeof(uint16), f); fwrite(&m_nSamplePreAmp, 1, size, f); code = MULTICHAR4_LE_MSVC('V','S','T','V'); //write m_nVSTiVolume fwrite(&code, 1, sizeof(uint32), f); size = sizeof(m_nVSTiVolume); - fwrite(&size, 1, sizeof(int16), f); + fwrite(&size, 1, sizeof(uint16), f); fwrite(&m_nVSTiVolume, 1, size, f); - code = MULTICHAR4_LE_MSVC('D','G','V','.'); //write m_nDefaultGlobalVolume - fwrite(&code, 1, sizeof(uint32), f); - size = sizeof(m_nDefaultGlobalVolume); - fwrite(&size, 1, sizeof(int16), f); - fwrite(&m_nDefaultGlobalVolume, 1, size, f); + if(GetType() == MOD_TYPE_XM && m_nDefaultGlobalVolume != MAX_GLOBAL_VOLUME) + { + code = MULTICHAR4_LE_MSVC('D','G','V','.'); //write m_nDefaultGlobalVolume + fwrite(&code, 1, sizeof(uint32), f); + size = sizeof(m_nDefaultGlobalVolume); + fwrite(&size, 1, sizeof(uint16), f); + fwrite(&m_nDefaultGlobalVolume, 1, size, f); + } - code = MULTICHAR4_LE_MSVC('R','P','.','.'); //write m_nRestartPos - fwrite(&code, 1, sizeof(uint32), f); - size = sizeof(m_nRestartPos); - fwrite(&size, 1, sizeof(int16), f); - fwrite(&m_nRestartPos, 1, size, f); + if(GetType() != MOD_TYPE_XM && m_nRestartPos != 0) + { + code = MULTICHAR4_LE_MSVC('R','P','.','.'); //write m_nRestartPos + fwrite(&code, 1, sizeof(uint32), f); + size = sizeof(m_nRestartPos); + fwrite(&size, 1, sizeof(uint16), f); + fwrite(&m_nRestartPos, 1, size, f); + } - //Additional flags for XM/IT/MPTM if(m_ModFlags) { code = MULTICHAR4_LE_MSVC('M','S','F','.'); fwrite(&code, 1, sizeof(uint32), f); size = sizeof(m_ModFlags); - fwrite(&size, 1, sizeof(int16), f); + fwrite(&size, 1, sizeof(uint16), f); fwrite(&m_ModFlags, 1, size, f); } @@ -2089,7 +2103,7 @@ code = MULTICHAR4_LE_MSVC('M','I','M','A'); fwrite(&code, 1, sizeof(uint32), f); size = static_cast<int16>(objectsize); - fwrite(&size, 1, sizeof(int16), f); + fwrite(&size, 1, sizeof(uint16), f); GetMIDIMapper().Serialize(f); } } @@ -2239,7 +2253,7 @@ Limit(m_nDefaultTempo, GetModSpecifications().tempoMin, GetModSpecifications().tempoMax); //m_nRowsPerBeat //m_nRowsPerMeasure - LimitMax(m_nChannels, GetModSpecifications().channelsMax); + Limit(m_nChannels, CHANNELINDEX(1), GetModSpecifications().channelsMax); //m_nTempoMode //m_nMixLevels //m_dwCreatedWithVersion Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-07-04 23:15:17 UTC (rev 2498) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-07-04 23:22:02 UTC (rev 2499) @@ -402,7 +402,7 @@ firstChn = 0; lastChn = GetNumChannels() - 1; } - for(CHANNELINDEX c = firstChn; c < lastChn; c++) + for(CHANNELINDEX c = firstChn; c <= lastChn; c++) { memory.chnSettings[c].patLoop = memory.elapsedTime; memory.chnSettings[c].patLoopStart = nRow; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-07-05 12:11:20
|
Revision: 2500 http://sourceforge.net/p/modplug/code/2500 Author: manxorist Date: 2013-07-05 12:11:10 +0000 (Fri, 05 Jul 2013) Log Message: ----------- [Fix] Fix VS2008 build. Modified Paths: -------------- trunk/OpenMPT/common/StringFixer.h trunk/OpenMPT/mptrack/Mod2wave.cpp Modified: trunk/OpenMPT/common/StringFixer.h =================================================================== --- trunk/OpenMPT/common/StringFixer.h 2013-07-04 23:22:02 UTC (rev 2499) +++ trunk/OpenMPT/common/StringFixer.h 2013-07-05 12:11:10 UTC (rev 2500) @@ -301,7 +301,7 @@ //------------------------------------------------------------------------------------ { ASSERT(destBuffer.size() > 0); - Write<mode>(destBuffer.data(), destBuffer.size(), srcBuffer, srcSize); + Write<mode>(&destBuffer[0], destBuffer.size(), srcBuffer, srcSize); } // Copy a string from srcBuffer to destBuffer using a given write mode. Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mod2wave.cpp 2013-07-04 23:22:02 UTC (rev 2499) +++ trunk/OpenMPT/mptrack/Mod2wave.cpp 2013-07-05 12:11:10 UTC (rev 2500) @@ -621,7 +621,7 @@ std::fstream normalizeFile; if(m_bNormalize) { - normalizeFile.open(normalizeFileName, std::ios::binary | std::ios::in | std::ios::out | std::ios::trunc); + normalizeFile.open(normalizeFileName.c_str(), std::ios::binary | std::ios::in | std::ios::out | std::ios::trunc); } WAVWriter file(m_lpszFileName); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-07-05 12:13:25
|
Revision: 2501 http://sourceforge.net/p/modplug/code/2501 Author: manxorist Date: 2013-07-05 12:13:18 +0000 (Fri, 05 Jul 2013) Log Message: ----------- [Ref] Rename soundtouch/ to include/soundtouch/. Modified Paths: -------------- trunk/OpenMPT/include/soundtouch/soundtouch_08.vcproj trunk/OpenMPT/mptrack/MPTRACK_08.sln trunk/OpenMPT/mptrack/MPTRACK_10.sln trunk/OpenMPT/mptrack/mptrack_10.vcxproj Added Paths: ----------- trunk/OpenMPT/include/soundtouch/ Removed Paths: ------------- trunk/OpenMPT/soundtouch/ Modified: trunk/OpenMPT/include/soundtouch/soundtouch_08.vcproj =================================================================== --- trunk/OpenMPT/soundtouch/soundtouch_08.vcproj 2013-07-04 23:22:02 UTC (rev 2499) +++ trunk/OpenMPT/include/soundtouch/soundtouch_08.vcproj 2013-07-05 12:13:18 UTC (rev 2501) @@ -142,7 +142,7 @@ <Tool Name="VCLinkerTool" AdditionalOptions="/PDBPATH:none" - OutputFile="..\mptrack\bin\OpenMPT_SoundTouch_i16.dll" + OutputFile="..\..\mptrack\bin\OpenMPT_SoundTouch_i16.dll" LinkIncremental="1" GenerateDebugInformation="true" ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb" Modified: trunk/OpenMPT/mptrack/MPTRACK_08.sln =================================================================== --- trunk/OpenMPT/mptrack/MPTRACK_08.sln 2013-07-05 12:11:10 UTC (rev 2500) +++ trunk/OpenMPT/mptrack/MPTRACK_08.sln 2013-07-05 12:13:18 UTC (rev 2501) @@ -12,7 +12,7 @@ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xsoundlib", "..\include\smbPitchShift\xsoundlib_08.vcproj", "{DCC2BB2F-6778-4FD3-9C00-D6CD8DC917B8}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SoundTouch", "..\soundtouch\soundtouch_08.vcproj", "{CF3C2CA5-5D45-4635-BBA4-C1F435E10896}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SoundTouch", "..\include\soundtouch\soundtouch_08.vcproj", "{CF3C2CA5-5D45-4635-BBA4-C1F435E10896}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "..\include\zlib\contrib\vstudio\vc9\zlibstat.vcproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" EndProject Modified: trunk/OpenMPT/mptrack/MPTRACK_10.sln =================================================================== --- trunk/OpenMPT/mptrack/MPTRACK_10.sln 2013-07-05 12:11:10 UTC (rev 2500) +++ trunk/OpenMPT/mptrack/MPTRACK_10.sln 2013-07-05 12:13:18 UTC (rev 2501) @@ -7,7 +7,7 @@ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xsoundlib", "..\include\smbPitchShift\xsoundlib_10.vcxproj", "{DCC2BB2F-6778-4FD3-9C00-D6CD8DC917B8}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SoundTouch", "..\soundtouch\soundtouch_10.vcxproj", "{CF3C2CA5-5D45-4635-BBA4-C1F435E10896}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SoundTouch", "..\include\soundtouch\soundtouch_10.vcxproj", "{CF3C2CA5-5D45-4635-BBA4-C1F435E10896}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "..\include\zlib\contrib\vstudio\vc10\zlibstat.vcxproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" EndProject Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2013-07-05 12:11:10 UTC (rev 2500) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2013-07-05 12:13:18 UTC (rev 2501) @@ -637,7 +637,7 @@ <ProjectReference Include="..\include\zlib\contrib\vstudio\vc10\zlibstat.vcxproj"> <Project>{745dec58-ebb3-47a9-a9b8-4c6627c01bf8}</Project> </ProjectReference> - <ProjectReference Include="..\soundtouch\soundtouch_10.vcxproj"> + <ProjectReference Include="..\include\soundtouch\soundtouch_10.vcxproj"> <Project>{cf3c2ca5-5d45-4635-bba4-c1f435e10896}</Project> <ReferenceOutputAssembly>false</ReferenceOutputAssembly> </ProjectReference> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-07-05 16:56:08
|
Revision: 2502 http://sourceforge.net/p/modplug/code/2502 Author: manxorist Date: 2013-07-05 16:55:57 +0000 (Fri, 05 Jul 2013) Log Message: ----------- [Ref] Rename the last 4 remaining files in soundlib/ with had .CPP extension to lowercase .cpp. Modified Paths: -------------- trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj.filters trunk/OpenMPT/openmpt123/Makefile Added Paths: ----------- trunk/OpenMPT/soundlib/Load_amf.cpp trunk/OpenMPT/soundlib/Load_dbm.cpp trunk/OpenMPT/soundlib/Load_dmf.cpp trunk/OpenMPT/soundlib/Load_dsm.cpp Removed Paths: ------------- trunk/OpenMPT/soundlib/LOAD_AMF.CPP trunk/OpenMPT/soundlib/LOAD_DBM.CPP trunk/OpenMPT/soundlib/LOAD_DMF.CPP trunk/OpenMPT/soundlib/LOAD_DSM.CPP Modified: trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj 2013-07-05 12:13:18 UTC (rev 2501) +++ trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj 2013-07-05 16:55:57 UTC (rev 2502) @@ -394,12 +394,12 @@ <ClCompile Include="..\soundlib\ITCompression.cpp" /> <ClCompile Include="..\soundlib\ITTools.cpp" /> <ClCompile Include="..\soundlib\Load_669.cpp" /> - <ClCompile Include="..\soundlib\LOAD_AMF.CPP" /> + <ClCompile Include="..\soundlib\Load_amf.cpp" /> <ClCompile Include="..\soundlib\Load_ams.cpp" /> - <ClCompile Include="..\soundlib\LOAD_DBM.CPP" /> + <ClCompile Include="..\soundlib\Load_dbm.cpp" /> <ClCompile Include="..\soundlib\Load_digi.cpp" /> - <ClCompile Include="..\soundlib\LOAD_DMF.CPP" /> - <ClCompile Include="..\soundlib\LOAD_DSM.CPP" /> + <ClCompile Include="..\soundlib\Load_dmf.cpp" /> + <ClCompile Include="..\soundlib\Load_dsm.cpp" /> <ClCompile Include="..\soundlib\Load_far.cpp" /> <ClCompile Include="..\soundlib\Load_gdm.cpp" /> <ClCompile Include="..\soundlib\Load_imf.cpp" /> Modified: trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj.filters =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj.filters 2013-07-05 12:13:18 UTC (rev 2501) +++ trunk/OpenMPT/libopenmpt/libopenmpt.vcxproj.filters 2013-07-05 16:55:57 UTC (rev 2502) @@ -277,19 +277,19 @@ <ClCompile Include="..\soundlib\XMTools.cpp"> <Filter>Source Files\soundlib</Filter> </ClCompile> - <ClCompile Include="..\soundlib\LOAD_AMF.CPP"> + <ClCompile Include="..\soundlib\Load_amf.cpp"> <Filter>Source Files\soundlib</Filter> </ClCompile> <ClCompile Include="..\soundlib\Load_ams.cpp"> <Filter>Source Files\soundlib</Filter> </ClCompile> - <ClCompile Include="..\soundlib\LOAD_DBM.CPP"> + <ClCompile Include="..\soundlib\Load_dbm.cpp"> <Filter>Source Files\soundlib</Filter> </ClCompile> - <ClCompile Include="..\soundlib\LOAD_DMF.CPP"> + <ClCompile Include="..\soundlib\Load_dmf.cpp"> <Filter>Source Files\soundlib</Filter> </ClCompile> - <ClCompile Include="..\soundlib\LOAD_DSM.CPP"> + <ClCompile Include="..\soundlib\Load_dsm.cpp"> <Filter>Source Files\soundlib</Filter> </ClCompile> <ClCompile Include="..\soundlib\Load_far.cpp"> Modified: trunk/OpenMPT/openmpt123/Makefile =================================================================== --- trunk/OpenMPT/openmpt123/Makefile 2013-07-05 12:13:18 UTC (rev 2501) +++ trunk/OpenMPT/openmpt123/Makefile 2013-07-05 16:55:57 UTC (rev 2502) @@ -115,11 +115,6 @@ $(INFO) [LD ] $@ $(SILENT)$(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@ -%.o: %.CPP - $(INFO) [CXX] $< - $(VERYSILENT)$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -M -MT$@ $< > $*.d - $(SILENT)@$(COMPILE.cc) $(OUTPUT_OPTION) $< - %.o: %.cpp $(INFO) [CXX] $< $(VERYSILENT)$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -M -MT$@ $< > $*.d @@ -141,13 +136,11 @@ COMMON_CXX_SOURCES += \ $(wildcard ../common/*.cpp) \ - + SOUNDLIB_CXX_SOURCES += \ $(COMMON_CXX_SOURCES) \ $(wildcard ../soundlib/*.cpp) \ -SOUNDLIB_CXX_SOURCES_UPPERCASE += $(wildcard ../soundlib/*.CPP) -SOUNDLIB_CXX_SOURCES += $(SOUNDLIB_CXX_SOURCES_UPPERCASE:.CPP=.cpp) LIBOPENMPT_CXX_SOURCES += \ Deleted: trunk/OpenMPT/soundlib/LOAD_AMF.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_AMF.CPP 2013-07-05 12:13:18 UTC (rev 2501) +++ trunk/OpenMPT/soundlib/LOAD_AMF.CPP 2013-07-05 16:55:57 UTC (rev 2502) @@ -1,593 +0,0 @@ -/* - * Load_amf.cpp - * ------------ - * Purpose: AMF module loader - * Notes : There are two types of AMF files, the ASYLUM Music Format (used in Crusader: No Remorse and Crusader: No Regret) - * and Advanced Music Format (DSMI / Digital Sound And Music Interface, used in various games such as Pinball World). - * Both module types are handled here. - * Authors: Olivier Lapicque - * OpenMPT Devs - * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. - */ - - -#include "stdafx.h" -#include "Loaders.h" - - -#ifdef NEEDS_PRAGMA_PACK -#pragma pack(push, 1) -#endif - -// ASYLUM AMF File Header -struct PACKED AsylumFileHeader -{ - char signature[32]; - uint8 defaultSpeed; - uint8 defaultTempo; - uint8 numSamples; - uint8 numPatterns; - uint8 numOrders; - uint8 restartPos; -}; - -STATIC_ASSERT(sizeof(AsylumFileHeader) == 38); - - -// ASYLUM AMF Sample Header -struct PACKED AsylumSampleHeader -{ - char name[22]; - uint8 finetune; - uint8 defaultVolume; - int8 transpose; - uint32 length; - uint32 loopStart; - uint32 loopLength; - - // Convert all multi-byte numeric values to current platform's endianness or vice versa. - void ConvertEndianness() - { - SwapBytesLE(length); - SwapBytesLE(loopStart); - SwapBytesLE(loopLength); - } - - // Convert an AMF sample header to OpenMPT's internal sample header. - void ConvertToMPT(ModSample &mptSmp) const - { - mptSmp.Initialize(); - mptSmp.nFineTune = MOD2XMFineTune(finetune); - mptSmp.nVolume = std::min(defaultVolume, uint8(64)) * 4u; - mptSmp.RelativeTone = transpose; - mptSmp.nLength = length; - - if(loopLength > 2 && loopStart + loopLength <= length) - { - mptSmp.uFlags.set(CHN_LOOP); - mptSmp.nLoopStart = loopStart; - mptSmp.nLoopEnd = loopStart + loopLength; - } - } -}; - -STATIC_ASSERT(sizeof(AsylumSampleHeader) == 37); - - -// DSMI AMF File Header -struct PACKED AMFFileHeader -{ - char amf[3]; - uint8 version; - char title[32]; - uint8 numSamples; - uint8 numOrders; - uint16 numTracks; - uint8 numChannels; - - // Convert all multi-byte numeric values to current platform's endianness or vice versa. - void ConvertEndianness() - { - SwapBytesLE(numTracks); - } -}; - -STATIC_ASSERT(sizeof(AMFFileHeader) == 41); - - -#ifdef NEEDS_PRAGMA_PACK -#pragma pack(pop) -#endif - - -bool CSoundFile::ReadAMF_Asylum(FileReader &file, ModLoadingFlags loadFlags) -//-------------------------------------------------------------------------- -{ - file.Rewind(); - - AsylumFileHeader fileHeader; - if(!file.Read(fileHeader) - || strncmp(fileHeader.signature, "ASYLUM Music Format V1.0", 25) - || fileHeader.numSamples > 64 - || !file.CanRead(256 + 64 * sizeof(AsylumSampleHeader) + 64 * 4 * 8 * fileHeader.numPatterns)) - { - return false; - } else if(loadFlags == onlyVerifyHeader) - { - return true; - } - - InitializeGlobals(); - InitializeChannels(); - m_nType = MOD_TYPE_AMF0; - m_nChannels = 8; - m_nDefaultSpeed = fileHeader.defaultSpeed; - m_nDefaultTempo = fileHeader.defaultTempo; - m_nSamples = fileHeader.numSamples; - if(fileHeader.restartPos < fileHeader.numOrders) - { - m_nRestartPos = fileHeader.restartPos; - } - songName = ""; - - Order.ReadAsByte(file, 256, fileHeader.numOrders); - - // Read Sample Headers - for(SAMPLEINDEX smp = 1; smp <= GetNumSamples(); smp++) - { - AsylumSampleHeader sampleHeader; - file.ReadConvertEndianness(sampleHeader); - sampleHeader.ConvertToMPT(Samples[smp]); - mpt::String::Read<mpt::String::maybeNullTerminated>(m_szNames[smp], sampleHeader.name); - } - - file.Skip((64 - fileHeader.numSamples) * sizeof(AsylumSampleHeader)); - - // Read Patterns - for(PATTERNINDEX pat = 0; pat < fileHeader.numPatterns; pat++) - { - if(!(loadFlags & loadPatternData) || Patterns.Insert(pat, 64)) - { - file.Skip(64 * 4 * 8); - continue; - } - - ModCommand *p = Patterns[pat]; - for(size_t i = 0; i < 8 * 64; i++, p++) - { - uint8 data[4]; - file.ReadArray(data); - - p->note = NOTE_NONE; - if(data[0] && data[0] + 12 + NOTE_MIN <= NOTE_MAX) - { - p->note = data[0] + 12 + NOTE_MIN; - } - p->instr = data[1]; - p->command = data[2]; - p->param = data[3]; - ConvertModCommand(*p); - } - } - - if(loadFlags & loadSampleData) - { - // Read Sample Data - const SampleIO sampleIO( - SampleIO::_8bit, - SampleIO::mono, - SampleIO::littleEndian, - SampleIO::signedPCM); - - for(SAMPLEINDEX smp = 1; smp <= GetNumSamples(); smp++) - { - sampleIO.ReadSample(Samples[smp], file); - } - } - - return true; -} - - -// Read a single AMF track (channel) into a pattern. -void AMFReadPattern(CPattern &pattern, CHANNELINDEX chn, FileReader &fileChunk) -//----------------------------------------------------------------------------- -{ - fileChunk.Rewind(); - ModCommand::INSTR lastInstr = 0; - while(fileChunk.AreBytesLeft()) - { - const uint8 row = fileChunk.ReadUint8(); - const uint8 command = fileChunk.ReadUint8(); - const uint8 value = fileChunk.ReadUint8(); - if(row >= pattern.GetNumRows()) - { - break; - } - - ModCommand &m = *pattern.GetpModCommand(row, chn); - if(command < 0x7F) - { - // Note + Volume - if(command == 0 && value == 0) - { - m.note = NOTE_NOTECUT; - } else - { - m.note = command + NOTE_MIN; - if(value != 0xFF) - { - if(!m.instr) m.instr = lastInstr; - m.volcmd = VOLCMD_VOLUME; - m.vol = value; - } - } - } else if(command == 0x7F) - { - // Duplicate row - int8 rowDelta = static_cast<int8>(value); - int16 copyRow = static_cast<int16>(row) + rowDelta; - if(copyRow >= 0 && copyRow < static_cast<int16>(pattern.GetNumRows())) - { - m = *pattern.GetpModCommand(copyRow, chn); - } - } else if(command == 0x80) - { - // Instrument - m.instr = value + 1; - lastInstr = m.instr; - } else - { - // Effect - static const ModCommand::COMMAND effTrans[] = - { - CMD_NONE, CMD_SPEED, CMD_VOLUMESLIDE, CMD_VOLUME, - CMD_PORTAMENTOUP, CMD_NONE, CMD_TONEPORTAMENTO, CMD_TREMOR, - CMD_ARPEGGIO, CMD_VIBRATO, CMD_TONEPORTAVOL, CMD_VIBRATOVOL, - CMD_PATTERNBREAK, CMD_POSITIONJUMP, CMD_NONE, CMD_RETRIG, - CMD_OFFSET, CMD_VOLUMESLIDE, CMD_PORTAMENTOUP, CMD_S3MCMDEX, - CMD_S3MCMDEX, CMD_TEMPO, CMD_PORTAMENTOUP, CMD_PANNING8, - }; - - uint8 cmd = (command & 0x7F); - uint8 param = value; - - if(cmd < CountOf(effTrans)) - { - cmd = effTrans[cmd]; - } else - { - cmd = CMD_NONE; - } - - // Fix some commands... - switch(command & 0x7F) - { - // 02: Volume Slide - // 0A: Tone Porta + Vol Slide - // 0B: Vibrato + Vol Slide - case 0x02: - case 0x0A: - case 0x0B: - if(param & 0x80) - param = (-static_cast<int8>(param)) & 0x0F; - else - param = (param & 0x0F) << 4; - break; - - // 03: Volume - case 0x03: - param = std::min(param, uint8(64)); - if(m.volcmd == VOLCMD_NONE || m.volcmd == VOLCMD_VOLUME) - { - m.volcmd = VOLCMD_VOLUME; - m.vol = param; - cmd = CMD_NONE; - } - break; - - // 04: Porta Up/Down - case 0x04: - if(param & 0x80) - param = (-static_cast<int8>(param)) & 0x7F; - else - cmd = CMD_PORTAMENTODOWN; - break; - - // 11: Fine Volume Slide - case 0x11: - if(param) - { - if(param & 0x80) - param = 0xF0 | ((-static_cast<int8>(param)) & 0x0F); - else - param = 0x0F | ((param & 0x0F) << 4); - } else - { - cmd = CMD_NONE; - } - break; - - // 12: Fine Portamento - // 16: Extra Fine Portamento - case 0x12: - case 0x16: - if(param) - { - cmd = static_cast<uint8>((param & 0x80) ? CMD_PORTAMENTOUP : CMD_PORTAMENTODOWN); - if(param & 0x80) - { - param = ((-static_cast<int8>(param)) & 0x0F); - } - param |= (command == 0x16) ? 0xE0 : 0xF0; - } else - { - cmd = CMD_NONE; - } - break; - - // 13: Note Delay - case 0x13: - param = 0xD0 | (param & 0x0F); - break; - - // 14: Note Cut - case 0x14: - param = 0xC0 | (param & 0x0F); - break; - - // 17: Panning - case 0x17: - param = (param + 64) & 0x7F; - if(m.command != CMD_NONE) - { - if(m.volcmd == VOLCMD_NONE || m.volcmd == VOLCMD_PANNING) - { - m.volcmd = VOLCMD_PANNING; - m.vol = param / 2; - } - cmd = CMD_NONE; - } - break; - } - - if(cmd != CMD_NONE) - { - m.command = cmd; - m.param = param; - } - } - } -} - - -bool CSoundFile::ReadAMF_DSMI(FileReader &file, ModLoadingFlags loadFlags) -//------------------------------------------------------------------------ -{ - file.Rewind(); - - AMFFileHeader fileHeader; - if(!file.ReadConvertEndianness(fileHeader) - || memcmp(fileHeader.amf, "AMF", 3) - || fileHeader.version < 8 || fileHeader.version > 14 - || ((fileHeader.numChannels < 1 || fileHeader.numChannels > 32) && fileHeader.version >= 10)) - { - return false; - } else if(loadFlags == onlyVerifyHeader) - { - return true; - } - - InitializeGlobals(); - InitializeChannels(); - - m_nType = MOD_TYPE_AMF; - m_nChannels = fileHeader.numChannels; - m_nSamples = fileHeader.numSamples; - - mpt::String::Read<mpt::String::maybeNullTerminated>(songName, fileHeader.title); - - if(fileHeader.version < 10) - { - // Old format revisions are fixed to 4 channels - fileHeader.numChannels = 4; - file.SkipBack(1); - SetupMODPanning(true); - } - - // Setup Channel Pan Positions - if(fileHeader.version >= 11) - { - const CHANNELINDEX readChannels = fileHeader.version >= 12 ? 32 : 16; - for(CHANNELINDEX chn = 0; chn < readChannels; chn++) - { - int16 pan = (file.ReadInt8() + 64) * 2; - if(pan < 0) pan = 0; - if(pan > 256) - { - pan = 128; - ChnSettings[chn].dwFlags = CHN_SURROUND; - } - ChnSettings[chn].nPan = static_cast<uint16>(pan); - } - } else if(fileHeader.version == 10) - { - uint8 panPos[16]; - file.ReadArray(panPos); - for(CHANNELINDEX chn = 0; chn < 16; chn++) - { - ChnSettings[chn].nPan = (panPos[chn] & 1) ? 0x40 : 0xC0; - } - } - // To check: Was the channel table introduced in revision 1.0 or 0.9? I only have 0.8 files, in which it is missing... - ASSERT(fileHeader.version != 9); - - // Get Tempo/Speed - if(fileHeader.version >= 13) - { - m_nDefaultTempo = file.ReadUint8(); - m_nDefaultSpeed = file.ReadUint8(); - if(m_nDefaultTempo < 32) - { - m_nDefaultTempo = 125; - } - } else - { - m_nDefaultTempo = 125; - m_nDefaultSpeed = 6; - } - - // Setup Order List - Order.resize(fileHeader.numOrders); - std::vector<ROWINDEX> patternLength(fileHeader.numOrders, 64); - const FileReader::off_t trackStartPos = file.GetPosition() + (fileHeader.version >= 14 ? 2 : 0); - - for(ORDERINDEX ord = 0; ord < fileHeader.numOrders; ord++) - { - Order[ord] = ord; - if(fileHeader.version >= 14) - { - patternLength[ord] = file.ReadUint16LE(); - } - // Track positions will be read as needed. - file.Skip(m_nChannels * 2); - } - - // Read Sample Headers - std::vector<uint32> samplePos(GetNumSamples(), 0); - uint32 maxSamplePos = 0; - - for(SAMPLEINDEX smp = 1; smp <= GetNumSamples(); smp++) - { - ModSample &sample = Samples[smp]; - sample.Initialize(); - - uint8 type = file.ReadUint8(); - file.ReadString<mpt::String::maybeNullTerminated>(m_szNames[smp], 32); - file.ReadString<mpt::String::nullTerminated>(sample.filename, 13); - samplePos[smp - 1] = file.ReadUint32LE(); - if(fileHeader.version < 10) - { - sample.nLength = file.ReadUint16LE(); - } else - { - sample.nLength = file.ReadUint32LE(); - } - - sample.nC5Speed = file.ReadUint16LE(); - sample.nVolume = std::min(file.ReadUint8(), uint8(64)) * 4u; - - if(fileHeader.version < 10) - { - // Various sources (Miodrag Vallat's amf.txt, old ModPlug code) suggest that the loop information - // format revision 1.0 should only consist of a 16-bit value for the loop start (loop end would - // automatically equal sample length), but the only v1.0 files I have ("the tribal zone" and - // "the way its gonna b" by Maelcum) do not confirm this - the sample headers are laid out exactly - // as in the newer revisions in these two files. Even in format revision 0.8 (output by MOD2AMF v1.02) - // There are loop start and loop end values (although they are 16-Bit). Maybe this only applies to - // even older revision of the format? - sample.nLoopStart = file.ReadUint16LE(); - sample.nLoopEnd = file.ReadUint16LE(); - } else - { - sample.nLoopStart = file.ReadUint32LE(); - sample.nLoopEnd = file.ReadUint32LE(); - } - - // Length of v1.0+ sample header: 65 bytes - // Length of old sample header: 59 bytes - - if(type != 0) - { - if(sample.nLoopEnd > sample.nLoopStart + 2 && sample.nLoopEnd <= sample.nLength) - { - sample.uFlags.set(CHN_LOOP); - } else - { - sample.nLoopStart = sample.nLoopEnd = 0; - } - - maxSamplePos = std::max(maxSamplePos, samplePos[smp - 1]); - } - } - - // Read Track Mapping Table - std::vector<uint16> trackMap; - file.ReadVectorLE(trackMap, fileHeader.numTracks); - uint16 trackCount = 0; - for(std::vector<uint16>::const_iterator i = trackMap.begin(); i != trackMap.end(); i++) - { - trackCount = std::max(trackCount, *i); - } - - // Store Tracks Positions - std::vector<FileReader> trackData(trackCount); - for(uint16 i = 0; i < trackCount; i++) - { - // Track size is a 24-Bit value describing the number of byte triplets in this track. - uint32 trackSize = file.ReadUint16LE() | (file.ReadUint8() << 16); - trackData[i] = file.GetChunk(trackSize * 3); - } - - if(loadFlags & loadSampleData) - { - // Read Sample Data - const SampleIO sampleIO( - SampleIO::_8bit, - SampleIO::mono, - SampleIO::littleEndian, - SampleIO::unsignedPCM); - - // Why is all of this sample loading business so dumb in AMF? - // Surely there must be some great idea behind it which isn't handled here (re-using the same sample data for different sample slots maybe?) - for(uint32 seekPos = 1; seekPos <= maxSamplePos; seekPos++) - { - for(SAMPLEINDEX smp = 0; smp < GetNumSamples(); smp++) - { - if(seekPos == samplePos[smp]) - { - sampleIO.ReadSample(Samples[smp + 1], file); - break; - } - } - if(file.NoBytesLeft()) - { - break; - } - } - } - - if(!(loadFlags & loadPatternData)) - { - return true; - } - - // Create the patterns from the list of tracks - for(PATTERNINDEX pat = 0; pat < fileHeader.numOrders; pat++) - { - if(Patterns.Insert(pat, patternLength[pat])) - { - continue; - } - - // Get table with per-channel track assignments - file.Seek(trackStartPos + pat * (GetNumChannels() * 2 + (fileHeader.version >= 14 ? 2 : 0))); - std::vector<uint16> tracks; - file.ReadVectorLE(tracks, GetNumChannels()); - - for(CHANNELINDEX chn = 0; chn < GetNumChannels(); chn++) - { - if(tracks[chn] > 0 && tracks[chn] <= fileHeader.numTracks) - { - uint16 realTrack = trackMap[tracks[chn] - 1]; - if(realTrack > 0 && realTrack <= trackCount) - { - realTrack--; - AMFReadPattern(Patterns[pat], chn, trackData[realTrack]); - } - } - } - } - - return true; -} Deleted: trunk/OpenMPT/soundlib/LOAD_DBM.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2013-07-05 12:13:18 UTC (rev 2501) +++ trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2013-07-05 16:55:57 UTC (rev 2502) @@ -1,506 +0,0 @@ -/* - * Load_dbm.cpp - * ------------ - * Purpose: DigiBooster Pro module Loader (DBM) - * Notes : This loader doesn't handle multiple songs. - * Authors: Olivier Lapicque - * Adam Goode (endian and char fixes for PPC) - * OpenMPT Devs - * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. - */ - - -#include "stdafx.h" -#include "Loaders.h" - -#define DBM_FILE_MAGIC 0x304d4244 -#define DBM_ID_NAME 0x454d414e -#define DBM_NAMELEN 0x2c000000 -#define DBM_ID_INFO 0x4f464e49 -#define DBM_INFOLEN 0x0a000000 -#define DBM_ID_SONG 0x474e4f53 -#define DBM_ID_INST 0x54534e49 -#define DBM_ID_VENV 0x564e4556 -#define DBM_ID_PATT 0x54544150 -#define DBM_ID_SMPL 0x4c504d53 - -#ifdef NEEDS_PRAGMA_PACK -#pragma pack(push, 1) -#endif - -struct PACKED DBMFileHeader -{ - uint32 dbm_id; // "DBM0" = 0x304d4244 - uint8 trkVerHi; // Tracker version: 02.15 - uint8 trkVerLo; - uint16 reserved; - uint32 name_id; // "NAME" = 0x454d414e - uint32 name_len; // name length: always 44 - char songname[44]; - uint32 info_id; // "INFO" = 0x4f464e49 - uint32 info_len; // 0x0a000000 - uint16 instruments; - uint16 samples; - uint16 songs; - uint16 patterns; - uint16 channels; - uint32 song_id; // "SONG" = 0x474e4f53 - uint32 song_len; - char songname2[44]; - uint16 orders; -// uint16 orderlist[0]; // orderlist[orders] in words -}; - -STATIC_ASSERT(sizeof(DBMFileHeader) == 132); - -struct PACKED DBMInstrument -{ - char name[30]; - uint16 sampleno; - uint16 volume; - uint32 finetune; - uint32 loopstart; - uint32 looplen; - uint16 panning; - uint16 flags; -}; - -STATIC_ASSERT(sizeof(DBMInstrument) == 50); - -struct PACKED DBMEnvelope -{ - uint16 instrument; - uint8 flags; - uint8 numpoints; - uint8 sustain1; - uint8 loopbegin; - uint8 loopend; - uint8 sustain2; - uint16 volenv[2 * 32]; -}; - -STATIC_ASSERT(sizeof(DBMEnvelope) == 136); - -struct PACKED DBMPattern -{ - uint16 rows; - uint32 packedsize; - uint8 patterndata[2]; // [packedsize] -}; - -STATIC_ASSERT(sizeof(DBMPattern) == 8); - -struct PACKED DBMSample -{ - uint32 flags; - uint32 samplesize; - uint8 sampledata[2]; // [samplesize] -}; - -STATIC_ASSERT(sizeof(DBMSample) == 10); - -#ifdef NEEDS_PRAGMA_PACK -#pragma pack(pop) -#endif - - -static const ModCommand::COMMAND dbmEffects[23] = -{ - CMD_ARPEGGIO, CMD_PORTAMENTOUP, CMD_PORTAMENTODOWN, CMD_TONEPORTAMENTO, - CMD_VIBRATO, CMD_TONEPORTAVOL, CMD_VIBRATOVOL, CMD_TREMOLO, - CMD_PANNING8, CMD_OFFSET, CMD_VOLUMESLIDE, CMD_POSITIONJUMP, - CMD_VOLUME, CMD_PATTERNBREAK, CMD_MODCMDEX, CMD_TEMPO, - CMD_GLOBALVOLUME, CMD_GLOBALVOLSLIDE, CMD_KEYOFF, CMD_SETENVPOSITION, - CMD_CHANNELVOLUME, CMD_CHANNELVOLSLIDE, CMD_PANNINGSLIDE, -}; - - -void ConvertDBMEffect(uint8 &command, uint8 ¶m) -//------------------------------------------------- -{ - if(command < CountOf(dbmEffects)) - command = dbmEffects[command]; - else - command = CMD_NONE; - - switch (command) - { - case CMD_ARPEGGIO: - if(param == 0) - command = CMD_NONE; - break; - - case CMD_VOLUMESLIDE: - if(param & 0xF0) - param &= 0xF0; - break; - - case CMD_GLOBALVOLUME: - if(param <= 64) - param *= 2; - else - param = 128; - break; - - case CMD_MODCMDEX: - switch(param & 0xF0) - { - case 0x00: // set filter - command = CMD_NONE; - break; - case 0x30: // play backwards - command = CMD_S3MCMDEX; - param = 0x9F; - break; - case 0x40: // turn off sound in channel - // TODO - break; - case 0x50: // turn on/off channel - // TODO is this correct? - if((param & 0x0F) <= 0x01) - { - command = CMD_CHANNELVOLUME; - param = (param == 0x50) ? 0x00 : 0x40; - } - break; - case 0x60: // set loop begin / loop - // TODO - break; - case 0x70: // set offset - // TODO - break; - case 0xF0: // turn on/off channel - // TODO - break; - default: - // Rest will be converted later from CMD_MODCMDEX to CMD_S3MCMDEX. - break; - } - break; - - case CMD_TEMPO: - if(param <= 0x1F) command = CMD_SPEED; - break; - - case CMD_KEYOFF: - if (param == 0) - { - // TODO key of at tick 0 - } - break; - - case CMD_OFFSET: - // TODO Sample offset slide - command = CMD_NONE; - break; - } -} - - -bool CSoundFile::ReadDBM(const BYTE *lpStream, const DWORD dwMemLength, ModLoadingFlags loadFlags) -//------------------------------------------------------------------------------------------------ -{ - const DBMFileHeader *pfh = (DBMFileHeader *)lpStream; - DWORD dwMemPos; - uint16 nOrders, nSamples, nInstruments, nPatterns; - - if ((!lpStream) || (dwMemLength <= sizeof(DBMFileHeader)) || (!pfh->channels) - || (pfh->dbm_id != DBM_FILE_MAGIC) || (!pfh->songs) || (pfh->song_id != DBM_ID_SONG) - || (pfh->name_id != DBM_ID_NAME) || (pfh->name_len != DBM_NAMELEN) - || (pfh->info_id != DBM_ID_INFO) || (pfh->info_len != DBM_INFOLEN)) return false; - dwMemPos = sizeof(DBMFileHeader); - nOrders = BigEndianW(pfh->orders); - if (dwMemPos + 2 * nOrders + 8*3 >= dwMemLength) - return false; - else if(loadFlags == onlyVerifyHeader) - return true; - - InitializeGlobals(); - InitializeChannels(); - - nInstruments = BigEndianW(pfh->instruments); - nSamples = BigEndianW(pfh->samples); - nPatterns = BigEndianW(pfh->patterns); - m_nType = MOD_TYPE_DBM; - m_nChannels = CLAMP(BigEndianW(pfh->channels), 1, MAX_BASECHANNELS); // note: MAX_BASECHANNELS is currently 127, but DBM supports up to 128 channels. - madeWithTracker = mpt::String::Format("Digi Booster %x.%x", pfh->trkVerHi, pfh->trkVerLo); - - if(pfh->songname[0]) - { - mpt::String::Read<mpt::String::maybeNullTerminated>(songName, pfh->songname); - } else - { - mpt::String::Read<mpt::String::maybeNullTerminated>(songName, pfh->songname2); - - } - - Order.resize(nOrders, Order.GetInvalidPatIndex()); - for (UINT iOrd=0; iOrd < nOrders; iOrd++) - { - if (iOrd >= MAX_ORDERS) break; - Order[iOrd] = (PATTERNINDEX)BigEndianW(*((WORD *)(lpStream + dwMemPos + iOrd * 2))); - } - dwMemPos += 2 * nOrders; - while (dwMemPos + 10 < dwMemLength) - { - uint32 chunk_id = LittleEndian(((uint32 *)(lpStream + dwMemPos))[0]); - uint32 chunk_size = BigEndian(((uint32 *)(lpStream + dwMemPos))[1]); - uint32 chunk_pos; - - dwMemPos += 8; - chunk_pos = dwMemPos; - if ((dwMemPos + chunk_size > dwMemLength) || (chunk_size > dwMemLength)) break; - dwMemPos += chunk_size; - // Instruments - if (chunk_id == DBM_ID_INST) - { - if (nInstruments >= MAX_INSTRUMENTS) nInstruments = MAX_INSTRUMENTS-1; - for(INSTRUMENTINDEX iIns = 0; iIns < nInstruments; iIns++) - { - ModSample *psmp; - ModInstrument *pIns; - DBMInstrument *pih; - uint16 nsmp; - - if (chunk_pos + sizeof(DBMInstrument) > dwMemPos) break; - - pih = (DBMInstrument *)(lpStream + chunk_pos); - nsmp = BigEndianW(pih->sampleno); - psmp = ((nsmp) && (nsmp < MAX_SAMPLES)) ? &Samples[nsmp] : nullptr; - - pIns = AllocateInstrument(iIns + 1, nsmp); - if(pIns == nullptr) - { - break; - } - - mpt::String::Read<mpt::String::maybeNullTerminated>(pIns->name, pih->name); - if (psmp) - { - mpt::String::Read<mpt::String::maybeNullTerminated>(m_szNames[nsmp], pih->name); - } - - pIns->nFadeOut = 1024; // ??? - pIns->nPan = BigEndianW(pih->panning); - if ((pIns->nPan) && (pIns->nPan < 256)) - pIns->dwFlags = INS_SETPANNING; - else - pIns->nPan = 128; - - // Sample Info - if(psmp) - { - uint16 sflags = BigEndianW(pih->flags); - psmp->nVolume = BigEndianW(pih->volume) * 4; - if(/*!psmp->nVolume ||*/ psmp->nVolume > 256) psmp->nVolume = 256; // XXX First condition looks like a typical "modplug-ism" - psmp->nGlobalVol = 64; - psmp->nC5Speed = BigEndian(pih->finetune); - - if(pih->looplen && (sflags & 3)) - { - psmp->nLoopStart = BigEndian(pih->loopstart); - psmp->nLoopEnd = psmp->nLoopStart + BigEndian(pih->looplen); - psmp->uFlags |= CHN_LOOP; - psmp->uFlags &= ~CHN_PINGPONGLOOP; - if(sflags & 2) psmp->uFlags |= CHN_PINGPONGLOOP; - } - } - chunk_pos += sizeof(DBMInstrument); - m_nInstruments = iIns + 1; - } - } else - // Volume Envelopes - if (chunk_id == DBM_ID_VENV) - { - UINT nEnvelopes = lpStream[chunk_pos+1]; - - chunk_pos += 2; - for (UINT iEnv=0; iEnv<nEnvelopes; iEnv++) - { - DBMEnvelope *peh; - UINT nins; - - if (chunk_pos + sizeof(DBMEnvelope) > dwMemPos) break; - peh = (DBMEnvelope *)(lpStream+chunk_pos); - nins = BigEndianW(peh->instrument); - if ((nins) && (nins < MAX_INSTRUMENTS) && (Instruments[nins]) && (peh->numpoints)) - { - ModInstrument *pIns = Instruments[nins]; - - pIns->VolEnv.dwFlags.set(ENV_ENABLED, (peh->flags & 1) != 0); - pIns->VolEnv.dwFlags.set(ENV_SUSTAIN, (peh->flags & 2) != 0); - pIns->VolEnv.dwFlags.set(ENV_LOOP, (peh->flags & 4) != 0); - pIns->VolEnv.nNodes = peh->numpoints + 1; - if (pIns->VolEnv.nNodes > MAX_ENVPOINTS) pIns->VolEnv.nNodes = MAX_ENVPOINTS; - pIns->VolEnv.nLoopStart = peh->loopbegin; - pIns->VolEnv.nLoopEnd = peh->loopend; - pIns->VolEnv.nSustainStart = pIns->VolEnv.nSustainEnd = peh->sustain1; - for(uint32 i=0; i<pIns->VolEnv.nNodes; i++) - { - pIns->VolEnv.Ticks[i] = BigEndianW(peh->volenv[i * 2]); - pIns->VolEnv.Values[i] = (BYTE)BigEndianW(peh->volenv[i * 2 + 1]); - } - } - chunk_pos += sizeof(DBMEnvelope); - } - } else - // Packed Pattern Data - if (chunk_id == DBM_ID_PATT && (loadFlags & loadPatternData)) - { - if (nPatterns > MAX_PATTERNS) nPatterns = MAX_PATTERNS; - for(PATTERNINDEX iPat = 0; iPat < nPatterns; iPat++) - { - DBMPattern *pph; - DWORD pksize; - UINT nRows; - - if (chunk_pos + sizeof(DBMPattern) > dwMemPos) break; - pph = (DBMPattern *)(lpStream+chunk_pos); - pksize = BigEndian(pph->packedsize); - if ((chunk_pos + pksize + 6 > dwMemPos) || (pksize > dwMemPos)) break; - nRows = BigEndianW(pph->rows); - if ((nRows >= 4) && (nRows <= 256)) - { - Patterns.Insert(iPat, nRows); - ModCommand *m = Patterns[iPat]; - if (m) - { - LPBYTE pkdata = (LPBYTE)&pph->patterndata; - UINT row = 0; - UINT i = 0; - - while ((i+3<pksize) && (row < nRows)) - { - UINT ch = pkdata[i++]; - - if (ch) - { - BYTE b = pkdata[i++]; - ch--; - if (ch < m_nChannels) - { - if (b & 0x01) - { - uint8 note = pkdata[i++]; - - if (note == 0x1F) note = NOTE_KEYOFF; else - if ((note) && (note < 0xFE)) - { - note = ((note >> 4) * 12) + (note & 0x0F) + 13; - } - m[ch].note = note; - } - if (b & 0x02) m[ch].instr = pkdata[i++]; - if (b & 0x3C) - { - uint8 cmd1 = CMD_NONE, cmd2 = CMD_NONE; - uint8 param1 = 0, param2 = 0; - if (b & 0x04) cmd2 = pkdata[i++]; - if (b & 0x08) param2 = pkdata[i++]; - if (b & 0x10) cmd1 = pkdata[i++]; - if (b & 0x20) param1 = pkdata[i++]; - ConvertDBMEffect(cmd1, param1); - ConvertDBMEffect(cmd2, param2); - - // this is the same conversion algorithm as in the ULT loader. maybe this should be merged at some point... - if (cmd2 == CMD_VOLUME || (cmd2 == CMD_NONE && cmd1 != CMD_VOLUME)) - { - std::swap(cmd1, cmd2); - std::swap(param1, param2); - } - - int n; - for (n = 0; n < 4; n++) - { - if(ModCommand::ConvertVolEffect(cmd1, param1, (n >> 1) != 0)) - { - n = 5; - break; - } - std::swap(cmd1, cmd2); - std::swap(param1, param2); - } - if (n < 5) - { - if (ModCommand::GetEffectWeight((ModCommand::COMMAND)cmd1) > ModCommand::GetEffectWeight((ModCommand::COMMAND)cmd2)) - { - std::swap(cmd1, cmd2); - std::swap(param1, param2); - } - cmd1 = CMD_NONE; - } - if (!cmd1) - param1 = 0; - if (!cmd2) - param2 = 0; - - m[ch].volcmd = cmd1; - m[ch].vol = param1; - m[ch].command = cmd2; - m[ch].param = param2; - m[ch].ExtendedMODtoS3MEffect(); - } - } else - { - if (b & 0x01) i++; - if (b & 0x02) i++; - if (b & 0x04) i++; - if (b & 0x08) i++; - if (b & 0x10) i++; - if (b & 0x20) i++; - } - } else - { - row++; - m += m_nChannels; - } - } - } - } - chunk_pos += 6 + pksize; - } - } else - // Reading Sample Data - if (chunk_id == DBM_ID_SMPL && (loadFlags & loadSampleData)) - { - if (nSamples >= MAX_SAMPLES) nSamples = MAX_SAMPLES-1; - m_nSamples = nSamples; - for (UINT iSmp=1; iSmp<=nSamples; iSmp++) - { - DBMSample *psh; - DWORD samplesize; - DWORD sampleflags; - - if (chunk_pos + sizeof(DBMSample) >= dwMemPos) break; - psh = (DBMSample *)(lpStream+chunk_pos); - chunk_pos += 8; - samplesize = BigEndian(psh->samplesize); - sampleflags = BigEndian(psh->flags); - - ModSample &sample = Samples[iSmp]; - sample.nLength = samplesize; - if(sampleflags & 2) - { - samplesize *= 2; - } - if(chunk_pos + samplesize > dwMemPos || samplesize > dwMemLength) - { - break; - } - - if(sampleflags & 3) - { - FileReader chunk(psh->sampledata, samplesize); - SampleIO( - (sampleflags & 2) ? SampleIO::_16bit : SampleIO::_8bit, - SampleIO::mono, - SampleIO::bigEndian, - SampleIO::signedPCM) - .ReadSample(sample, chunk); - } - chunk_pos += samplesize; - } - } - } - return true; -} Deleted: trunk/OpenMPT/soundlib/LOAD_DMF.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2013-07-05 12:13:18 UTC (rev 2501) +++ trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2013-07-05 16:55:57 UTC (rev 2502) @@ -1,1225 +0,0 @@ -/* - * load_dmf.cpp - * ------------ - * Purpose: DMF module loader (X-Tracker by D-LUSiON). - * Notes : If it wasn't already outdated when the tracker was released, this would be a rather interesting - * and in some parts even sophisticated format - effect columns are separated by effect type, an easy to - * understand BPM tempo mode, effect durations are always divided into a 256th row, vibrato effects are - * specified by period length and the same 8-Bit granularity is used for both volume and panning. - * Unluckily, this format does not offer any envelopes or multi-sample instruments, and bidi sample loops - * are missing as well, so it was already well behind FT2 and IT back then. - * Authors: Johannes Schultz (mostly based on DMF.TXT, DMF_EFFC.TXT, trial and error and some invaluable hints by Zatzen) - * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. - */ - - -#include "stdafx.h" -#include "Loaders.h" -#include "ChunkReader.h" -#ifdef MODPLUG_TRACKER -#include "../mptrack/Moddoc.h" -#endif // MODPLUG_TRACKER - -#ifdef NEEDS_PRAGMA_PACK -#pragma pack(push, 1) -#endif - -// DMF header -struct PACKED DMFFileHeader -{ - char signature[4]; // "DDMF" - uint8 version; // 1 - 7 are beta versions, 8 is the official thing, 10 is xtracker32 - char tracker[8]; // "XTRACKER" - char songname[30]; - char composer[20]; - uint8 creationDay; - uint8 creationMonth; - uint8 creationYear; -}; - -STATIC_ASSERT(sizeof(DMFFileHeader) == 66); - -struct PACKED DMFChunk -{ - // 32-Bit chunk identifiers - enum ChunkIdentifiers - { - idCMSG = 0x47534D43, // Song message - idSEQU = 0x55514553, // Order list - idPATT = 0x54544150, // Patterns - idSMPI = 0x49504D53, // Sample headers - idSMPD = 0x44504D53, // Sample data - idSMPJ = 0x4A504D53, // Sample jump table (XTrakcker 32 only) - idENDE = 0x45444E45, // Last four bytes of DMF file - idSETT = 0x9C219DE4, // Probably contains GUI settings - }; - - typedef ChunkIdentifiers id_type; - - uint32 id; - uint32 length; - - size_t GetLength() const - { - uint32 l = length; - return SwapBytesLE(l); - } - - id_type GetID() const - { - uint32 i = id; - return static_cast<id_type>(SwapBytesLE(i)); - } -}; - -STATIC_ASSERT(sizeof(DMFChunk) == 8); - -// Order list -struct PACKED DMFSequence -{ - uint16 loopStart; - uint16 loopEnd; - // order list follows here ... - - // Convert all multi-byte numeric values to current platform's endianness or vice versa. - void ConvertEndianness() - { - SwapBytesLE(loopStart); - SwapBytesLE(loopEnd); - } -}; - -STATIC_ASSERT(sizeof(DMFSequence) == 4); - -// Pattern header (global) -struct PACKED DMFPatterns -{ - uint16 numPatterns; // 1..1024 patterns - uint8 numTracks; // 1..32 channels - - // Convert all multi-byte numeric values to current platform's endianness or vice versa. - void ConvertEndianness() - { - SwapBytesLE(numPatterns); - } -}; - -STATIC_ASSERT(sizeof(DMFPatterns) == 3); - -// Pattern header (for each pattern) -struct PACKED DMFPatternHeader -{ - uint8 numTracks; // 1..32 channels - uint8 beat; // [hi|lo] -> hi = rows per beat, lo = reserved - uint16 numRows; - uint32 patternLength; - // patttern data follows here ... - - // Convert all multi-byte numeric values to current platform's endianness or vice versa. - void ConvertEndianness() - { - SwapBytesLE(numRows); - SwapBytesLE(patternLength); - } -}; - -STATIC_ASSERT(sizeof(DMFPatternHeader) == 8); - -// Sample header -struct PACKED DMFSampleHeader -{ - enum SampleFlags - { - // Sample flags - smpLoop = 0x01, - smp16Bit = 0x02, - smpCompMask = 0x0C, - smpComp1 = 0x04, // Compression type 1 - smpComp2 = 0x08, // Compression type 2 (unused) - smpComp3 = 0x0C, // Compression type 3 (dito) - smpLibrary = 0x80, // Sample is stored in a library - }; - - uint32 length; - uint32 loopStart; - uint32 loopEnd; - uint16 c3freq; // 1000..45000hz - uint8 volume; // 0 = ignore - uint8 flags; - - // Convert an DMFSampleHeader to OpenMPT's internal sample representation. - void ConvertToMPT(ModSample &mptSmp) const - { - mptSmp.Initialize(); - mptSmp.nLength = length; - mptSmp.nSustainEnd = loopEnd; - mptSmp.nSustainStart = loopStart; - if(mptSmp.nSustainEnd > 0) - { - mptSmp.nSustainEnd--; - } - mptSmp.SanitizeLoops(); - - mptSmp.nC5Speed = c3freq; - mptSmp.nGlobalVol = 64; - if(volume) - { - mptSmp.nVolume = volume + 1; - } else - { - mptSmp.nVolume = 256; - } - - if((flags & smpLoop) != 0 && mptSmp.nSustainEnd > mptSmp.nSustainStart) - { - mptSmp.uFlags.set(CHN_SUSTAINLOOP); - } - if((flags & smp16Bit) != 0) - { - mptSmp.uFlags.set(CHN_16BIT); - mptSmp.nLength /= 2; - mptSmp.nSustainStart /= 2; - mptSmp.nSustainEnd /= 2; - } - } - - // Convert all multi-byte numeric values to current platform's endianness or vice versa. - void ConvertEndianness() - { - SwapBytesLE(length); - SwapBytesLE(loopStart); - SwapBytesLE(loopEnd); - SwapBytesLE(c3freq); - } -}; - -STATIC_ASSERT(sizeof(DMFSampleHeader) == 16); - -// Sample header tail (between head and tail, there might be the library name of the sample, depending on the DMF version) -struct PACKED DMFSampleHeaderTail -{ - uint16 filler; - uint32 crc32; -}; - -STATIC_ASSERT(sizeof(DMFSampleHeaderTail) == 6); - -#ifdef NEEDS_PRAGMA_PACK -#pragma pack(pop) -#endif - -// Pattern translation memory -struct DMFPatternSettings -{ - struct ChannelState - { - ModCommand::NOTE noteBuffer; // Note buffer - ModCommand::NOTE lastNote; // Last played note on channel - uint8 vibratoType; // Last used vibrato type on channel - uint8 tremoloType; // Last used tremolo type on channel - uint8 highOffset; // Last used high offset on channel - bool playDir; // Sample play direction... false = forward (default) - - ChannelState() - { - noteBuffer = lastNote = NOTE_NONE; - vibratoType = 8; - tremoloType = 4; - highOffset = 0; - playDir = false; - } - }; - - std::vector<ChannelState> channels; // Memory for each channel's state - bool realBPMmode; // true = BPM mode - uint8 beat; // Rows per beat - uint8 tempoTicks; // Tick mode param - uint8 tempoBPM; // BPM mode param - uint8 internalTicks; // Ticks per row in final pattern - - DMFPatternSettings(CHANNELINDEX numChannels) : channels(numChannels) - { - realBPMmode = false; - beat = 0; - tempoTicks = 32; - tempoBPM = 120; - internalTicks = 6; - } -}; - - -// Convert portamento value (not very accurate due to X-Tracker's higher granularity, to say the least) -static uint8 DMFporta2MPT(uint8 val, const uint8 internalTicks, const bool hasFine) -//--------------------------------------------------------------------------------- -{ - if(val == 0) - return 0; - else if((val <= 0x0F || internalTicks < 2) && hasFine) - return (val | 0xF0); - else - return MAX(1, (val / (internalTicks - 1))); // no porta on first tick! -} - - -// Convert portamento / volume slide value (not very accurate due to X-Tracker's higher granularity, to say the least) -static uint8 DMFslide2MPT(uint8 val, const uint8 internalTicks, const bool up) -//---------------------------------------------------------------------------- -{ - val = MAX(1, val / 4); - const bool isFine = (val < 0x0F) || (internalTicks < 2); - if(!isFine) - val = MAX(1, (val + internalTicks - 2) / (internalTicks - 1)); // no slides on first tick! "+ internalTicks - 2" for rounding precision - - if(up) - return (isFine ? 0x0F : 0x00) | (val << 4); - else - return (isFine ? 0xF0 : 0x00) | (val & 0x0F); - -} - - -// Calculate tremor on/off param -static uint8 DMFtremor2MPT(uint8 val, const uint8 internalTicks) -//-------------------------------------------------------------- -{ - uint8 ontime = (val >> 4); - uint8 offtime = (val & 0x0F); - ontime = CLAMP(ontime * internalTicks / 15, 1, 15); - offtime = CLAMP(offtime * internalTicks / 15, 1, 15); - return (ontime << 4) | offtime; -} - - -// Calculate delay parameter for note cuts / delays -static uint8 DMFdelay2MPT(uint8 val, const uint8 internalTicks) -//------------------------------------------------------------- -{ - int newval = (int)val * (int)internalTicks / 255; - Limit(newval, 0, 15); - return (uint8)newval; -} - - -// Convert vibrato-style command parameters -static uint8 DMFvibrato2MPT(uint8 val, const uint8 internalTicks) -//--------------------------------------------------------------- -{ - // MPT: 1 vibrato period == 64 ticks... we have internalTicks ticks per row. - // X-Tracker: Period length specified in rows! - const int periodInTicks = MAX(1, (val >> 4)) * internalTicks; - const uint8 matchingPeriod = (uint8)CLAMP((128 / periodInTicks), 1, 15); - return (matchingPeriod << 4) | MAX(1, (val & 0x0F)); -} - - -// Try using effect memory (zero paramer) to give the effect swapper some optimization hints. -static void ApplyEffectMemory(const ModCommand *m, ROWINDEX row, CHANNELINDEX numChannels, uint8 effect, uint8 ¶m) -//-------------------------------------------------------------------------------------------------------------------- -{ - if(effect == CMD_NONE || param == 0) - { - return; - } - - const bool isTonePortaEffect = (effect == CMD_PORTAMENTOUP || effect == CMD_PORTAMENTODOWN || effect == CMD_TONEPORTAMENTO); - const bool isVolSlideEffect = (effect == CMD_VOLUMESLIDE || effect == CMD_TONEPORTAVOL || effect == CMD_VIBRATOVOL); - - while(row > 0) - { - m -= numChannels; - row--; - - // First, keep some extra rules in mind for portamento, where effect memory is shared between various commands. - bool isSame = (effect == m->command); - if(isTonePortaEffect && (m->command == CMD_PORTAMENTOUP || m->command == CMD_PORTAMENTODOWN || m->command == CMD_TONEPORTAMENTO)) - { - if(m->param < 0xE0) - { - // Avoid effect param for fine slides, or else we could accidentally put this command in the volume column, where fine slides won't work! - isSame = true; - } else - { - return; - } - } else if(isVolSlideEffect && (m->command == CMD_VOLUMESLIDE || m->command == CMD_TONEPORTAVOL || m->command == CMD_VIBRATOVOL)) - { - isSame = true; - } - if(isTonePortaEffect - && (m->volcmd == VOLCMD_PORTAUP || m->volcmd == VOLCMD_PORTADOWN || m->volcmd == VOLCMD_TONEPORTAMENTO) - && m->vol != 0) - { - // Uuh... Don't even try - return; - } else if(isVolSlideEffect - && (m->volcmd == VOLCMD_FINEVOLUP || m->volcmd == VOLCMD_FINEVOLDOWN || m->volcmd == VOLCMD_VOLSLIDEUP || m->volcmd == VOLCMD_VOLSLIDEDOWN) - && m->vol != 0) - { - // Same! - return; - } - - if(isSame) - { - if(param != m->param && m->param != 0) - { - // No way to optimize this - return; - } else if(param == m->param) - { - // Yay! - param = 0; - return; - } - } - } -} - - -static PATTERNINDEX ConvertDMFPattern(FileReader &file, DMFPatternSettings &settings, CSoundFile &sndFile) -//-------------------------------------------------------------------------------------------------------- -{ - // Pattern flags - enum PatternFlags - { - // Global Track - patGlobPack = 0x80, // Pack information for global track follows - patGlobMask = 0x3F, // Mask for global effects - // Note tracks - patCounter = 0x80, // Pack information for current channel follows - patInstr = 0x40, // Instrument number present - patNote = 0x20, // Note present - patVolume = 0x10, // Volume present - patInsEff = 0x08, // Instrument effect present - patNoteEff = 0x04, // Note effect present - patVolEff = 0x02, // Volume effect stored - }; - - file.Rewind(); - - DMFPatternHeader patHead; - file.ReadConvertEndianness(patHead); - - const ROWINDEX numRows = Clamp(ROWINDEX(patHead.numRows), ROWINDEX(1), MAX_PATTERN_ROWS); - const PATTERNINDEX pat = sndFile.Patterns.Insert(numRows); - if(pat == PATTERNINDEX_INVALID) - { - return pat; - } - - PatternRow m = sndFile.Patterns[pat].GetRow(0); - const CHANNELINDEX numChannels = std::min(sndFile.GetNumChannels(), CHANNELINDEX(patHead.numTracks)); - - // When breaking to a pattern with less channels that the previous pattern, - // all voices in the now unused channels are killed: - for(CHANNELINDEX chn = numChannels + 1; chn < sndFile.GetNumChannels(); chn++) - { - m[chn].note = NOTE_NOTECUT; - } - - // Initialize tempo stuff - settings.beat = (patHead.beat >> 4); - bool tempoChange = settings.realBPMmode; - uint8 writeDelay = 0; - - // Counters for channel packing (including global track) - std::vector<uint8> channelCounter(numChannels + 1, 0); - - for(ROWINDEX row = 0; row < numRows; row++) - { - // Global track info counter reached 0 => read global track data - if(channelCounter[0] == 0) - { - uint8 globalInfo = file.ReadUint8(); - // 0x80: Packing counter (if not present, counter stays at 0) - if((globalInfo & patGlobPack) != 0) - { - channelCounter[0] = file.ReadUint8(); - } - - globalInfo &= patGlobMask; - - uint8 globalData = 0; - if(globalInfo != 0) - { - globalData = file.ReadUint8(); - } - - switch(globalInfo) - { - case 1: // Set Tick Frame Speed - settings.realBPMmode = false; - settings.tempoTicks = std::max(uint8(1), globalData); // Tempo in 1/4 rows per second - settings.tempoBPM = 0; // Automatically updated by X-Tracker - tempoChange = true; - break; - case 2: // Set BPM Speed (real BPM mode) - if(globalData) // DATA = 0 doesn't do anything - { - settings.realBPMmode = true; - settings.tempoBPM = globalData; // Tempo in real BPM (depends on rows per beat) - if(settings.beat != 0) - { - settings.tempoTicks = (globalData * settings.beat * 15); // Automatically updated by X-Tracker - } - tempoChange = true; - } - break; - case 3: // Set Beat - settings.beat = (globalData >> 4); - if(settings.beat != 0) - { - // Tempo changes only if we're in real BPM mode - tempoChange = settings.realBPMmode; - } else - { - // If beat is 0, change to tick speed mode, but keep current tempo - settings.realBPMmode = false; - } - break; - case 4: // Tick Delay - writeDelay = globalData; - break; - case 5: // Set External Flag - break; - case 6: // Slide Speed Up - if(globalData > 0) - { - uint8 &tempoData = (settings.realBPMmode) ? settings.tempoBPM : settings.tempoTicks; - if(tempoData < 256 - globalData) - { - tempoData += globalData; - } else - { - tempoData = 255; - } - tempoChange = true; - } - break; - case 7: // Slide Speed Down - if(globalData > 0) - { - uint8 &tempoData = (settings.realBPMmode) ? settings.tempoBPM : settings.tempoTicks; - if(tempoData > 1 + globalData) - { - tempoData -= globalData; - } else - { - tempoData = 1; - } - tempoChange = true; - } - break; - } - } else - { - channelCounter[0]--; - } - - // These will eventually be written to the pattern - int speed = 0, tempo = 0; - - if(tempoChange) - { - // Can't do anything if we're in BPM mode and there's no rows per beat set... - if(!settings.realBPMmode || settings.beat) - { - // My approach to convert X-Tracker's "tick speed" (1/4 rows per second): - // Tempo * 6 / Speed = Beats per Minute - // => Tempo * 6 / (Speed * 60) = Beats per Second - // => Tempo * 24 / (Speed * 60) = Rows per Second (4 rows per beat at tempo 6) - // => Tempo = 60 * Rows per Second * Speed / 24 - // For some reason, using settings.tempoTicks + 1 gives more accurate results than just settings.tempoTicks... (same problem in the old libmodplug DMF loader) - // Original unoptimized formula: - //const int tickspeed = (tempoRealBPMmode) ? MAX(1, (tempoData * beat * 4) / 60) : tempoData; - const int tickspeed = (settings.realBPMmode) ? std::max(1, settings.tempoBPM * settings.beat * 2) : ((settings.tempoTicks + 1) * 30); - // Try to find matching speed - try higher speeds first, so that effects like arpeggio and tremor work better. - for(speed = 255; speed > 1; speed--) - { - // Original unoptimized formula: - // tempo = 30 * tickspeed * speed / 48; - tempo = tickspeed * speed / 48; - if(tempo >= 32 && tempo <= 255) - { - break; - } - } - Limit(tempo, 32, 255); - settings.internalTicks = (uint8)speed; - } else - { - tempoChange = false; - } - } - - m = sndFile.Patterns[pat].GetpModCommand(row, 1); // Reserve first channel for global effects - - for(CHANNELINDEX chn = 1; chn <= numChannels; chn++, m++) - { - // Track info counter reached 0 => read track data - if(channelCounter[chn] == 0) - { - const uint8 channelInfo = file.ReadUint8(); - //////////////////////////////////////////////////////////////// - // 0x80: Packing counter (if not present, counter stays at 0) - if((channelInfo & patCounter) != 0) - { - channelCounter[chn] = file.ReadUint8(); - } - - //////////////////////////////////////////////////////////////// - // 0x40: Instrument - bool slideNote = true; // If there is no instrument number next to a note, the note is not retriggered! - if((channelInfo & patInstr) != 0) - { - m->instr = file.ReadUint8(); - if(m->instr != 0) - { - slideNote = false; - } - } - - //////////////////////////////////////////////////////////////// - // 0x20: Note - if((channelInfo & patNote) != 0) - { - m->note = file.ReadUint8(); - if(m->note >= 1 && m->note <= 108) - { - m->note = static_cast<uint8>(Clamp(m->note + 24, NOTE_MIN, NOTE_MAX)); - settings.channels[chn].lastNote = m->note; - } else if(m->note >= 129 && m->note <= 236) - { - // "Buffer notes" for portamento (and other effects?) that are actually not played, but just "queued"... - m->note = static_cast<uint8>(Clamp((m->note & 0x7F) + 24, NOTE_MIN, NOTE_MAX)); - settings.channels[chn].noteBuffer = m->note; - m->note = NOTE_NONE; - } else if(m->note == 255) - { - m->note = NOTE_NOTECUT; - } - } - - // If there's just an instrument number, but no note, retrigger sample. - if(m->note == NOTE_NONE && m->instr > 0) - { - m->note = settings.channels[chn].lastNote; - m->instr = 0; - } - - if(m->IsNote()) - { - settings.channels[chn].playDir = false; - } - - uint8 effect1 = CMD_NONE, effect2 = CMD_NONE, effect3 = CMD_NONE; - uint8 effectParam1 = 0, effectParam2 = 0, effectParam3 = 0; - bool useMem2 = false, useMem3 = false; // Effect can use memory if necessary - - //////////////////////////////////////////////////////////////// - // 0x10: Volume - if((channelInfo & patVolume) != 0) - { - m->volcmd = VOLCMD_VOLUME; - m->vol = (file.ReadUint8() + 2) / 4; // Should be + 3 instead of + 2, but volume 1 is silent in X-Tracker. - } - - //////////////////////////////////////////////////////////////// - // 0x08: Instrument effect - if((channelInfo & patInsEff) != 0) - { - effect1 = file.ReadUint8(); - effectParam1 = file.ReadUint8(); - - switch(effect1) - { - case 1: // Stop Sample - m->note = NOTE_NOTECUT; - effect1 = CMD_NONE; - break; - case 2: // Stop Sample Loop - m->note = NOTE_KEYOFF; - effect1 = CMD_NONE; - break; - case 3: // Instrument Volume Override (aka "Restart") - m->note = settings.channels[chn].lastNote; - settings.channels[chn].playDir = false; - effect1 = CMD_NONE; - break; - case 4: // Sample Delay - effectParam1 = DMFdelay2MPT(effectParam1, settings.internalTicks); - if(effectParam1) - { - effect1 = CMD_S3MCMDEX; - effectParam1 = 0xD0 | (effectParam1); - } else - { - effect1 = CMD_NONE; - } - if(m->note == NOTE_NONE) - { - m->note = settings.channels[chn].lastNote; - settings.channels[chn].playDir = false; - } - break; - case 5: // Tremolo Retrig Sample (who invented those stupid effect names?) - effectParam1 = MAX(1, DMFdelay2MPT(effectParam1, settings.internalTicks)); - effect1 = CMD_RETRIG; - settings.channels[chn].playDir = false; - break; - case 6: // Offset - case 7: // Offset + 64k - case 8: // Offset + 128k - case 9: // Offset + 192k - // Put high offset on previous row - if(row > 0 && effect1 != settings.channels[chn].highOffset) - { - if(sndFile.Patterns[pat].WriteEffect(EffectWriter(CMD_S3MCMDEX, (0xA0 | (effect1 - 6))).Row(row - 1).Channel(chn).Retry(EffectWriter::rmTryPreviousRow))) - { - settings.channels[chn].highOffset = effect1; - } - } - effect1 = CMD_OFFSET; - if(m->note == NOTE_NONE) - { - // Offset without note does also work in DMF. - m->note = settings.channels[chn].lastNote; - } - settings.channels[chn].playDir = false; - break; - case 10: // Invert Sample play direction ("Tekkno Invert") - effect1 = CMD_S3MCMDEX; - if(settings.channels[chn].playDir == false) - effectParam1 = 0x9F; - else - effectParam1 = 0x9E; - settings.channels[chn].playDir = !settings.channels[chn].playDir; - break; - default: - effect1 = CMD_NONE; - break; - } - } - - //////////////////////////////////////////////////////////////// - // 0x04: Note effect - if((channelInfo & patNoteEff) != 0) - { - effect2 = file.ReadUint8(); - effectParam2 = file.ReadUint8(); - - switch(effect2) - { - case 1: // Note Finetune - effect2 = static_cast<ModCommand::COMMAND>(effectParam2 < 128 ? CMD_PORTAMENTOUP : CMD_PORTAMENTODOWN); - if(effectParam2 > 128) effectParam2 = 255 - effectParam2 + 1; - effectParam2 = 0xF0 | MIN(0x0F, effectParam2); // Well, this is not too accurate... - break; - case 2: // Note Delay (wtf is the difference to Sample Delay?) - effectParam2 = DMFdelay2MPT(effectParam2, settings.internalTicks); - if(effectParam2) - { - effect2 = CMD_S3MCMDEX; - effectParam2 = 0xD0 | (effectParam2); - } else - { - effect2 = CMD_NONE; - } - useMem2 = true; - break; - case 3: // Arpeggio - effect2 = CMD_ARPEGGIO; - useMem2 = true; - break; - case 4: // Portamento Up - case 5: // Portamento Down - effectParam2 = DMFporta2MPT(effectParam2, settings.internalTicks, true); - effect2 = static_cast<ModCommand::COMMAND>(effect2 == 4 ? CMD_PORTAMENTOUP : CMD_PORTAMENTODOWN); - useMem2 = true; - break; - case 6: // Portamento to Note - if(m->note == NOTE_NONE) - { - m->note = settings.channels[chn].noteBuffer; - } - effectParam2 = DMFporta2MPT(effectParam2, settings.internalTicks, false); - effect2 = CMD_TONEPORTAMENTO; - useMem2 = true; - break; - case 7: // Scratch to Note (neat! but we don't have such an effect...) - m->note = CLAMP(effectParam2 + 25, NOTE_MIN, NOTE_MAX); - effect2 = CMD_TONEPORTAMENTO; - effectParam2 = 0xFF; - useMem2 = true; - break; - case 8: // Vibrato Sine - case 9: // Vibrato Triangle (ramp down should be close enough) - case 10: // Vibrato Square - // Put vibrato type on previous row - if(row > 0 && effect2 != settings.channels[chn].vibratoType) - { - if(sndFile.Patterns[pat].WriteEffect(EffectWriter(CMD_S3MCMDEX, (0x30 | (effect2 - 8))).Row(row - 1).Channel(chn).Retry(EffectWriter::rmTryPreviousRow))) - { - settings.channels[chn].vibratoType = effect2; - } - } - effect2 = CMD_VIBRATO; - effectParam2 = DMFvibrato2MPT(effectParam2, settings.internalTicks); - useMem2 = true; - break; - case 11: // Note Tremolo - effectParam2 = DMFtremor2MPT(effectParam2, settings.internalTicks); - effect2 = CMD_TREMOR; - useMem2 = true; - break; - case 12: // Note Cut - effectParam2 = DMFdelay2MPT(effectParam2, settings.internalTicks); - if(effectParam2) - { - effect2 = CMD_S3MCMDEX; - effectParam2 = 0xC0 | (effectParam2); - } else - { - effect2 = CMD_NONE; - m->note = NOTE_NOTECUT; - } - useMem2 = true; - break; - default: - effect2 = CMD_NONE; - break; - } - } - - //////////////////////////////////////////////////////////////// - // 0x02: Volume effect - if((channelInfo & patVolEff) != 0) - { - effect3 = file.ReadUint8(); - effectParam3 = file.ReadUint8(); - - switch(effect3) - { - case 1: // Volume Slide Up - case 2: // Volume Slide Down - effectParam3 = DMFslide2MPT(effectParam3, settings.internalTicks, (effect3 == 1)); - effect3 = CMD_VOLUMESLIDE; - useMem3 = true; - break; - case 3: // Volume Tremolo (actually this is Tremor) - effectParam3 = DMFtremor2MPT(effectParam3, settings.internalTicks); - effect3 = CMD_TREMOR; - useMem3 = true; - break; - case 4: // Tremolo Sine - case 5: // Tremolo Triangle (ramp down should be close enough) - case 6: // Tremolo Square - // Put tremolo type on previous row - if(row > 0 && effect3 != settings.channels[chn].tremoloType) - { - if(sndFile.Patterns[pat].WriteEffect(EffectWriter(CMD_S3MCMDEX, (0x40 | (effect3 - 4))).Row(row - 1).Channel(chn).Retry(EffectWriter::rmTryPreviousRow))) - { - settings.channels[chn].tremoloType = effect3; - } - } - effect3 = CMD_TREMOLO; - effectParam3 = DMFvibrato2MPT(effectParam3, settings.internalTicks); - useMem3 = true; - break; - case 7: // Set Balance - effect3 = CMD_PANNING8; - break; - case 8: // Slide Balance Left - case 9: // Slide Balance Right - effectParam3 = DMFslide2MPT(effectParam3, settings.internalTicks, (effect3 == 8)); - effect3 = CMD_PANNINGSLIDE; - useMem3 = true; - break; - case 10: // Balance Vibrato Left/Right (always sine modulated) - effect3 = CMD_PANBRELLO; - effectParam3 = DMFvibrato2MPT(effectParam3, settings.internalTicks); - useMem3 = true; - break; - default: - effect3 = CMD_NONE; - break; - } - } - - // Let's see if we can help the effect swapper by reducing some effect parameters to "continue" parameters. - if(useMem2) - { - ApplyEffectMemory(m, row, sndFile.GetNumChannels(), effect2, effectParam2); - } - if(useMem3) - { - ApplyEffectMemory(m, row, sndFile.GetNumChannels(), effect3, effectParam3); - } - - // I guess this is close enough to "not retriggering the note" - ... [truncated message content] |
From: <man...@us...> - 2013-07-05 19:59:42
|
Revision: 2503 http://sourceforge.net/p/modplug/code/2503 Author: manxorist Date: 2013-07-05 19:59:35 +0000 (Fri, 05 Jul 2013) Log Message: ----------- [Ref] Logging actually goes nowhere in release builds, so we can as well just #define NO_LOGGING. [Ref] When LOG_TO_FILE is compiled in debug mode, also write timestamps. [Ref] Other small cleanups to DoLog(). Modified Paths: -------------- trunk/OpenMPT/common/BuildSettings.h trunk/OpenMPT/common/typedefs.cpp trunk/OpenMPT/common/typedefs.h Property Changed: ---------------- trunk/OpenMPT/mptrack/ Modified: trunk/OpenMPT/common/BuildSettings.h =================================================================== --- trunk/OpenMPT/common/BuildSettings.h 2013-07-05 16:55:57 UTC (rev 2502) +++ trunk/OpenMPT/common/BuildSettings.h 2013-07-05 19:59:35 UTC (rev 2503) @@ -69,7 +69,9 @@ //#define MODPLUG_NO_FILESAVE // Disable any debug logging -//#define NO_LOGGING +#ifndef _DEBUG +#define NO_LOGGING +#endif // Disable unarchiving support //#define NO_ARCHIVE_SUPPORT Modified: trunk/OpenMPT/common/typedefs.cpp =================================================================== --- trunk/OpenMPT/common/typedefs.cpp 2013-07-05 16:55:57 UTC (rev 2502) +++ trunk/OpenMPT/common/typedefs.cpp 2013-07-05 19:59:35 UTC (rev 2503) @@ -57,67 +57,123 @@ #endif +//#define LOG_TO_FILE + + static const std::size_t LOGBUF_SIZE = 1024; + +#if defined(MODPLUG_TRACKER) && defined(_DEBUG) + + +static uint64 GetTimeMS() +//----------------------- +{ + FILETIME filetime; + GetSystemTimeAsFileTime(&filetime); + return ((uint64)filetime.dwHighDateTime << 32 | filetime.dwLowDateTime) / 10000; +} + +static std::string TimeAsAsString(uint64 ms) +//------------------------------------------ +{ + + FILETIME filetime; + SYSTEMTIME systime; + filetime.dwHighDateTime = (DWORD)(((uint64)ms * 10000) >> 32); + filetime.dwLowDateTime = (DWORD)((uint64)ms * 10000); + FileTimeToSystemTime(&filetime, &systime); + + std::string result; + TCHAR buf[LOGBUF_SIZE]; + + GetDateFormat(LOCALE_SYSTEM_DEFAULT, 0, &systime, "yyyy-MM-dd ", buf, LOGBUF_SIZE); + result.append(buf); + + GetTimeFormat(LOCALE_SYSTEM_DEFAULT, TIME_FORCE24HOURFORMAT, &systime, "HH:mm:ss.", buf, LOGBUF_SIZE); + result.append(buf); + + sprintf(buf, "%03u", (unsigned)systime.wMilliseconds); + result.append(buf); + + return result; +} + +static std::string TimeDiffAsString(uint64 ms) +//-------------------------------------------- +{ + return mpt::String::Format("%6u", (unsigned)(ms)); +} + + +#endif // MODPLUG_TRACKER + + static void DoLog(const char *file, int line, const char *function, const char *format, va_list args) //--------------------------------------------------------------------------------------------------- { -#if !defined(MODPLUG_TRACKER) || defined(_DEBUG) +#if !defined(MODPLUG_TRACKER) || (defined(MODPLUG_TRACKER) && defined(_DEBUG)) char message[LOGBUF_SIZE]; va_list va; va_copy(va, args); vsnprintf(message, LOGBUF_SIZE, format, va); message[LOGBUF_SIZE - 1] = '\0'; va_end(va); + if(!file) + { + file = "unknown"; + } + if(!function) + { + function = ""; + } + // remove eol if already present + std::size_t len = std::strlen(message); + if(len > 0 && message[len-1] == '\n') + { + message[len-1] = '\0'; + len--; + } + if(len > 0 && message[len-1] == '\r') + { + message[len-1] = '\0'; + len--; + } #if defined(MODPLUG_TRACKER) - char buf2[LOGBUF_SIZE]; - char *verbose_message = nullptr; - if(file || function) + static uint64_t s_lastlogtime = 0; + uint64 cur = GetTimeMS(); + uint64 diff = cur - s_lastlogtime; + s_lastlogtime = cur; + #ifdef LOG_TO_FILE { - snprintf(buf2, LOGBUF_SIZE, "%s(%i): %s", file?file:"", line, message); - buf2[LOGBUF_SIZE - 1] = '\0'; - verbose_message = buf2; - } else - { - verbose_message = message; - } - OutputDebugString(verbose_message); - #ifdef LOG_TO_FILE - FILE *f = fopen("c:\\mptrack.log", "a"); - if(f) + static FILE * s_logfile = nullptr; + char verbose_message[LOGBUF_SIZE]; + snprintf(verbose_message, LOGBUF_SIZE, "%s+%s %s(%i): %s [%s]\n", TimeAsAsString(cur).c_str(), TimeDiffAsString(diff).c_str(), file, line, message, function); + verbose_message[LOGBUF_SIZE - 1] = '\0'; + if(!s_logfile) { - fwrite(verbose_message, 1, strlen(verbose_message), f); - fclose(f); + s_logfile = fopen("mptrack.log", "a"); } - #endif //LOG_TO_FILE - #else // !MODPLUG_TRACKER - std::size_t len = std::strlen(message); - // remove eol if already present - if(len > 0 && message[len-1] == '\n') - { - message[len-1] = '\0'; - len--; + if(s_logfile) + { + fprintf(s_logfile, "%s", verbose_message); + fflush(s_logfile); + } } - if(len > 0 && message[len-1] == '\r') + #endif // LOG_TO_FILE { - message[len-1] = '\0'; - len--; + char verbose_message[LOGBUF_SIZE]; + snprintf(verbose_message, LOGBUF_SIZE, "%s(%i): +%s %s [%s]\n", file, line, TimeDiffAsString(diff).c_str(), message, function); + verbose_message[LOGBUF_SIZE - 1] = '\0'; + OutputDebugString(verbose_message); } - if(file || function) - { - std::clog - << "openmpt: DEBUG: " - << (file?file:"") << "(" << line << ")" << ": " - << std::string(message) - << " [" << (function?function:"") << "]" - << std::endl; - } else - { - std::clog - << "openmpt: DEBUG: " - << std::string(message) - << std::endl; - } + #else // !MODPLUG_TRACKER + std::clog + << "openmpt: DEBUG: " + << file << "(" << line << ")" << ": " + << std::string(message) + << " [" << function << "]" + << std::endl; #endif // MODPLUG_TRACKER #else UNREFERENCED_PARAMETER(file); Modified: trunk/OpenMPT/common/typedefs.h =================================================================== --- trunk/OpenMPT/common/typedefs.h 2013-07-05 16:55:57 UTC (rev 2502) +++ trunk/OpenMPT/common/typedefs.h 2013-07-05 19:59:35 UTC (rev 2503) @@ -346,8 +346,8 @@ }; #define Log Logger(__FILE__, __LINE__, __FUNCTION__) #else // !NO_LOGGING -inline void MPT_PRINTF_FUNC(1,2) Log(const char *format, ...) {} -class Logger { public: void MPT_PRINTF_FUNC(2,3) operator () (const char *format, ...) {} }; +static inline void MPT_PRINTF_FUNC(1,2) Log(const char * /*format*/, ...) {} +class Logger { public: void MPT_PRINTF_FUNC(2,3) operator () (const char * /*format*/, ...) {} }; #define Log if(true) {} else Logger() // completely compile out arguments to Log() so that they do not even get evaluated #endif // NO_LOGGING Index: trunk/OpenMPT/mptrack =================================================================== --- trunk/OpenMPT/mptrack 2013-07-05 16:55:57 UTC (rev 2502) +++ trunk/OpenMPT/mptrack 2013-07-05 19:59:35 UTC (rev 2503) Property changes on: trunk/OpenMPT/mptrack ___________________________________________________________________ Added: svn:global-ignores ## -0,0 +1 ## +mptrack.log This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |