From: <sag...@us...> - 2013-01-22 15:27:21
|
Revision: 1507 http://sourceforge.net/p/modplug/code/1507 Author: saga-games Date: 2013-01-22 15:27:14 +0000 (Tue, 22 Jan 2013) Log Message: ----------- [Imp] Sample Editor: Sustain loop preview is now updated instantly (http://bugs.openmpt.org/view.php?id=108). Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 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 2013-01-22 15:01:28 UTC (rev 1506) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2013-01-22 15:27:14 UTC (rev 1507) @@ -164,7 +164,7 @@ } -CCtrlSamples::CCtrlSamples() : +CCtrlSamples::CCtrlSamples() : //---------------------------- m_nStretchProcessStepLength(nDefaultStretchChunkSize), m_nSequenceMs(DEFAULT_SEQUENCE_MS), @@ -2665,14 +2665,14 @@ { if ((IsLocked()) || (!m_pSndFile)) return; ModSample &sample = m_pSndFile->GetSample(m_nSample); - LONG n = GetDlgItemInt(IDC_EDIT1); - if ((n >= 0) && (n < (LONG)sample.nLength) && ((n < (LONG)sample.nLoopEnd) || (!(sample.uFlags & CHN_LOOP)))) + SmpLength n = GetDlgItemInt(IDC_EDIT1); + if ((n >= 0) && (n < sample.nLength) && ((n < sample.nLoopEnd) || !sample.uFlags[CHN_LOOP])) { sample.nLoopStart = n; - if(sample.uFlags & CHN_LOOP) + if(sample.uFlags[CHN_LOOP]) { - /* only update sample buffer if the loop is actually enabled - (resets sound without any reason otherwise) - http://forum.openmpt.org/index.php?topic=1874.0 */ + // only update sample buffer if the loop is actually enabled + // (resets sound without any reason otherwise) - http://forum.openmpt.org/index.php?topic=1874.0 m_pModDoc->AdjustEndOfSample(m_nSample); } m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA, this); @@ -2686,14 +2686,14 @@ { if ((IsLocked()) || (!m_pSndFile)) return; ModSample &sample = m_pSndFile->GetSample(m_nSample); - LONG n = GetDlgItemInt(IDC_EDIT2); - if ((n >= 0) && (n <= (LONG)sample.nLength) && ((n > (LONG)sample.nLoopStart) || (!(sample.uFlags & CHN_LOOP)))) + SmpLength n = GetDlgItemInt(IDC_EDIT2); + if ((n >= 0) && (n <= sample.nLength) && ((n > sample.nLoopStart) || !sample.uFlags[CHN_LOOP])) { sample.nLoopEnd = n; - if(sample.uFlags & CHN_LOOP) + if(sample.uFlags[CHN_LOOP]) { - /* only update sample buffer if the loop is actually enabled - (resets sound without any reason otherwise) - http://forum.openmpt.org/index.php?topic=1874.0 */ + // only update sample buffer if the loop is actually enabled + // (resets sound without any reason otherwise) - http://forum.openmpt.org/index.php?topic=1874.0 m_pModDoc->AdjustEndOfSample(m_nSample); } m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA, this); @@ -2745,11 +2745,12 @@ { if ((IsLocked()) || (!m_pSndFile)) return; ModSample &sample = m_pSndFile->GetSample(m_nSample); - LONG n = GetDlgItemInt(IDC_EDIT3); - if ((n >= 0) && (n <= (LONG)sample.nLength) - && ((n < (LONG)sample.nSustainEnd) || (!(sample.uFlags & CHN_SUSTAINLOOP)))) + SmpLength n = GetDlgItemInt(IDC_EDIT3); + if ((n >= 0) && (n <= sample.nLength) + && ((n < sample.nSustainEnd) || !sample.uFlags[CHN_SUSTAINLOOP])) { sample.nSustainStart = n; + ctrlSmp::UpdateLoopPoints(sample, *m_pSndFile); m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA, this); m_pModDoc->SetModified(); } @@ -2761,11 +2762,12 @@ { if ((IsLocked()) || (!m_pSndFile)) return; ModSample &sample = m_pSndFile->GetSample(m_nSample); - LONG n = GetDlgItemInt(IDC_EDIT4); - if ((n >= 0) && (n <= (LONG)sample.nLength) - && ((n > (LONG)sample.nSustainStart) || (!(sample.uFlags & CHN_SUSTAINLOOP)))) + SmpLength n = GetDlgItemInt(IDC_EDIT4); + if ((n >= 0) && (n <= sample.nLength) + && ((n > sample.nSustainStart) || !sample.uFlags[CHN_SUSTAINLOOP])) { sample.nSustainEnd = n; + ctrlSmp::UpdateLoopPoints(sample, *m_pSndFile); m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA, this); m_pModDoc->SetModified(); } Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.cpp =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2013-01-22 15:01:28 UTC (rev 1506) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2013-01-22 15:27:14 UTC (rev 1507) @@ -24,11 +24,11 @@ LPSTR const pOldSmp = smp.pSample; FlagSet<ChannelFlags> setFlags, resetFlags; - setFlags.set(CHN_16BIT, (smp.uFlags & CHN_16BIT) != 0); - resetFlags.set(CHN_16BIT, (smp.uFlags & CHN_16BIT) == 0); + setFlags.set(CHN_16BIT, smp.uFlags[CHN_16BIT]); + resetFlags.set(CHN_16BIT, !smp.uFlags[CHN_16BIT]); - setFlags.set(CHN_STEREO, (smp.uFlags & CHN_STEREO) != 0); - resetFlags.set(CHN_STEREO, (smp.uFlags & CHN_STEREO) == 0); + setFlags.set(CHN_STEREO, smp.uFlags[CHN_STEREO]); + resetFlags.set(CHN_STEREO, !smp.uFlags[CHN_STEREO]); CriticalSection cs; @@ -189,28 +189,57 @@ // Update channels with new loop values if(pSndFile != nullptr) { - CSoundFile& rSndFile = *pSndFile; - for(CHANNELINDEX i = 0; i < MAX_CHANNELS; i++) if ((rSndFile.Chn[i].pModSample == &smp) && rSndFile.Chn[i].nLength != 0) + return UpdateLoopPoints(smp, *pSndFile); + } + + return true; +} + + +// Propagate loop point changes to player +bool UpdateLoopPoints(const ModSample &smp, CSoundFile &sf) +//--------------------------------------------------------- +{ + if(!smp.nLength || !smp.pSample) + return false; + + CriticalSection cs; + + // Update channels with new loop values + for(CHANNELINDEX i = 0; i < MAX_CHANNELS; i++) if((sf.Chn[i].pModSample == &smp) && sf.Chn[i].nLength != 0) + { + bool looped = false, bidi = false; + + if(smp.nSustainStart < smp.nSustainEnd && smp.nSustainEnd <= smp.nLength && smp.uFlags[CHN_SUSTAINLOOP] && !sf.Chn[i].dwFlags[CHN_KEYOFF]) { - if((smp.nLoopStart + 3 < smp.nLoopEnd) && (smp.nLoopEnd <= smp.nLength)) - { - rSndFile.Chn[i].nLoopStart = smp.nLoopStart; - rSndFile.Chn[i].nLoopEnd = smp.nLoopEnd; - rSndFile.Chn[i].nLength = smp.nLoopEnd; - if(rSndFile.Chn[i].nPos > rSndFile.Chn[i].nLength) - { - rSndFile.Chn[i].nPos = rSndFile.Chn[i].nLoopStart; - rSndFile.Chn[i].dwFlags.reset(CHN_PINGPONGFLAG); - } + // Sustain loop is active + sf.Chn[i].nLoopStart = smp.nSustainStart; + sf.Chn[i].nLoopEnd = smp.nSustainEnd; + sf.Chn[i].nLength = smp.nSustainEnd; + looped = true; + bidi = smp.uFlags[CHN_PINGPONGSUSTAIN]; + } else if(smp.nLoopStart < smp.nLoopEnd && smp.nLoopEnd <= smp.nLength && smp.uFlags[CHN_LOOP]) + { + // Normal loop is active + sf.Chn[i].nLoopStart = smp.nLoopStart; + sf.Chn[i].nLoopEnd = smp.nLoopEnd; + sf.Chn[i].nLength = smp.nLoopEnd; + looped = true; + bidi = smp.uFlags[CHN_PINGPONGLOOP]; + } + sf.Chn[i].dwFlags.set(CHN_LOOP, looped); + sf.Chn[i].dwFlags.set(CHN_PINGPONGLOOP, looped && bidi); - bool looped = (smp.uFlags & CHN_LOOP) != 0; - rSndFile.Chn[i].dwFlags.set(CHN_LOOP, looped); - rSndFile.Chn[i].dwFlags.set(CHN_PINGPONGLOOP, looped && (smp.uFlags & CHN_PINGPONGLOOP)); - } else if (!(smp.uFlags & CHN_LOOP)) - { - rSndFile.Chn[i].dwFlags.reset(CHN_PINGPONGLOOP | CHN_LOOP); - } + if(sf.Chn[i].nPos > sf.Chn[i].nLength) + { + sf.Chn[i].nPos = sf.Chn[i].nLoopStart; + sf.Chn[i].dwFlags.reset(CHN_PINGPONGFLAG); } + + if(!looped) + { + sf.Chn[i].nLength = smp.nLength; + } } return true; Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.h =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.h 2013-01-22 15:01:28 UTC (rev 1506) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.h 2013-01-22 15:27:14 UTC (rev 1507) @@ -38,6 +38,9 @@ bool AdjustEndOfSample(ModSample &smp, CSoundFile *pSndFile = nullptr); +// Propagate loop point changes to player +bool UpdateLoopPoints(const ModSample &smp, CSoundFile &sf); + // Returns the number of bytes allocated(at least) for sample data. // Note: Currently the return value is based on the sample length and the actual // allocation may be more than what this function returns. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |