From: <sag...@us...> - 2010-03-28 00:09:47
|
Revision: 557 http://modplug.svn.sourceforge.net/modplug/?rev=557&view=rev Author: saga-games Date: 2010-03-28 00:09:41 +0000 (Sun, 28 Mar 2010) Log Message: ----------- [Fix] Song Cleanup: "Remove unused samples" was broken in the last revision (strangely, no debug assertions appeared in the IDE...) [Fix] Sample Editor: When applying time stretch / pitch shift to an 8-bit sample and selecting the sample partly lead to partial upsampling, instead of upsampling the whole sample. Modified Paths: -------------- trunk/OpenMPT/mptrack/CleanupSong.cpp trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/Ctrl_smp.h Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp =================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.cpp 2010-03-27 20:21:45 UTC (rev 556) +++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2010-03-28 00:09:41 UTC (rev 557) @@ -515,13 +515,14 @@ vector<bool> bIns; int nExt = 0; int nRemoved = 0; - bIns.resize(pSndFile->GetNumSamples(), false); + bIns.resize(pSndFile->GetNumSamples() + 1, false); BeginWaitCursor(); for (SAMPLEINDEX nSmp = pSndFile->m_nSamples; nSmp >= 1; nSmp--) if (pSndFile->Samples[nSmp].pSample) { if (!pSndFile->IsSampleUsed(nSmp)) { + m_pModDoc->GetSampleUndo()->PrepareUndo(nSmp, sundo_delete); BEGIN_CRITICAL(); pSndFile->DestroySample(nSmp); if ((nSmp == pSndFile->m_nSamples) && (nSmp > 1)) pSndFile->m_nSamples--; @@ -531,12 +532,12 @@ } if (pSndFile->m_nInstruments) { - for (UINT ipat=0; ipat<pSndFile->Patterns.Size(); ipat++) + for (PATTERNINDEX nPat = 0; nPat < pSndFile->GetNumPatterns(); nPat++) { - MODCOMMAND *p = pSndFile->Patterns[ipat]; + MODCOMMAND *p = pSndFile->Patterns[nPat]; if (p) { - UINT jmax = pSndFile->PatternSize[ipat] * pSndFile->m_nChannels; + UINT jmax = pSndFile->PatternSize[nPat] * pSndFile->m_nChannels; for (UINT j=0; j<jmax; j++, p++) { if ((p->note) && (p->note <= NOTE_MAX)) @@ -581,9 +582,9 @@ { if ((!bIns[nSmp]) && (pSndFile->Samples[nSmp].pSample)) { + m_pModDoc->GetSampleUndo()->PrepareUndo(nSmp, sundo_delete); BEGIN_CRITICAL(); pSndFile->DestroySample(nSmp); - m_pModDoc->GetSampleUndo()->PrepareUndo(nSmp, sundo_delete); if ((nSmp == pSndFile->m_nSamples) && (nSmp > 1)) pSndFile->m_nSamples--; END_CRITICAL(); nRemoved++; Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2010-03-27 20:21:45 UTC (rev 556) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2010-03-28 00:09:41 UTC (rev 557) @@ -1489,13 +1489,7 @@ m_pModDoc->AdjustEndOfSample(m_nSample); if (selection.bSelected == true) { - SAMPLEVIEWSTATE viewstate; - memset(&viewstate, 0, sizeof(viewstate)); - SendViewMessage(VIEWMSG_SAVESTATE, (LPARAM)&viewstate); - - viewstate.dwBeginSel = dwStart; - viewstate.dwEndSel = dwEnd + (dwEnd-dwStart); - SendViewMessage(VIEWMSG_LOADSTATE, (LPARAM)&viewstate); + SetSelectionPoints(dwStart, dwEnd + (dwEnd - dwStart)); } m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA | HINT_SAMPLEINFO, NULL); m_pModDoc->SetModified(); @@ -1623,13 +1617,7 @@ m_pModDoc->AdjustEndOfSample(m_nSample); if (selection.bSelected == true) { - SAMPLEVIEWSTATE viewstate; - memset(&viewstate, 0, sizeof(viewstate)); - SendViewMessage(VIEWMSG_SAVESTATE, (LPARAM)&viewstate); - - viewstate.dwBeginSel = dwStart; - viewstate.dwEndSel = dwStart + dwRemove; - SendViewMessage(VIEWMSG_LOADSTATE, (LPARAM)&viewstate); + SetSelectionPoints(dwStart, dwStart + dwRemove); } m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA | HINT_SAMPLEINFO, NULL); m_pModDoc->SetModified(); @@ -1727,7 +1715,8 @@ if(!pSmp || pSmp->nLength == 0) goto error; // Time stretching - if(IsDlgButtonChecked(IDC_CHECK3)){ + if(IsDlgButtonChecked(IDC_CHECK3)) + { UpdateData(TRUE); //Ensure m_dTimeStretchRatio is up-to-date with textbox content errorcode = TimeStretch((float)(m_dTimeStretchRatio / 100.0)); @@ -1742,7 +1731,8 @@ } // Pitch shifting - else{ + else + { // Get selected pitch modifier [-12,+12] CComboBox *combo = (CComboBox *)GetDlgItem(IDC_COMBO4); float pm = float(combo->GetCurSel()) - 12.0f; @@ -1761,27 +1751,29 @@ // Error management error: - if(errorcode > 0){ - CHAR str[64]; - switch(errorcode & 0xff){ - case 1 : wsprintf(str,"Pitch %s...",(errorcode>>8) == 1 ? "< 0.5" : "> 2.0"); + if(errorcode > 0) + { + TCHAR str[64]; + switch(errorcode & 0xff) + { + case 1 : wsprintf(str, _T("Pitch %s..."), (errorcode >> 8) == 1 ? _T("< 0.5") : _T("> 2.0")); break; - case 2 : wsprintf(str,"Stretch ratio is too %s. Must be between 50% and 200%.",(errorcode>>8) == 1 ? "low" : "high"); + case 2 : wsprintf(str, _T("Stretch ratio is too %s. Must be between 50% and 200%."), (errorcode >> 8) == 1 ? _T("low") : _T("high")); break; - case 3 : wsprintf(str,"Not enough memory..."); + case 3 : wsprintf(str, _T("Not enough memory...")); break; - case 5 : wsprintf(str, "Too low sample rate"); + case 5 : wsprintf(str, _T("Too low sample rate")); break; - case 6 : wsprintf(str, "Too short sample"); + case 6 : wsprintf(str, _T("Too short sample")); break; - default: wsprintf(str,"Unknown Error..."); + default: wsprintf(str, _T("Unknown Error...")); break; } AfxMessageBox(str, MB_ICONERROR); } // Update sample view - m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA | HINT_SAMPLEINFO, NULL); // !!!! see CODE#0006, update#3 + m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA | HINT_SAMPLEINFO, NULL); m_pModDoc->SetModified(); } @@ -1828,13 +1820,14 @@ } // Get number of channels & sample size - BYTE smpsize = pSmp->GetElementarySampleSize(); - const UINT nChn = pSmp->GetNumChannels(); + uint8 smpsize = pSmp->GetElementarySampleSize(); + const uint8 nChn = pSmp->GetNumChannels(); // Stretching is implemented only for 16-bit samples. if(smpsize != 2) { // This has to be converted to 16-bit first. + SetSelectionPoints(0, 0); // avoid partial upsampling. OnUpsample(); smpsize = pSmp->GetElementarySampleSize(); } @@ -2033,6 +2026,7 @@ if(smpsize != 2) { // This has to be converted to 16-bit first. + SetSelectionPoints(0, 0); // avoid partial upsampling. OnUpsample(); smpsize = pSmp->GetElementarySampleSize(); } @@ -3032,3 +3026,19 @@ return points; } +// Set the currently select part of the sample. +// To reset the selection, use nStart = nEnd = 0. +void CCtrlSamples::SetSelectionPoints(UINT nStart, UINT nEnd) +//----------------------------------------------------------- +{ + nStart = CLAMP(nStart, 0, m_pSndFile->Samples[m_nSample].nLength); + nEnd = CLAMP(nEnd, 0, m_pSndFile->Samples[m_nSample].nLength); + + SAMPLEVIEWSTATE viewstate; + memset(&viewstate, 0, sizeof(viewstate)); + SendViewMessage(VIEWMSG_SAVESTATE, (LPARAM)&viewstate); + + viewstate.dwBeginSel = nStart; + viewstate.dwEndSel = nEnd; + SendViewMessage(VIEWMSG_LOADSTATE, (LPARAM)&viewstate); +} Modified: trunk/OpenMPT/mptrack/Ctrl_smp.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.h 2010-03-27 20:21:45 UTC (rev 556) +++ trunk/OpenMPT/mptrack/Ctrl_smp.h 2010-03-28 00:09:41 UTC (rev 557) @@ -44,7 +44,9 @@ // Applies amplification to sample. Negative values // can be used to invert phase. void ApplyAmplify(LONG nAmp, bool bFadeIn = false, bool bFadeOut = false); + SELECTIONPOINTS GetSelectionPoints(); + void SetSelectionPoints(UINT nStart, UINT nEnd); public: CCtrlSamples(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |