From: <sag...@us...> - 2011-06-23 14:46:46
|
Revision: 904 http://modplug.svn.sourceforge.net/modplug/?rev=904&view=rev Author: saga-games Date: 2011-06-23 14:46:38 +0000 (Thu, 23 Jun 2011) Log Message: ----------- [Ref] Moved stereo to mono sample converson to ctrlSmp namespace [Imp] MPTHacks also detects stereo samples in XM files now. [Imp] Fixed tab order in pitch shift dialog [Mod] OpenMPT: Version is now 1.19.02.07 Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/MPTHacks.cpp trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/version.h trunk/OpenMPT/soundlib/modsmp_ctrl.cpp trunk/OpenMPT/soundlib/modsmp_ctrl.h Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2011-06-16 20:29:56 UTC (rev 903) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2011-06-23 14:46:38 UTC (rev 904) @@ -3143,7 +3143,6 @@ if(ctrlSmp::XFadeSample(pSmp, nFadeLength, m_pSndFile)) { - m_pModDoc->AdjustEndOfSample(m_nSample); m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA | HINT_SAMPLEINFO, NULL); m_pModDoc->SetModified(); } else Modified: trunk/OpenMPT/mptrack/MPTHacks.cpp =================================================================== --- trunk/OpenMPT/mptrack/MPTHacks.cpp 2011-06-16 20:29:56 UTC (rev 903) +++ trunk/OpenMPT/mptrack/MPTHacks.cpp 2011-06-23 14:46:38 UTC (rev 904) @@ -8,6 +8,7 @@ #include "stdafx.h" #include "Moddoc.h" +#include "../soundlib/modsmp_ctrl.h" /* TODO: stereo/16bit samples (only XM? stereo/16bit flags are defined in the S3M and IT specs...) @@ -254,6 +255,26 @@ // REQUIRES (INTELLIGENT) AUTOFIX } + // Check for sample extensions + foundHere = false; + for(SAMPLEINDEX i = 1; i <= m_SndFile.GetNumSamples(); i++) + { + MODSAMPLE &smp = m_SndFile.Samples[i]; + if(m_SndFile.GetType() == MOD_TYPE_XM && smp.GetNumChannels() > 1) + { + foundHere = foundHacks = true; + if(autofix) + { + ctrlSmp::ConvertToMono(&smp, &m_SndFile); + } else + { + break; + } + } + } + if(foundHere) + AddToLog("Stereo samples are not supported in the original XM format\n"); + // Check for too many instruments if(m_SndFile.GetNumInstruments() > originalSpecs->instrumentsMax) { Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2011-06-16 20:29:56 UTC (rev 903) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2011-06-23 14:46:38 UTC (rev 904) @@ -1999,8 +1999,7 @@ pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace); BEGIN_CRITICAL(); signed char *p = (signed char *)(pSmp->pSample); - UINT len = pSmp->nLength+1; - if (pSmp->uFlags & CHN_STEREO) len *= 2; + UINT len = (pSmp->nLength + 1) * pSmp->GetNumChannels(); for (UINT i=0; i<=len; i++) { p[i] = (signed char) ((*((short int *)(p+i*2))) / 256); @@ -2032,32 +2031,14 @@ if ((pSmp->uFlags & CHN_STEREO) && (pSmp->pSample) && (pSmp->nLength)) { pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace); - BEGIN_CRITICAL(); - if (pSmp->uFlags & CHN_16BIT) + if(ctrlSmp::ConvertToMono(pSmp, pSndFile)) { - signed short *p = (signed short *)(pSmp->pSample); - for (UINT i=0; i<=pSmp->nLength+1; i++) - { - p[i] = (signed short)((p[i*2]+p[i*2+1]+1)>>1); - } + pModDoc->SetModified(); + pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA | HINT_SAMPLEINFO, NULL); } else { - signed char *p = (signed char *)(pSmp->pSample); - for (UINT i=0; i<=pSmp->nLength+1; i++) - { - p[i] = (signed char)((p[i*2]+p[i*2+1]+1)>>1); - } + pModDoc->GetSampleUndo()->RemoveLastUndoStep(m_nSample); } - pSmp->uFlags &= ~(CHN_STEREO); - for (UINT j=0; j<MAX_CHANNELS; j++) if (pSndFile->Chn[j].pSample == pSmp->pSample) - { - pSndFile->Chn[j].dwFlags &= ~(CHN_STEREO); - } - END_CRITICAL(); - pModDoc->SetModified(); - pModDoc->AdjustEndOfSample(m_nSample); - - pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA | HINT_SAMPLEINFO, NULL); } } EndWaitCursor(); @@ -2074,8 +2055,9 @@ CSoundFile *pSndFile = pModDoc->GetSoundFile(); MODSAMPLE *pSmp = &pSndFile->Samples[m_nSample]; - if(m_dwBeginSel == m_dwEndSel) { - // trim around loop points if there's no selection (suggested by jojo in topic 2258) + if(m_dwBeginSel == m_dwEndSel) + { + // Trim around loop points if there's no selection (http://forum.openmpt.org/index.php?topic=2258.0) m_dwBeginSel = pSmp->nLoopStart; m_dwEndSel = pSmp->nLoopEnd; } @@ -2090,16 +2072,15 @@ { pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace); BEGIN_CRITICAL(); + + // Note: Sample is overwritten in-place! Unused data is not deallocated! + const UINT bend = nEnd * pSmp->GetBytesPerSample() , bstart = nStart * pSmp->GetBytesPerSample(); + signed char *p = (signed char *)pSmp->pSample; + for (UINT i = 0; i < bend; i++) { - UINT bend = nEnd, bstart = nStart; - if (pSmp->uFlags & CHN_16BIT) { bend <<= 1; bstart <<= 1; } - if (pSmp->uFlags & CHN_STEREO) { bend <<= 1; bstart <<= 1; } - signed char *p = (signed char *)pSmp->pSample; - for (UINT i=0; i<bend; i++) - { - p[i] = p[i+bstart]; - } + p[i] = p[i + bstart]; } + if (pSmp->nLoopStart >= nStart) pSmp->nLoopStart -= nStart; if (pSmp->nLoopEnd >= nStart) pSmp->nLoopEnd -= nStart; if (pSmp->nSustainStart >= nStart) pSmp->nSustainStart -= nStart; Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2011-06-16 20:29:56 UTC (rev 903) +++ trunk/OpenMPT/mptrack/mptrack.rc 2011-06-23 14:46:38 UTC (rev 904) @@ -1409,7 +1409,7 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN EDITTEXT IDC_VISSTATUS,4,92,162,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_STATICEDGE - COMBOBOX IDC_VISEFFECTLIST,299,89,76,158,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_VISEFFECTLIST,299,89,85,158,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_VISACTION,221,90,76,158,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP LTEXT "",IDC_RENDERZONE,4,3,414,84,NOT WS_VISIBLE END @@ -1424,33 +1424,33 @@ END IDD_PITCHSHIFT DIALOGEX 0, 0, 181, 124 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Time-Stretch Ratio Calculator" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - DEFPUSHBUTTON "OK",IDOK,127,106,50,14 - EDITTEXT IDC_SAMPLE_LENGTH_NEW,42,32,40,14,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Original:",IDC_STATIC,12,19,26,8 EDITTEXT IDC_SAMPLE_LENGTH_ORIGINAL,42,16,40,14,ES_AUTOHSCROLL | ES_READONLY | ES_NUMBER - EDITTEXT IDC_ROW_LENGTH_NEW2,131,81,40,14,ES_AUTOHSCROLL - EDITTEXT IDC_ROW_LENGTH_ORIGINAL,131,65,40,14,ES_AUTOHSCROLL | ES_READONLY - GROUPBOX "Length in Samples",IDC_STATIC,6,5,82,45 - LTEXT "Original:",IDC_STATIC,12,19,26,8 LTEXT "New:",IDC_STATIC,12,35,18,8 - GROUPBOX "Length in Rows at C4",IDC_STATIC,6,55,171,45 - EDITTEXT IDC_TEMPO,55,81,27,14,ES_AUTOHSCROLL | ES_NUMBER + EDITTEXT IDC_SAMPLE_LENGTH_NEW,42,32,40,14,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Original:",IDC_STATIC,101,19,26,8 + EDITTEXT IDC_MS_LENGTH_ORIGINAL2,131,16,40,14,ES_AUTOHSCROLL | ES_READONLY | ES_NUMBER + LTEXT "New:",IDC_STATIC,101,35,18,8 + EDITTEXT IDC_MS_LENGTH_NEW,131,32,40,14,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Speed:",IDC_STATIC,12,68,24,8 EDITTEXT IDC_SPEED,55,65,27,14,ES_AUTOHSCROLL | ES_NUMBER LTEXT "Tempo:",IDC_STATIC,12,84,25,8 - LTEXT "Speed:",IDC_STATIC,12,68,24,8 + EDITTEXT IDC_TEMPO,55,81,27,14,ES_AUTOHSCROLL | ES_NUMBER LTEXT "Original:",IDC_STATIC,101,68,26,8 + EDITTEXT IDC_ROW_LENGTH_ORIGINAL,131,65,40,14,ES_AUTOHSCROLL | ES_READONLY LTEXT "New:",IDC_STATIC,101,84,18,8 + EDITTEXT IDC_ROW_LENGTH_NEW2,131,81,40,14,ES_AUTOHSCROLL + LTEXT "Ratio:",IDC_STATIC,12,109,20,8 EDITTEXT IDC_PSRATIO,42,106,33,14,ES_AUTOHSCROLL - LTEXT "Ratio:",IDC_STATIC,12,109,20,8 LTEXT "%",IDC_STATIC,78,109,8,8 - EDITTEXT IDC_MS_LENGTH_NEW,131,32,40,14,ES_AUTOHSCROLL | ES_NUMBER - EDITTEXT IDC_MS_LENGTH_ORIGINAL2,131,16,40,14,ES_AUTOHSCROLL | ES_READONLY | ES_NUMBER + DEFPUSHBUTTON "OK",IDOK,127,106,50,14 + GROUPBOX "Length in Samples",IDC_STATIC,6,5,82,45 GROUPBOX "Length in ms at C4",IDC_STATIC,95,5,82,45 - LTEXT "Original:",IDC_STATIC,101,19,26,8 - LTEXT "New:",IDC_STATIC,101,35,18,8 + GROUPBOX "Length in Rows at C4",IDC_STATIC,6,55,171,45 END IDD_OPTIONS_AUTOSAVE DIALOGEX 0, 0, 272, 279 Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-06-16 20:29:56 UTC (rev 903) +++ trunk/OpenMPT/mptrack/version.h 2011-06-23 14:46:38 UTC (rev 904) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 19 #define VER_MINOR 02 -#define VER_MINORMINOR 06 +#define VER_MINORMINOR 07 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.cpp =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2011-06-16 20:29:56 UTC (rev 903) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2011-06-23 14:46:38 UTC (rev 904) @@ -91,6 +91,7 @@ return smp.nLength; } + SmpLength ResizeSample(MODSAMPLE& smp, const SmpLength nNewLength, CSoundFile* pSndFile) //-------------------------------------------------------------------------------------- { @@ -137,6 +138,7 @@ namespace // Unnamed namespace for local implementation functions. { + template <class T> void AdjustEndOfSampleImpl(MODSAMPLE& smp) //---------------------------------------- @@ -183,7 +185,7 @@ AdjustEndOfSampleImpl<int8>(*pSmp); // Update channels with new loop values - if(pSndFile != 0) + if(pSndFile != nullptr) { CSoundFile& rSndFile = *pSndFile; for (UINT i=0; i<MAX_CHANNELS; i++) if ((rSndFile.Chn[i].pModSample == pSmp) && (rSndFile.Chn[i].nLength)) @@ -308,6 +310,7 @@ } }; + // Remove DC offset float RemoveDCOffset(MODSAMPLE& smp, SmpLength iStart, @@ -412,12 +415,13 @@ template <class T> -void UnsignSampleImpl(T* pStart, T nOffset, const SmpLength nLength) -//------------------------------------------------------------------ +void UnsignSampleImpl(T* pStart, const SmpLength nLength) +//------------------------------------------------------- { + const T offset = (T)std::numeric_limits<T>::min; for(SmpLength i = 0; i < nLength; i++) { - pStart[i] += nOffset; + pStart[i] += offset; } } @@ -434,9 +438,9 @@ iStart *= pSmp->GetNumChannels(); iEnd *= pSmp->GetNumChannels(); if(pSmp->GetElementarySampleSize() == 2) - UnsignSampleImpl(reinterpret_cast<int16*>(pSmp->pSample) + iStart, (int16)-0x8000, iEnd - iStart); + UnsignSampleImpl(reinterpret_cast<int16*>(pSmp->pSample) + iStart, iEnd - iStart); else if(pSmp->GetElementarySampleSize() == 1) - UnsignSampleImpl(reinterpret_cast<int8*>(pSmp->pSample) + iStart, (int8)-0x80, iEnd - iStart); + UnsignSampleImpl(reinterpret_cast<int8*>(pSmp->pSample) + iStart, iEnd - iStart); else return false; @@ -516,6 +520,48 @@ } +template <class T> +void ConvertStereoToMonoImpl(T* pDest, const SmpLength length) +//------------------------------------------------------------ +{ + const T* pEnd = pDest + length; + for(T* pSource = pDest; pDest != pEnd; pDest++, pSource += 2) + { + *pDest = (pSource[0] + pSource[1] + 1) >> 1; + } +} + + +// Convert a multichannel sample to mono (currently only implemented for stereo) +bool ConvertToMono(MODSAMPLE *pSmp, CSoundFile *pSndFile) +//------------------------------------------------------- +{ + if(pSmp->pSample == nullptr || pSmp->nLength == 0 || pSmp->GetNumChannels() != 2) return false; + + // Note: Sample is overwritten in-place! Unused data is not deallocated! + if(pSmp->GetElementarySampleSize() == 2) + ConvertStereoToMonoImpl(reinterpret_cast<int16*>(pSmp->pSample), pSmp->nLength); + else if(pSmp->GetElementarySampleSize() == 1) + ConvertStereoToMonoImpl(reinterpret_cast<int8*>(pSmp->pSample), pSmp->nLength); + else + return false; + + BEGIN_CRITICAL(); + pSmp->uFlags &= ~(CHN_STEREO); + for (CHANNELINDEX i = 0; i < MAX_CHANNELS; i++) + { + if(pSndFile->Chn[i].pSample == pSmp->pSample) + { + pSndFile->Chn[i].dwFlags &= ~CHN_STEREO; + } + } + END_CRITICAL(); + + AdjustEndOfSample(*pSmp, pSndFile); + return true; +} + + } // namespace ctrlSmp Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.h =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.h 2011-06-16 20:29:56 UTC (rev 903) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.h 2011-06-23 14:46:38 UTC (rev 904) @@ -65,6 +65,9 @@ // Crossfade sample data to create smooth loops bool XFadeSample(MODSAMPLE *pSmp, SmpLength iFadeLength, CSoundFile *pSndFile); +// Convert a sample with any number of channels to mono +bool ConvertToMono(MODSAMPLE *pSmp, CSoundFile *pSndFile); + } // Namespace ctrlSmp namespace ctrlChn This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |