From: <sag...@us...> - 2013-01-30 16:58:42
|
Revision: 1509 http://sourceforge.net/p/modplug/code/1509 Author: saga-games Date: 2013-01-30 16:58:33 +0000 (Wed, 30 Jan 2013) Log Message: ----------- [Imp] Elapsed time in status bar is a lot more accurate now. [Imp] Comments page: Editing sample/instrument names limits the name length during input instead of just trimming long strings afterwards. [Mod] Changed default song name to be empty instead of "untitled" (suggestion by coda) [Int] Changed FileReader::ReadVector behaviour if not enough bytes can be read, to prevent possible heap corruptions when not checking for the ReadVector result. Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/view_com.cpp trunk/OpenMPT/mptrack/view_com.h trunk/OpenMPT/soundlib/FileReader.h Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2013-01-25 00:01:06 UTC (rev 1508) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2013-01-30 16:58:33 UTC (rev 1509) @@ -224,7 +224,6 @@ m_hWndMidi = NULL; m_pSndFile = nullptr; m_dwStatus = 0; - m_dwElapsedTime = 0; m_dwTimeSec = 0; m_dwNotifyType = 0; m_nTimer = 0; @@ -1021,7 +1020,6 @@ BOOL CMainFrame::DoNotification(DWORD dwSamplesRead, DWORD dwLatency) //------------------------------------------------------------------- { - m_dwElapsedTime += (dwSamplesRead * 1000) / GetSettings().m_dwRate; gsdwTotalSamples += dwSamplesRead; if (!m_pSndFile) return FALSE; if (m_nMixChn < m_pSndFile->m_nMixStat) m_nMixChn++; @@ -1324,8 +1322,8 @@ // Select correct bidi loop mode when playing a module. pSndFile->SetupITBidiMode(); - if ((m_pSndFile) || (m_dwStatus & MODSTATUS_PLAYING)) PauseMod(); - if (((m_pSndFile) && (pSndFile != m_pSndFile)) || (!m_dwElapsedTime)) CSoundFile::ResetAGC(); + if(m_pSndFile != nullptr || (m_dwStatus & MODSTATUS_PLAYING)) PauseMod(); + if(m_pSndFile != nullptr && (pSndFile != m_pSndFile || !m_pSndFile->GetTotalSampleCount())) CSoundFile::ResetAGC(); m_pSndFile = pSndFile; m_pModPlaying = pModDoc; m_hFollowSong = hPat; @@ -1439,7 +1437,6 @@ PauseMod(); if (pPlay) pPlay->SetPause(FALSE); if (pSndFile) pSndFile->SetCurrentPos(0); - m_dwElapsedTime = 0; return TRUE; } @@ -1981,10 +1978,15 @@ //---------------------------- { // Display Time in status bar - DWORD dwTime = m_dwElapsedTime / 1000; - if (dwTime != m_dwTimeSec) + size_t time = 0; + if(m_pSndFile != nullptr && m_pSndFile->GetSampleRate() != 0) { - m_dwTimeSec = dwTime; + time = m_pSndFile->GetTotalSampleCount() / m_pSndFile->GetSampleRate(); + } + + if (time != m_dwTimeSec) + { + m_dwTimeSec = time; m_nAvgMixChn = m_nMixChn; OnUpdateTime(NULL); } @@ -2096,20 +2098,18 @@ { CHAR s[64]; wsprintf(s, "%d:%02d:%02d", - m_dwTimeSec / 3600, (m_dwTimeSec / 60) % 60, (m_dwTimeSec % 60)); - if ((m_pSndFile) && (!(m_pSndFile->IsPaused()))) + m_dwTimeSec / 3600, (m_dwTimeSec / 60) % 60, m_dwTimeSec % 60); + + if(m_pSndFile != nullptr && m_pSndFile != &m_WaveFile && !m_pSndFile->IsPaused()) { - if (m_pSndFile != &m_WaveFile) + PATTERNINDEX nPat = m_pSndFile->m_nPattern; + if(m_pSndFile->Patterns.IsValidIndex(nPat)) { - UINT nPat = m_pSndFile->m_nPattern; - if(nPat < m_pSndFile->Patterns.Size()) - { - if (nPat < 10) strcat(s, " "); - if (nPat < 100) strcat(s, " "); - wsprintf(s+strlen(s), " [%d]", nPat); - } + if(nPat < 10) strcat(s, " "); + if(nPat < 100) strcat(s, " "); + wsprintf(s + strlen(s), " [%d]", nPat); } - wsprintf(s+strlen(s), " %dch", m_nAvgMixChn); + wsprintf(s + strlen(s), " %dch", m_nAvgMixChn); } m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_TIME), s, TRUE); } Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2013-01-25 00:01:06 UTC (rev 1508) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2013-01-30 16:58:33 UTC (rev 1509) @@ -553,15 +553,12 @@ BOOL StopMod(CModDoc *pDoc=NULL); BOOL PauseMod(CModDoc *pDoc=NULL); BOOL PlaySoundFile(CSoundFile *); - BOOL PlaySoundFile(LPCSTR lpszFileName, UINT nNote=0); + BOOL PlaySoundFile(LPCSTR lpszFileName, UINT nNote = 0); BOOL PlaySoundFile(CSoundFile *pSong, UINT nInstrument, UINT nSample, UINT nNote=0); BOOL PlayDLSInstrument(UINT nDLSBank, UINT nIns, UINT nRgn); BOOL StopSoundFile(CSoundFile *); inline BOOL IsPlaying() const { return (m_dwStatus & MODSTATUS_PLAYING); } inline BOOL IsRendering() const { return (m_dwStatus & MODSTATUS_RENDERING); } //rewbs.VSTTimeInfo - DWORD GetElapsedTime() const { return m_dwElapsedTime; } - void ResetElapsedTime() { m_dwElapsedTime = 0; } - void SetElapsedTime(DWORD dwElapsedTime) { m_dwElapsedTime = dwElapsedTime; } inline CModDoc *GetModPlaying() const { return (IsPlaying()||IsRendering()) ? m_pModPlaying : NULL; } inline CSoundFile *GetSoundFilePlaying() const { return (IsPlaying()||IsRendering()) ? m_pSndFile : NULL; } //rewbs.VSTTimeInfo BOOL InitRenderer(CSoundFile*); //rewbs.VSTTimeInfo Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2013-01-25 00:01:06 UTC (rev 1508) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2013-01-30 16:58:33 UTC (rev 1509) @@ -693,7 +693,7 @@ } MemsetZero(m_SndFile.m_szNames); - strcpy(m_SndFile.m_szNames[0], "untitled"); + //strcpy(m_SndFile.m_szNames[0], "untitled"); m_SndFile.m_nMusicTempo = m_SndFile.m_nDefaultTempo = 125; m_SndFile.m_nMusicSpeed = m_SndFile.m_nDefaultSpeed = 6; @@ -803,9 +803,9 @@ { CString strMsg; va_list args; - va_start(args, pszFormat); + va_start(args, pszFormat); strMsg.FormatV(pszFormat, args); - va_end(args); + va_end(args); m_logEvents << Util::sdTime::GetDateTimeStr() << _T("Event type: ") << eventType << std::endl @@ -902,8 +902,8 @@ { CriticalSection cs; - //OnPlayerPause(); // pause song - pausing VSTis is too slow - pMainFrm->SetLastMixActiveTime(); // mark activity + //OnPlayerPause(); // pause song - pausing VSTis is too slow + pMainFrm->SetLastMixActiveTime(); // mark activity // All notes off for (UINT i=0; i<MAX_CHANNELS; i++) @@ -1987,7 +1987,6 @@ m_SndFile.m_SongFlags.reset(SONG_STEP | SONG_PATTERNLOOP); m_SndFile.SetCurrentPos(0); m_SndFile.visitedSongRows.Initialize(true); - pMainFrm->ResetElapsedTime(); m_SndFile.m_lTotalSampleCount = 0; m_SndFile.m_bPositionChanged = true; @@ -2104,13 +2103,13 @@ //----------------------------- { const PATTERNINDEX pat = InsertPattern(); - if (pat >= 0) + if(pat != PATTERNINDEX_INVALID) { ORDERINDEX ord = 0; - for (ORDERINDEX i = 0; i < m_SndFile.Order.size(); i++) + for(ORDERINDEX i = 0; i < m_SndFile.Order.size(); i++) { - if (m_SndFile.Order[i] == pat) ord = i; - if (m_SndFile.Order[i] == m_SndFile.Order.GetInvalidPatIndex()) break; + if(m_SndFile.Order[i] == pat) ord = i; + if(m_SndFile.Order[i] == m_SndFile.Order.GetInvalidPatIndex()) break; } ViewPattern(pat, ord); } @@ -2120,16 +2119,16 @@ void CModDoc::OnInsertSample() //---------------------------- { - LONG smp = InsertSample(); - if (smp != SAMPLEINDEX_INVALID) ViewSample(smp); + SAMPLEINDEX smp = InsertSample(); + if(smp != SAMPLEINDEX_INVALID) ViewSample(smp); } void CModDoc::OnInsertInstrument() //-------------------------------- { - LONG ins = InsertInstrument(); - if (ins != INSTRUMENTINDEX_INVALID) ViewInstrument(ins); + INSTRUMENTINDEX ins = InsertInstrument(); + if(ins != INSTRUMENTINDEX_INVALID) ViewInstrument(ins); } @@ -2303,7 +2302,7 @@ // set playback timer in the status bar (and update channel status) SetElapsedTime(nOrd, 0); - if (pModPlaying == this) + if(pModPlaying == this) { pSndFile->StopAllVsti(); } else @@ -2313,7 +2312,7 @@ cs.Leave(); - if (pModPlaying != this) + if(pModPlaying != this) { pMainFrm->PlayMod(this, followSonghWnd, m_dwNotifyType|MPTNOTIFY_POSITION|MPTNOTIFY_VUMETERS); //rewbs.fix2977 } @@ -2361,7 +2360,7 @@ // set playback timer in the status bar (and update channel status) SetElapsedTime(nOrd, nRow); - if (pModPlaying == this) + if(pModPlaying == this) { pSndFile->StopAllVsti(); } else @@ -2371,7 +2370,7 @@ cs.Leave(); - if (pModPlaying != this) + if(pModPlaying != this) { pMainFrm->PlayMod(this, followSonghWnd, m_dwNotifyType|MPTNOTIFY_POSITION|MPTNOTIFY_VUMETERS); //rewbs.fix2977 } @@ -2422,7 +2421,7 @@ // set playback timer in the status bar (and update channel status) SetElapsedTime(nOrd, nRow); - if (pModPlaying == this) + if(pModPlaying == this) { pSndFile->StopAllVsti(); } else @@ -2432,7 +2431,7 @@ cs.Leave(); - if (pModPlaying != this) + if(pModPlaying != this) { pMainFrm->PlayMod(this, followSonghWnd, m_dwNotifyType|MPTNOTIFY_POSITION|MPTNOTIFY_VUMETERS); //rewbs.fix2977 } @@ -2678,12 +2677,7 @@ void CModDoc::SetElapsedTime(ORDERINDEX nOrd, ROWINDEX nRow) //---------------------------------------------------------- { - const double dPatternPlaytime = m_SndFile.GetPlaybackTimeAt(nOrd, nRow, true); - CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); - if(pMainFrm != nullptr) - { - pMainFrm->SetElapsedTime(static_cast<DWORD>(Util::Max(0.0, dPatternPlaytime) * 1000.0)); - } + m_SndFile.GetPlaybackTimeAt(nOrd, nRow, true); } Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2013-01-25 00:01:06 UTC (rev 1508) +++ trunk/OpenMPT/mptrack/mptrack.rc 2013-01-30 16:58:33 UTC (rev 1509) @@ -243,7 +243,6 @@ CONTROL "&Surround",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,192,54,42,12 END - IDD_INPUT DIALOGEX 0, 0, 166, 66 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTERMOUSE | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "OpenMPT" @@ -630,8 +629,9 @@ STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN - EDITTEXT IDC_EDIT_SONGTITLE,2,3,167,12,ES_AUTOHSCROLL - CTEXT "Type EXT, ## channels",IDC_EDIT_MODTYPE,174,3,156,12,SS_CENTERIMAGE,WS_EX_STATICEDGE + LTEXT "Name:",IDC_STATIC,2,5,23,8 + EDITTEXT IDC_EDIT_SONGTITLE,30,3,156,12,ES_AUTOHSCROLL + CTEXT "Type EXT, ## channels",IDC_EDIT_MODTYPE,192,3,138,12,SS_CENTERIMAGE,WS_EX_STATICEDGE GROUPBOX "",IDC_STATIC,1,14,83,82 LTEXT "Initial tempo:",IDC_STATIC,5,20,44,8 CONTROL "",IDC_SLIDER_SONGTEMPO,"msctls_trackbar32",TBS_VERT | TBS_BOTH | TBS_NOTICKS,11,28,15,50 Modified: trunk/OpenMPT/mptrack/view_com.cpp =================================================================== --- trunk/OpenMPT/mptrack/view_com.cpp 2013-01-25 00:01:06 UTC (rev 1508) +++ trunk/OpenMPT/mptrack/view_com.cpp 2013-01-30 16:58:33 UTC (rev 1509) @@ -99,7 +99,8 @@ ON_COMMAND(IDC_LIST_SAMPLES, OnShowSamples) ON_COMMAND(IDC_LIST_INSTRUMENTS, OnShowInstruments) ON_COMMAND(IDC_LIST_PATTERNS, OnShowPatterns) - ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST_DETAILS, OnEndLabelEdit) + ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST_DETAILS, OnEndLabelEdit) + ON_NOTIFY(LVN_BEGINLABELEDIT, IDC_LIST_DETAILS, OnBeginLabelEdit) ON_NOTIFY(NM_DBLCLK, IDC_LIST_DETAILS, OnDblClickListItem) //}}AFX_MSG_MAP END_MESSAGE_MAP() @@ -458,7 +459,7 @@ } -VOID CViewComments::RecalcLayout() +void CViewComments::RecalcLayout() //-------------------------------- { CRect rect; @@ -470,7 +471,7 @@ } -VOID CViewComments::UpdateButtonState() +void CViewComments::UpdateButtonState() //------------------------------------- { CModDoc *pModDoc = GetDocument(); @@ -485,51 +486,55 @@ } -VOID CViewComments::OnEndLabelEdit(LPNMHDR pnmhdr, LRESULT *) +void CViewComments::OnBeginLabelEdit(LPNMHDR, LRESULT *) +//------------------------------------------------------ +{ + CEdit *editCtrl = m_ItemList.GetEditControl(); + if(editCtrl) + { + const CModSpecifications &specs = GetDocument()->GetSoundFile()->GetModSpecifications(); + const size_t maxStrLen = (m_nListId == IDC_LIST_SAMPLES) ? specs.sampleNameLengthMax : specs.instrNameLengthMax; + editCtrl->LimitText(maxStrLen); + } +} + + +void CViewComments::OnEndLabelEdit(LPNMHDR pnmhdr, LRESULT *) //----------------------------------------------------------- { LV_DISPINFO *plvDispInfo = (LV_DISPINFO *)pnmhdr; - LV_ITEM *plvItem = &plvDispInfo->item; + LV_ITEM &lvItem = plvDispInfo->item; CModDoc *pModDoc = GetDocument(); - CHAR s[512]; //rewbs.fix3082 - if ((plvItem->pszText != NULL) && (!plvItem->iSubItem) && (pModDoc)) + if(lvItem.pszText != nullptr && !lvItem.iSubItem && pModDoc) { - UINT iItem = plvItem->iItem; + UINT iItem = lvItem.iItem; CSoundFile *pSndFile = pModDoc->GetSoundFile(); - lstrcpyn(s, plvItem->pszText, sizeof(s)); - size_t maxStrLen = (m_nListId == IDC_LIST_SAMPLES) ? pSndFile->GetModSpecifications().sampleNameLengthMax : pSndFile->GetModSpecifications().instrNameLengthMax; - - for (size_t i = min(maxStrLen, strlen(s)); i < sizeof(s); i++) - s[i] = 0; - - if (m_nListId == IDC_LIST_SAMPLES) + if(m_nListId == IDC_LIST_SAMPLES) { - if (iItem < pSndFile->m_nSamples) + if(iItem < pSndFile->GetNumSamples()) { - memcpy(pSndFile->m_szNames[iItem + 1], s, sizeof(pSndFile->m_szNames[iItem + 1])); + strncpy(pSndFile->m_szNames[iItem + 1], lvItem.pszText, MAX_SAMPLENAME); StringFixer::SetNullTerminator(pSndFile->m_szNames[iItem + 1]); - // 05/01/05 : ericus replaced "<< 24" by "<< 20" : 4000 samples -> 12bits [see Moddoc.h] - pModDoc->UpdateAllViews(this, ((iItem + 1) << HINT_SHIFT_SMP) | (HINT_SMPNAMES|HINT_SAMPLEINFO), this); + pModDoc->UpdateAllViews(this, ((iItem + 1) << HINT_SHIFT_SMP) | (HINT_SMPNAMES | HINT_SAMPLEINFO), this); pModDoc->SetModified(); } - } else - if (m_nListId == IDC_LIST_INSTRUMENTS) + } else if(m_nListId == IDC_LIST_INSTRUMENTS) { - if ((iItem < pSndFile->m_nInstruments) && (pSndFile->Instruments[iItem + 1])) + if((iItem < pSndFile->GetNumInstruments()) && (pSndFile->Instruments[iItem + 1])) { - ModInstrument *pIns = pSndFile->Instruments[iItem+1]; - memcpy(pIns->name, s, sizeof(pIns->name)); + ModInstrument *pIns = pSndFile->Instruments[iItem + 1]; + strncpy(pIns->name, lvItem.pszText, MAX_INSTRUMENTNAME); StringFixer::SetNullTerminator(pIns->name); - pModDoc->UpdateAllViews(this, ((iItem + 1) << HINT_SHIFT_INS) | (HINT_INSNAMES|HINT_INSTRUMENT), this); + pModDoc->UpdateAllViews(this, ((iItem + 1) << HINT_SHIFT_INS) | (HINT_INSNAMES | HINT_INSTRUMENT), this); pModDoc->SetModified(); } } else { return; } - m_ItemList.SetItemText(iItem, plvItem->iSubItem, s); + m_ItemList.SetItemText(iItem, lvItem.iSubItem, lvItem.pszText); } } Modified: trunk/OpenMPT/mptrack/view_com.h =================================================================== --- trunk/OpenMPT/mptrack/view_com.h 2013-01-25 00:01:06 UTC (rev 1508) +++ trunk/OpenMPT/mptrack/view_com.h 2013-01-30 16:58:33 UTC (rev 1509) @@ -54,6 +54,7 @@ afx_msg void OnShowInstruments(); afx_msg void OnShowPatterns(); afx_msg VOID OnEndLabelEdit(LPNMHDR pnmhdr, LRESULT *pLResult); + afx_msg VOID OnBeginLabelEdit(LPNMHDR pnmhdr, LRESULT *pLResult); afx_msg void OnDblClickListItem(NMHDR *, LRESULT *); //}}AFX_MSG DECLARE_MESSAGE_MAP() Modified: trunk/OpenMPT/soundlib/FileReader.h =================================================================== --- trunk/OpenMPT/soundlib/FileReader.h 2013-01-25 00:01:06 UTC (rev 1508) +++ trunk/OpenMPT/soundlib/FileReader.h 2013-01-30 16:58:33 UTC (rev 1509) @@ -399,9 +399,9 @@ bool ReadVector(std::vector<T> &destVector, size_t destSize) { const off_t readSize = sizeof(T) * destSize; + destVector.resize(destSize); if(CanRead(readSize)) { - destVector.resize(destSize); if(readSize) { memcpy(&destVector[0], streamData + streamPos, readSize); @@ -410,7 +410,6 @@ return true; } else { - destVector.clear(); return false; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |