From: <sag...@us...> - 2013-03-12 16:48:30
|
Revision: 1565 http://sourceforge.net/p/modplug/code/1565 Author: saga-games Date: 2013-03-12 16:48:18 +0000 (Tue, 12 Mar 2013) Log Message: ----------- [Imp] Treeview: Previewing samples does not open the audio device for every new sample playback anymore. Previewing the same file multiple times in a row does not unload and reload it everytime. Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/pattern.cpp Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2013-03-12 02:33:25 UTC (rev 1564) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2013-03-12 16:48:18 UTC (rev 1565) @@ -226,7 +226,7 @@ m_szXInfoText[0]= 0; //rewbs.xinfo MemsetZero(gpenVuMeter); - + // Create Audio Critical Section MemsetZero(g_csAudio); InitializeCriticalSection(&g_csAudio); @@ -280,7 +280,7 @@ // Setup timer OnUpdateUser(NULL); m_nTimer = SetTimer(1, MPTTIMER_PERIOD, NULL); - + //rewbs: reduce to normal priority during debug for easier hang debugging //SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS); SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS); @@ -291,7 +291,7 @@ UpdateAudioParameters(TRUE); // Update the tree m_wndTree.Init(); - + CreateExampleModulesMenu(); CreateTemplateModulesMenu(); } @@ -347,9 +347,9 @@ penHalfDarkGray = ::CreatePen(PS_DOT, 0, GetSysColor(COLOR_BTNSHADOW)); penBlack = (HPEN)::GetStockObject(BLACK_PEN); penWhite = (HPEN)::GetStockObject(WHITE_PEN); - - - + + + // Cursors curDragging = theApp.LoadCursor(IDC_DRAGGING); curArrow = theApp.LoadStandardCursor(IDC_ARROW); @@ -554,7 +554,7 @@ return static_cast<DWORD>(atol(valueBuffer)); } -bool CMainFrame::WritePrivateProfileCString(const CString section, const CString key, const CString value, const CString iniFile) +bool CMainFrame::WritePrivateProfileCString(const CString section, const CString key, const CString value, const CString iniFile) { return (WritePrivateProfileString(section, key, value, iniFile) != 0); } @@ -612,7 +612,7 @@ CWnd* pWnd = CWnd::FromHandlePermanent(pMsg->hwnd); CControlBar* pBar = NULL; HWND hwnd = (pWnd) ? pWnd->m_hWnd : NULL; - + if ((hwnd) && (pMsg->message == WM_RBUTTONDOWN)) pBar = DYNAMIC_DOWNCAST(CControlBar, pWnd); if ((pBar != NULL) || ((pMsg->message == WM_NCRBUTTONDOWN) && (pMsg->wParam == HTMENU))) { @@ -712,10 +712,10 @@ //rewbs: reduce to normal priority during debug for easier hang debugging #ifdef NDEBUG SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL ); -#endif +#endif #ifdef _DEBUG SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL); -#endif +#endif // SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL); // -! BEHAVIOUR_CHANGE#0021 for (;;) @@ -867,7 +867,7 @@ { WAVEFORMATEXTENSIBLE WaveFormat; UINT buflen = TrackerSettings::Instance().m_nBufferLength; - + if (!m_pSndFile) return -1; slSampleSize = (bits/8) * channels; sdwAudioBufferSize = ((samplespersec * buflen) / 1000) * slSampleSize; @@ -1134,7 +1134,7 @@ CSoundFile::gdwSoundSetup |= SNDMIX_REVERSESTEREO; else CSoundFile::gdwSoundSetup &= ~SNDMIX_REVERSESTEREO; - + // Soft panning if (TrackerSettings::Instance().m_dwSoundSetup & SOUNDSETUP_SOFTPANNING) CSoundFile::gdwSoundSetup |= SNDMIX_SOFTPANNING; @@ -1264,7 +1264,7 @@ brushYellow = CreateSolidBrush(RGB(0xFF,0xFF,0x00)); if (brushWindow) DeleteObject(brushWindow); - brushWindow = CreateSolidBrush(crBkgnd); + brushWindow = CreateSolidBrush(crBkgnd); if (penSeparator) DeleteObject(penSeparator); penSeparator = CreatePen(PS_SOLID, 0, RGB(GetRValue(crBkgnd)/2, GetGValue(crBkgnd)/2, GetBValue(crBkgnd)/2)); } @@ -1436,8 +1436,8 @@ BOOL CMainFrame::PlaySoundFile(CSoundFile *pSndFile) //-------------------------------------------------- { - if (m_pSndFile) PauseMod(NULL); if ((!pSndFile) || (!pSndFile->GetType())) return FALSE; + if (m_pSndFile && m_pSndFile != pSndFile) PauseMod(NULL); m_pSndFile = pSndFile; if (!audioOpenDevice()) { @@ -1448,8 +1448,8 @@ m_pSndFile->SetMasterVolume(TrackerSettings::Instance().m_nPreAmp, true); m_pSndFile->SetMixerSettings(TrackerSettings::Instance().m_MixerSettings); m_pSndFile->InitPlayer(TRUE); + if(gpSoundDevice && !(m_dwStatus & MODSTATUS_PLAYING)) gpSoundDevice->Start(); m_dwStatus |= MODSTATUS_PLAYING; - if (gpSoundDevice) gpSoundDevice->Start(); SetEvent(m_hAudioWakeUp); return TRUE; } @@ -1460,71 +1460,47 @@ { if(nDLSBank >= CTrackApp::gpDLSBanks.size() || !CTrackApp::gpDLSBanks[nDLSBank]) return FALSE; BeginWaitCursor(); - PlaySoundFile((LPCSTR)NULL); - m_WaveFile.m_nInstruments = 1; + InitPreview(); if (CTrackApp::gpDLSBanks[nDLSBank]->ExtractInstrument(&m_WaveFile, 1, nIns, nRgn)) { + PreparePreview(NOTE_MIDDLEC); PlaySoundFile(&m_WaveFile); - m_WaveFile.SetRepeatCount(-1); } EndWaitCursor(); return TRUE; } -BOOL CMainFrame::PlaySoundFile(LPCSTR lpszFileName, UINT nNote) -//------------------------------------------------------------- +BOOL CMainFrame::PlaySoundFile(LPCSTR lpszFileName, ModCommand::NOTE note) +//------------------------------------------------------------------------ { - CMappedFile f; - bool bOk = false; + static CString prevFile; + bool bOk = (prevFile == lpszFileName && m_pSndFile == &m_WaveFile); - if (lpszFileName) + CriticalSection cs; + if(!bOk && lpszFileName) { + CMappedFile f; + BeginWaitCursor(); - if (!f.Open(lpszFileName)) + if(!f.Open(lpszFileName)) { EndWaitCursor(); return FALSE; } - } - StopPreview(); - m_WaveFile.Create(NULL, 0); - //Avoid global volume ramping when trying samples in the treeview. - m_WaveFile.m_pConfig->setGlobalVolumeAppliesToMaster(false); - m_WaveFile.m_nDefaultGlobalVolume=64; + m_WaveFile.Destroy(); + m_WaveFile.Create(NULL, 0); + InitPreview(); - m_WaveFile.m_nDefaultTempo = 125; - m_WaveFile.m_nGlobalVolume=64; - m_WaveFile.m_nDefaultSpeed = 4; - m_WaveFile.SetRepeatCount(0); - m_WaveFile.m_nType = MOD_TYPE_IT; - m_WaveFile.m_nChannels = 4; - m_WaveFile.m_nInstruments = 1; - m_WaveFile.m_nSamples = 1; - m_WaveFile.Order.resize(3); - m_WaveFile.Order[0] = 0; - m_WaveFile.Order[1] = 1; - m_WaveFile.Order[2] = m_WaveFile.Order.GetInvalidPatIndex(); - m_WaveFile.Patterns.Insert(0,64); - m_WaveFile.Patterns.Insert(1,64); - if (m_WaveFile.Patterns[0]) - { - if (!nNote) nNote = NOTE_MIDDLEC; - ModCommand *m = m_WaveFile.Patterns[0]; - m[0].note = (BYTE)nNote; - m[0].instr = 1; - m[1].note = (BYTE)nNote; - m[1].instr = 1; - } - if (lpszFileName) - { DWORD dwLen = f.GetLength(); - if (dwLen) + if(dwLen) { LPBYTE p = f.Lock(); - if (p) + if(p) { + m_WaveFile.m_SongFlags.set(SONG_PAUSED); + cs.Leave(); // Avoid hanging audio while reading file bOk = m_WaveFile.ReadInstrumentFromFile(1, p, dwLen); if(!bOk) { @@ -1533,45 +1509,32 @@ } f.Unlock(); } - if (bOk) - { - if ((m_WaveFile.m_nSamples > 1) || (m_WaveFile.GetSample(1).uFlags & CHN_LOOP)) - { - ModCommand *m = m_WaveFile.Patterns[0]; - m[32*4].note = NOTE_KEYOFF; - m[32*4+1].note = NOTE_KEYOFF; - m[63*4].note = NOTE_NOTECUT; - m[63*4+1].note = NOTE_NOTECUT; - } else - { - ModCommand *m = m_WaveFile.Patterns[1]; - if (m) - { - m[63*4].command = CMD_POSITIONJUMP; - m[63*4].param = 1; - } - } - bOk = PlaySoundFile(&m_WaveFile) != FALSE; - } } f.Close(); EndWaitCursor(); } + + if(bOk) + { + cs.Enter(); + PreparePreview(note); + bOk = PlaySoundFile(&m_WaveFile) != FALSE; + + prevFile = lpszFileName; + } return bOk; } -BOOL CMainFrame::PlaySoundFile(CSoundFile *pSong, UINT nInstrument, UINT nSample, UINT nNote) -//------------------------------------------------------------------------------------------- +BOOL CMainFrame::PlaySoundFile(CSoundFile *pSong, INSTRUMENTINDEX nInstrument, SAMPLEINDEX nSample, ModCommand::NOTE note) +//------------------------------------------------------------------------------------------------------------------------ { - StopPreview(); + CriticalSection cs; + m_WaveFile.Destroy(); m_WaveFile.Create(NULL, 0); - m_WaveFile.m_nDefaultTempo = 125; - m_WaveFile.m_nDefaultSpeed = 6; - m_WaveFile.SetRepeatCount(0); + InitPreview(); m_WaveFile.m_nType = pSong->m_nType; - m_WaveFile.m_nChannels = 4; - if ((nInstrument) && (nInstrument <= pSong->m_nInstruments)) + if ((nInstrument) && (nInstrument <= pSong->GetNumInstruments())) { m_WaveFile.m_nInstruments = 1; m_WaveFile.m_nSamples = 32; @@ -1580,34 +1543,67 @@ m_WaveFile.m_nInstruments = 0; m_WaveFile.m_nSamples = 1; } - m_WaveFile.Order.resize(3); + if (nInstrument != INSTRUMENTINDEX_INVALID && nInstrument <= pSong->GetNumInstruments()) + { + m_WaveFile.ReadInstrumentFromSong(1, pSong, nInstrument); + } else if(nSample != SAMPLEINDEX_INVALID && nSample <= pSong->GetNumSamples()) + { + m_WaveFile.ReadSampleFromSong(1, pSong, nSample); + } + PreparePreview(note); + return PlaySoundFile(&m_WaveFile); +} + + +void CMainFrame::InitPreview() +//---------------------------- +{ + // Avoid global volume ramping when trying samples in the treeview. + m_WaveFile.m_pConfig->setGlobalVolumeAppliesToMaster(false); + m_WaveFile.m_nDefaultGlobalVolume = m_WaveFile.m_nGlobalVolume = MAX_GLOBAL_VOLUME; + m_WaveFile.m_nDefaultTempo = 125; + m_WaveFile.m_nDefaultSpeed = 4; + m_WaveFile.m_nType = MOD_TYPE_IT; + m_WaveFile.m_nChannels = 4; + m_WaveFile.m_nInstruments = 1; + m_WaveFile.Order.resize(2); m_WaveFile.Order[0] = 0; m_WaveFile.Order[1] = 1; - m_WaveFile.Order[2] = m_WaveFile.Order.GetInvalidPatIndex(); m_WaveFile.Patterns.Insert(0, 64); - m_WaveFile.Patterns.Insert(1, 64); - if (m_WaveFile.Patterns[0]) + m_WaveFile.Patterns.Insert(1, 1); +} + + +void CMainFrame::PreparePreview(ModCommand::NOTE note) +//---------------------------------------------------- +{ + m_WaveFile.m_SongFlags.reset(SONG_PAUSED); + m_WaveFile.SetRepeatCount(-1); + m_WaveFile.SetCurrentPos(0); + + ModCommand *m = m_WaveFile.Patterns[0]; + if(m) { - if (!nNote) nNote = NOTE_MIDDLEC; - ModCommand *m = m_WaveFile.Patterns[0]; - m[0].note = (BYTE)nNote; + m[0].note = note; m[0].instr = 1; - m[1].note = (BYTE)nNote; + m[1].note = note; m[1].instr = 1; - m = m_WaveFile.Patterns[1]; - m[32*4].note = NOTE_FADE; - m[32*4+1].note = NOTE_FADE; - m[63*4].note = NOTE_KEYOFF; - m[63*4+1].note = NOTE_KEYOFF; + + if(m_WaveFile.m_nSamples > 1 || m_WaveFile.GetSample(1).uFlags[CHN_LOOP]) + { + m[32 * 4].note = NOTE_KEYOFF; + m[32 * 4 + 1].note = NOTE_KEYOFF; + m[63 * 4].note = NOTE_NOTECUT; + m[63 * 4 + 1].note = NOTE_NOTECUT; + } } - if ((nInstrument) && (nInstrument <= pSong->GetNumInstruments())) + + m = m_WaveFile.Patterns[1]; + if(m) { - m_WaveFile.ReadInstrumentFromSong(1, pSong, nInstrument); - } else - { - m_WaveFile.ReadSampleFromSong(1, pSong, nSample); + m->command = CMD_POSITIONJUMP; + m->param = 1; } - return PlaySoundFile(&m_WaveFile); } @@ -1772,7 +1768,7 @@ if (lpszText[0] | m_szUserText[0]) { strcpy(m_szUserText, lpszText); - OnUpdateUser(NULL); + OnUpdateUser(NULL); } } @@ -1819,7 +1815,7 @@ if (pModDoc == m_pModPlaying) PauseMod(); // Make sure that OnTimer() won't try to set the closed document modified anymore. - if (pModDoc == m_pJustModifiedDoc) m_pJustModifiedDoc = nullptr; + if (pModDoc == m_pJustModifiedDoc) m_pJustModifiedDoc = nullptr; m_wndTree.OnDocumentClosed(pModDoc); } @@ -1841,7 +1837,7 @@ { if (m_bOptionsLocked) //rewbs.customKeys return; - + CPropertySheet dlg("OpenMPT Setup", this, m_nLastOptionsPage); COptionsGeneral general; COptionsSoundcard sounddlg(TrackerSettings::Instance().m_dwRate, TrackerSettings::Instance().m_dwSoundSetup, TrackerSettings::Instance().m_nBitsPerSample, TrackerSettings::Instance().m_nChannels, TrackerSettings::Instance().m_nBufferLength, TrackerSettings::Instance().m_nWaveDevice); @@ -2042,7 +2038,7 @@ OnViewOptions(); } } - + // Ensure the modified flag gets set in the WinMain thread, even if modification // originated from Audio Thread (access to CWnd is not thread safe). // Flaw: if 2 docs are modified in between Timer ticks (very rare), one mod will be lost. @@ -2213,7 +2209,7 @@ AfxFormatString1(str, IDS_FILE_EXISTS_BUT_IS_NOT_READABLE, (LPCTSTR)sPath); else AfxFormatString1(str, IDS_FILE_DOES_NOT_EXIST, (LPCTSTR)sPath); - Reporting::Notification(str); + Reporting::Notification(str); } } else @@ -2405,7 +2401,7 @@ case kcViewPattern: case kcViewSamples: case kcViewInstruments: - case kcViewComments: + case kcViewComments: case kcViewGraph: //rewbs.graph case kcViewSongProperties: case kcPlayPatternFromCursor: @@ -2451,7 +2447,7 @@ return; CMDIFrameWnd::OnInitMenu(pMenu); - + } //end rewbs.VSTTimeInfo @@ -2514,7 +2510,7 @@ return m_InputHandler->SetEffectLetters(pSndFile->GetModSpecifications()); } } - + return false; } //end rewbs.customKeys @@ -2525,7 +2521,7 @@ //----------------------------------------- { CMDIFrameWnd::OnKillFocus(pNewWnd); - + //rewbs: ensure modifiers are reset when we leave the window (e.g. alt-tab) CMainFrame::GetMainFrame()->GetInputHandler()->SetModifierMask(0); //end rewbs Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2013-03-12 02:33:25 UTC (rev 1564) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2013-03-12 16:48:18 UTC (rev 1565) @@ -311,7 +311,7 @@ static UINT m_nLastOptionsPage; static HHOOK ghKbdHook; static DWORD gdwNotificationType; - + // GDI static HICON m_hIcon; static HFONT m_hGUIFont, m_hFixedFont, m_hLargeFixedFont; @@ -362,8 +362,8 @@ public: CMainFrame(/*CString regKeyExtension*/); void Initialize(); - + // Low-Level Audio public: static void UpdateAudioParameters(BOOL bReset=FALSE); @@ -412,8 +412,8 @@ static DWORD GetPrivateProfileDWord(const CString section, const CString key, const DWORD defaultValue, const CString iniFile); static bool WritePrivateProfileCString(const CString section, const CString key, const CString value, const CString iniFile); static CString GetPrivateProfileCString(const CString section, const CString key, const CString defaultValue, const CString iniFile); - + // Misc functions public: void SetUserText(LPCSTR lpszText); @@ -455,17 +455,19 @@ BOOL StopMod(CModDoc *pDoc=NULL); BOOL PauseMod(CModDoc *pDoc=NULL); BOOL PlaySoundFile(CSoundFile *); - BOOL PlaySoundFile(LPCSTR lpszFileName, UINT nNote = 0); - BOOL PlaySoundFile(CSoundFile *pSong, UINT nInstrument, UINT nSample, UINT nNote=0); + BOOL PlaySoundFile(LPCSTR lpszFileName, ModCommand::NOTE note = NOTE_MIDDLEC); + BOOL PlaySoundFile(CSoundFile *pSong, INSTRUMENTINDEX nInstrument, SAMPLEINDEX nSample, ModCommand::NOTE note = NOTE_MIDDLEC); BOOL PlayDLSInstrument(UINT nDLSBank, UINT nIns, UINT nRgn); BOOL StopSoundFile(CSoundFile *); + void InitPreview(); + void PreparePreview(ModCommand::NOTE note); void StopPreview(); - inline BOOL IsPlaying() const { return (m_dwStatus & MODSTATUS_PLAYING); } - inline BOOL IsRendering() const { return (m_dwStatus & MODSTATUS_RENDERING); } //rewbs.VSTTimeInfo + inline BOOL IsPlaying() const { return (m_dwStatus & MODSTATUS_PLAYING); } + inline BOOL IsRendering() const { return (m_dwStatus & MODSTATUS_RENDERING); } 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 - BOOL StopRenderer(CSoundFile*); //rewbs.VSTTimeInfo + inline CSoundFile *GetSoundFilePlaying() const { return (IsPlaying()||IsRendering()) ? m_pSndFile : NULL; } + BOOL InitRenderer(CSoundFile*); + BOOL StopRenderer(CSoundFile*); void SwitchToActiveView(); BOOL SetupSoundCard(DWORD q, DWORD rate, UINT nbits, UINT chns, UINT bufsize, LONG wd); BOOL SetupDirectories(LPCTSTR szModDir, LPCTSTR szSampleDir, LPCTSTR szInstrDir, LPCTSTR szVstDir, LPCTSTR szPresetDir); @@ -518,8 +520,8 @@ afx_msg void OnPluginManager(); // -! NEW_FEATURE#0002 - + afx_msg void OnChannelManager(); afx_msg void OnClipboardManager(); @@ -552,13 +554,13 @@ DECLARE_MESSAGE_MAP() public: afx_msg void OnInitMenu(CMenu* pMenu); - bool UpdateEffectKeys(); + bool UpdateEffectKeys(); afx_msg void OnKillFocus(CWnd* pNewWnd); afx_msg void OnShowWindow(BOOL bShow, UINT nStatus); // Defines maximum number of items in example modules menu. - static const size_t nMaxItemsInExampleModulesMenu = 50; - static const size_t nMaxItemsInTemplateModulesMenu = 50; + static const size_t nMaxItemsInExampleModulesMenu = 50; + static const size_t nMaxItemsInTemplateModulesMenu = 50; /// Array of paths of example modules that are available from help menu. static std::vector<CString> s_ExampleModulePaths; Modified: trunk/OpenMPT/mptrack/View_tre.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp 2013-03-12 02:33:25 UTC (rev 1564) +++ trunk/OpenMPT/mptrack/View_tre.cpp 2013-03-12 16:48:18 UTC (rev 1565) @@ -205,22 +205,22 @@ } } return TRUE; - } - } + } + } //rewbs.customKeys //We handle keypresses before Windows has a chance to handle them (for alt etc..) - if ((pMsg->message == WM_SYSKEYUP) || (pMsg->message == WM_KEYUP) || + if ((pMsg->message == WM_SYSKEYUP) || (pMsg->message == WM_KEYUP) || (pMsg->message == WM_SYSKEYDOWN) || (pMsg->message == WM_KEYDOWN)) { CInputHandler* ih = (CMainFrame::GetMainFrame())->GetInputHandler(); - + //Translate message manually UINT nChar = pMsg->wParam; UINT nRepCnt = LOWORD(pMsg->lParam); UINT nFlags = HIWORD(pMsg->lParam); KeyEventType kT = ih->GetKeyEventType(nFlags); InputTargetContext ctx = (InputTargetContext)(kCtxViewTree); - + if (ih->KeyEvent(ctx, nChar, nRepCnt, nFlags, kT) != kcNull) return true; // Mapped to a command, no need to pass message on. } @@ -1185,7 +1185,7 @@ case MODITEM_COMMENTS: if (pModDoc) pModDoc->ActivateView(IDD_CONTROL_COMMENTS, 0); return TRUE; - + /*case MODITEM_SEQUENCE: if (pModDoc) pModDoc->ActivateView(IDD_CONTROL_PATTERNS, (dwItem << 16) | 0x8000); return TRUE;*/ @@ -1215,7 +1215,7 @@ case MODITEM_EFFECT: case MODITEM_INSLIB_SAMPLE: case MODITEM_INSLIB_INSTRUMENT: - PlayItem(hItem); + PlayItem(hItem, NOTE_MIDDLEC); return TRUE; case MODITEM_INSLIB_SONG: @@ -1308,10 +1308,10 @@ { if (modItemType == MODITEM_INSLIB_INSTRUMENT) { - pMainFrm->PlaySoundFile(&m_SongFile, static_cast<INSTRUMENTINDEX>(n), SAMPLEINDEX_INVALID, nParam); + pMainFrm->PlaySoundFile(&m_SongFile, static_cast<INSTRUMENTINDEX>(n), SAMPLEINDEX_INVALID, static_cast<ModCommand::NOTE>(nParam)); } else { - pMainFrm->PlaySoundFile(&m_SongFile, INSTRUMENTINDEX_INVALID, static_cast<SAMPLEINDEX>(n), nParam); + pMainFrm->PlaySoundFile(&m_SongFile, INSTRUMENTINDEX_INVALID, static_cast<SAMPLEINDEX>(n), static_cast<ModCommand::NOTE>(nParam)); } } } else @@ -1346,7 +1346,7 @@ { CDLSBank *pDLSBank = CTrackApp::gpDLSBanks[bank]; UINT rgn = 0, instr = (modItem & 0x00007FFF); - // Drum + // Drum if (modItem & 0x80000000) { rgn = (modItem & 0x007F0000) >> 16; @@ -1585,7 +1585,7 @@ { TV_INSERTSTRUCT tvis; char s[_MAX_PATH+32], szPath[_MAX_PATH] = ""; - + if (!m_hInsLib) return; SetRedraw(FALSE); if ((m_szSongName[0]) && (!m_pDataTree)) @@ -1641,7 +1641,7 @@ if (m_pDataTree) { strcpy(s, "?:\\"); - for (UINT iDrive='A'; iDrive<='Z'; iDrive++) //rewbs.fix3112: < became <= + for (UINT iDrive='A'; iDrive<='Z'; iDrive++) { s[0] = (CHAR)iDrive; UINT nDriveType = GetDriveType(s); @@ -1710,7 +1710,7 @@ strcpy(szFileName, m_szInstrLibPath); strncat(szFileName, wfd.cFileName, sizeof(szFileName)); _splitpath(szFileName, NULL, NULL, NULL, s); - + if(s[0]) { const size_t len = strlen(s); @@ -1870,7 +1870,7 @@ { CHAR s[_MAX_PATH+80], sdrive[_MAX_DRIVE]; BOOL bOk = FALSE, bSong = FALSE; - + if ((!lpszDir) || (!lpszDir[0])) return FALSE; BeginWaitCursor(); if (!GetCurrentDirectory(CountOf(s), s)) s[0] = 0; @@ -1955,7 +1955,7 @@ case MODITEM_PATTERN: pdropinfo->dwDropType = DRAGONDROP_PATTERN; break; - + case MODITEM_SAMPLE: pdropinfo->dwDropType = DRAGONDROP_SAMPLE; break; @@ -2021,7 +2021,7 @@ pdropinfo->dwDropItem = (DWORD)((m_qwItemDrag & 0x3F000000) >> 24); // bank # // Melodic: (Instrument) // Drums: (0x80000000) | (Region << 16) | (Instrument) - pdropinfo->lDropParam = (LPARAM)((m_qwItemDrag & 0x80FF7FFF)); // + pdropinfo->lDropParam = (LPARAM)((m_qwItemDrag & 0x80FF7FFF)); break; } } @@ -2308,7 +2308,7 @@ if (!(m_dwStatus & TREESTATUS_DRAGGING)) { bool bDrag = false; - + m_hDropWnd = NULL; m_hItemDrag = hItem; if (m_hItemDrag != NULL) @@ -2455,7 +2455,7 @@ nDefault = ID_MODTREE_EXECUTE; AppendMenu(hMenu, MF_STRING, nDefault, "&View Comments"); break; - + case MODITEM_ORDER: case MODITEM_PATTERN: nDefault = ID_MODTREE_EXECUTE; @@ -2745,7 +2745,7 @@ { HTREEITEM hItem; UINT flags; - + // Bug? if (!(nFlags & (MK_LBUTTON|MK_RBUTTON))) { @@ -3019,7 +3019,7 @@ //---------------------------------- { HTREEITEM hItem = GetSelectedItem(); - + const uint64 modItem = GetModItem(hItem); const ModItemType modItemType = GetModItemType(modItem); const uint32 modItemID = GetModItemID(modItem); @@ -3282,7 +3282,7 @@ HDROP hDropInfo; UINT nFiles; BOOL bOk = FALSE; - + if (!pDataObject) return FALSE; if (!pDataObject->GetData(CF_HDROP, &stgm)) return FALSE; if (stgm.tymed != TYMED_HGLOBAL) return FALSE; @@ -3315,7 +3315,7 @@ //-------------------------------- { HTREEITEM hActive; - + BeginWaitCursor(); RefreshInstrumentLibrary(); if (m_pDataTree) @@ -3392,7 +3392,7 @@ { if (wParam == kcNull) return NULL; - + CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); if (wParam>=kcTreeViewStartNotes && wParam<=kcTreeViewEndNotes) @@ -3401,7 +3401,7 @@ return wParam; } if (wParam>=kcTreeViewStartNoteStops && wParam<=kcTreeViewEndNoteStops) - { + { return wParam; } @@ -3414,7 +3414,7 @@ { CTreeCtrl::OnKillFocus(pNewWnd); CMainFrame::GetMainFrame()->m_bModTreeHasFocus = false; - + } @@ -3519,7 +3519,7 @@ } break; } - + if(text) { CMainFrame::GetMainFrame()->GetInputHandler()->Bypass(true); Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2013-03-12 02:33:25 UTC (rev 1564) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2013-03-12 16:48:18 UTC (rev 1565) @@ -820,21 +820,29 @@ BOOL CSoundFile::Destroy() //------------------------ { - size_t i; + for(CHANNELINDEX i = 0; i < MAX_CHANNELS; i++) + { + Chn[i].pModInstrument = nullptr; + Chn[i].pModSample = nullptr; + Chn[i].pCurrentSample = nullptr; + Chn[i].pSample = nullptr; + Chn[i].nLength = 0; + } + Patterns.DestroyPatterns(); FreeMessage(); - for (i=1; i<MAX_SAMPLES; i++) + for(SAMPLEINDEX i = 1; i < MAX_SAMPLES; i++) { Samples[i].FreeSample(); } - for (i = 0; i < MAX_INSTRUMENTS; i++) + for(INSTRUMENTINDEX i = 0; i < MAX_INSTRUMENTS; i++) { delete Instruments[i]; Instruments[i] = nullptr; } - for (i=0; i<MAX_MIXPLUGINS; i++) + for(PLUGINDEX i = 0; i < MAX_MIXPLUGINS; i++) { if ((m_MixPlugins[i].nPluginDataSize) && (m_MixPlugins[i].pPluginData)) { @@ -849,6 +857,7 @@ m_MixPlugins[i].pMixPlugin = NULL; } } + m_nType = MOD_TYPE_NONE; m_nChannels = m_nSamples = m_nInstruments = 0; return TRUE; @@ -1768,7 +1777,7 @@ default: return (gdwMixingFreq * 5 * m_nTempoFactor) / (tempo << 8); - case tempo_mode_alternative: + case tempo_mode_alternative: return gdwMixingFreq / tempo; case tempo_mode_modern: @@ -1779,11 +1788,11 @@ //tick-to-tick tempo correction: if(m_dBufferDiff >= 1) - { + { bufferCount++; m_dBufferDiff--; } else if(m_dBufferDiff <= -1) - { + { bufferCount--; m_dBufferDiff++; } @@ -2195,4 +2204,4 @@ } Patterns.ForEachModCommand(UpgradePatternData(this)); -} \ No newline at end of file +} Modified: trunk/OpenMPT/soundlib/pattern.cpp =================================================================== --- trunk/OpenMPT/soundlib/pattern.cpp 2013-03-12 02:33:25 UTC (rev 1564) +++ trunk/OpenMPT/soundlib/pattern.cpp 2013-03-12 16:48:18 UTC (rev 1565) @@ -97,7 +97,7 @@ void CPattern::ClearCommands() //---------------------------- { - if (m_ModCommands != nullptr) + if(m_ModCommands != nullptr) memset(m_ModCommands, 0, GetNumRows() * GetNumChannels() * sizeof(ModCommand)); } @@ -105,19 +105,24 @@ bool CPattern::AllocatePattern(ROWINDEX rows) //------------------------------------------- { - ModCommand *m = AllocatePattern(rows, GetNumChannels()); - if(m != nullptr) + ModCommand *m = m_ModCommands; + if(m != nullptr && rows == GetNumRows()) { - Deallocate(); - m_ModCommands = m; - m_Rows = rows; - m_RowsPerBeat = m_RowsPerMeasure = 0; - return true; + // Re-use allocated memory + ClearCommands(); + m_ModCommands = nullptr; } else { - return false; + m = AllocatePattern(rows, GetNumChannels()); + if(m == nullptr) + { + return false; + } } - + Deallocate(); + m_ModCommands = m; + m_Rows = rows; + return true; } @@ -414,16 +419,13 @@ ModCommand *CPattern::AllocatePattern(ROWINDEX rows, CHANNELINDEX nchns) //---------------------------------------------------------------------- { - try + size_t patSize = rows * nchns; + ModCommand *p = new (std::nothrow) ModCommand[patSize]; + if(p != nullptr) { - size_t patSize = rows * nchns; - ModCommand *p = new ModCommand[patSize]; memset(p, 0, patSize * sizeof(ModCommand)); - return p; - } catch(MPTMemoryException) - { - return nullptr; } + return p; } @@ -557,7 +559,7 @@ chval |= IT_bitmask_patternChanEnabled_c; Binarywrite<uint8>(oStrm, chval); - + if(diffmask) { lastChnMC[c] = m; @@ -608,7 +610,7 @@ continue; } - CHANNELINDEX ch = (t & IT_bitmask_patternChanField_c); + CHANNELINDEX ch = (t & IT_bitmask_patternChanField_c); if(ch > 0) ch--; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |