From: <sag...@us...> - 2013-06-17 21:20:47
|
Revision: 2390 http://sourceforge.net/p/modplug/code/2390 Author: saga-games Date: 2013-06-17 21:20:40 +0000 (Mon, 17 Jun 2013) Log Message: ----------- [Fix] Don't display negative numbers or 0s as an estimated length for extremely long tracks [Fix] Better SBx loop length handling for IT files in song length estimation (http://bugs.openmpt.org/view.php?id=416) Modified Paths: -------------- trunk/OpenMPT/mptrack/Mod2wave.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/soundlib/Load_mod.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.h Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mod2wave.cpp 2013-06-16 12:32:51 UTC (rev 2389) +++ trunk/OpenMPT/mptrack/Mod2wave.cpp 2013-06-17 21:20:40 UTC (rev 2390) @@ -68,7 +68,7 @@ // this converts a buffer of 32-bit integer sample data to 32 bit floating point static void M2W_32ToFloat(void *pBuffer, long nCount) { -// const float _ki2f = 1.0f / (float)(ULONG)(0x80000000); //olivier +// const float _ki2f = 1.0f / (float)(ULONG)(0x80000000); //olivier const float _ki2f = 1.0f / (float)(ULONG)(0x7fffffff); //ericus' 32bit fix // const float _ki2f = 1.0f / (float)(ULONG)(0x7ffffff); //robin _asm { @@ -672,8 +672,8 @@ BYTE buffer[WAVECONVERTBUFSIZE]; CHAR s[80]; HWND progress = ::GetDlgItem(m_hWnd, IDC_PROGRESS1); - UINT ok = IDOK, pos; - ULONGLONG ullSamples, ullMaxSamples; + UINT ok = IDOK, pos = 0; + uint64 ullSamples = 0, ullMaxSamples; DWORD dwDataOffset; LONG lMax = 256; @@ -739,18 +739,17 @@ fwrite(m_pWaveFormat, 1, fmthdr.length, f); fwrite(&datahdr, 1, sizeof(datahdr), f); dwDataOffset = ftell(f); - pos = 0; ullSamples = 0; ullMaxSamples = m_dwFileLimit / (m_pWaveFormat->nChannels * m_pWaveFormat->wBitsPerSample / 8); if (m_dwSongLimit) { - ULONGLONG l = (ULONGLONG)m_dwSongLimit * m_pWaveFormat->nSamplesPerSec; + uint64 l = (uint64)m_dwSongLimit * m_pWaveFormat->nSamplesPerSec; if (l < ullMaxSamples) ullMaxSamples = l; } // calculate maximum samples - ULONGLONG max = ullMaxSamples; - ULONGLONG l = ((ULONGLONG)m_pSndFile->GetSongTime()) * m_pWaveFormat->nSamplesPerSec * (ULONGLONG)std::max(1, 1 + m_pSndFile->GetRepeatCount()); + uint64 max = ullMaxSamples; + uint64 l = static_cast<uint64>(m_pSndFile->GetSongTime() + 0.5) * m_pWaveFormat->nSamplesPerSec * std::max<uint64>(1, 1 + m_pSndFile->GetRepeatCount()); if (m_nMaxPatterns > 0) { DWORD dwOrds = m_pSndFile->Order.GetLengthFirstEmpty(); @@ -793,20 +792,6 @@ iter->processed = true; } -/* if (m_bGivePlugsIdleTime) { - LARGE_INTEGER startTime, endTime, duration,Freq; - QueryPerformanceFrequency(&Freq); - long samplesprocessed = sizeof(buffer)/(m_pWaveFormat->nChannels * m_pWaveFormat->wBitsPerSample / 8); - duration.QuadPart = samplesprocessed / static_cast<double>(m_pWaveFormat->nSamplesPerSec) * Freq.QuadPart; - if (QueryPerformanceCounter(&startTime)) { - endTime.QuadPart=0; - while ((endTime.QuadPart-startTime.QuadPart)<duration.QuadPart*4) { - theApp.GetPluginManager()->OnIdle(); - QueryPerformanceCounter(&endTime); - } - } - }*/ - if (m_bGivePlugsIdleTime) { Sleep(20); @@ -1106,7 +1091,7 @@ } DWORD oldsndcfg = m_pSndFile->m_MixerSettings.MixerFlags; oldrepeat = m_pSndFile->GetRepeatCount(); - const DWORD dwSongTime = m_pSndFile->GetSongTime(); + const uint64 dwSongTime = static_cast<uint64>(m_pSndFile->GetSongTime() + 0.5); mixersettings.gdwMixingFreq = wfxSrc.nSamplesPerSec; mixersettings.m_SampleFormat = SampleFormatInt16; mixersettings.gnChannels = wfxSrc.nChannels; Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2013-06-16 12:32:51 UTC (rev 2389) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2013-06-17 21:20:40 UTC (rev 2390) @@ -234,7 +234,7 @@ std::ostringstream str; str << "File: " << lpszPathName << std::endl - << "Last saved with: " << MptVersion::ToStr(m_SndFile.m_dwLastSavedWithVersion) << ", your version is " << MptVersion::str << std::endl + << "Last saved with: " << m_SndFile.madeWithTracker << ", you are using OpenMPT " << MptVersion::str << std::endl << std::endl; logcapturer.ShowLog(str.str()); @@ -1217,7 +1217,7 @@ if(!pChn->dwFlags[mask] && pChn->nLength && (note == pChn->nNewNote || !note)) { m_SndFile.KeyOff(i); - if (!m_SndFile.m_nInstruments) pChn->dwFlags.reset(CHN_LOOP); + if (!m_SndFile.m_nInstruments) pChn->dwFlags.reset(CHN_LOOP); // FIXME: If a sample with pingpong loop is playing backwards, stuff before the loop is played again! if (fade) pChn->dwFlags.set(CHN_NOTEFADE); if (note) break; } @@ -2263,9 +2263,16 @@ void CModDoc::OnEstimateSongLength() //---------------------------------- { - CHAR s[64]; - DWORD dwSongLength = m_SndFile.GetSongTime(); - wsprintf(s, "Approximate song length: %dmn%02ds", dwSongLength / 60, dwSongLength % 60); + CString s; + double songLength = m_SndFile.GetSongTime(); + if(songLength != std::numeric_limits<double>::infinity()) + { + songLength = Util::Round(songLength); + s.Format("Approximate song length: %.0fmn%02.0fs", songLength / 60.0, fmod(songLength, 60.0)); + } else + { + s = "Song too long!"; + } Reporting::Information(s); } Modified: trunk/OpenMPT/soundlib/Load_mod.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mod.cpp 2013-06-16 12:32:51 UTC (rev 2389) +++ trunk/OpenMPT/soundlib/Load_mod.cpp 2013-06-17 21:20:40 UTC (rev 2390) @@ -724,7 +724,7 @@ // In the pattern loader above, a second condition is used: Only tempo commands // below 100 BPM are taken into account. Furthermore, only M.K. (ProTracker) // modules are checked. - const bool fixVBlank = isMdKd && hasTempoCommands && GetSongTime() >= 10 * 60; + const bool fixVBlank = isMdKd && hasTempoCommands && GetSongTime() >= 600.0; const bool fix7BitPanning = leftPanning && !extendedPanning; if(fixVBlank || fix7BitPanning) { @@ -1228,7 +1228,7 @@ uint16 period = 0; // Convert note to period - if(m.IsNote() && m.note >= 36 + NOTE_MIN && m.note < CountOf(ProTrackerPeriodTable) + 36 + NOTE_MIN) + if(m.note >= 36 + NOTE_MIN && m.note < CountOf(ProTrackerPeriodTable) + 36 + NOTE_MIN) { period = ProTrackerPeriodTable[m.note - 36 - NOTE_MIN]; } Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-06-16 12:32:51 UTC (rev 2389) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-06-17 21:20:40 UTC (rev 2390) @@ -170,6 +170,7 @@ nPattern = Order[nCurrentOrder]; bool positionJumpOnThisRow = false; bool patternBreakOnThisRow = false; + bool patternLoopEndedOnThisRow = false; while(nPattern >= Patterns.Size()) { @@ -382,6 +383,7 @@ if (param & 0x0F) { memory.elapsedTime += (memory.elapsedTime - memory.chnSettings[nChn].patLoop) * (double)(param & 0x0F); + patternLoopEndedOnThisRow = true; } else { memory.chnSettings[nChn].patLoop = memory.elapsedTime; @@ -534,9 +536,22 @@ const UINT tickDuration = GetTickDuration(memory.musicTempo, memory.musicSpeed, rowsPerBeat); const UINT rowDuration = tickDuration * (memory.musicSpeed + tickDelay) * MAX(rowDelay, 1); + const double rowDurationDbl = static_cast<double>(rowDuration) / static_cast<double>(m_MixerSettings.gdwMixingFreq); + memory.elapsedTime += rowDurationDbl; + memory.renderedSamples += rowDuration; - memory.elapsedTime += static_cast<double>(rowDuration) / static_cast<double>(m_MixerSettings.gdwMixingFreq); - memory.renderedSamples += rowDuration; + if(GetType() == MOD_TYPE_IT && patternLoopEndedOnThisRow) + { + // IT pattern loop start row update - at the end of a pattern loop, set pattern loop start to next row (for upcoming pattern loops with missing SB0) + p = Patterns[nPattern].GetRow(nRow); + for(CHANNELINDEX nChn = 0; nChn < GetNumChannels(); p++, pChn++, nChn++) + { + if(p->command == CMD_S3MCMDEX && p->param >= 0xB1 && p->param <= 0xBF) + { + memory.chnSettings[nChn].patLoop = memory.elapsedTime; + } + } + } } if(retval.targetReached || target.mode == GetLengthTarget::NoTarget) @@ -3963,7 +3978,7 @@ const PLUGINDEX nPlug = (plugin != 0) ? plugin : GetBestPlugin(nChn, PrioritiseChannel, EvenIfMuted); if ((nPlug) && (nPlug <= MAX_MIXPLUGINS) && param < 0x80) { - const float newRatio = 1.0 - (static_cast<float>(param & 0x7F) / 127.0f); + const float newRatio = 1.0f - (static_cast<float>(param & 0x7F) / 127.0f); if(!isSmooth) { m_MixPlugins[nPlug - 1].fDryRatio = newRatio; Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2013-06-16 12:32:51 UTC (rev 2389) +++ trunk/OpenMPT/soundlib/Sndfile.h 2013-06-17 21:20:40 UTC (rev 2390) @@ -535,7 +535,7 @@ public: //Returns song length in seconds. - DWORD GetSongTime() { return static_cast<DWORD>(GetLength(eNoAdjust).duration + 0.5); } + double GetSongTime() { return GetLength(eNoAdjust).duration; } void RecalculateSamplesPerTick(); double GetRowDuration(UINT tempo, UINT speed) const; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |