From: <rel...@us...> - 2009-09-01 18:50:54
|
Revision: 351 http://modplug.svn.sourceforge.net/modplug/?rev=351&view=rev Author: relabsoluness Date: 2009-09-01 18:50:33 +0000 (Tue, 01 Sep 2009) Log Message: ----------- [Ref] Moved constants from Sndfile.h to a new file, renamed OrderToPatternTable files, added some utility functions, minor code cleanup. Modified Paths: -------------- trunk/OpenMPT/mptrack/misc_util.h trunk/OpenMPT/mptrack/mptrack.vcproj trunk/OpenMPT/mptrack/mptrack_08.vcproj trunk/OpenMPT/mptrack/typedefs.h trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/mod_specifications.h trunk/OpenMPT/soundlib/pattern.h trunk/OpenMPT/soundlib/patternContainer.h Added Paths: ----------- trunk/OpenMPT/soundlib/ModSequence.cpp trunk/OpenMPT/soundlib/ModSequence.h trunk/OpenMPT/soundlib/Snd_defs.h Removed Paths: ------------- trunk/OpenMPT/soundlib/OrderToPatternTable.cpp trunk/OpenMPT/soundlib/OrderToPatternTable.h Modified: trunk/OpenMPT/mptrack/misc_util.h =================================================================== --- trunk/OpenMPT/mptrack/misc_util.h 2009-08-30 22:27:15 UTC (rev 350) +++ trunk/OpenMPT/mptrack/misc_util.h 2009-09-01 18:50:33 UTC (rev 351) @@ -81,4 +81,33 @@ LPCCH LoadResource(LPCTSTR lpName, LPCTSTR lpType, LPCCH& pData, size_t& nSize, HGLOBAL& hglob); +namespace utilImpl +{ + template <bool bMemcpy> + struct ArrayCopyImpl {}; + + template <> + struct ArrayCopyImpl<true> + { + template <class T> + static void Do(T* pDst, const T* pSrc, const size_t n) {memcpy(pDst, pSrc, sizeof(T) * n);} + }; + + template <> + struct ArrayCopyImpl<false> + { + template <class T> + static void Do(T* pDst, const T* pSrc, const size_t n) {std::copy(pSrc, pSrc + n, pDst);} + }; +} // namespace utilImpl + + +// Copies n elements from array pSrc to array pDst. +// If the source and destination arrays overlap, behaviour is undefined. +template <class T> +void ArrayCopy(T* pDst, const T* pSrc, const size_t n) +{ + utilImpl::ArrayCopyImpl<std::tr1::has_trivial_assign<T>::value>::Do(pDst, pSrc, n); +} + #endif Modified: trunk/OpenMPT/mptrack/mptrack.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack.vcproj 2009-08-30 22:27:15 UTC (rev 350) +++ trunk/OpenMPT/mptrack/mptrack.vcproj 2009-09-01 18:50:33 UTC (rev 351) @@ -367,6 +367,9 @@ RelativePath=".\Modedit.cpp"> </File> <File + RelativePath="..\soundlib\ModSequence.cpp"> + </File> + <File RelativePath="..\soundlib\modsmp_ctrl.cpp"> </File> <File @@ -397,9 +400,6 @@ RelativePath=".\OpenGLEditor.cpp"> </File> <File - RelativePath="..\soundlib\OrderToPatternTable.cpp"> - </File> - <File RelativePath="..\soundlib\pattern.cpp"> </File> <File @@ -795,6 +795,9 @@ RelativePath=".\moddoc.h"> </File> <File + RelativePath="..\soundlib\ModSequence.h"> + </File> + <File RelativePath="..\soundlib\modsmp_ctrl.h"> </File> <File @@ -819,12 +822,6 @@ RelativePath=".\OpenGLEditor.h"> </File> <File - RelativePath=".\order.h"> - </File> - <File - RelativePath="..\soundlib\OrderToPatternTable.h"> - </File> - <File RelativePath="..\soundlib\pattern.h"> </File> <File @@ -852,6 +849,9 @@ RelativePath=".\serialization_utils.h"> </File> <File + RelativePath="..\soundlib\Snd_defs.h"> + </File> + <File RelativePath="..\Soundlib\snddev.h"> </File> <File Modified: trunk/OpenMPT/mptrack/mptrack_08.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_08.vcproj 2009-08-30 22:27:15 UTC (rev 350) +++ trunk/OpenMPT/mptrack/mptrack_08.vcproj 2009-09-01 18:50:33 UTC (rev 351) @@ -493,6 +493,10 @@ > </File> <File + RelativePath="..\soundlib\ModSequence.cpp" + > + </File> + <File RelativePath="..\soundlib\modsmp_ctrl.cpp" > </File> @@ -533,10 +537,6 @@ > </File> <File - RelativePath="..\soundlib\OrderToPatternTable.cpp" - > - </File> - <File RelativePath="..\soundlib\pattern.cpp" > </File> @@ -1051,6 +1051,10 @@ > </File> <File + RelativePath="..\soundlib\ModSequence.h" + > + </File> + <File RelativePath="..\soundlib\modsmp_ctrl.h" > </File> @@ -1083,14 +1087,6 @@ > </File> <File - RelativePath=".\order.h" - > - </File> - <File - RelativePath="..\soundlib\OrderToPatternTable.h" - > - </File> - <File RelativePath="..\soundlib\pattern.h" > </File> @@ -1127,6 +1123,10 @@ > </File> <File + RelativePath="..\soundlib\Snd_defs.h" + > + </File> + <File RelativePath="..\Soundlib\snddev.h" > </File> Modified: trunk/OpenMPT/mptrack/typedefs.h =================================================================== --- trunk/OpenMPT/mptrack/typedefs.h 2009-08-30 22:27:15 UTC (rev 350) +++ trunk/OpenMPT/mptrack/typedefs.h 2009-09-01 18:50:33 UTC (rev 351) @@ -31,26 +31,26 @@ typedef float float32; -typedef uint32 ROWINDEX; - const ROWINDEX ROWINDEX_MAX = uint32_max; -typedef uint16 CHANNELINDEX; - const CHANNELINDEX CHANNELINDEX_MAX = uint16_max; - const CHANNELINDEX CHANNELINDEX_INVALID = CHANNELINDEX_MAX; -typedef uint16 ORDERINDEX; - const ORDERINDEX ORDERINDEX_MAX = uint16_max; - const ORDERINDEX ORDERINDEX_INVALID = ORDERINDEX_MAX; -typedef uint16 PATTERNINDEX; - const PATTERNINDEX PATTERNINDEX_MAX = uint16_max; - const PATTERNINDEX PATTERNINDEX_INVALID = PATTERNINDEX_MAX; -typedef uint8 PLUGINDEX; -typedef uint16 TEMPO; -typedef uint16 SAMPLEINDEX; - const SAMPLEINDEX SAMPLEINDEX_MAX = uint16_max; - const SAMPLEINDEX SAMPLEINDEX_INVALID = SAMPLEINDEX_MAX; -typedef uint16 INSTRUMENTINDEX; - const SAMPLEINDEX INSTRUMENTINDEX_MAX = uint16_max; - const SAMPLEINDEX INSTRUMENTINDEX_INVALID = INSTRUMENTINDEX_MAX; -typedef uint32 MODTYPE; +#if !_HAS_TR1 + namespace std + { + namespace tr1 + { + template <class T> struct has_trivial_assign {static const bool value = false;}; + #define SPECIALIZE_TRIVIAL_ASSIGN(type) template <> struct has_trivial_assign<type> {static const bool value = true;} + SPECIALIZE_TRIVIAL_ASSIGN(int8); + SPECIALIZE_TRIVIAL_ASSIGN(uint8); + SPECIALIZE_TRIVIAL_ASSIGN(int16); + SPECIALIZE_TRIVIAL_ASSIGN(uint16); + SPECIALIZE_TRIVIAL_ASSIGN(int32); + SPECIALIZE_TRIVIAL_ASSIGN(uint32); + SPECIALIZE_TRIVIAL_ASSIGN(int64); + SPECIALIZE_TRIVIAL_ASSIGN(uint64); + #undef SPECIALIZE_TRIVIAL_ASSIGN + }; + }; +#endif + #endif Copied: trunk/OpenMPT/soundlib/ModSequence.cpp (from rev 349, trunk/OpenMPT/soundlib/OrderToPatternTable.cpp) =================================================================== --- trunk/OpenMPT/soundlib/ModSequence.cpp (rev 0) +++ trunk/OpenMPT/soundlib/ModSequence.cpp 2009-09-01 18:50:33 UTC (rev 351) @@ -0,0 +1,221 @@ +#include "stdafx.h" +#include "sndfile.h" +#include "ModSequence.h" +#include "../mptrack/serialization_utils.h" + +#define str_SequenceTruncationNote (GetStrI18N((_TEXT("Module has sequence of length %u; it will be truncated to maximum supported length, %u.")))) + +DWORD COrderToPatternTable::Deserialize(const BYTE* const src, const DWORD memLength) +//------------------------------------------------------------------------- +{ + if(memLength < 2 + 4) return 0; + uint16 version = 0; + uint32 s = 0; + DWORD memPos = 0; + memcpy(&version, src, sizeof(version)); + memPos += sizeof(version); + if(version != 0) return memPos; + memcpy(&s, src+memPos, sizeof(s)); + memPos += sizeof(s); + if(s > 65000) return true; + if(memLength < memPos+s*4) return memPos; + + const uint32 nOriginalSize = s; + if(s > ModSpecs::mptm.ordersMax) + s = ModSpecs::mptm.ordersMax; + + resize(max(s, MAX_ORDERS)); + for(size_t i = 0; i<s; i++, memPos +=4 ) + { + uint32 temp; + memcpy(&temp, src+memPos, 4); + (*this)[i] = static_cast<PATTERNINDEX>(temp); + } + memPos += 4*(nOriginalSize - s); + return memPos; +} + + +size_t COrderToPatternTable::WriteToByteArray(BYTE* dest, const UINT numOfBytes, const UINT destSize) +//----------------------------------------------------------------------------- +{ + if(numOfBytes > destSize) return true; + if(size() < numOfBytes) resize(numOfBytes, 0xFF); + UINT i = 0; + for(i = 0; i<numOfBytes; i++) + { + dest[i] = static_cast<BYTE>((*this)[i]); + } + return i; //Returns the number of bytes written. +} + + +size_t COrderToPatternTable::WriteAsByte(FILE* f, const UINT count) +//--------------------------------------------------------------- +{ + if(size() < count) resize(count, GetInvalidPatIndex()); + + size_t i = 0; + + for(i = 0; i<count; i++) + { + const PATTERNINDEX pat = (*this)[i]; + BYTE temp = static_cast<BYTE>((*this)[i]); + + if(pat > 0xFD) + { + if(pat == GetInvalidPatIndex()) temp = 0xFF; + else temp = 0xFE; + } + fwrite(&temp, 1, 1, f); + } + return i; //Returns the number of bytes written. +} + +bool COrderToPatternTable::ReadAsByte(const BYTE* pFrom, const int howMany, const int memLength) +//------------------------------------------------------------------------- +{ + if(howMany < 0 || howMany > memLength) return true; + if(m_rSndFile.GetType() != MOD_TYPE_MPT && howMany > MAX_ORDERS) return true; + + if(size() < static_cast<size_t>(howMany)) + resize(howMany, GetInvalidPatIndex()); + + for(int i = 0; i<howMany; i++, pFrom++) + (*this)[i] = *pFrom; + return false; +} + + +bool COrderToPatternTable::NeedsExtraDatafield() const +//---------------------------------------------- +{ + if(m_rSndFile.GetType() == MOD_TYPE_MPT && m_rSndFile.Patterns.Size() > 0xFD) + return true; + else + return false; +} + + +void COrderToPatternTable::OnModTypeChanged(const MODTYPE oldtype) +//---------------------------------------------------------------- +{ + const CModSpecifications specs = m_rSndFile.GetModSpecifications(); + + //Resize orderlist if needed. Because old orderlist had MAX_ORDERS(256) elements, not making it + //smaller than that even if the modtype doesn't support that many orders. + if(specs.ordersMax < GetCount()) + { + resize(max(MAX_ORDERS, specs.ordersMax)); + for(ORDERINDEX i = GetCount(); i>specs.ordersMax; --i) (*this)[i-1] = GetInvalidPatIndex(); + } + if (GetCount() < MAX_ORDERS) + resize(MAX_ORDERS, GetInvalidPatIndex()); + + //Replace items used to denote end of song/skip order. + replace(begin(), end(), GetInvalidPatIndex(oldtype), GetInvalidPatIndex()); + replace(begin(), end(), GetIgnoreIndex(oldtype), GetIgnoreIndex()); +} + + +ORDERINDEX COrderToPatternTable::GetLengthTailTrimmed() const +//----------------------------------------------------------- +{ + ORDERINDEX nEnd = GetCount(); + if(nEnd == 0) return 0; + nEnd--; + const PATTERNINDEX iInvalid = GetInvalidPatIndex(); + while(nEnd > 0 && (*this)[nEnd] == iInvalid) + nEnd--; + return ((*this)[nEnd] == iInvalid) ? 0 : nEnd+1; +} + + +ORDERINDEX COrderToPatternTable::GetLengthFirstEmpty() const +//---------------------------------------------------------- +{ + const ORDERINDEX nLength = GetCount(); + ORDERINDEX nMax = 0; + while ((nMax < nLength) && ((*this)[nMax] != (*this).GetInvalidPatIndex())) nMax++; + return nMax; +} + + +ORDERINDEX COrderToPatternTable::GetNextOrderIgnoringSkips(const ORDERINDEX start) const +//------------------------------------------------------------------------------------- +{ + const ORDERINDEX count = GetCount(); + if(count == 0) return 0; + ORDERINDEX next = min(count-1, start+1); + while(next+1 < count && (*this)[next] == GetIgnoreIndex()) next++; + return next; +} + +ORDERINDEX COrderToPatternTable::GetPreviousOrderIgnoringSkips(const ORDERINDEX start) const +//------------------------------------------------------------------------------------- +{ + const ORDERINDEX count = GetCount(); + if(start == 0 || count == 0) return 0; + ORDERINDEX prev = min(start-1, count-1); + while(prev > 0 && (*this)[prev] == GetIgnoreIndex()) prev--; + return prev; +} + + +void COrderToPatternTable::Init() +//------------------------------- +{ + resize(MAX_ORDERS, GetInvalidPatIndex()); + for(ORDERINDEX i = 0; i < GetCount(); i++) + { + (*this)[i] = GetInvalidPatIndex(); + } +} + + + +PATTERNINDEX COrderToPatternTable::GetInvalidPatIndex(const MODTYPE type) {return type == MOD_TYPE_MPT ? 65535 : 0xFF;} +PATTERNINDEX COrderToPatternTable::GetIgnoreIndex(const MODTYPE type) {return type == MOD_TYPE_MPT ? 65534 : 0xFE;} + +PATTERNINDEX COrderToPatternTable::GetInvalidPatIndex() const {return GetInvalidPatIndex(m_rSndFile.GetType());} +PATTERNINDEX COrderToPatternTable::GetIgnoreIndex() const {return GetIgnoreIndex(m_rSndFile.GetType());} + + +void ReadModSequence(std::istream& iStrm, COrderToPatternTable& seq, const size_t) +//-------------------------------------------------------------------------------- +{ + uint16 size; + srlztn::Binaryread<uint16>(iStrm, size); + if(size > ModSpecs::mptm.ordersMax) + { + // Hack: Show message here if trying to load longer sequence than what is supported. + CString str; str.Format(str_SequenceTruncationNote, size, ModSpecs::mptm.ordersMax); + AfxMessageBox(str, MB_ICONWARNING); + size = ModSpecs::mptm.ordersMax; + } + seq.resize(max(size, MAX_ORDERS), seq.GetInvalidPatIndex()); + if(size == 0) + { seq.Init(); return; } + + for(size_t i = 0; i < size; i++) + { + uint16 temp; + srlztn::Binaryread<uint16>(iStrm, temp); + seq[i] = temp; + } +} + + +void WriteModSequence(std::ostream& oStrm, const COrderToPatternTable& seq) +//------------------------------------------------------------------------- +{ + uint16 size = seq.GetCount(); + srlztn::Binarywrite<uint16>(oStrm, size); + const COrderToPatternTable::const_iterator endIter = seq.end(); + for(COrderToPatternTable::const_iterator citer = seq.begin(); citer != endIter; citer++) + { + const uint16 temp = static_cast<uint16>(*citer); + srlztn::Binarywrite<uint16>(oStrm, temp); + } +} + Copied: trunk/OpenMPT/soundlib/ModSequence.h (from rev 349, trunk/OpenMPT/soundlib/OrderToPatternTable.h) =================================================================== --- trunk/OpenMPT/soundlib/ModSequence.h (rev 0) +++ trunk/OpenMPT/soundlib/ModSequence.h 2009-09-01 18:50:33 UTC (rev 351) @@ -0,0 +1,68 @@ +#ifndef ORDERTOPATTERNTABLE_H +#define ORDERTOPATTERNTABLE_H + +#include <vector> +using std::vector; + +class CSoundFile; + + +#pragma warning(disable:4244) //conversion from 'type1' to 'type2', possible loss of data. + + +//============================================== +class COrderToPatternTable : public vector<PATTERNINDEX> +//============================================== +{ +public: + COrderToPatternTable(const CSoundFile& sndFile) : m_rSndFile(sndFile) {} + + // Initialize default sized sequence. + void Init(); + + bool ReadAsByte(const BYTE* pFrom, const int howMany, const int memLength); + + size_t WriteAsByte(FILE* f, const UINT count); + + size_t WriteToByteArray(BYTE* dest, const UINT numOfBytes, const UINT destSize); + + ORDERINDEX GetCount() const {return size();} + + //Deprecated function used for MPTm's created in 1.17.02.46 - 1.17.02.48. + DWORD Deserialize(const BYTE* const src, const DWORD memLength); + + //Returns true if the IT orderlist datafield is not sufficient to store orderlist information. + bool NeedsExtraDatafield() const; + + void OnModTypeChanged(const MODTYPE oldtype); + + // Returns length of sequence without counting trailing '---' items. + ORDERINDEX GetLengthTailTrimmed() const; + + // Returns length of sequence stopping counting on first '---' (or at the end of sequence). + ORDERINDEX GetLengthFirstEmpty() const; + + PATTERNINDEX GetInvalidPatIndex() const; //To correspond 0xFF + static PATTERNINDEX GetInvalidPatIndex(const MODTYPE type); + + PATTERNINDEX GetIgnoreIndex() const; //To correspond 0xFE + static PATTERNINDEX GetIgnoreIndex(const MODTYPE type); + + //Returns the previous/next order ignoring skip indeces(+++). + //If no previous/next order exists, return first/last order, and zero + //when orderlist is empty. + ORDERINDEX GetNextOrderIgnoringSkips(const ORDERINDEX start) const; + ORDERINDEX GetPreviousOrderIgnoringSkips(const ORDERINDEX start) const; + +private: + const CSoundFile& m_rSndFile; +}; + +#pragma warning(default:4244) //conversion from 'type1' to 'type2', possible loss of data. + + +void ReadModSequence(std::istream& iStrm, COrderToPatternTable& seq, const size_t nSize = 0); +void WriteModSequence(std::ostream& oStrm, const COrderToPatternTable& seq); + +#endif + Deleted: trunk/OpenMPT/soundlib/OrderToPatternTable.cpp =================================================================== --- trunk/OpenMPT/soundlib/OrderToPatternTable.cpp 2009-08-30 22:27:15 UTC (rev 350) +++ trunk/OpenMPT/soundlib/OrderToPatternTable.cpp 2009-09-01 18:50:33 UTC (rev 351) @@ -1,221 +0,0 @@ -#include "stdafx.h" -#include "sndfile.h" -#include "ordertopatterntable.h" -#include "../mptrack/serialization_utils.h" - -#define str_SequenceTruncationNote (GetStrI18N((_TEXT("Module has sequence of length %u; it will be truncated to maximum supported length, %u.")))) - -DWORD COrderToPatternTable::Deserialize(const BYTE* const src, const DWORD memLength) -//------------------------------------------------------------------------- -{ - if(memLength < 2 + 4) return 0; - uint16 version = 0; - uint32 s = 0; - DWORD memPos = 0; - memcpy(&version, src, sizeof(version)); - memPos += sizeof(version); - if(version != 0) return memPos; - memcpy(&s, src+memPos, sizeof(s)); - memPos += sizeof(s); - if(s > 65000) return true; - if(memLength < memPos+s*4) return memPos; - - const uint32 nOriginalSize = s; - if(s > ModSpecs::mptm.ordersMax) - s = ModSpecs::mptm.ordersMax; - - resize(max(s, MAX_ORDERS)); - for(size_t i = 0; i<s; i++, memPos +=4 ) - { - uint32 temp; - memcpy(&temp, src+memPos, 4); - (*this)[i] = static_cast<PATTERNINDEX>(temp); - } - memPos += 4*(nOriginalSize - s); - return memPos; -} - - -size_t COrderToPatternTable::WriteToByteArray(BYTE* dest, const UINT numOfBytes, const UINT destSize) -//----------------------------------------------------------------------------- -{ - if(numOfBytes > destSize) return true; - if(size() < numOfBytes) resize(numOfBytes, 0xFF); - UINT i = 0; - for(i = 0; i<numOfBytes; i++) - { - dest[i] = static_cast<BYTE>((*this)[i]); - } - return i; //Returns the number of bytes written. -} - - -size_t COrderToPatternTable::WriteAsByte(FILE* f, const UINT count) -//--------------------------------------------------------------- -{ - if(size() < count) resize(count, GetInvalidPatIndex()); - - size_t i = 0; - - for(i = 0; i<count; i++) - { - const PATTERNINDEX pat = (*this)[i]; - BYTE temp = static_cast<BYTE>((*this)[i]); - - if(pat > 0xFD) - { - if(pat == GetInvalidPatIndex()) temp = 0xFF; - else temp = 0xFE; - } - fwrite(&temp, 1, 1, f); - } - return i; //Returns the number of bytes written. -} - -bool COrderToPatternTable::ReadAsByte(const BYTE* pFrom, const int howMany, const int memLength) -//------------------------------------------------------------------------- -{ - if(howMany < 0 || howMany > memLength) return true; - if(m_rSndFile.GetType() != MOD_TYPE_MPT && howMany > MAX_ORDERS) return true; - - if(size() < static_cast<size_t>(howMany)) - resize(howMany, GetInvalidPatIndex()); - - for(int i = 0; i<howMany; i++, pFrom++) - (*this)[i] = *pFrom; - return false; -} - - -bool COrderToPatternTable::NeedsExtraDatafield() const -//---------------------------------------------- -{ - if(m_rSndFile.GetType() == MOD_TYPE_MPT && m_rSndFile.Patterns.Size() > 0xFD) - return true; - else - return false; -} - - -void COrderToPatternTable::OnModTypeChanged(const MODTYPE oldtype) -//---------------------------------------------------------------- -{ - const CModSpecifications specs = m_rSndFile.GetModSpecifications(); - - //Resize orderlist if needed. Because old orderlist had MAX_ORDERS(256) elements, not making it - //smaller than that even if the modtype doesn't support that many orders. - if(specs.ordersMax < GetCount()) - { - resize(max(MAX_ORDERS, specs.ordersMax)); - for(ORDERINDEX i = GetCount(); i>specs.ordersMax; --i) (*this)[i-1] = GetInvalidPatIndex(); - } - if (GetCount() < MAX_ORDERS) - resize(MAX_ORDERS, GetInvalidPatIndex()); - - //Replace items used to denote end of song/skip order. - replace(begin(), end(), GetInvalidPatIndex(oldtype), GetInvalidPatIndex()); - replace(begin(), end(), GetIgnoreIndex(oldtype), GetIgnoreIndex()); -} - - -ORDERINDEX COrderToPatternTable::GetLengthTailTrimmed() const -//----------------------------------------------------------- -{ - ORDERINDEX nEnd = GetCount(); - if(nEnd == 0) return 0; - nEnd--; - const PATTERNINDEX iInvalid = GetInvalidPatIndex(); - while(nEnd > 0 && (*this)[nEnd] == iInvalid) - nEnd--; - return ((*this)[nEnd] == iInvalid) ? 0 : nEnd+1; -} - - -ORDERINDEX COrderToPatternTable::GetLengthFirstEmpty() const -//---------------------------------------------------------- -{ - const ORDERINDEX nLength = GetCount(); - ORDERINDEX nMax = 0; - while ((nMax < nLength) && ((*this)[nMax] != (*this).GetInvalidPatIndex())) nMax++; - return nMax; -} - - -ORDERINDEX COrderToPatternTable::GetNextOrderIgnoringSkips(const ORDERINDEX start) const -//------------------------------------------------------------------------------------- -{ - const ORDERINDEX count = GetCount(); - if(count == 0) return 0; - ORDERINDEX next = min(count-1, start+1); - while(next+1 < count && (*this)[next] == GetIgnoreIndex()) next++; - return next; -} - -ORDERINDEX COrderToPatternTable::GetPreviousOrderIgnoringSkips(const ORDERINDEX start) const -//------------------------------------------------------------------------------------- -{ - const ORDERINDEX count = GetCount(); - if(start == 0 || count == 0) return 0; - ORDERINDEX prev = min(start-1, count-1); - while(prev > 0 && (*this)[prev] == GetIgnoreIndex()) prev--; - return prev; -} - - -void COrderToPatternTable::Init() -//------------------------------- -{ - resize(MAX_ORDERS, GetInvalidPatIndex()); - for(ORDERINDEX i = 0; i < GetCount(); i++) - { - (*this)[i] = GetInvalidPatIndex(); - } -} - - - -PATTERNINDEX COrderToPatternTable::GetInvalidPatIndex(const MODTYPE type) {return type == MOD_TYPE_MPT ? 65535 : 0xFF;} -PATTERNINDEX COrderToPatternTable::GetIgnoreIndex(const MODTYPE type) {return type == MOD_TYPE_MPT ? 65534 : 0xFE;} - -PATTERNINDEX COrderToPatternTable::GetInvalidPatIndex() const {return GetInvalidPatIndex(m_rSndFile.GetType());} -PATTERNINDEX COrderToPatternTable::GetIgnoreIndex() const {return GetIgnoreIndex(m_rSndFile.GetType());} - - -void ReadModSequence(std::istream& iStrm, COrderToPatternTable& seq, const size_t) -//-------------------------------------------------------------------------------- -{ - uint16 size; - srlztn::Binaryread<uint16>(iStrm, size); - if(size > ModSpecs::mptm.ordersMax) - { - // Hack: Show message here if trying to load longer sequence than what is supported. - CString str; str.Format(str_SequenceTruncationNote, size, ModSpecs::mptm.ordersMax); - AfxMessageBox(str, MB_ICONWARNING); - size = ModSpecs::mptm.ordersMax; - } - seq.resize(max(size, MAX_ORDERS), seq.GetInvalidPatIndex()); - if(size == 0) - { seq.Init(); return; } - - for(size_t i = 0; i < size; i++) - { - uint16 temp; - srlztn::Binaryread<uint16>(iStrm, temp); - seq[i] = temp; - } -} - - -void WriteModSequence(std::ostream& oStrm, const COrderToPatternTable& seq) -//------------------------------------------------------------------------- -{ - uint16 size = seq.GetCount(); - srlztn::Binarywrite<uint16>(oStrm, size); - const COrderToPatternTable::const_iterator endIter = seq.end(); - for(COrderToPatternTable::const_iterator citer = seq.begin(); citer != endIter; citer++) - { - const uint16 temp = static_cast<uint16>(*citer); - srlztn::Binarywrite<uint16>(oStrm, temp); - } -} - Deleted: trunk/OpenMPT/soundlib/OrderToPatternTable.h =================================================================== --- trunk/OpenMPT/soundlib/OrderToPatternTable.h 2009-08-30 22:27:15 UTC (rev 350) +++ trunk/OpenMPT/soundlib/OrderToPatternTable.h 2009-09-01 18:50:33 UTC (rev 351) @@ -1,68 +0,0 @@ -#ifndef ORDERTOPATTERNTABLE_H -#define ORDERTOPATTERNTABLE_H - -#include <vector> -using std::vector; - -class CSoundFile; - - -#pragma warning(disable:4244) //conversion from 'type1' to 'type2', possible loss of data. - - -//============================================== -class COrderToPatternTable : public vector<PATTERNINDEX> -//============================================== -{ -public: - COrderToPatternTable(const CSoundFile& sndFile) : m_rSndFile(sndFile) {} - - // Initialize default sized sequence. - void Init(); - - bool ReadAsByte(const BYTE* pFrom, const int howMany, const int memLength); - - size_t WriteAsByte(FILE* f, const UINT count); - - size_t WriteToByteArray(BYTE* dest, const UINT numOfBytes, const UINT destSize); - - ORDERINDEX GetCount() const {return size();} - - //Deprecated function used for MPTm's created in 1.17.02.46 - 1.17.02.48. - DWORD Deserialize(const BYTE* const src, const DWORD memLength); - - //Returns true if the IT orderlist datafield is not sufficient to store orderlist information. - bool NeedsExtraDatafield() const; - - void OnModTypeChanged(const MODTYPE oldtype); - - // Returns length of sequence without counting trailing '---' items. - ORDERINDEX GetLengthTailTrimmed() const; - - // Returns length of sequence stopping counting on first '---' (or at the end of sequence). - ORDERINDEX GetLengthFirstEmpty() const; - - PATTERNINDEX GetInvalidPatIndex() const; //To correspond 0xFF - static PATTERNINDEX GetInvalidPatIndex(const MODTYPE type); - - PATTERNINDEX GetIgnoreIndex() const; //To correspond 0xFE - static PATTERNINDEX GetIgnoreIndex(const MODTYPE type); - - //Returns the previous/next order ignoring skip indeces(+++). - //If no previous/next order exists, return first/last order, and zero - //when orderlist is empty. - ORDERINDEX GetNextOrderIgnoringSkips(const ORDERINDEX start) const; - ORDERINDEX GetPreviousOrderIgnoringSkips(const ORDERINDEX start) const; - -private: - const CSoundFile& m_rSndFile; -}; - -#pragma warning(default:4244) //conversion from 'type1' to 'type2', possible loss of data. - - -void ReadModSequence(std::istream& iStrm, COrderToPatternTable& seq, const size_t nSize = 0); -void WriteModSequence(std::ostream& oStrm, const COrderToPatternTable& seq); - -#endif - Added: trunk/OpenMPT/soundlib/Snd_defs.h =================================================================== --- trunk/OpenMPT/soundlib/Snd_defs.h (rev 0) +++ trunk/OpenMPT/soundlib/Snd_defs.h 2009-09-01 18:50:33 UTC (rev 351) @@ -0,0 +1,367 @@ +/* + * OpenMPT + * + * Snd_defs.h + * + * Authors: Olivier Lapicque <oli...@jp...> + * OpenMPT devs +*/ + +#ifndef SND_DEF_H +#define SND_DEF_H + +#ifndef LPCBYTE +typedef const BYTE * LPCBYTE; +#endif + +typedef uint32 ROWINDEX; + const ROWINDEX ROWINDEX_MAX = uint32_max; +typedef uint16 CHANNELINDEX; + const CHANNELINDEX CHANNELINDEX_MAX = uint16_max; + const CHANNELINDEX CHANNELINDEX_INVALID = CHANNELINDEX_MAX; +typedef uint16 ORDERINDEX; + const ORDERINDEX ORDERINDEX_MAX = uint16_max; + const ORDERINDEX ORDERINDEX_INVALID = ORDERINDEX_MAX; +typedef uint16 PATTERNINDEX; + const PATTERNINDEX PATTERNINDEX_MAX = uint16_max; + const PATTERNINDEX PATTERNINDEX_INVALID = PATTERNINDEX_MAX; +typedef uint8 PLUGINDEX; +typedef uint16 TEMPO; +typedef uint16 SAMPLEINDEX; + const SAMPLEINDEX SAMPLEINDEX_MAX = uint16_max; + const SAMPLEINDEX SAMPLEINDEX_INVALID = SAMPLEINDEX_MAX; +typedef uint16 INSTRUMENTINDEX; + const SAMPLEINDEX INSTRUMENTINDEX_MAX = uint16_max; + const SAMPLEINDEX INSTRUMENTINDEX_INVALID = INSTRUMENTINDEX_MAX; +typedef uint8 SEQUENCEINDEX; + const SEQUENCEINDEX SEQUENCEINDEX_MAX = uint8_max; + const SEQUENCEINDEX SEQUENCEINDEX_INVALID = SEQUENCEINDEX_MAX; +typedef uint32 MODTYPE; + +#define MAX_PATTERN_ROWS 1024 // -> CODE#0008 -> DESC="#define to set pattern size" -! BEHAVIOUR_CHANGE#0008 + + +#define MOD_AMIGAC2 0x1AB +// -> CODE#0006 +// -> DESC="misc quantity changes" +#define MAX_SAMPLE_LENGTH 0x10000000 // 0x04000000 (64MB -> now 256MB). + // Note: Sample size in bytes can be more than 256 MB. +// -! BEHAVIOUR_CHANGE#0006 +#define MAX_SAMPLE_RATE 100000 +#define MAX_ORDERS 256 +const SEQUENCEINDEX MAX_SEQUENCES = 10; +#define MAX_PATTERNS 240 +#define MAX_SAMPLES 4000 + +#define MAX_INSTRUMENTS 256 //200 // -> CODE#0006 -> DESC="misc quantity changes" // -! BEHAVIOUR_CHANGE#0006 +//#ifdef FASTSOUNDLIB +//#define MAX_CHANNELS 80 +//#else +// -> CODE#0006 +// -> DESC="misc quantity changes" +#define MAX_CHANNELS 256 //200 // Note: This is the maximum number of sound channels, + // see MAX_BASECHANNELS for max pattern channels. +// -! BEHAVIOUR_CHANGE#0006 +//#endif +// -> CODE#0006 +// -> DESC="misc quantity changes" +//#ifdef FASTSOUNDLIB +//#define MAX_BASECHANNELS 64 +//#else +#define MAX_BASECHANNELS 127 // Max pattern channels. +//#endif +// -! BEHAVIOUR_CHANGE#0006 +#define MAX_ENVPOINTS 32 +#define MIN_PERIOD 0x0020 +#define MAX_PERIOD 0xFFFF +#define MAX_PATTERNNAME 32 +#define MAX_CHANNELNAME 20 +#define MAX_INFONAME 80 +#define MAX_EQ_BANDS 6 + +#define MAX_MIXPLUGINS 100 //50 // -> CODE#0006 -> DESC="misc quantity changes" -! BEHAVIOUR_CHANGE#0006 +#define MAX_PLUGPRESETS 1000 //rewbs.plugPresets + +#define MOD_TYPE_NONE 0x00 +#define MOD_TYPE_MOD 0x01 +#define MOD_TYPE_S3M 0x02 +#define MOD_TYPE_XM 0x04 +#define MOD_TYPE_MED 0x08 +#define MOD_TYPE_MTM 0x10 +#define MOD_TYPE_IT 0x20 +#define MOD_TYPE_669 0x40 +#define MOD_TYPE_ULT 0x80 +#define MOD_TYPE_STM 0x100 +#define MOD_TYPE_FAR 0x200 +#define MOD_TYPE_WAV 0x400 +#define MOD_TYPE_AMF 0x800 +#define MOD_TYPE_AMS 0x1000 +#define MOD_TYPE_DSM 0x2000 +#define MOD_TYPE_MDL 0x4000 +#define MOD_TYPE_OKT 0x8000 +#define MOD_TYPE_MID 0x10000 +#define MOD_TYPE_DMF 0x20000 +#define MOD_TYPE_PTM 0x40000 +#define MOD_TYPE_DBM 0x80000 +#define MOD_TYPE_MT2 0x100000 +#define MOD_TYPE_AMF0 0x200000 +#define MOD_TYPE_PSM 0x400000 +#define MOD_TYPE_J2B 0x800000 +#define MOD_TYPE_MPT 0x1000000 +#define MOD_TYPE_UMX 0x80000000 // Fake type +#define MAX_MODTYPE 24 + +// For compatibility mode +#define TRK_IMPULSETRACKER MOD_TYPE_IT | MOD_TYPE_MPT +#define TRK_FASTTRACKER2 MOD_TYPE_XM +#define TRK_SCREAMTRACKER MOD_TYPE_S3M +#define TRK_PROTRACKER MOD_TYPE_MOD +#define TRK_ALLTRACKERS TRK_IMPULSETRACKER | TRK_FASTTRACKER2 | TRK_SCREAMTRACKER | TRK_PROTRACKER + + + +// Channel flags: +// Bits 0-7: Sample Flags +#define CHN_16BIT 0x01 +#define CHN_LOOP 0x02 +#define CHN_PINGPONGLOOP 0x04 +#define CHN_SUSTAINLOOP 0x08 +#define CHN_PINGPONGSUSTAIN 0x10 +#define CHN_PANNING 0x20 +#define CHN_STEREO 0x40 +#define CHN_PINGPONGFLAG 0x80 //When flag is on, bidiloop is processed backwards? +// Bits 8-31: Channel Flags +#define CHN_MUTE 0x100 +#define CHN_KEYOFF 0x200 +#define CHN_NOTEFADE 0x400 +#define CHN_SURROUND 0x800 +#define CHN_NOIDO 0x1000 +#define CHN_HQSRC 0x2000 +#define CHN_FILTER 0x4000 +#define CHN_VOLUMERAMP 0x8000 +#define CHN_VIBRATO 0x10000 +#define CHN_TREMOLO 0x20000 +#define CHN_PANBRELLO 0x40000 +#define CHN_PORTAMENTO 0x80000 +#define CHN_GLISSANDO 0x100000 +#define CHN_VOLENV 0x200000 +#define CHN_PANENV 0x400000 +#define CHN_PITCHENV 0x800000 +#define CHN_FASTVOLRAMP 0x1000000 +#define CHN_EXTRALOUD 0x2000000 +#define CHN_REVERB 0x4000000 +#define CHN_NOREVERB 0x8000000 +#define CHN_SOLO 0x10000000 // -> CODE#0012 -> DESC="midi keyboard split" -! NEW_FEATURE#0012 +#define CHN_NOFX 0x20000000 // -> CODE#0015 -> DESC="channels management dlg" -! NEW_FEATURE#0015 +#define CHN_SYNCMUTE 0x40000000 + +#define ENV_VOLUME 0x0001 +#define ENV_VOLSUSTAIN 0x0002 +#define ENV_VOLLOOP 0x0004 +#define ENV_PANNING 0x0008 +#define ENV_PANSUSTAIN 0x0010 +#define ENV_PANLOOP 0x0020 +#define ENV_PITCH 0x0040 +#define ENV_PITCHSUSTAIN 0x0080 +#define ENV_PITCHLOOP 0x0100 +#define ENV_SETPANNING 0x0200 +#define ENV_FILTER 0x0400 +#define ENV_VOLCARRY 0x0800 +#define ENV_PANCARRY 0x1000 +#define ENV_PITCHCARRY 0x2000 +#define ENV_MUTE 0x4000 + + +// Filter Modes +#define FLTMODE_UNCHANGED 0xFF +#define FLTMODE_LOWPASS 0 +#define FLTMODE_HIGHPASS 1 +#define FLTMODE_BANDPASS 2 + + +#define RSF_16BIT 0x04 +#define RSF_STEREO 0x08 + +#define RS_PCM8S 0 // 8-bit signed +#define RS_PCM8U 1 // 8-bit unsigned +#define RS_PCM8D 2 // 8-bit delta values +#define RS_ADPCM4 3 // 4-bit ADPCM-packed +#define RS_PCM16D 4 // 16-bit delta values +#define RS_PCM16S 5 // 16-bit signed +#define RS_PCM16U 6 // 16-bit unsigned +#define RS_PCM16M 7 // 16-bit motorola order +#define RS_STPCM8S (RS_PCM8S|RSF_STEREO) // stereo 8-bit signed +#define RS_STPCM8U (RS_PCM8U|RSF_STEREO) // stereo 8-bit unsigned +#define RS_STPCM8D (RS_PCM8D|RSF_STEREO) // stereo 8-bit delta values +#define RS_STPCM16S (RS_PCM16S|RSF_STEREO) // stereo 16-bit signed +#define RS_STPCM16U (RS_PCM16U|RSF_STEREO) // stereo 16-bit unsigned +#define RS_STPCM16D (RS_PCM16D|RSF_STEREO) // stereo 16-bit delta values +#define RS_STPCM16M (RS_PCM16M|RSF_STEREO) // stereo 16-bit signed big endian +// IT 2.14 compressed samples +#define RS_IT2148 0x10 +#define RS_IT21416 0x14 +#define RS_IT2158 0x12 +#define RS_IT21516 0x16 +// AMS Packed Samples +#define RS_AMS8 0x11 +#define RS_AMS16 0x15 +// DMF Huffman compression +#define RS_DMF8 0x13 +#define RS_DMF16 0x17 +// MDL Huffman compression +#define RS_MDL8 0x20 +#define RS_MDL16 0x24 +#define RS_PTM8DTO16 0x25 +// Stereo Interleaved Samples +#define RS_STIPCM8S (RS_PCM8S|0x40|RSF_STEREO) // stereo 8-bit signed +#define RS_STIPCM8U (RS_PCM8U|0x40|RSF_STEREO) // stereo 8-bit unsigned +#define RS_STIPCM16S (RS_PCM16S|0x40|RSF_STEREO) // stereo 16-bit signed +#define RS_STIPCM16U (RS_PCM16U|0x40|RSF_STEREO) // stereo 16-bit unsigned +#define RS_STIPCM16M (RS_PCM16M|0x40|RSF_STEREO) // stereo 16-bit signed big endian +// 24-bit signed +#define RS_PCM24S (RS_PCM16S|0x80) // mono 24-bit signed +#define RS_STIPCM24S (RS_PCM16S|0x80|RSF_STEREO) // stereo 24-bit signed +// 32-bit +#define RS_PCM32S (RS_PCM16S|0xC0) // mono 32-bit signed +#define RS_STIPCM32S (RS_PCM16S|0xC0|RSF_STEREO) // stereo 32-bit signed + + + +// NNA types (New Note Action) +#define NNA_NOTECUT 0 +#define NNA_CONTINUE 1 +#define NNA_NOTEOFF 2 +#define NNA_NOTEFADE 3 + +// DCT types (Duplicate Check Types) +#define DCT_NONE 0 +#define DCT_NOTE 1 +#define DCT_SAMPLE 2 +#define DCT_INSTRUMENT 3 +#define DCT_PLUGIN 4 //rewbs.VSTiNNA + +// DNA types (Duplicate Note Action) +#define DNA_NOTECUT 0 +#define DNA_NOTEOFF 1 +#define DNA_NOTEFADE 2 + +// Mixer Hardware-Dependent features +#define SYSMIX_ENABLEMMX 0x01 +#define SYSMIX_SLOWCPU 0x02 +#define SYSMIX_FASTCPU 0x04 +#define SYSMIX_MMXEX 0x08 +#define SYSMIX_3DNOW 0x10 +#define SYSMIX_SSE 0x20 + +// Module flags +#define SONG_EMBEDMIDICFG 0x0001 +#define SONG_FASTVOLSLIDES 0x0002 +#define SONG_ITOLDEFFECTS 0x0004 +#define SONG_ITCOMPATMODE 0x0008 +#define SONG_LINEARSLIDES 0x0010 +#define SONG_PATTERNLOOP 0x0020 +#define SONG_STEP 0x0040 +#define SONG_PAUSED 0x0080 +#define SONG_FADINGSONG 0x0100 +#define SONG_ENDREACHED 0x0200 +#define SONG_GLOBALFADE 0x0400 +#define SONG_CPUVERYHIGH 0x0800 +#define SONG_FIRSTTICK 0x1000 +#define SONG_MPTFILTERMODE 0x2000 +#define SONG_SURROUNDPAN 0x4000 +#define SONG_EXFILTERRANGE 0x8000 +#define SONG_AMIGALIMITS 0x10000 +// -> CODE#0023 +// -> DESC="IT project files (.itp)" +#define SONG_ITPROJECT 0x20000 +#define SONG_ITPEMBEDIH 0x40000 +// -! NEW_FEATURE#0023 +#define SONG_BREAKTOROW 0x80000 +#define SONG_POSJUMP 0x100000 + +// Global Options (Renderer) +#define SNDMIX_REVERSESTEREO 0x0001 +#define SNDMIX_NOISEREDUCTION 0x0002 +#define SNDMIX_AGC 0x0004 +#define SNDMIX_NORESAMPLING 0x0008 +// SNDMIX_NOLINEARSRCMODE is the default +//#define SNDMIX_HQRESAMPLER 0x0010 //rewbs.resamplerConf: renamed SNDMIX_HQRESAMPLER to SNDMIX_SPLINESRCMODE +#define SNDMIX_SPLINESRCMODE 0x0010 +#define SNDMIX_MEGABASS 0x0020 +#define SNDMIX_SURROUND 0x0040 +#define SNDMIX_REVERB 0x0080 +#define SNDMIX_EQ 0x0100 +#define SNDMIX_SOFTPANNING 0x0200 +//#define SNDMIX_ULTRAHQSRCMODE 0x0400 //rewbs.resamplerConf: renamed SNDMIX_ULTRAHQSRCMODE to SNDMIX_POLYPHASESRCMODE +#define SNDMIX_POLYPHASESRCMODE 0x0400 +#define SNDMIX_FIRFILTERSRCMODE 0x0800 //rewbs: added SNDMIX_FIRFILTERSRCMODE + +//rewbs.resamplerConf: for stuff that applies to cubic spline, polyphase and FIR +#define SNDMIX_HQRESAMPLER (SNDMIX_SPLINESRCMODE|SNDMIX_POLYPHASESRCMODE|SNDMIX_FIRFILTERSRCMODE) + +////rewbs.resamplerConf: for stuff that applies to polyphase and FIR +#define SNDMIX_ULTRAHQSRCMODE (SNDMIX_POLYPHASESRCMODE|SNDMIX_FIRFILTERSRCMODE) + +// Misc Flags (can safely be turned on or off) +#define SNDMIX_DIRECTTODISK 0x10000 +#define SNDMIX_ENABLEMMX 0x20000 +#define SNDMIX_NOBACKWARDJUMPS 0x40000 +#define SNDMIX_MAXDEFAULTPAN 0x80000 // Used by the MOD loader +#define SNDMIX_MUTECHNMODE 0x100000 // Notes are not played on muted channels +#define SNDMIX_EMULATE_MIX_BUGS 0x200000 // rewbs.emulateMixBugs + +#define MAX_GLOBAL_VOLUME 256 + +// Resampling modes +enum { + SRCMODE_NEAREST, + SRCMODE_LINEAR, + SRCMODE_SPLINE, + SRCMODE_POLYPHASE, + SRCMODE_FIRFILTER, //rewbs.resamplerConf + SRCMODE_DEFAULT, + NUM_SRC_MODES +}; + +enum { + ENV_RESET_ALL, + ENV_RESET_VOL, + ENV_RESET_PAN, + ENV_RESET_PITCH, + ENV_RELEASE_NODE_UNSET=0xFF, + NOT_YET_RELEASED=-1 +}; + +enum { + CHANNEL_ONLY = 0, + INSTRUMENT_ONLY = 1, + PRIORITISE_INSTRUMENT = 2, + PRIORITISE_CHANNEL = 3, + EVEN_IF_MUTED = false, + RESPECT_MUTES = true, +}; + +//Plugin velocity handling options +enum PLUGVELOCITYHANDLING +{ + PLUGIN_VELOCITYHANDLING_CHANNEL = 0, + PLUGIN_VELOCITYHANDLING_VOLUME +}; + +//Plugin volumecommand handling options +enum PLUGVOLUMEHANDLING +{ + PLUGIN_VOLUMEHANDLING_MIDI = 0, + PLUGIN_VOLUMEHANDLING_DRYWET, + PLUGIN_VOLUMEHANDLING_IGNORE, +}; + +// filtermodes +/*enum { + INST_FILTERMODE_DEFAULT=0, + INST_FILTERMODE_HIGHPASS, + INST_FILTERMODE_LOWPASS, + INST_NUMFILTERMODES +};*/ + +#endif Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2009-08-30 22:27:15 UTC (rev 350) +++ trunk/OpenMPT/soundlib/Sndfile.h 2009-09-01 18:50:33 UTC (rev 351) @@ -7,364 +7,21 @@ * OpenMPT devs */ +#ifndef __SNDFILE_H +#define __SNDFILE_H + #include "../mptrack/SoundFilePlayConfig.h" #include "../mptrack/misc_util.h" #include "mod_specifications.h" #include <vector> #include <bitset> #include "midi.h" +#include "Snd_defs.h" class CTuningBase; typedef CTuningBase CTuning; -using std::bitset; -#ifndef __SNDFILE_H -#define __SNDFILE_H - -#ifndef LPCBYTE -typedef const BYTE * LPCBYTE; -#endif - -// -> CODE#0008 -// -> DESC="#define to set pattern size" -#define MAX_PATTERN_ROWS 1024 -// -! BEHAVIOUR_CHANGE#0008 - -#define MOD_AMIGAC2 0x1AB -// -> CODE#0006 -// -> DESC="misc quantity changes" -#define MAX_SAMPLE_LENGTH 0x10000000 // 0x04000000 (64MB -> now 256MB). - // Note: Sample size in bytes can be more than 256 MB. -// -! BEHAVIOUR_CHANGE#0006 -#define MAX_SAMPLE_RATE 100000 -#define MAX_ORDERS 256 -#define MAX_PATTERNS 240 -#define MAX_SAMPLES 4000 -// -> CODE#0006 -// -> DESC="misc quantity changes" -#define MAX_INSTRUMENTS 256 //200 -// -! BEHAVIOUR_CHANGE#0006 -//#ifdef FASTSOUNDLIB -//#define MAX_CHANNELS 80 -//#else -// -> CODE#0006 -// -> DESC="misc quantity changes" -#define MAX_CHANNELS 256 //200 //Note: This is the maximum number of sound channels, - // see MAX_BASECHANNELS for max pattern channels. -// -! BEHAVIOUR_CHANGE#0006 -//#endif -// -> CODE#0006 -// -> DESC="misc quantity changes" -//#ifdef FASTSOUNDLIB -//#define MAX_BASECHANNELS 64 -//#else -#define MAX_BASECHANNELS 127 //Max pattern channels. -//#endif -// -! BEHAVIOUR_CHANGE#0006 -#define MAX_ENVPOINTS 32 -#define MIN_PERIOD 0x0020 -#define MAX_PERIOD 0xFFFF -#define MAX_PATTERNNAME 32 -#define MAX_CHANNELNAME 20 -#define MAX_INFONAME 80 -#define MAX_EQ_BANDS 6 -// -> CODE#0006 -// -> DESC="misc quantity changes" -#define MAX_MIXPLUGINS 100 //50 -// -! BEHAVIOUR_CHANGE#0006 -#define MAX_PLUGPRESETS 1000 //rewbs.plugPresets - -#define MOD_TYPE_NONE 0x00 -#define MOD_TYPE_MOD 0x01 -#define MOD_TYPE_S3M 0x02 -#define MOD_TYPE_XM 0x04 -#define MOD_TYPE_MED 0x08 -#define MOD_TYPE_MTM 0x10 -#define MOD_TYPE_IT 0x20 -#define MOD_TYPE_669 0x40 -#define MOD_TYPE_ULT 0x80 -#define MOD_TYPE_STM 0x100 -#define MOD_TYPE_FAR 0x200 -#define MOD_TYPE_WAV 0x400 -#define MOD_TYPE_AMF 0x800 -#define MOD_TYPE_AMS 0x1000 -#define MOD_TYPE_DSM 0x2000 -#define MOD_TYPE_MDL 0x4000 -#define MOD_TYPE_OKT 0x8000 -#define MOD_TYPE_MID 0x10000 -#define MOD_TYPE_DMF 0x20000 -#define MOD_TYPE_PTM 0x40000 -#define MOD_TYPE_DBM 0x80000 -#define MOD_TYPE_MT2 0x100000 -#define MOD_TYPE_AMF0 0x200000 -#define MOD_TYPE_PSM 0x400000 -#define MOD_TYPE_J2B 0x800000 -#define MOD_TYPE_MPT 0x1000000 -#define MOD_TYPE_UMX 0x80000000 // Fake type -#define MAX_MODTYPE 24 - -// For compatibility mode -#define TRK_IMPULSETRACKER MOD_TYPE_IT | MOD_TYPE_MPT -#define TRK_FASTTRACKER2 MOD_TYPE_XM -#define TRK_SCREAMTRACKER MOD_TYPE_S3M -#define TRK_PROTRACKER MOD_TYPE_MOD -#define TRK_ALLTRACKERS TRK_IMPULSETRACKER | TRK_FASTTRACKER2 | TRK_SCREAMTRACKER | TRK_PROTRACKER - - - -// Channel flags: -// Bits 0-7: Sample Flags -#define CHN_16BIT 0x01 -#define CHN_LOOP 0x02 -#define CHN_PINGPONGLOOP 0x04 -#define CHN_SUSTAINLOOP 0x08 -#define CHN_PINGPONGSUSTAIN 0x10 -#define CHN_PANNING 0x20 -#define CHN_STEREO 0x40 -#define CHN_PINGPONGFLAG 0x80 //When flag is on, bidiloop is processed backwards? -// Bits 8-31: Channel Flags -#define CHN_MUTE 0x100 -#define CHN_KEYOFF 0x200 -#define CHN_NOTEFADE 0x400 -#define CHN_SURROUND 0x800 -#define CHN_NOIDO 0x1000 -#define CHN_HQSRC 0x2000 -#define CHN_FILTER 0x4000 -#define CHN_VOLUMERAMP 0x8000 -#define CHN_VIBRATO 0x10000 -#define CHN_TREMOLO 0x20000 -#define CHN_PANBRELLO 0x40000 -#define CHN_PORTAMENTO 0x80000 -#define CHN_GLISSANDO 0x100000 -#define CHN_VOLENV 0x200000 -#define CHN_PANENV 0x400000 -#define CHN_PITCHENV 0x800000 -#define CHN_FASTVOLRAMP 0x1000000 -#define CHN_EXTRALOUD 0x2000000 -#define CHN_REVERB 0x4000000 -#define CHN_NOREVERB 0x8000000 -// -> CODE#0012 -// -> DESC="midi keyboard split" -#define CHN_SOLO 0x10000000 -// -! NEW_FEATURE#0012 - -// -> CODE#0015 -// -> DESC="channels management dlg" -#define CHN_NOFX 0x20000000 -// -! NEW_FEATURE#0015 - -#define CHN_SYNCMUTE 0x40000000 - -#define ENV_VOLUME 0x0001 -#define ENV_VOLSUSTAIN 0x0002 -#define ENV_VOLLOOP 0x0004 -#define ENV_PANNING 0x0008 -#define ENV_PANSUSTAIN 0x0010 -#define ENV_PANLOOP 0x0020 -#define ENV_PITCH 0x0040 -#define ENV_PITCHSUSTAIN 0x0080 -#define ENV_PITCHLOOP 0x0100 -#define ENV_SETPANNING 0x0200 -#define ENV_FILTER 0x0400 -#define ENV_VOLCARRY 0x0800 -#define ENV_PANCARRY 0x1000 -#define ENV_PITCHCARRY 0x2000 -#define ENV_MUTE 0x4000 - - -// Filter Modes -#define FLTMODE_UNCHANGED 0xFF -#define FLTMODE_LOWPASS 0 -#define FLTMODE_HIGHPASS 1 -#define FLTMODE_BANDPASS 2 - - -#define RSF_16BIT 0x04 -#define RSF_STEREO 0x08 - -#define RS_PCM8S 0 // 8-bit signed -#define RS_PCM8U 1 // 8-bit unsigned -#define RS_PCM8D 2 // 8-bit delta values -#define RS_ADPCM4 3 // 4-bit ADPCM-packed -#define RS_PCM16D 4 // 16-bit delta values -#define RS_PCM16S 5 // 16-bit signed -#define RS_PCM16U 6 // 16-bit unsigned -#define RS_PCM16M 7 // 16-bit motorola order -#define RS_STPCM8S (RS_PCM8S|RSF_STEREO) // stereo 8-bit signed -#define RS_STPCM8U (RS_PCM8U|RSF_STEREO) // stereo 8-bit unsigned -#define RS_STPCM8D (RS_PCM8D|RSF_STEREO) // stereo 8-bit delta values -#define RS_STPCM16S (RS_PCM16S|RSF_STEREO) // stereo 16-bit signed -#define RS_STPCM16U (RS_PCM16U|RSF_STEREO) // stereo 16-bit unsigned -#define RS_STPCM16D (RS_PCM16D|RSF_STEREO) // stereo 16-bit delta values -#define RS_STPCM16M (RS_PCM16M|RSF_STEREO) // stereo 16-bit signed big endian -// IT 2.14 compressed samples -#define RS_IT2148 0x10 -#define RS_IT21416 0x14 -#define RS_IT2158 0x12 -#define RS_IT21516 0x16 -// AMS Packed Samples -#define RS_AMS8 0x11 -#define RS_AMS16 0x15 -// DMF Huffman compression -#define RS_DMF8 0x13 -#define RS_DMF16 0x17 -// MDL Huffman compression -#define RS_MDL8 0x20 -#define RS_MDL16 0x24 -#define RS_PTM8DTO16 0x25 -// Stereo Interleaved Samples -#define RS_STIPCM8S (RS_PCM8S|0x40|RSF_STEREO) // stereo 8-bit signed -#define RS_STIPCM8U (RS_PCM8U|0x40|RSF_STEREO) // stereo 8-bit unsigned -#define RS_STIPCM16S (RS_PCM16S|0x40|RSF_STEREO) // stereo 16-bit signed -#define RS_STIPCM16U (RS_PCM16U|0x40|RSF_STEREO) // stereo 16-bit unsigned -#define RS_STIPCM16M (RS_PCM16M|0x40|RSF_STEREO) // stereo 16-bit signed big endian -// 24-bit signed -#define RS_PCM24S (RS_PCM16S|0x80) // mono 24-bit signed -#define RS_STIPCM24S (RS_PCM16S|0x80|RSF_STEREO) // stereo 24-bit signed -// 32-bit -#define RS_PCM32S (RS_PCM16S|0xC0) // mono 32-bit signed -#define RS_STIPCM32S (RS_PCM16S|0xC0|RSF_STEREO) // stereo 32-bit signed - - - -// NNA types (New Note Action) -#define NNA_NOTECUT 0 -#define NNA_CONTINUE 1 -#define NNA_NOTEOFF 2 -#define NNA_NOTEFADE 3 - -// DCT types (Duplicate Check Types) -#define DCT_NONE 0 -#define DCT_NOTE 1 -#define DCT_SAMPLE 2 -#define DCT_INSTRUMENT 3 -#define DCT_PLUGIN 4 //rewbs.VSTiNNA - -// DNA types (Duplicate Note Action) -#define DNA_NOTECUT 0 -#define DNA_NOTEOFF 1 -#define DNA_NOTEFADE 2 - -// Mixer Hardware-Dependent features -#define SYSMIX_ENABLEMMX 0x01 -#define SYSMIX_SLOWCPU 0x02 -#define SYSMIX_FASTCPU 0x04 -#define SYSMIX_MMXEX 0x08 -#define SYSMIX_3DNOW 0x10 -#define SYSMIX_SSE 0x20 - -// Module flags -#define SONG_EMBEDMIDICFG 0x0001 -#define SONG_FASTVOLSLIDES 0x0002 -#define SONG_ITOLDEFFECTS 0x0004 -#define SONG_ITCOMPATMODE 0x0008 -#define SONG_LINEARSLIDES 0x0010 -#define SONG_PATTERNLOOP 0x0020 -#define SONG_STEP 0x0040 -#define SONG_PAUSED 0x0080 -#define SONG_FADINGSONG 0x0100 -#define SONG_ENDREACHED 0x0200 -#define SONG_GLOBALFADE 0x0400 -#define SONG_CPUVERYHIGH 0x0800 -#define SONG_FIRSTTICK 0x1000 -#define SONG_MPTFILTERMODE 0x2000 -#define SONG_SURROUNDPAN 0x4000 -#define SONG_EXFILTERRANGE 0x8000 -#define SONG_AMIGALIMITS 0x10000 -// -> CODE#0023 -// -> DESC="IT project files (.itp)" -#define SONG_ITPROJECT 0x20000 -#define SONG_ITPEMBEDIH 0x40000 -// -! NEW_FEATURE#0023 -#define SONG_BREAKTOROW 0x80000 -#define SONG_POSJUMP 0x100000 - -// Global Options (Renderer) -#define SNDMIX_REVERSESTEREO 0x0001 -#define SNDMIX_NOISEREDUCTION 0x0002 -#define SNDMIX_AGC 0x0004 -#define SNDMIX_NORESAMPLING 0x0008 -// SNDMIX_NOLINEARSRCMODE is the default -//#define SNDMIX_HQRESAMPLER 0x0010 //rewbs.resamplerConf: renamed SNDMIX_HQRESAMPLER to SNDMIX_SPLINESRCMODE -#define SNDMIX_SPLINESRCMODE 0x0010 -#define SNDMIX_MEGABASS 0x0020 -#define SNDMIX_SURROUND 0x0040 -#define SNDMIX_REVERB 0x0080 -#define SNDMIX_EQ 0x0100 -#define SNDMIX_SOFTPANNING 0x0200 -//#define SNDMIX_ULTRAHQSRCMODE 0x0400 //rewbs.resamplerConf: renamed SNDMIX_ULTRAHQSRCMODE to SNDMIX_POLYPHASESRCMODE -#define SNDMIX_POLYPHASESRCMODE 0x0400 -#define SNDMIX_FIRFILTERSRCMODE 0x0800 //rewbs: added SNDMIX_FIRFILTERSRCMODE - -//rewbs.resamplerConf: for stuff that applies to cubic spline, polyphase and FIR -#define SNDMIX_HQRESAMPLER (SNDMIX_SPLINESRCMODE|SNDMIX_POLYPHASESRCMODE|SNDMIX_FIRFILTERSRCMODE) - -////rewbs.resamplerConf: for stuff that applies to polyphase and FIR -#define SNDMIX_ULTRAHQSRCMODE (SNDMIX_POLYPHASESRCMODE|SNDMIX_FIRFILTERSRCMODE) - -// Misc Flags (can safely be turned on or off) -#define SNDMIX_DIRECTTODISK 0x10000 -#define SNDMIX_ENABLEMMX 0x20000 -#define SNDMIX_NOBACKWARDJUMPS 0x40000 -#define SNDMIX_MAXDEFAULTPAN 0x80000 // Used by the MOD loader -#define SNDMIX_MUTECHNMODE 0x100000 // Notes are not played on muted channels -#define SNDMIX_EMULATE_MIX_BUGS 0x200000 // rewbs.emulateMixBugs - -#define MAX_GLOBAL_VOLUME 256 - -// Resampling modes -enum { - SRCMODE_NEAREST, - SRCMODE_LINEAR, - SRCMODE_SPLINE, - SRCMODE_POLYPHASE, - SRCMODE_FIRFILTER, //rewbs.resamplerConf - SRCMODE_DEFAULT, - NUM_SRC_MODES -}; - -enum { - ENV_RESET_ALL, - ENV_RESET_VOL, - ENV_RESET_PAN, - ENV_RESET_PITCH, - ENV_RELEASE_NODE_UNSET=0xFF, - NOT_YET_RELEASED=-1 -}; - -enum { - CHANNEL_ONLY = 0, - INSTRUMENT_ONLY = 1, - PRIORITISE_INSTRUMENT = 2, - PRIORITISE_CHANNEL = 3, - EVEN_IF_MUTED = false, - RESPECT_MUTES = true, -}; - -//Plugin velocity handling options -enum PLUGVELOCITYHANDLING -{ - PLUGIN_VELOCITYHANDLING_CHANNEL = 0, - PLUGIN_VELOCITYHANDLING_VOLUME -}; - -//Plugin volumecommand handling options -enum PLUGVOLUMEHANDLING -{ - PLUGIN_VOLUMEHANDLING_MIDI = 0, - PLUGIN_VOLUMEHANDLING_DRYWET, - PLUGIN_VOLUMEHANDLING_IGNORE, -}; - -// filtermodes -/*enum { - INST_FILTERMODE_DEFAULT=0, - INST_FILTERMODE_HIGHPASS, - INST_FILTERMODE_LOWPASS, - INST_NUMFILTERMODES -};*/ - // Sample Struct struct MODSAMPLE { @@ -774,12 +431,11 @@ #include "pattern.h" #include "patternContainer.h" -#include "ordertopatterntable.h" +#include "ModSequence.h" +#include "PlaybackEventer.h" -#include "playbackEventer.h" - class CSoundFile; //====================== @@ -1022,10 +678,7 @@ bool ReadSTM(LPCBYTE lpStream, DWORD dwMemLength); bool ReadIT(LPCBYTE lpStream, const DWORD dwMemLength); //bool ReadMPT(LPCBYTE lpStream, const DWORD dwMemLength); -// -> CODE#0023 -// -> DESC="IT project files (.itp)" - bool ReadITProject(LPCBYTE lpStream, const DWORD dwMemLength); -// -! NEW_FEATURE#0023 + bool ReadITProject(LPCBYTE lpStream, const DWORD dwMemLength); // -> CODE#0023 -> DESC="IT project files (.itp)" -! NEW_FEATURE#0023 bool Read669(LPCBYTE lpStream, DWORD dwMemLength); bool ReadUlt(LPCBYTE lpStream, DWORD dwMemLength); bool ReadWav(LPCBYTE lpStream, DWORD dwMemLength); @@ -1055,10 +708,7 @@ bool SaveMod(LPCSTR lpszFileName, UINT nPacking=0, const bool bCompatibilityExport = false); bool SaveIT(LPCSTR lpszFileName, UINT nPacking=0); bool SaveCompatIT(LPCSTR lpszFileName); -// -> CODE#0023 -// -> DESC="IT project files (.itp)" - bool SaveITProject(LPCSTR lpszFileName); -// -! NEW_FEATURE#0023 + bool SaveITProject(LPCSTR lpszFileName); // -> CODE#0023 -> DESC="IT project files (.itp)" -! NEW_FEATURE#0023 UINT SaveMixPlugins(FILE *f=NULL, BOOL bUpdate=TRUE); void WriteInstrumentPropertyForAllInstruments(__int32 code, __int16 size, FILE* f, MODINSTRUMENT* instruments[], UINT nInstruments); void SaveExtendedInstrumentProperties(MODINSTRUMENT *instruments[], UINT nInstruments, FILE* f); Modified: trunk/OpenMPT/soundlib/mod_specifications.h =================================================================== --- trunk/OpenMPT/soundlib/mod_specifications.h 2009-08-30 22:27:15 UTC (rev 350) +++ trunk/OpenMPT/soundlib/mod_specifications.h 2009-09-01 18:50:33 UTC (rev 351) @@ -1,6 +1,7 @@ #ifndef MOD_SPECIFICATIONS_H #define MOD_SPECIFICATIONS_H +#include "Snd_defs.h" #include "modcommand.h" // #include "../mptrack/SoundFilePlayConfig.h" // mixlevel constants. Modified: trunk/OpenMPT/soundlib/pattern.h =================================================================== --- trunk/OpenMPT/soundlib/pattern.h 2009-08-30 22:27:15 UTC (rev 350) +++ trunk/OpenMPT/soundlib/pattern.h 2009-09-01 18:50:33 UTC (rev 351) @@ -3,6 +3,7 @@ #include <vector> #include "modcommand.h" +#include "Snd_defs.h" using std::vector; Modified: trunk/OpenMPT/soundlib/patternContainer.h =================================================================== --- trunk/OpenMPT/soundlib/patternContainer.h 2009-08-30 22:27:15 UTC (rev 350) +++ trunk/OpenMPT/soundlib/patternContainer.h 2009-09-01 18:50:33 UTC (rev 351) @@ -2,6 +2,7 @@ #define PATTERNCONTAINER_H #include "pattern.h" +#include "Snd_defs.h" class CSoundFile; typedef CPattern MODPATTERN; @@ -25,7 +26,7 @@ //BEGIN: INTERFACE METHODS public: - CPatternContainer(CSoundFile& sndFile) : m_rSndFile(sndFile) {m_Patterns.assign(240, MODPATTERN(*this));} + CPatternContainer(CSoundFile& sndFile) : m_rSndFile(sndFile) {m_Patterns.assign(MAX_PATTERNS, MODPATTERN(*this));} // Clears existing patterns and resizes array to default size. void Init(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |