From: <sag...@us...> - 2013-04-07 23:23:30
|
Revision: 1773 http://sourceforge.net/p/modplug/code/1773 Author: saga-games Date: 2013-04-07 23:23:15 +0000 (Sun, 07 Apr 2013) Log Message: ----------- [New] Added global, always active VU meter in main toolbar. Doesn't work properly in vertical toolbar mode, just like so many other things. [Mod] OpenMPT: Version is now 1.22.01.01 Modified Paths: -------------- trunk/OpenMPT/common/version.h trunk/OpenMPT/mptrack/Ctrl_com.cpp trunk/OpenMPT/mptrack/Ctrl_gen.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainbar.cpp trunk/OpenMPT/mptrack/Mainbar.h trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/Notification.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/res/MAINBAR.BMP trunk/OpenMPT/mptrack/resource.h Modified: trunk/OpenMPT/common/version.h =================================================================== --- trunk/OpenMPT/common/version.h 2013-04-07 22:43:38 UTC (rev 1772) +++ trunk/OpenMPT/common/version.h 2013-04-07 23:23:15 UTC (rev 1773) @@ -19,7 +19,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 22 #define VER_MINOR 01 -#define VER_MINORMINOR 00 +#define VER_MINORMINOR 01 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of Modified: trunk/OpenMPT/mptrack/Ctrl_com.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_com.cpp 2013-04-07 22:43:38 UTC (rev 1772) +++ trunk/OpenMPT/mptrack/Ctrl_com.cpp 2013-04-07 23:23:15 UTC (rev 1773) @@ -52,7 +52,13 @@ void CCtrlComments::OnActivatePage(LPARAM) //---------------------------------------- { - // nothing + CModDoc *modDoc = GetDocument(); + if(modDoc) + { + // Don't stop generating VU meter messages + modDoc->SetNotifications(Notification::Position); + modDoc->SetFollowWnd(m_hWnd); + } } Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2013-04-07 22:43:38 UTC (rev 1772) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2013-04-07 23:23:15 UTC (rev 1773) @@ -234,7 +234,7 @@ // MOD Type LPCSTR pszModType = "MOD (ProTracker)"; - switch(m_pSndFile->m_nType) + switch(m_pSndFile->GetType()) { case MOD_TYPE_S3M: pszModType = "S3M (ScreamTracker)"; break; case MOD_TYPE_XM: pszModType = "XM (FastTracker 2)"; break; @@ -393,7 +393,7 @@ void CCtrlGeneral::OnVSTiVolChanged() -//------------------------------------- +//----------------------------------- { CHAR s[16]; if ((m_pSndFile) && (m_pModDoc) && (m_bInitialized)) @@ -418,7 +418,7 @@ } void CCtrlGeneral::OnSamplePAChanged() -//------------------------------------- +//------------------------------------ { CHAR s[16]; if ((m_pSndFile) && (m_pModDoc) && (m_bInitialized)) @@ -526,8 +526,8 @@ Notification *pnotify = (Notification *)lParam; if (pnotify) { - m_VuMeterLeft.SetVuMeter(pnotify->masterVu[0]); - m_VuMeterRight.SetVuMeter(pnotify->masterVu[1]); + m_VuMeterLeft.SetVuMeter(pnotify->masterVU[0] & (~Notification::ClipVU)); + m_VuMeterRight.SetVuMeter(pnotify->masterVU[1] & (~Notification::ClipVU)); } return 0; } Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2013-04-07 22:43:38 UTC (rev 1772) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2013-04-07 23:23:15 UTC (rev 1773) @@ -109,6 +109,8 @@ LONG CMainFrame::gnLVuMeter = 0; LONG CMainFrame::gnRVuMeter = 0; +bool CMainFrame::gnClipLeft = false; +bool CMainFrame::gnClipRight = false; // GDI HICON CMainFrame::m_hIcon = NULL; @@ -437,6 +439,7 @@ } // Kill GDI Objects +#define DeleteGDIObject(h) if (h) { ::DeleteObject(h); h = NULL; } DeleteGDIObject(brushGray); DeleteGDIObject(penLightGray); DeleteGDIObject(penDarkGray); @@ -457,12 +460,9 @@ for (UINT i=0; i<NUM_VUMETER_PENS*2; i++) { - if (gpenVuMeter[i]) - { - DeleteObject(gpenVuMeter[i]); - gpenVuMeter[i] = NULL; - } + DeleteGDIObject(gpenVuMeter[i]); } +#undef DeleteGDIObject return CMDIFrameWnd::DestroyWindow(); } @@ -939,6 +939,8 @@ } gnLVuMeter = lmax; gnRVuMeter = rmax; + if(lmax > MIXING_CLIPMAX) gnClipLeft = true; + if(rmax > MIXING_CLIPMAX) gnClipRight = true; } @@ -958,7 +960,7 @@ } } if(!m_pSndFile) return FALSE; - FlagSet<Notification::Type,uint16> notifyType; + FlagSet<Notification::Type> notifyType; notifyType = Notification::None; Notification::Item notifyItem = 0; @@ -977,19 +979,11 @@ } // Add an entry to the notification history - Notification notification; + Notification notification(notifyType, notifyItem, notificationtimestamp, m_pSndFile->m_nRow, m_pSndFile->m_nTickCount, m_pSndFile->m_nCurrentOrder, m_pSndFile->m_nPattern); Notification *p = ¬ification; - p->type = notifyType; - p->item = notifyItem; if(endOfStream) p->type.set(Notification::EOS); - p->timestampSamples = notificationtimestamp; - p->row = m_pSndFile->m_nRow; - p->tick = m_pSndFile->m_nTickCount; - p->order = m_pSndFile->m_nCurrentOrder; - p->pattern = m_pSndFile->m_nPattern; - if(notifyType[Notification::Sample]) { // Sample positions @@ -1054,15 +1048,19 @@ p->pos[k] = (vul << 8) | (vur); } } + { // Master VU meter uint32 lVu = (gnLVuMeter >> 11); uint32 rVu = (gnRVuMeter >> 11); if(lVu > 0x10000) lVu = 0x10000; if(rVu > 0x10000) rVu = 0x10000; - p->masterVu[0] = lVu; - p->masterVu[1] = rVu; + p->masterVU[0] = lVu; + p->masterVU[1] = rVu; + if(gnClipLeft) p->masterVU[0] |= Notification::ClipVU; + if(gnClipRight) p->masterVU[1] |= Notification::ClipVU; uint32 dwVuDecay = Util::muldiv(dwSamplesRead, 120000, TrackerSettings::Instance().m_dwRate) + 1; + if (lVu >= dwVuDecay) gnLVuMeter = (lVu - dwVuDecay) << 11; else gnLVuMeter = 0; if (rVu >= dwVuDecay) gnRVuMeter = (rVu - dwVuDecay) << 11; else gnRVuMeter = 0; } @@ -1331,8 +1329,7 @@ void CMainFrame::GenerateStopNotification() //----------------------------------------- { - Notification mn; - mn.type = Notification::Stop; + Notification mn(Notification::Stop); SendMessage(WM_MOD_UPDATEPOSITION, 0, (LPARAM)&mn); } @@ -1420,8 +1417,8 @@ m_wndToolBar.SetCurrentSong(m_pSndFile); - gnLVuMeter = 0; - gnRVuMeter = 0; + gnLVuMeter = gnRVuMeter = 0; + gnClipLeft = gnClipRight = false; m_nMixChn = 0; m_nAvgMixChn = 0; @@ -2287,7 +2284,7 @@ LRESULT CMainFrame::OnUpdatePositionThreaded(WPARAM, LPARAM) -//----------------------------------------------------------------- +//---------------------------------------------------------- { Notification * pnotify = &m_PendingNotification; LRESULT retval = OnUpdatePosition(0, (LPARAM)pnotify); @@ -2296,6 +2293,7 @@ return retval; } + LRESULT CMainFrame::OnUpdatePosition(WPARAM, LPARAM lParam) //--------------------------------------------------------- { @@ -2313,6 +2311,8 @@ if (m_hFollowSong) ::SendMessage(m_hFollowSong, WM_MOD_UPDATEPOSITION, 0, lParam); } + m_wndToolBar.m_VuMeter.SetVuMeter(pnotify->masterVU[0], pnotify->masterVU[1]); + } return 0; } @@ -2561,11 +2561,7 @@ CModDoc* pModDoc = GetActiveDoc(); if (pModDoc) { - CSoundFile* pSndFile = pModDoc->GetSoundFile(); - if (pSndFile) - { - return m_InputHandler->SetEffectLetters(pSndFile->GetModSpecifications()); - } + return m_InputHandler->SetEffectLetters(pModDoc->GetrSoundFile().GetModSpecifications()); } return false; Modified: trunk/OpenMPT/mptrack/Mainbar.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mainbar.cpp 2013-04-07 22:43:38 UTC (rev 1772) +++ trunk/OpenMPT/mptrack/Mainbar.cpp 2013-04-07 23:23:15 UTC (rev 1773) @@ -74,16 +74,7 @@ SetVertical(); } } -#if 0 - // Hack - fixed in VC++ 6.0 - if ((sizeResult.cy > 30) && (m_bFlatButtons)) - { - if (dwMode & LM_HORZ) - sizeResult.cy += ((sizeResult.cy-30)/28) * 4; - else - sizeResult.cy += 8; - } -#endif + return sizeResult; } @@ -138,7 +129,7 @@ // Play Command #define PLAYCMD_INDEX 10 #define TOOLBAR_IMAGE_PAUSE 8 -#define TOOLBAR_IMAGE_PLAY 16 +#define TOOLBAR_IMAGE_PLAY 12 // Base octave #define EDITOCTAVE_INDEX 13 #define EDITOCTAVE_WIDTH 55 @@ -182,8 +173,12 @@ #define SPINRPB_INDEX (EDITRPB_INDEX+1) #define SPINRPB_WIDTH 16 #define SPINRPB_HEIGHT (EDITRPB_HEIGHT) +// VU Meters +#define VUMETER_INDEX (SPINRPB_INDEX+5) +#define VUMETER_WIDTH 255 +#define VUMETER_HEIGHT 19 -static UINT BASED_CODE MainButtons[] = +static UINT MainButtons[] = { // same order as in the bitmap 'mainbar.bmp' ID_FILE_NEW, @@ -216,12 +211,9 @@ ID_SEPARATOR, ID_SEPARATOR, ID_VIEW_OPTIONS, - ID_APP_ABOUT, -// ID_CONTEXT_HELP, - ID_SEPARATOR, //rewbs.reportBug - ID_REPORT_BUG, //rewbs.reportBug - ID_SEPARATOR, ID_PANIC, + ID_SEPARATOR, + ID_SEPARATOR, // VU Meter }; @@ -282,10 +274,14 @@ rect.SetRect(-SPINRPB_WIDTH, -SPINRPB_HEIGHT, 0, 0); m_SpinRowsPerBeat.Create(WS_CHILD|UDS_ALIGNRIGHT, rect, this, IDC_SPIN_RPB); + // VU Meter + rect.SetRect(-VUMETER_WIDTH, -VUMETER_HEIGHT, 0, 0); + //m_VuMeter.CreateEx(WS_EX_STATICEDGE, "STATIC", "", WS_CHILD | WS_BORDER | SS_NOTIFY, rect, this, IDC_VUMETER); + m_VuMeter.Create("", WS_CHILD | WS_BORDER | SS_NOTIFY, rect, this, IDC_VUMETER); // Adjust control styles HFONT hFont = CMainFrame::GetGUIFont(); - m_EditOctave.SendMessage(WM_SETFONT, (WPARAM)hFont); + m_EditOctave.SendMessage(WM_SETFONT, (WPARAM)hFont); m_EditOctave.ModifyStyleEx(0, WS_EX_STATICEDGE, SWP_NOACTIVATE); m_StaticTempo.SendMessage(WM_SETFONT, (WPARAM)hFont); m_EditTempo.SendMessage(WM_SETFONT, (WPARAM)hFont); @@ -326,6 +322,7 @@ //-------------------------------- { CToolBarEx::SetHorizontal(); + m_VuMeter.SetOrientation(true); SetButtonInfo(EDITOCTAVE_INDEX, IDC_EDIT_BASEOCTAVE, TBBS_SEPARATOR, EDITOCTAVE_WIDTH); SetButtonInfo(SPINOCTAVE_INDEX, IDC_SPIN_BASEOCTAVE, TBBS_SEPARATOR, SPINOCTAVE_WIDTH); SetButtonInfo(TEMPOTEXT_INDEX, IDC_TEXT_CURRENTTEMPO, TBBS_SEPARATOR, TEMPOTEXT_WIDTH); @@ -337,6 +334,7 @@ SetButtonInfo(RPBTEXT_INDEX, IDC_TEXT_RPB, TBBS_SEPARATOR, RPBTEXT_WIDTH); SetButtonInfo(EDITRPB_INDEX, IDC_EDIT_RPB, TBBS_SEPARATOR, EDITRPB_WIDTH); SetButtonInfo(SPINRPB_INDEX, IDC_SPIN_RPB, TBBS_SEPARATOR, SPINRPB_WIDTH); + SetButtonInfo(VUMETER_INDEX, IDC_VUMETER, TBBS_SEPARATOR, VUMETER_WIDTH); //SetButtonInfo(SPINSPEED_INDEX+1, IDC_TEXT_BPM, TBBS_SEPARATOR, SPEEDTEXT_WIDTH); // Octave Box @@ -354,6 +352,7 @@ EnableControl(m_StaticRowsPerBeat, RPBTEXT_INDEX, RPBTEXT_HEIGHT); EnableControl(m_EditRowsPerBeat, EDITRPB_INDEX, EDITRPB_HEIGHT); EnableControl(m_SpinRowsPerBeat, SPINRPB_INDEX, SPINRPB_HEIGHT); + EnableControl(m_VuMeter, VUMETER_INDEX, VUMETER_HEIGHT); return TRUE; } @@ -363,6 +362,7 @@ //------------------------------ { CToolBarEx::SetVertical(); + m_VuMeter.SetOrientation(false); // Change Buttons SetButtonInfo(EDITOCTAVE_INDEX, ID_SEPARATOR, TBBS_SEPARATOR, 1); SetButtonInfo(SPINOCTAVE_INDEX, ID_SEPARATOR, TBBS_SEPARATOR, 1); @@ -375,6 +375,7 @@ SetButtonInfo(RPBTEXT_INDEX, ID_SEPARATOR, TBBS_SEPARATOR, 1); SetButtonInfo(EDITRPB_INDEX, ID_SEPARATOR, TBBS_SEPARATOR, 1); SetButtonInfo(SPINRPB_INDEX, ID_SEPARATOR, TBBS_SEPARATOR, 1); + SetButtonInfo(VUMETER_INDEX, IDC_VUMETER, TBBS_SEPARATOR, VUMETER_HEIGHT); // Hide Controls if (m_EditOctave.m_hWnd != NULL) m_EditOctave.ShowWindow(SW_HIDE); @@ -388,6 +389,7 @@ if (m_StaticRowsPerBeat.m_hWnd != NULL) m_StaticRowsPerBeat.ShowWindow(SW_HIDE); if (m_EditRowsPerBeat.m_hWnd != NULL) m_EditRowsPerBeat.ShowWindow(SW_HIDE); if (m_SpinRowsPerBeat.m_hWnd != NULL) m_SpinRowsPerBeat.ShowWindow(SW_HIDE); + EnableControl(m_VuMeter, VUMETER_INDEX, VUMETER_HEIGHT); //if (m_StaticBPM.m_hWnd != NULL) m_StaticBPM.ShowWindow(SW_HIDE); return TRUE; } @@ -1075,3 +1077,129 @@ return 0; } //end rewbs.customKeys + + +//////////////////////////////////////////////////////////////////////////////// +// +// Stereo VU Meter for toolbar +// + +BEGIN_MESSAGE_MAP(CStereoVU, CStatic) + ON_WM_PAINT() + ON_WM_LBUTTONDOWN() +END_MESSAGE_MAP() + + +void CStereoVU::OnPaint() +//----------------------- +{ + CRect rect; + CPaintDC dc(this); + HDC hdc = dc.m_hDC; + GetClientRect(&rect); + FillRect(hdc, &rect, CMainFrame::brushBlack); + DrawVuMeters(hdc); +} + + +void CStereoVU::SetVuMeter(uint32 left, uint32 right) +//--------------------------------------------------- +{ + if(left != vuMeter[0] || right != vuMeter[1]) + { + vuMeter[0] = left; + vuMeter[1] = right; + CClientDC dc(this); + DrawVuMeters(dc.m_hDC); + } +} + + +// Draw stereo VU +void CStereoVU::DrawVuMeters(HDC hdc) +//----------------------------------- +{ + CRect rect; + GetClientRect(&rect); + CRect rectL = rect, rectR = rect; + + if(horizontal) + { + const int mid = rect.top + rect.Height() / 2; + rectL.bottom = mid; + + rectR.top = mid + 1; + } else + { + const int mid = rect.left + rect.Width() / 2; + rectL.right = mid; + + rectR.left = mid + 1; + } + + HGDIOBJ oldPen = SelectObject(hdc, CMainFrame::penBlack); + DrawVuMeter(hdc, rectL, vuMeter[0]); + DrawVuMeter(hdc, rectR, vuMeter[1]); + SelectObject(hdc, oldPen); +} + + +// Draw a single VU Meter +void CStereoVU::DrawVuMeter(HDC hdc, const CRect &rect, uint32 vu) +//---------------------------------------------------------------- +{ + if(CMainFrame::GetMainFrame()->GetSoundFilePlaying() == nullptr) + { + vu = 0; + } + + const bool clip = (vu & Notification::ClipVU) != 0; + vu = (vu & (~Notification::ClipVU)) >> 8; + + if(horizontal) + { + const int cx = Util::Max(1, rect.Width()); + int v = (vu * cx) >> 8; + + for(int rx = rect.left; rx <= rect.right; rx += 2) + { + int pen = Clamp((rx * NUM_VUMETER_PENS) / cx, 0, NUM_VUMETER_PENS - 1); + const bool last = (rx == rect.right - 1); + + // Darken everything above volume, unless it's the clip indicator + if(v <= rx && (!last || !clip)) + pen += NUM_VUMETER_PENS; + + SelectObject(hdc, CMainFrame::gpenVuMeter[pen]); + MoveToEx(hdc, rx, rect.top, NULL); + LineTo(hdc, rx, rect.bottom); + } + } else + { + const int cy = Util::Max(1, rect.Height()); + int v = (vu * cy) >> 8; + + for(int ry = rect.bottom - 1; ry > rect.top; ry -= 2) + { + const int y0 = rect.bottom - ry; + int pen = Clamp((y0 * NUM_VUMETER_PENS) / cy, 0, NUM_VUMETER_PENS - 1); + const bool last = (ry == rect.top + 1); + + // Darken everything above volume, unless it's the clip indicator + if(v <= y0 && (!last || !clip)) + pen += NUM_VUMETER_PENS; + + SelectObject(hdc, CMainFrame::gpenVuMeter[pen]); + MoveToEx(hdc, rect.left, ry, NULL); + LineTo(hdc, rect.right, ry); + } + } +} + + +void CStereoVU::OnLButtonDown(UINT, CPoint) +//----------------------------------------- +{ + // Reset clip indicator. + CMainFrame::gnClipLeft = CMainFrame::gnClipRight = false; +} \ No newline at end of file Modified: trunk/OpenMPT/mptrack/Mainbar.h =================================================================== --- trunk/OpenMPT/mptrack/Mainbar.h 2013-04-07 22:43:38 UTC (rev 1772) +++ trunk/OpenMPT/mptrack/Mainbar.h 2013-04-07 23:23:15 UTC (rev 1773) @@ -10,6 +10,29 @@ #pragma once +//============================= +class CStereoVU: public CStatic +//============================= +{ +protected: + uint32 vuMeter[2]; + bool horizontal; + +public: + CStereoVU() { vuMeter[0] = vuMeter[1] = 0; horizontal = true; } + void SetVuMeter(uint32 left, uint32 right); + void SetOrientation(bool h) { horizontal = h; } + +protected: + void DrawVuMeters(HDC hdc); + void DrawVuMeter(HDC hdc, const CRect &rect, uint32 vu); + +protected: + afx_msg void OnPaint(); + afx_msg void OnLButtonDown(UINT, CPoint); + DECLARE_MESSAGE_MAP(); +}; + #define MIN_BASEOCTAVE 0 #define MAX_BASEOCTAVE 8 @@ -51,6 +74,8 @@ CStatic m_StaticTempo, m_StaticSpeed, m_StaticRowsPerBeat; CSpinButtonCtrl m_SpinTempo, m_SpinSpeed, m_SpinOctave, m_SpinRowsPerBeat; int nCurrentSpeed, nCurrentTempo, nCurrentOctave, nCurrentRowsPerBeat; +public: + CStereoVU m_VuMeter; public: CMainToolBar() {} Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2013-04-07 22:43:38 UTC (rev 1772) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2013-04-07 23:23:15 UTC (rev 1773) @@ -261,12 +261,6 @@ #include "Notification.h" -///////////////////////////////////////////////////////////////////////// -// Misc. Macros - - -#define DeleteGDIObject(h) if (h) { ::DeleteObject(h); h = NULL; } - #include "mainbar.h" #include "TrackerSettings.h" @@ -301,6 +295,7 @@ HANDLE m_hNotifyThread; DWORD m_dwNotifyThreadId; static LONG gnLVuMeter, gnRVuMeter; + static bool gnClipLeft, gnClipRight; bool m_IsPlaybackRunning; // Midi Input @@ -565,9 +560,7 @@ static std::vector<CString> s_TemplateModulePaths; }; -const CHAR gszBuildDate[] = __DATE__ " " __TIME__; - ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} Modified: trunk/OpenMPT/mptrack/Notification.h =================================================================== --- trunk/OpenMPT/mptrack/Notification.h 2013-04-07 22:43:38 UTC (rev 1772) +++ trunk/OpenMPT/mptrack/Notification.h 2013-04-07 23:23:15 UTC (rev 1773) @@ -30,7 +30,8 @@ typedef uint16 Item; - static const SmpLength PosInvalid = -1; // pos[i] is not valid (if it contains sample or envelope position) + static const SmpLength PosInvalid = SmpLength(-1); // pos[i] is not valid (if it contains sample or envelope position) + static const uint32 ClipVU = 0x80000000; // Master VU clip indicator bit (sound output has previously clipped) /* timestampSamples is kind of confusing at the moment: @@ -46,19 +47,12 @@ uint32 tick; // dito ORDERINDEX order; // dito PATTERNINDEX pattern; // dito - uint32 masterVu[2]; // dito + uint32 masterVU[2]; // dito SmpLength pos[MAX_CHANNELS]; // Sample / envelope pos for each channel if != PosInvalid, or pattern channel VUs - Notification() + + Notification(Type t = None, Item i = 0, int64 s = 0, ROWINDEX r = 0, uint32 ti = 0, ORDERINDEX o = 0, PATTERNINDEX p = 0) : timestampSamples(s), type(t), item(i), row(r), tick(ti), order(o), pattern(p) { - timestampSamples = 0; - type = Notification::None; - item = 0; - row = 0; - tick = 0; - order = 0; - pattern = 0; - MemsetZero(masterVu); - MemsetZero(pos); + MemsetZero(masterVU); } }; Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2013-04-07 22:43:38 UTC (rev 1772) +++ trunk/OpenMPT/mptrack/mptrack.rc 2013-04-07 23:23:15 UTC (rev 1773) @@ -2515,6 +2515,11 @@ IDC_SAMPLE_AUTOTUNE "Sample Tuner\nTune the sample to a given note." END +STRINGTABLE +BEGIN + IDC_VUMETER "Global VU Meter (Click to reset clip indicator)" +END + #endif // English (United States) resources ///////////////////////////////////////////////////////////////////////////// Modified: trunk/OpenMPT/mptrack/res/MAINBAR.BMP =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2013-04-07 22:43:38 UTC (rev 1772) +++ trunk/OpenMPT/mptrack/resource.h 2013-04-07 23:23:15 UTC (rev 1773) @@ -942,6 +942,7 @@ #define IDC_PROMPT 2440 #define IDC_SLIDER_NUMBUFFERS 2454 #define IDC_EDIT_STATISTICS 2455 +#define IDC_VUMETER 2456 #define IDC_STATIC_BUFFERLENGTH 2457 #define IDC_STATIC_UPDATEINTERVAL 2458 #define IDC_COMBO_UPDATEINTERVAL 2459 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2013-04-08 23:39:23
|
Revision: 1783 http://sourceforge.net/p/modplug/code/1783 Author: saga-games Date: 2013-04-08 23:39:14 +0000 (Mon, 08 Apr 2013) Log Message: ----------- [Ref] Lots of small changes to remove some useless #includes Modified Paths: -------------- trunk/OpenMPT/common/AudioCriticalSection.h trunk/OpenMPT/common/FlagSet.h trunk/OpenMPT/mptrack/AbstractVstEditor.cpp trunk/OpenMPT/mptrack/AbstractVstEditor.h trunk/OpenMPT/mptrack/CleanupSong.cpp trunk/OpenMPT/mptrack/CleanupSong.h trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/CommandSet.h trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/Ctrl_smp.h trunk/OpenMPT/mptrack/DefaultVstEditor.cpp trunk/OpenMPT/mptrack/DefaultVstEditor.h trunk/OpenMPT/mptrack/EffectInfo.cpp trunk/OpenMPT/mptrack/InputHandler.h trunk/OpenMPT/mptrack/MIDIMacroDialog.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainbar.h trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/MoveFXSlotDialog.cpp trunk/OpenMPT/mptrack/MoveFXSlotDialog.h trunk/OpenMPT/mptrack/Mptrack.h trunk/OpenMPT/mptrack/SampleEditorDialogs.h trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.h trunk/OpenMPT/mptrack/TrackerSettings.cpp trunk/OpenMPT/mptrack/UpdateCheck.cpp trunk/OpenMPT/mptrack/UpdateCheck.h trunk/OpenMPT/mptrack/VSTEditor.cpp trunk/OpenMPT/mptrack/VSTEditor.h trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/mod2midi.cpp trunk/OpenMPT/soundlib/Dlsbank.cpp trunk/OpenMPT/soundlib/Fastmix.cpp trunk/OpenMPT/soundlib/ModChannel.h trunk/OpenMPT/soundlib/ModInstrument.h trunk/OpenMPT/soundlib/ModSequence.h trunk/OpenMPT/soundlib/PlaybackEventer.h trunk/OpenMPT/soundlib/SampleFormats.cpp trunk/OpenMPT/soundlib/SampleIO.h trunk/OpenMPT/soundlib/Snd_defs.h trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/modsmp_ctrl.cpp trunk/OpenMPT/soundlib/modsmp_ctrl.h trunk/OpenMPT/soundlib/pattern.h trunk/OpenMPT/soundlib/patternContainer.h Modified: trunk/OpenMPT/common/AudioCriticalSection.h =================================================================== --- trunk/OpenMPT/common/AudioCriticalSection.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/common/AudioCriticalSection.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -9,6 +9,9 @@ #pragma once +#define WIN32_LEAN_AND_MEAN +#define VC_EXTRALEAN +#define NOMINMAX #include <windows.h> extern CRITICAL_SECTION g_csAudio; Modified: trunk/OpenMPT/common/FlagSet.h =================================================================== --- trunk/OpenMPT/common/FlagSet.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/common/FlagSet.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -8,6 +8,8 @@ */ +#pragma once + #include <string> template <typename enum_t, typename store_t = enum_t> Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2013-04-08 23:39:14 UTC (rev 1783) @@ -9,11 +9,11 @@ #include "stdafx.h" -#include "mptrack.h" -#include "moddoc.h" -#include "mainfrm.h" -#include "sndfile.h" -#include "vstplug.h" +#include "Mptrack.h" +#include "Moddoc.h" +#include "Mainfrm.h" +#include "../soundlib/Sndfile.h" +#include "Vstplug.h" #include "dlg_misc.h" #include "AbstractVstEditor.h" #include "../common/StringFixer.h" Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.h =================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -12,6 +12,11 @@ #ifndef NO_VST +#include <vector> +#include "../soundlib/Snd_defs.h" + +class CVstPlugin; + class CAbstractVstEditor: public CDialog { Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp =================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.cpp 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2013-04-08 23:39:14 UTC (rev 1783) @@ -18,7 +18,7 @@ // Default checkbox state bool CModCleanupDlg::m_bCheckBoxes[CU_MAX_CLEANUP_OPTIONS] = { - true, false, true, // patterns + true, false, true, // patterns false, false, // orders true, false, false, true, // samples true, false, // instruments @@ -45,7 +45,7 @@ }; // Options that are mutually exclusive to each other -ENUM_CLEANUP_OPTIONS const CModCleanupDlg::m_nMutuallyExclusive[CU_MAX_CLEANUP_OPTIONS] = +CModCleanupDlg::ENUM_CLEANUP_OPTIONS const CModCleanupDlg::m_nMutuallyExclusive[CModCleanupDlg::CU_MAX_CLEANUP_OPTIONS] = { // patterns CU_REMOVE_PATTERNS, CU_CLEANUP_PATTERNS, CU_REMOVE_PATTERNS, Modified: trunk/OpenMPT/mptrack/CleanupSong.h =================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/CleanupSong.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -10,38 +10,38 @@ #pragma once -enum ENUM_CLEANUP_OPTIONS -{ - // patterns - CU_CLEANUP_PATTERNS = 0, - CU_REMOVE_PATTERNS, - CU_REARRANGE_PATTERNS, - // orders - CU_MERGE_SEQUENCES, - CU_REMOVE_ORDERS, - // samples - CU_CLEANUP_SAMPLES, - CU_REMOVE_SAMPLES, - CU_REARRANGE_SAMPLES, - CU_OPTIMIZE_SAMPLES, - // instruments - CU_CLEANUP_INSTRUMENTS, - CU_REMOVE_INSTRUMENTS, - // plugins - CU_CLEANUP_PLUGINS, - CU_REMOVE_PLUGINS, - // misc - CU_RESET_VARIABLES, - - CU_NONE, - CU_MAX_CLEANUP_OPTIONS = CU_NONE -}; - //================================== class CModCleanupDlg: public CDialog //================================== { private: + enum ENUM_CLEANUP_OPTIONS + { + // patterns + CU_CLEANUP_PATTERNS = 0, + CU_REMOVE_PATTERNS, + CU_REARRANGE_PATTERNS, + // orders + CU_MERGE_SEQUENCES, + CU_REMOVE_ORDERS, + // samples + CU_CLEANUP_SAMPLES, + CU_REMOVE_SAMPLES, + CU_REARRANGE_SAMPLES, + CU_OPTIMIZE_SAMPLES, + // instruments + CU_CLEANUP_INSTRUMENTS, + CU_REMOVE_INSTRUMENTS, + // plugins + CU_CLEANUP_PLUGINS, + CU_REMOVE_PLUGINS, + // misc + CU_RESET_VARIABLES, + + CU_NONE, + CU_MAX_CLEANUP_OPTIONS = CU_NONE + }; + CModDoc &modDoc; static bool m_bCheckBoxes[CU_MAX_CLEANUP_OPTIONS]; // Checkbox state static const WORD m_nCleanupIDtoDlgID[CU_MAX_CLEANUP_OPTIONS]; // Checkbox -> Control ID LUT Modified: trunk/OpenMPT/mptrack/CommandSet.cpp =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/CommandSet.cpp 2013-04-08 23:39:14 UTC (rev 1783) @@ -9,9 +9,10 @@ #include "stdafx.h" -#include "commandset.h" +#include "CommandSet.h" #include "resource.h" #include "Mptrack.h" // For MsgBox +#include "../soundlib/mod_specifications.h" #include "../common/Reporting.h" #include <stdio.h> #include <stdlib.h> Modified: trunk/OpenMPT/mptrack/CommandSet.h =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/CommandSet.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -10,8 +10,8 @@ #pragma once #include "afxtempl.h" -#include "../soundlib/mod_specifications.h" #include <string> +struct CModSpecifications; //#define VK_ALT 0x12 Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2013-04-08 23:39:14 UTC (rev 1783) @@ -3077,8 +3077,8 @@ // Return currently selected part of the sample. // The whole sample size will be returned if no part of the sample is selected. // However, point.bSelected indicates whether a sample selection exists or not. -SampleSelectionPoints CCtrlSamples::GetSelectionPoints() -//------------------------------------------------------ +CCtrlSamples::SampleSelectionPoints CCtrlSamples::GetSelectionPoints() +//-------------------------------------------------------------------- { SampleSelectionPoints points; SAMPLEVIEWSTATE viewstate; Modified: trunk/OpenMPT/mptrack/Ctrl_smp.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/Ctrl_smp.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -11,18 +11,20 @@ #pragma once -struct SampleSelectionPoints -{ - UINT nStart; - UINT nEnd; - bool selectionActive; // does sample selection exist or not? -}; +#include "../soundlib/SampleIO.h" //======================================= class CCtrlSamples: public CModControlDlg //======================================= { protected: + struct SampleSelectionPoints + { + SmpLength nStart; + SmpLength nEnd; + bool selectionActive; // does sample selection exist or not? + }; + CModControlBar m_ToolBar1, m_ToolBar2; CEdit m_EditSample, m_EditName, m_EditFileName, m_EditFineTune; CEdit m_EditLoopStart, m_EditLoopEnd, m_EditSustainStart, m_EditSustainEnd; Modified: trunk/OpenMPT/mptrack/DefaultVstEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/DefaultVstEditor.cpp 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/DefaultVstEditor.cpp 2013-04-08 23:39:14 UTC (rev 1783) @@ -9,9 +9,9 @@ #include "stdafx.h" -//#include "vstplug.h" -#include "moddoc.h" #include "DefaultVstEditor.h" +#include "../soundlib/Sndfile.h" +#include "Vstplug.h" #ifndef NO_VST Modified: trunk/OpenMPT/mptrack/DefaultVstEditor.h =================================================================== --- trunk/OpenMPT/mptrack/DefaultVstEditor.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/DefaultVstEditor.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -10,11 +10,6 @@ #pragma once -#include "mptrack.h" -#include "MainFrm.h" -#include "VstPlug.h" -#include "abstractvsteditor.h" - enum { PARAM_RESOLUTION = 1000, @@ -23,6 +18,9 @@ #ifndef NO_VST +#include "mptrack.h" +#include "AbstractVstEditor.h" + //=================== class ParamControlSet //=================== @@ -57,7 +55,7 @@ { protected: - vector<ParamControlSet *> controls; + std::vector<ParamControlSet *> controls; CScrollBar paramScroller; PlugParamIndex paramOffset; Modified: trunk/OpenMPT/mptrack/EffectInfo.cpp =================================================================== --- trunk/OpenMPT/mptrack/EffectInfo.cpp 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/EffectInfo.cpp 2013-04-08 23:39:14 UTC (rev 1783) @@ -10,8 +10,8 @@ #include "stdafx.h" #include "EffectInfo.h" -#include "mptrack.h" -#include "..\soundlib\modcommand.h" +#include "Mptrack.h" // for szHexChar +#include "../soundlib/Sndfile.h" #include "../soundlib/Tables.h" /////////////////////////////////////////////////////////////////////////// Modified: trunk/OpenMPT/mptrack/InputHandler.h =================================================================== --- trunk/OpenMPT/mptrack/InputHandler.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/InputHandler.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -10,6 +10,8 @@ #pragma once +#include "CommandSet.h" + //not sure why I shoved message IDs here anymore. Might want to move em. -rewbs enum { @@ -38,7 +40,6 @@ HC_MIDI = 0x8000, }; - class CInputHandler { Modified: trunk/OpenMPT/mptrack/MIDIMacroDialog.cpp =================================================================== --- trunk/OpenMPT/mptrack/MIDIMacroDialog.cpp 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/MIDIMacroDialog.cpp 2013-04-08 23:39:14 UTC (rev 1783) @@ -228,14 +228,14 @@ void CMidiMacroSetup::OnSetAsDefault() //------------------------------------ { - theApp.SetDefaultMidiMacro(&m_MidiCfg); + theApp.SetDefaultMidiMacro(m_MidiCfg); } void CMidiMacroSetup::OnResetCfg() //-------------------------------- { - theApp.GetDefaultMidiMacro(&m_MidiCfg); + theApp.GetDefaultMidiMacro(m_MidiCfg); m_CbnZxxPreset.SetCurSel(0); OnSFxChanged(); } Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2013-04-08 23:39:14 UTC (rev 1783) @@ -574,8 +574,8 @@ HWND hWnd = ::GetFocus(); if(hWnd != NULL) { - TCHAR activeWindowClassName[512]; - GetClassName(hWnd, activeWindowClassName, 6); + TCHAR activeWindowClassName[6]; + GetClassName(hWnd, activeWindowClassName, CountOf(activeWindowClassName)); textboxHasFocus = _tcsicmp(activeWindowClassName, _T("Edit")) == 0; if(textboxHasFocus) { Modified: trunk/OpenMPT/mptrack/Mainbar.h =================================================================== --- trunk/OpenMPT/mptrack/Mainbar.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/Mainbar.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -39,6 +39,7 @@ class CSoundFile; class CModDoc; class CModTree; +class CMainFrame; //=============================== class CToolBarEx: public CToolBar Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -10,13 +10,12 @@ #pragma once -#include "sndfile.h" -#include "CommandSet.h" -#include "inputhandler.h" -#include "mptrack.h" +#include "Mptrack.h" +#include "InputHandler.h" #include "../common/AudioCriticalSection.h" #include "../common/mutex.h" -#include "soundlib/snddev.h" +#include "../soundlib/snddev.h" +#include "../soundlib/Sndfile.h" class CInputHandler; class CModDoc; @@ -263,8 +262,8 @@ #include "mainbar.h" #include "TrackerSettings.h" +struct MODPLUGDIB; - //======================================================== class CMainFrame: public CMDIFrameWnd, public ISoundSource //======================================================== @@ -284,7 +283,7 @@ // static CBrush *pbrushBlack, *pbrushWhite; static HPEN penBlack, penDarkGray, penLightGray, penWhite, penHalfDarkGray, penSample, penEnvelope, penEnvelopeHighlight, penSeparator, penScratch, penGray00, penGray33, penGray40, penGray55, penGray80, penGray99, penGraycc, penGrayff; static HCURSOR curDragging, curNoDrop, curArrow, curNoDrop2, curVSplit; - static LPMODPLUGDIB bmpPatterns, bmpNotes, bmpVUMeters, bmpVisNode, bmpVisPcNode; + static MODPLUGDIB *bmpPatterns, *bmpNotes, *bmpVUMeters, *bmpVisNode, *bmpVisPcNode; static HPEN gpenVuMeter[NUM_VUMETER_PENS * 2]; // General tab VU meters public: Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2013-04-08 23:39:14 UTC (rev 1783) @@ -177,7 +177,7 @@ m_SndFile.m_SongFlags.set(SONG_ITPROJECT); } - theApp.GetDefaultMidiMacro(&m_SndFile.m_MidiCfg); + theApp.GetDefaultMidiMacro(m_SndFile.m_MidiCfg); if (m_SndFile.m_nType & (MOD_TYPE_XM | MOD_TYPE_IT | MOD_TYPE_MPT)) { m_SndFile.m_SongFlags.set(SONG_LINEARSLIDES); Modified: trunk/OpenMPT/mptrack/MoveFXSlotDialog.cpp =================================================================== --- trunk/OpenMPT/mptrack/MoveFXSlotDialog.cpp 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/MoveFXSlotDialog.cpp 2013-04-08 23:39:14 UTC (rev 1783) @@ -48,8 +48,9 @@ CDialog::OnOK(); } -void CMoveFXSlotDialog::SetupMove(PLUGINDEX currentSlot, vector<PLUGINDEX> &emptySlots, PLUGINDEX defaultIndex) -//------------------------------------------------------------------------------------------------------------- + +void CMoveFXSlotDialog::SetupMove(PLUGINDEX currentSlot, std::vector<PLUGINDEX> &emptySlots, PLUGINDEX defaultIndex) +//------------------------------------------------------------------------------------------------------------------ { m_nDefaultSlot = defaultIndex; m_csPrompt.Format("Move plugin in slot %d to the following empty slot:", currentSlot + 1); @@ -57,6 +58,7 @@ m_EmptySlots = emptySlots; } + BOOL CMoveFXSlotDialog::OnInitDialog() //------------------------------------ { Modified: trunk/OpenMPT/mptrack/MoveFXSlotDialog.h =================================================================== --- trunk/OpenMPT/mptrack/MoveFXSlotDialog.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/MoveFXSlotDialog.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -20,7 +20,7 @@ public: CMoveFXSlotDialog(CWnd* pParent = NULL); // standard constructor virtual ~CMoveFXSlotDialog(); - void SetupMove(PLUGINDEX currentSlot, vector<PLUGINDEX> &emptySlots, PLUGINDEX defaultIndex); + void SetupMove(PLUGINDEX currentSlot, std::vector<PLUGINDEX> &emptySlots, PLUGINDEX defaultIndex); PLUGINDEX m_nToSlot; @@ -31,7 +31,7 @@ protected: CString m_csPrompt, m_csTitle; CEdit m_EditPrompt; - vector<PLUGINDEX> m_EmptySlots; + std::vector<PLUGINDEX> m_EmptySlots; virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support CComboBox m_CbnEmptySlots; PLUGINDEX m_nDefaultSlot; Modified: trunk/OpenMPT/mptrack/Mptrack.h =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/Mptrack.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -11,10 +11,12 @@ #pragma once #include "resource.h" // main symbols -#include "../soundlib/Sndfile.h" #include "ACMConvert.h" #include <windows.h> #include "../common/Reporting.h" +#include "../soundlib/MIDIMacros.h" +#include "../soundlib/modcommand.h" +#include <vector> class CModDoc; class CVstPluginManager; @@ -94,7 +96,7 @@ public: static MEMORYSTATUS gMemStatus; - static vector<CDLSBank *> gpDLSBanks; + static std::vector<CDLSBank *> gpDLSBanks; #if (_MSC_VER < MSVC_VER_2010) virtual CDocument* OpenDocumentFile(LPCTSTR lpszFileName, BOOL bAddToMRU = TRUE) @@ -152,13 +154,13 @@ static FileDlgResult ShowOpenSaveFileDialog(const bool load, const std::string defaultExtension, const std::string defaultFilename, const std::string extFilter, const std::string workingDirectory = "", const bool allowMultiSelect = false, int *filterIndex = nullptr); int GetOpenDocumentCount() const; - vector<CModDoc *>GetOpenDocuments() const; + std::vector<CModDoc *>GetOpenDocuments() const; public: CDocTemplate *GetModDocTemplate() const { return m_pModTemplate; } CVstPluginManager *GetPluginManager() const { return m_pPluginManager; } - void GetDefaultMidiMacro(MIDIMacroConfig *pcfg) const { *pcfg = m_MidiCfg; } - void SetDefaultMidiMacro(const MIDIMacroConfig *pcfg) { m_MidiCfg = *pcfg; } + void GetDefaultMidiMacro(MIDIMacroConfig &cfg) const { cfg = m_MidiCfg; } + void SetDefaultMidiMacro(const MIDIMacroConfig &cfg) { m_MidiCfg = cfg; } BOOL CanEncodeLayer3() const { return acmConvert.IsLayer3Present(); } BOOL IsWaveExEnabled() const { return m_bExWaveSupport; } BOOL IsDebug() const { return m_bDebugMode; } @@ -182,12 +184,12 @@ // Splash Screen protected: - VOID StartSplashScreen(); - VOID StopSplashScreen(); + void StartSplashScreen(); + void StopSplashScreen(); // Localized strings public: - VOID ImportLocalizedStrings(); + void ImportLocalizedStrings(); BOOL GetLocalizedString(LPCSTR pszName, LPSTR pszStr, UINT cbSize); // Overrides @@ -324,6 +326,8 @@ void ErrorBox(UINT nStringID, CWnd*p=NULL); // Helper function declarations. +struct SNDMIXPLUGIN; +class CVstPlugin; void AddPluginNamesToCombobox(CComboBox& CBox, SNDMIXPLUGIN* plugarray, const bool librarynames = false); void AddPluginParameternamesToCombobox(CComboBox& CBox, SNDMIXPLUGIN& plugarray); void AddPluginParameternamesToCombobox(CComboBox& CBox, CVstPlugin& plug); Modified: trunk/OpenMPT/mptrack/SampleEditorDialogs.h =================================================================== --- trunk/OpenMPT/mptrack/SampleEditorDialogs.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/SampleEditorDialogs.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -11,6 +11,8 @@ #pragma once +#include "../soundlib/SampleIO.h" + ////////////////////////////////////////////////////////////////////////// // Sample amplification dialog Modified: trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp =================================================================== --- trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp 2013-04-08 23:39:14 UTC (rev 1783) @@ -9,8 +9,9 @@ #include "stdafx.h" -#include "mptrack.h" +#include "resource.h" #include "ScaleEnvPointsDlg.h" +#include "ModInstrument.h" float CScaleEnvPointsDlg::m_fFactorX = 1.0f; float CScaleEnvPointsDlg::m_fFactorY = 1.0f; @@ -44,21 +45,21 @@ if(m_fFactorX > 0 && m_fFactorX != 1) { - for(UINT i = 0; i < m_pEnv->nNodes; i++) + for(uint32 i = 0; i < m_Env.nNodes; i++) { - m_pEnv->Ticks[i] = static_cast<WORD>(m_fFactorX * m_pEnv->Ticks[i]); + m_Env.Ticks[i] = static_cast<WORD>(m_fFactorX * m_Env.Ticks[i]); // Checking that the order of points is preserved. - if(i > 0 && m_pEnv->Ticks[i] <= m_pEnv->Ticks[i - 1]) - m_pEnv->Ticks[i] = m_pEnv->Ticks[i - 1] + 1; + if(i > 0 && m_Env.Ticks[i] <= m_Env.Ticks[i - 1]) + m_Env.Ticks[i] = m_Env.Ticks[i - 1] + 1; } } if(m_fFactorY != 1) { - for(UINT i = 0; i < m_pEnv->nNodes; i++) + for(uint32 i = 0; i < m_Env.nNodes; i++) { - m_pEnv->Values[i] = CLAMP(static_cast<BYTE>((m_fFactorY * ((int)m_pEnv->Values[i] - m_nCenter)) + m_nCenter), ENVELOPE_MIN, ENVELOPE_MAX); + m_Env.Values[i] = CLAMP(static_cast<BYTE>((m_fFactorY * ((int)m_Env.Values[i] - m_nCenter)) + m_nCenter), ENVELOPE_MIN, ENVELOPE_MAX); } } Modified: trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.h =================================================================== --- trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -10,20 +10,21 @@ #pragma once +struct InstrumentEnvelope; + //======================================= class CScaleEnvPointsDlg : public CDialog //======================================= { public: - CScaleEnvPointsDlg(CWnd* pParent, InstrumentEnvelope *pEnv, int nCenter) : CDialog(IDD_SCALE_ENV_POINTS, pParent) + CScaleEnvPointsDlg(CWnd* pParent, InstrumentEnvelope &env, int nCenter) : CDialog(IDD_SCALE_ENV_POINTS, pParent), m_Env(env) { - m_pEnv = pEnv; m_nCenter = nCenter; } private: - InstrumentEnvelope *m_pEnv; //To tell which envelope to process. + InstrumentEnvelope &m_Env; //To tell which envelope to process. static float m_fFactorX, m_fFactorY; int m_nCenter; Modified: trunk/OpenMPT/mptrack/TrackerSettings.cpp =================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.cpp 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/TrackerSettings.cpp 2013-04-08 23:39:14 UTC (rev 1783) @@ -206,7 +206,7 @@ // Load default macro configuration MIDIMacroConfig macros; - theApp.GetDefaultMidiMacro(¯os); + theApp.GetDefaultMidiMacro(macros); for(int isfx = 0; isfx < 16; isfx++) { CHAR snam[8]; @@ -226,7 +226,7 @@ { macros.UpgradeMacros(); } - theApp.SetDefaultMidiMacro(¯os); + theApp.SetDefaultMidiMacro(macros); // Default directory location for(UINT i = 0; i < NUM_DIRS; i++) @@ -885,7 +885,7 @@ // Save default macro configuration MIDIMacroConfig macros; - theApp.GetDefaultMidiMacro(¯os); + theApp.GetDefaultMidiMacro(macros); for(int isfx = 0; isfx < 16; isfx++) { CHAR snam[8]; Modified: trunk/OpenMPT/mptrack/UpdateCheck.cpp =================================================================== --- trunk/OpenMPT/mptrack/UpdateCheck.cpp 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/UpdateCheck.cpp 2013-04-08 23:39:14 UTC (rev 1783) @@ -13,6 +13,10 @@ #include "../common/version.h" #include "../common/misc_util.h" #include "Mptrack.h" +#include "TrackerSettings.h" +// Setup dialog stuff +#include "Mainfrm.h" +#include "Moptions.h" #ifdef _DEBUG #define new DEBUG_NEW Modified: trunk/OpenMPT/mptrack/UpdateCheck.h =================================================================== --- trunk/OpenMPT/mptrack/UpdateCheck.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/UpdateCheck.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -13,10 +13,7 @@ #include <WinInet.h> #include <time.h> -// Setup dialog stuff -#include "Mainfrm.h" #include "resource.h" -#include "Moptions.h" #define DOWNLOAD_BUFFER_SIZE 256 Modified: trunk/OpenMPT/mptrack/VSTEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/VSTEditor.cpp 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/VSTEditor.cpp 2013-04-08 23:39:14 UTC (rev 1783) @@ -9,7 +9,10 @@ #include "stdafx.h" -#include "vsteditor.h" +#include "resource.h" +#include "../soundlib/Sndfile.h" +#include "VstPlug.h" +#include "VSTEditor.h" #ifndef NO_VST Modified: trunk/OpenMPT/mptrack/VSTEditor.h =================================================================== --- trunk/OpenMPT/mptrack/VSTEditor.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/VSTEditor.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -10,9 +10,6 @@ #pragma once -#include "mptrack.h" -#include "MainFrm.h" -#include "VstPlug.h" #include "AbstractVstEditor.h" #ifndef NO_VST Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2013-04-08 23:39:14 UTC (rev 1783) @@ -2239,14 +2239,14 @@ return; const CSoundFile &sndFile = pModDoc->GetrSoundFile(); - if(m_nInstrument >= 1 && - m_nInstrument <= sndFile.GetNumInstruments() && - sndFile.Instruments[m_nInstrument]) + if(m_nInstrument >= 1 + && m_nInstrument <= sndFile.GetNumInstruments() + && sndFile.Instruments[m_nInstrument]) { // "Center" y value of the envelope. For panning and pitch, this is 32, for volume and filter it is 0 (minimum). int nOffset = ((m_nEnv != ENV_VOLUME) && !GetEnvelopePtr()->dwFlags[ENV_FILTER]) ? 32 : 0; - CScaleEnvPointsDlg dlg(this, GetEnvelopePtr(), nOffset); + CScaleEnvPointsDlg dlg(this, *GetEnvelopePtr(), nOffset); if(dlg.DoModal() == IDOK) { SetInstrumentModified(); Modified: trunk/OpenMPT/mptrack/mod2midi.cpp =================================================================== --- trunk/OpenMPT/mptrack/mod2midi.cpp 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/mptrack/mod2midi.cpp 2013-04-08 23:39:14 UTC (rev 1783) @@ -9,7 +9,8 @@ #include "stdafx.h" -#include "mptrack.h" +#include "Mptrack.h" +#include "../soundlib/Sndfile.h" #include "mod2midi.h" #include "Wav.h" Modified: trunk/OpenMPT/soundlib/Dlsbank.cpp =================================================================== --- trunk/OpenMPT/soundlib/Dlsbank.cpp 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/soundlib/Dlsbank.cpp 2013-04-08 23:39:14 UTC (rev 1783) @@ -15,8 +15,8 @@ #include "dlsbank.h" #include "Wav.h" #include "../common/StringFixer.h" +#include "SampleIO.h" - //#define DLSBANK_LOG //#define DLSINSTR_LOG Modified: trunk/OpenMPT/soundlib/Fastmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Fastmix.cpp 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/soundlib/Fastmix.cpp 2013-04-08 23:39:14 UTC (rev 1783) @@ -2265,6 +2265,8 @@ } +typedef struct ModChannel ModChannel_; + void MPPASMCALL X86_EndChannelOfs(ModChannel *pChannel, int *pBuffer, UINT nSamples) //---------------------------------------------------------------------------------- { @@ -2273,8 +2275,8 @@ mov esi, pChannel mov edi, pBuffer mov ecx, nSamples - mov eax, dword ptr [esi+ModChannel.nROfs] - mov edx, dword ptr [esi+ModChannel.nLOfs] + mov eax, dword ptr [esi+ModChannel_.nROfs] + mov edx, dword ptr [esi+ModChannel_.nLOfs] or ecx, ecx jz brkloop ofsloop: @@ -2302,8 +2304,8 @@ jnz ofsloop brkloop: mov esi, pChannel - mov dword ptr [esi+ModChannel.nROfs], eax - mov dword ptr [esi+ModChannel.nLOfs], edx + mov dword ptr [esi+ModChannel_.nROfs], eax + mov dword ptr [esi+ModChannel_.nLOfs], edx } #else // c implementation taken from libmodplug int rofs = pChannel->nROfs; Modified: trunk/OpenMPT/soundlib/ModChannel.h =================================================================== --- trunk/OpenMPT/soundlib/ModChannel.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/soundlib/ModChannel.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -10,11 +10,10 @@ #pragma once - #pragma warning(disable : 4324) //structure was padded due to __declspec(align()) // Mix Channel Struct -typedef struct __declspec(align(32)) ModChannel_ +struct __declspec(align(32)) ModChannel { // Envelope playback info struct EnvInfo @@ -169,12 +168,12 @@ float m_VibratoDepth; //<---- - ModChannel_() + ModChannel() { memset(this, 0, sizeof(*this)); } -} ModChannel; +}; // Default pattern channel settings Modified: trunk/OpenMPT/soundlib/ModInstrument.h =================================================================== --- trunk/OpenMPT/soundlib/ModInstrument.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/soundlib/ModInstrument.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -11,6 +11,8 @@ #pragma once #include "tuning.h" +#include "Snd_defs.h" +#include "../common/FlagSet.h" #include <set> // Instrument Envelopes Modified: trunk/OpenMPT/soundlib/ModSequence.h =================================================================== --- trunk/OpenMPT/soundlib/ModSequence.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/soundlib/ModSequence.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -11,10 +11,10 @@ #pragma once #include <vector> -#include "Loaders.h" class CSoundFile; class ModSequenceSet; +class FileReader; class ModSequence //=============== Modified: trunk/OpenMPT/soundlib/PlaybackEventer.h =================================================================== --- trunk/OpenMPT/soundlib/PlaybackEventer.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/soundlib/PlaybackEventer.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -10,8 +10,7 @@ #pragma once -#include "pattern.h" - +#include "Snd_defs.h" class CSoundFile; //==================== @@ -19,11 +18,11 @@ //==================== { public: - CPlaybackEventer(CSoundFile& sndf) : m_rSndFile(sndf) {} + CPlaybackEventer(CSoundFile &sndf) : m_rSndFile(sndf) {} void PatternTranstionChnSolo(const CHANNELINDEX chnIndex); void PatternTransitionChnUnmuteAll(); private: - CSoundFile& m_rSndFile; + CSoundFile &m_rSndFile; }; Modified: trunk/OpenMPT/soundlib/SampleFormats.cpp =================================================================== --- trunk/OpenMPT/soundlib/SampleFormats.cpp 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/soundlib/SampleFormats.cpp 2013-04-08 23:39:14 UTC (rev 1783) @@ -13,7 +13,7 @@ #include "sndfile.h" #ifdef MODPLUG_TRACKER #include "../mptrack/Moddoc.h" -#include "../mptrack/Mainfrm.h" +#include "../mptrack/Mainfrm.h" // For ini settings #endif //MODPLUG_TRACKER #include "../common/AudioCriticalSection.h" #include "Wav.h" Modified: trunk/OpenMPT/soundlib/SampleIO.h =================================================================== --- trunk/OpenMPT/soundlib/SampleIO.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/soundlib/SampleIO.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -12,6 +12,7 @@ #pragma once +struct ModSample; class FileReader; // Sample import / export formats Modified: trunk/OpenMPT/soundlib/Snd_defs.h =================================================================== --- trunk/OpenMPT/soundlib/Snd_defs.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/soundlib/Snd_defs.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -203,9 +203,10 @@ // envelope types in instrument editor enum enmEnvelopeTypes { - ENV_VOLUME = 1, - ENV_PANNING = 2, - ENV_PITCH = 3, + ENV_VOLUME = 0, + ENV_PANNING, + ENV_PITCH, + NUM_ENVELOPES, }; // Filter Modes Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/soundlib/Sndfile.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -31,6 +31,7 @@ #include "modcommand.h" #include "plugins/PlugInterface.h" #include "RowVisitor.h" +#include "FileReader.h" #include "snd_rvb.h" #include "../sounddsp/AGC.h" @@ -323,7 +324,7 @@ DWORD m_dwLastSavedWithVersion; #ifdef MODPLUG_TRACKER - vector<PatternCuePoint> m_PatternCuePoints; // For WAV export (writing pattern positions to file) + std::vector<PatternCuePoint> m_PatternCuePoints; // For WAV export (writing pattern positions to file) #endif // MODPLUG_TRACKER // For handling backwards jumps and stuff to prevent infinite loops when counting the mod length or rendering to wav. @@ -618,8 +619,8 @@ bool IsSampleUsed(SAMPLEINDEX nSample) const; bool IsInstrumentUsed(INSTRUMENTINDEX nInstr) const; bool RemoveInstrumentSamples(INSTRUMENTINDEX nInstr); - SAMPLEINDEX DetectUnusedSamples(vector<bool> &sampleUsed) const; - SAMPLEINDEX RemoveSelectedSamples(const vector<bool> &keepSamples); + SAMPLEINDEX DetectUnusedSamples(std::vector<bool> &sampleUsed) const; + SAMPLEINDEX RemoveSelectedSamples(const std::vector<bool> &keepSamples); static void AdjustSampleLoop(ModSample &sample); // Samples file I/O Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.cpp =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2013-04-08 23:39:14 UTC (rev 1783) @@ -12,6 +12,7 @@ #include "modsmp_ctrl.h" #include "../common/AudioCriticalSection.h" #include "../common/Reporting.h" +#include "Sndfile.h" #define new DEBUG_NEW Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.h =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -10,8 +10,12 @@ #pragma once -#include "Sndfile.h" +class CSoundFile; +struct ModSample; +struct ModChannel; +#include "Snd_defs.h" + namespace ctrlSmp { @@ -40,11 +44,6 @@ // Propagate loop point changes to player bool UpdateLoopPoints(const ModSample &smp, CSoundFile &sndFile); -// 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. -inline SmpLength GetSampleCapacity(ModSample &smp) {return smp.GetSampleSizeInBytes();} - // Resets samples. void ResetSamples(CSoundFile &sndFile, ResetFlag resetflag, SAMPLEINDEX minSample = SAMPLEINDEX_INVALID, SAMPLEINDEX maxSample = SAMPLEINDEX_INVALID); Modified: trunk/OpenMPT/soundlib/pattern.h =================================================================== --- trunk/OpenMPT/soundlib/pattern.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/soundlib/pattern.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -14,8 +14,6 @@ #include "modcommand.h" #include "Snd_defs.h" -using std::vector; - class CPatternContainer; class CSoundFile; class EffectWriter; Modified: trunk/OpenMPT/soundlib/patternContainer.h =================================================================== --- trunk/OpenMPT/soundlib/patternContainer.h 2013-04-08 18:36:53 UTC (rev 1782) +++ trunk/OpenMPT/soundlib/patternContainer.h 2013-04-08 23:39:14 UTC (rev 1783) @@ -11,7 +11,6 @@ #pragma once #include "pattern.h" -#include "Snd_defs.h" class CSoundFile; typedef CPattern MODPATTERN; @@ -22,7 +21,7 @@ { //BEGIN: TYPEDEFS public: - typedef vector<MODPATTERN> PATTERNVECTOR; + typedef std::vector<MODPATTERN> PATTERNVECTOR; //END: TYPEDEFS @@ -97,7 +96,7 @@ //BEGIN: DATA MEMBERS private: PATTERNVECTOR m_Patterns; - CSoundFile& m_rSndFile; + CSoundFile &m_rSndFile; //END: DATA MEMBERS }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-04-09 16:27:50
|
Revision: 1791 http://sourceforge.net/p/modplug/code/1791 Author: manxorist Date: 2013-04-09 16:27:40 +0000 (Tue, 09 Apr 2013) Log Message: ----------- [Imp] On Vista/Win7/Win8, boost the thread priority using MMCSS. Also add an option to completely disable boosting of audio thread priority. [Ref] Add code to use WASAPI in exclusive mode via portuadio. This is disabled for now as portaudio behaves kind of strange in that mode. Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/Mpdlgs.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/soundlib/SNDDEV.H trunk/OpenMPT/soundlib/SNDDEVX.H trunk/OpenMPT/soundlib/Snddev.cpp Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2013-04-09 00:29:35 UTC (rev 1790) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2013-04-09 16:27:40 UTC (rev 1791) @@ -836,7 +836,11 @@ if(!gpSoundDevice) gpSoundDevice = CreateSoundDevice(nDevType); if(!gpSoundDevice) return false; gpSoundDevice->SetSource(this); - gpSoundDevice->Configure(m_hWnd, TrackerSettings::Instance().m_LatencyMS, TrackerSettings::Instance().m_UpdateIntervalMS, (TrackerSettings::Instance().m_dwSoundSetup & SOUNDSETUP_SECONDARY) ? SNDDEV_OPTIONS_SECONDARY : 0); + gpSoundDevice->Configure(m_hWnd, TrackerSettings::Instance().m_LatencyMS, TrackerSettings::Instance().m_UpdateIntervalMS, + ((TrackerSettings::Instance().m_dwSoundSetup & SOUNDSETUP_SECONDARY) ? 0 : SNDDEV_OPTIONS_EXCLUSIVE) + | + ((TrackerSettings::Instance().m_dwSoundSetup & SOUNDSETUP_NOBOOSTTHREADPRIORITY) ? 0 : SNDDEV_OPTIONS_BOOSTTHREADPRIORITY) + ); if (!gpSoundDevice->Open(SNDDEV_GET_NUMBER(TrackerSettings::Instance().m_nWaveDevice), &WaveFormat.Format)) return false; return true; } Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2013-04-09 00:29:35 UTC (rev 1790) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2013-04-09 16:27:40 UTC (rev 1791) @@ -111,7 +111,8 @@ #define SOUNDSETUP_ENABLEMMX 0x08 #define SOUNDSETUP_SOFTPANNING 0x10 #define SOUNDSETUP_SECONDARY 0x40 -#define SOUNDSETUP_RESTARTMASK SOUNDSETUP_SECONDARY +#define SOUNDSETUP_NOBOOSTTHREADPRIORITY 0x80 +#define SOUNDSETUP_RESTARTMASK (SOUNDSETUP_SECONDARY|SOUNDSETUP_NOBOOSTTHREADPRIORITY) #ifndef NO_DSP #define QUALITY_NOISEREDUCTION 0x01 Modified: trunk/OpenMPT/mptrack/Mpdlgs.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mpdlgs.cpp 2013-04-09 00:29:35 UTC (rev 1790) +++ trunk/OpenMPT/mptrack/Mpdlgs.cpp 2013-04-09 16:27:40 UTC (rev 1791) @@ -65,6 +65,7 @@ ON_COMMAND(IDC_CHECK2, OnSettingsChanged) ON_COMMAND(IDC_CHECK3, OnSettingsChanged) ON_COMMAND(IDC_CHECK4, OnSettingsChanged) + ON_COMMAND(IDC_CHECK5, OnSettingsChanged) ON_CBN_SELCHANGE(IDC_COMBO1, OnDeviceChanged) ON_CBN_SELCHANGE(IDC_COMBO2, OnSettingsChanged) ON_CBN_SELCHANGE(IDC_COMBO_UPDATEINTERVAL, OnSettingsChanged) @@ -126,6 +127,7 @@ if (m_dwSoundSetup & SOUNDSETUP_SOFTPANNING) CheckDlgButton(IDC_CHECK2, MF_CHECKED); if (m_dwSoundSetup & SOUNDSETUP_ENABLEMMX) CheckDlgButton(IDC_CHECK3, MF_CHECKED); if (m_dwSoundSetup & SOUNDSETUP_SECONDARY) CheckDlgButton(IDC_CHECK4, MF_CHECKED); + if (!(m_dwSoundSetup & SOUNDSETUP_NOBOOSTTHREADPRIORITY)) CheckDlgButton(IDC_CHECK5, MF_CHECKED); // Multimedia extensions ::EnableWindow(::GetDlgItem(m_hWnd, IDC_CHECK3), (CSoundFile::GetSysInfo() & SYSMIX_ENABLEMMX) ? TRUE : FALSE); if(CSoundFile::GetSysInfo() & SYSMIX_SSE) @@ -243,7 +245,7 @@ nDev++; } } - GetDlgItem(IDC_CHECK4)->EnableWindow((SNDDEV_GET_TYPE(m_nSoundDevice) == SNDDEV_DSOUND) ? TRUE : FALSE); + GetDlgItem(IDC_CHECK4)->EnableWindow((SNDDEV_GET_TYPE(m_nSoundDevice) == SNDDEV_DSOUND /*|| SNDDEV_GET_TYPE(m_nSoundDevice) == SNDDEV_PORTAUDIO_WASAPI*/) ? TRUE : FALSE); GetDlgItem(IDC_STATIC_UPDATEINTERVAL)->EnableWindow((SNDDEV_GET_TYPE(m_nSoundDevice) == SNDDEV_ASIO) ? FALSE : TRUE); GetDlgItem(IDC_COMBO_UPDATEINTERVAL)->EnableWindow((SNDDEV_GET_TYPE(m_nSoundDevice) == SNDDEV_ASIO) ? FALSE : TRUE); } @@ -333,7 +335,7 @@ if (n >= 0) { int dev = m_CbnDevice.GetItemData(n); - GetDlgItem(IDC_CHECK4)->EnableWindow((SNDDEV_GET_TYPE(dev) == SNDDEV_DSOUND) ? TRUE : FALSE); + GetDlgItem(IDC_CHECK4)->EnableWindow((SNDDEV_GET_TYPE(dev) == SNDDEV_DSOUND /*|| SNDDEV_GET_TYPE(dev) == SNDDEV_PORTAUDIO_WASAPI*/) ? TRUE : FALSE); GetDlgItem(IDC_STATIC_UPDATEINTERVAL)->EnableWindow((SNDDEV_GET_TYPE(dev) == SNDDEV_ASIO) ? FALSE : TRUE); GetDlgItem(IDC_COMBO_UPDATEINTERVAL)->EnableWindow((SNDDEV_GET_TYPE(dev) == SNDDEV_ASIO) ? FALSE : TRUE); UpdateSampleRates(dev); @@ -410,10 +412,11 @@ void COptionsSoundcard::OnOK() //---------------------------- { - m_dwSoundSetup &= ~(SOUNDSETUP_ENABLEMMX | SOUNDSETUP_SECONDARY | SOUNDSETUP_SOFTPANNING); + m_dwSoundSetup &= ~(SOUNDSETUP_ENABLEMMX | SOUNDSETUP_SECONDARY | SOUNDSETUP_SOFTPANNING | SOUNDSETUP_NOBOOSTTHREADPRIORITY); if (IsDlgButtonChecked(IDC_CHECK2)) m_dwSoundSetup |= SOUNDSETUP_SOFTPANNING; if (IsDlgButtonChecked(IDC_CHECK3)) m_dwSoundSetup |= SOUNDSETUP_ENABLEMMX; if (IsDlgButtonChecked(IDC_CHECK4)) m_dwSoundSetup |= SOUNDSETUP_SECONDARY; + if (!IsDlgButtonChecked(IDC_CHECK5)) m_dwSoundSetup |= SOUNDSETUP_NOBOOSTTHREADPRIORITY; // Mixing Freq { m_dwRate = m_CbnMixingFreq.GetItemData(m_CbnMixingFreq.GetCurSel()); Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2013-04-09 00:29:35 UTC (rev 1790) +++ trunk/OpenMPT/mptrack/mptrack.rc 2013-04-09 16:27:40 UTC (rev 1791) @@ -1299,6 +1299,7 @@ EDITTEXT IDC_EDIT_STATISTICS,6,222,258,36,ES_MULTILINE | ES_AUTOHSCROLL | ES_READONLY | NOT WS_TABSTOP GROUPBOX "",IDC_STATIC,6,6,258,114 GROUPBOX "",IDC_STATIC,6,126,258,90 + CONTROL "Boost thread priority",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,156,66,89,12 END IDD_MIDIMACRO DIALOGEX 0, 0, 358, 354 Modified: trunk/OpenMPT/soundlib/SNDDEV.H =================================================================== --- trunk/OpenMPT/soundlib/SNDDEV.H 2013-04-09 00:29:35 UTC (rev 1790) +++ trunk/OpenMPT/soundlib/SNDDEV.H 2013-04-09 16:27:40 UTC (rev 1791) @@ -75,7 +75,8 @@ #define SNDDEV_MINUPDATEINTERVAL_MS 1 #define SNDDEV_MAXUPDATEINTERVAL_MS 200 -#define SNDDEV_OPTIONS_SECONDARY 0x01 // Use secondary buffers (if available) +#define SNDDEV_OPTIONS_EXCLUSIVE 0x01 // Use hardware buffers directly +#define SNDDEV_OPTIONS_BOOSTTHREADPRIORITY 0x02 // Boost thread priority for glitch-free audio rendering //============================================= Modified: trunk/OpenMPT/soundlib/SNDDEVX.H =================================================================== --- trunk/OpenMPT/soundlib/SNDDEVX.H 2013-04-09 00:29:35 UTC (rev 1790) +++ trunk/OpenMPT/soundlib/SNDDEVX.H 2013-04-09 16:27:40 UTC (rev 1791) @@ -25,6 +25,7 @@ #ifndef NO_PORTAUDIO #include "portaudio/include/portaudio.h" +#include "portaudio/include/pa_win_wasapi.h" #endif @@ -261,6 +262,7 @@ protected: PaHostApiIndex m_HostApi; PaStreamParameters m_StreamParameters; + PaWasapiStreamInfo m_WasapiStreamInfo; PaStream * m_Stream; void * m_CurrentFrameBuffer; unsigned long m_CurrentFrameCount; Modified: trunk/OpenMPT/soundlib/Snddev.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snddev.cpp 2013-04-09 00:29:35 UTC (rev 1790) +++ trunk/OpenMPT/soundlib/Snddev.cpp 2013-04-09 16:27:40 UTC (rev 1791) @@ -109,10 +109,6 @@ //------------------------------- { HANDLE sleepEvent = CreateEvent(NULL, FALSE, FALSE, NULL); -#ifdef NDEBUG - SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL ); -#endif - HANDLE waithandles[3]; waithandles[0] = m_hAudioThreadTerminateRequest; waithandles[1] = m_hAudioWakeUp; @@ -138,6 +134,43 @@ continue; } +#ifdef NDEBUG + typedef HANDLE (WINAPI *FAvSetMmThreadCharacteristics) (LPCTSTR,LPDWORD); + typedef BOOL (WINAPI *FAvRevertMmThreadCharacteristics)(HANDLE); + FAvSetMmThreadCharacteristics pAvSetMmThreadCharacteristics = NULL; + FAvRevertMmThreadCharacteristics pAvRevertMmThreadCharacteristics = NULL; + HMODULE hAvrtDLL = NULL; + DWORD task_idx = 0; + HANDLE hTask = NULL; + + OSVERSIONINFO versioninfo; + MemsetZero(versioninfo); + versioninfo.dwOSVersionInfoSize = sizeof(versioninfo); + GetVersionEx(&versioninfo); + + bool boostPriority = (m_SoundDevice.m_fulCfgOptions & SNDDEV_OPTIONS_BOOSTTHREADPRIORITY); + + if(boostPriority) + { + if(versioninfo.dwMajorVersion >= 6) // vista + { + hAvrtDLL = LoadLibrary("avrt.dll"); + if(hAvrtDLL) + { + pAvSetMmThreadCharacteristics = (FAvSetMmThreadCharacteristics)GetProcAddress(hAvrtDLL, "AvSetMmThreadCharacteristicsA"); + pAvRevertMmThreadCharacteristics = (FAvRevertMmThreadCharacteristics)GetProcAddress(hAvrtDLL, "AvRevertMmThreadCharacteristics"); + } + if(pAvSetMmThreadCharacteristics && pAvRevertMmThreadCharacteristics) + { + hTask = pAvSetMmThreadCharacteristics("Pro Audio", &task_idx); + } + } else + { + SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL); + } + } +#endif + // increase resolution of multimedia timer bool period_set = (timeBeginPeriod(1) == TIMERR_NOERROR); @@ -173,6 +206,29 @@ if(period_set) timeEndPeriod(1); +#ifdef NDEBUG + if(boostPriority) + { + if(versioninfo.dwMajorVersion >= 6) // vista + { + if(pAvSetMmThreadCharacteristics && pAvRevertMmThreadCharacteristics) + { + pAvRevertMmThreadCharacteristics(hTask); + } + if(hAvrtDLL) + { + pAvRevertMmThreadCharacteristics = NULL; + pAvSetMmThreadCharacteristics = NULL; + FreeLibrary(hAvrtDLL); + hAvrtDLL = NULL; + } + } else + { + SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL); + } + } +#endif + } SetEvent(m_hAudioThreadGoneIdle); @@ -544,7 +600,7 @@ { DSBUFFERDESC dsbd; DSBCAPS dsc; - UINT nPriorityLevel = (m_fulCfgOptions & SNDDEV_OPTIONS_SECONDARY) ? DSSCL_PRIORITY : DSSCL_WRITEPRIMARY; + UINT nPriorityLevel = (m_fulCfgOptions & SNDDEV_OPTIONS_EXCLUSIVE) ? DSSCL_WRITEPRIMARY : DSSCL_PRIORITY; if (m_piDS) return TRUE; if (!gpDSoundEnumerate) return FALSE; @@ -560,7 +616,7 @@ if(m_nDSoundBufferSize > DSOUND_MAXBUFFERSIZE) m_nDSoundBufferSize = DSOUND_MAXBUFFERSIZE; m_nBytesPerSec = pwfx->nAvgBytesPerSec; m_BytesPerSample = (pwfx->wBitsPerSample/8) * pwfx->nChannels; - if (m_fulCfgOptions & SNDDEV_OPTIONS_SECONDARY) + if(!(m_fulCfgOptions & SNDDEV_OPTIONS_EXCLUSIVE)) { // Set the format of the primary buffer dsbd.dwSize = sizeof(dsbd); @@ -1738,8 +1794,17 @@ } m_StreamParameters.suggestedLatency = m_LatencyMS / 1000.0; m_StreamParameters.hostApiSpecificStreamInfo = NULL; + if(false && (m_HostApi == Pa_HostApiTypeIdToHostApiIndex(paWASAPI)) && (m_fulCfgOptions & SNDDEV_OPTIONS_EXCLUSIVE)) + { + MemsetZero(m_WasapiStreamInfo); + m_WasapiStreamInfo.size = sizeof(PaWasapiStreamInfo); + m_WasapiStreamInfo.hostApiType = paWASAPI; + m_WasapiStreamInfo.version = 1; + m_WasapiStreamInfo.flags = paWinWasapiExclusive; + m_StreamParameters.hostApiSpecificStreamInfo = &m_WasapiStreamInfo; + } if(Pa_IsFormatSupported(NULL, &m_StreamParameters, pwfx->nSamplesPerSec) != paFormatIsSupported) return false; - if(Pa_OpenStream(&m_Stream, NULL, &m_StreamParameters, pwfx->nSamplesPerSec, (m_fulCfgOptions & SNDDEV_OPTIONS_SECONDARY && false) ? static_cast<long>(m_UpdateIntervalMS * pwfx->nSamplesPerSec / 1000.0f) : paFramesPerBufferUnspecified, paNoFlag, StreamCallbackWrapper, (void*)this) != paNoError) return false; + if(Pa_OpenStream(&m_Stream, NULL, &m_StreamParameters, pwfx->nSamplesPerSec, /*static_cast<long>(m_UpdateIntervalMS * pwfx->nSamplesPerSec / 1000.0f)*/ paFramesPerBufferUnspecified, paNoFlag, StreamCallbackWrapper, (void*)this) != paNoError) return false; if(!Pa_GetStreamInfo(m_Stream)) { Pa_CloseStream(m_Stream); @@ -1843,6 +1908,15 @@ StreamParameters.sampleFormat = paInt16; StreamParameters.suggestedLatency = 0.0; StreamParameters.hostApiSpecificStreamInfo = NULL; + if(false && (m_HostApi == Pa_HostApiTypeIdToHostApiIndex(paWASAPI)) && (m_fulCfgOptions & SNDDEV_OPTIONS_EXCLUSIVE)) + { + MemsetZero(m_WasapiStreamInfo); + m_WasapiStreamInfo.size = sizeof(PaWasapiStreamInfo); + m_WasapiStreamInfo.hostApiType = paWASAPI; + m_WasapiStreamInfo.version = 1; + m_WasapiStreamInfo.flags = paWinWasapiExclusive; + m_StreamParameters.hostApiSpecificStreamInfo = &m_WasapiStreamInfo; + } result.push_back(Pa_IsFormatSupported(NULL, &StreamParameters, samplerates[n]) == paFormatIsSupported); } return true; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-04-09 17:15:20
|
Revision: 1793 http://sourceforge.net/p/modplug/code/1793 Author: manxorist Date: 2013-04-09 17:15:12 +0000 (Tue, 09 Apr 2013) Log Message: ----------- [Ref] Add ALWAYS_ASSERT() which is also active in release builds. [Ref] Convert AudioCriticalSection ASSERTs and CASIODevice ASSERTs to ALWAYS_ASSERT. Modified Paths: -------------- trunk/OpenMPT/common/AudioCriticalSection.cpp trunk/OpenMPT/common/AudioCriticalSection.h trunk/OpenMPT/common/typedefs.h trunk/OpenMPT/mptrack/ExceptionHandler.cpp trunk/OpenMPT/soundlib/Snddev.cpp Modified: trunk/OpenMPT/common/AudioCriticalSection.cpp =================================================================== --- trunk/OpenMPT/common/AudioCriticalSection.cpp 2013-04-09 16:56:45 UTC (rev 1792) +++ trunk/OpenMPT/common/AudioCriticalSection.cpp 2013-04-09 17:15:12 UTC (rev 1793) @@ -12,7 +12,5 @@ #include "../common/AudioCriticalSection.h" CRITICAL_SECTION g_csAudio; -#ifdef _DEBUG int g_csAudioLockCount = 0; -#endif Modified: trunk/OpenMPT/common/AudioCriticalSection.h =================================================================== --- trunk/OpenMPT/common/AudioCriticalSection.h 2013-04-09 16:56:45 UTC (rev 1792) +++ trunk/OpenMPT/common/AudioCriticalSection.h 2013-04-09 17:15:12 UTC (rev 1793) @@ -15,9 +15,7 @@ #include <windows.h> extern CRITICAL_SECTION g_csAudio; -#ifdef _DEBUG extern int g_csAudioLockCount; -#endif // Critical section handling done in (safe) RAII style. // Create a CriticalSection object whenever you need exclusive access to CSoundFile. @@ -40,9 +38,7 @@ { inSection = true; EnterCriticalSection(&g_csAudio); -#ifdef _DEBUG g_csAudioLockCount++; -#endif } }; void Leave() @@ -50,9 +46,7 @@ if(inSection) { inSection = false; -#ifdef _DEBUG g_csAudioLockCount--; -#endif LeaveCriticalSection(&g_csAudio); } }; @@ -63,12 +57,10 @@ static void AssertUnlocked() { // asserts that the critical section is currently not hold by THIS thread -#ifdef _DEBUG if(TryEnterCriticalSection(&g_csAudio)) { - ASSERT(g_csAudioLockCount==0); + ALWAYS_ASSERT(g_csAudioLockCount==0); LeaveCriticalSection(&g_csAudio); } -#endif } }; Modified: trunk/OpenMPT/common/typedefs.h =================================================================== --- trunk/OpenMPT/common/typedefs.h 2013-04-09 16:56:45 UTC (rev 1792) +++ trunk/OpenMPT/common/typedefs.h 2013-04-09 17:15:12 UTC (rev 1793) @@ -38,6 +38,13 @@ #define static_assert(expr, msg) C_ASSERT(expr) #endif +void AlwaysAssertHandler(const char *file, int line, const char *function, const char *expr); +#ifdef NDEBUG +#define ALWAYS_ASSERT(expr) do { if(!(expr)) { if(IsDebuggerPresent()) { ASSERT(expr); } else { AlwaysAssertHandler(__FILE__, __LINE__, __FUNCTION__, #expr); } } } while(0) +#else +#define ALWAYS_ASSERT(expr) ASSERT(expr) +#endif + // Advanced inline attributes #if defined(_MSC_VER) #define forceinline __forceinline Modified: trunk/OpenMPT/mptrack/ExceptionHandler.cpp =================================================================== --- trunk/OpenMPT/mptrack/ExceptionHandler.cpp 2013-04-09 16:56:45 UTC (rev 1792) +++ trunk/OpenMPT/mptrack/ExceptionHandler.cpp 2013-04-09 17:15:12 UTC (rev 1793) @@ -23,27 +23,12 @@ CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam ); -// Try to close the audio device and rescue unsaved work if an unhandled exception occours... -LONG ExceptionHandler::UnhandledExceptionFilter(_EXCEPTION_POINTERS *pExceptionInfo) -//---------------------------------------------------------------------------------- + +static void GenerateDump(CString &errorMessage, _EXCEPTION_POINTERS *pExceptionInfo=NULL) +//--------------------------------------------------------------------------------------- { CMainFrame* pMainFrame = CMainFrame::GetMainFrame(); - // Shut down audio device... - if(pMainFrame) - { - try - { - if(pMainFrame->gpSoundDevice) pMainFrame->gpSoundDevice->Reset(); - pMainFrame->audioCloseDevice(); - } catch(...) - { - } - } - - CString errorMessage; - errorMessage.Format("Unhandled exception 0x%X at address %p occoured.", pExceptionInfo->ExceptionRecord->ExceptionCode, pExceptionInfo->ExceptionRecord->ExceptionAddress); - const CString timestampDir = (CTime::GetCurrentTime()).Format("%Y-%m-%d %H.%M.%S\\"); CString baseRescuePath; { @@ -76,11 +61,14 @@ { _MINIDUMP_EXCEPTION_INFORMATION ExInfo; - ExInfo.ThreadId = ::GetCurrentThreadId(); - ExInfo.ExceptionPointers = pExceptionInfo; - ExInfo.ClientPointers = NULL; + if(pExceptionInfo) + { + ExInfo.ThreadId = ::GetCurrentThreadId(); + ExInfo.ExceptionPointers = pExceptionInfo; + ExInfo.ClientPointers = NULL; + } - pDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL); + pDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, pExceptionInfo ? &ExInfo : NULL, NULL, NULL); ::CloseHandle(hFile); errorMessage.AppendFormat("\n\nDebug information has been saved to\n%s", baseRescuePath); @@ -122,6 +110,41 @@ Reporting::Error(errorMessage, "OpenMPT Crash", pMainFrame); +} + + +// Try to close the audio device and rescue unsaved work if an unhandled exception occours... +LONG ExceptionHandler::UnhandledExceptionFilter(_EXCEPTION_POINTERS *pExceptionInfo) +//---------------------------------------------------------------------------------- +{ + CMainFrame* pMainFrame = CMainFrame::GetMainFrame(); + + // Shut down audio device... + if(pMainFrame) + { + try + { + if(pMainFrame->gpSoundDevice) pMainFrame->gpSoundDevice->Reset(); + pMainFrame->audioCloseDevice(); + } catch(...) + { + } + } + + CString errorMessage; + errorMessage.Format("Unhandled exception 0x%X at address %p occoured.", pExceptionInfo->ExceptionRecord->ExceptionCode, pExceptionInfo->ExceptionRecord->ExceptionAddress); + + GenerateDump(errorMessage, pExceptionInfo); + // Let Windows handle the exception... return EXCEPTION_CONTINUE_SEARCH; } + + +void AlwaysAssertHandler(const char *file, int line, const char *function, const char *expr) +//------------------------------------------------------------------------------------------ +{ + CString errorMessage; + errorMessage.Format("Internal error occured at %s(%d): ASSERT(%s) failed in [%s].", file, line, expr, function); + GenerateDump(errorMessage); +} Modified: trunk/OpenMPT/soundlib/Snddev.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snddev.cpp 2013-04-09 16:56:45 UTC (rev 1792) +++ trunk/OpenMPT/soundlib/Snddev.cpp 2013-04-09 17:15:12 UTC (rev 1793) @@ -879,9 +879,7 @@ static DWORD g_dwBuffer = 0; -#ifdef _DEBUG static int g_asio_startcount = 0; -#endif BOOL CASIODevice::EnumerateDevices(UINT nIndex, LPSTR pszDescription, UINT cbSize) @@ -1134,10 +1132,8 @@ { if (IsOpen()) { -#ifdef _DEBUG - ASSERT(g_asio_startcount==0); + ALWAYS_ASSERT(g_asio_startcount==0); g_asio_startcount++; -#endif InterlockedExchange(&m_RenderSilence, 0); if(!m_bMixRunning) @@ -1161,10 +1157,8 @@ if (IsOpen()) { InterlockedExchange(&m_RenderSilence, 1); -#ifdef _DEBUG g_asio_startcount--; - ASSERT(g_asio_startcount==0); -#endif + ALWAYS_ASSERT(g_asio_startcount==0); } } @@ -1217,9 +1211,7 @@ { CASIODevice::ReportASIOException("ASIO crash in stop()\n"); } -#ifdef _DEBUG g_asio_startcount = 0; -#endif InterlockedExchange(&m_RenderSilence, 0); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-04-10 16:51:07
|
Revision: 1810 http://sourceforge.net/p/modplug/code/1810 Author: manxorist Date: 2013-04-10 16:50:58 +0000 (Wed, 10 Apr 2013) Log Message: ----------- [Ref] Replace static CTuning *CModDoc::s_DefaultTuning; with static CTuning *CSoundFile::GetDefaultTuning() which kind of makes more sense for future extensibility. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/test/test.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/ModInstrument.cpp trunk/OpenMPT/soundlib/ModInstrument.h trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2013-04-10 09:10:49 UTC (rev 1809) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2013-04-10 16:50:58 UTC (rev 1810) @@ -2724,7 +2724,7 @@ Reporting::Notification(str); CriticalSection cs; - pIns->SetTuning(pIns->s_DefaultTuning); + pIns->SetTuning(m_pSndFile->GetDefaultTuning()); m_pModDoc->SetModified(); } Modified: trunk/OpenMPT/mptrack/test/test.cpp =================================================================== --- trunk/OpenMPT/mptrack/test/test.cpp 2013-04-10 09:10:49 UTC (rev 1809) +++ trunk/OpenMPT/mptrack/test/test.cpp 2013-04-10 16:50:58 UTC (rev 1810) @@ -435,7 +435,7 @@ VERIFY_EQUAL_NONCONT(pIns->wMidiBank, 2); VERIFY_EQUAL_NONCONT(pIns->midiPWD, 8); - VERIFY_EQUAL_NONCONT(pIns->pTuning, pIns->s_DefaultTuning); + VERIFY_EQUAL_NONCONT(pIns->pTuning, pSndFile->GetDefaultTuning()); VERIFY_EQUAL_NONCONT(pIns->wPitchToTempoLock, 0); @@ -670,7 +670,7 @@ VERIFY_EQUAL_NONCONT(pIns->wMidiBank, 2); VERIFY_EQUAL_NONCONT(pIns->midiPWD, ins); - VERIFY_EQUAL_NONCONT(pIns->pTuning, pIns->s_DefaultTuning); + VERIFY_EQUAL_NONCONT(pIns->pTuning, pSndFile->GetDefaultTuning()); VERIFY_EQUAL_NONCONT(pIns->wPitchToTempoLock, 130); Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2013-04-10 09:10:49 UTC (rev 1809) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2013-04-10 16:50:58 UTC (rev 1810) @@ -208,13 +208,13 @@ #endif // MODPLUG_TRACKER } - csf.Instruments[i]->pTuning = csf.Instruments[i]->s_DefaultTuning; + csf.Instruments[i]->pTuning = csf.GetDefaultTuning(); } else //This 'else' happens probably only in case of corrupted file. { if(csf.Instruments[i]) - csf.Instruments[i]->pTuning = ModInstrument::s_DefaultTuning; + csf.Instruments[i]->pTuning = csf.GetDefaultTuning(); } } Modified: trunk/OpenMPT/soundlib/ModInstrument.cpp =================================================================== --- trunk/OpenMPT/soundlib/ModInstrument.cpp 2013-04-10 09:10:49 UTC (rev 1809) +++ trunk/OpenMPT/soundlib/ModInstrument.cpp 2013-04-10 16:50:58 UTC (rev 1810) @@ -156,7 +156,7 @@ nPluginVelocityHandling = PLUGIN_VELOCITYHANDLING_CHANNEL; nPluginVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE; - pTuning = s_DefaultTuning; + pTuning = CSoundFile::GetDefaultTuning(); AssignSample(sample); ResetNoteMap(); Modified: trunk/OpenMPT/soundlib/ModInstrument.h =================================================================== --- trunk/OpenMPT/soundlib/ModInstrument.h 2013-04-10 09:10:49 UTC (rev 1809) +++ trunk/OpenMPT/soundlib/ModInstrument.h 2013-04-10 16:50:58 UTC (rev 1810) @@ -82,7 +82,6 @@ uint16 wPitchToTempoLock; // BPM at which the samples assigned to this instrument loop correctly uint32 nResampling; // Resampling mode CTuning *pTuning; // sample tuning assigned to this instrument - static CTuning *s_DefaultTuning; InstrumentEnvelope VolEnv; // Volume envelope data InstrumentEnvelope PanEnv; // Panning envelope data Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2013-04-10 09:10:49 UTC (rev 1809) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2013-04-10 16:50:58 UTC (rev 1810) @@ -399,9 +399,6 @@ // -! NEW_FEATURE#0027 -CTuning* ModInstrument::s_DefaultTuning = 0; - - ////////////////////////////////////////////////////////// // CSoundFile @@ -1627,8 +1624,6 @@ s_pTuningsSharedBuiltIn->SetConstStatus(CTuningCollection::EM_CONST); #endif - ModInstrument::s_DefaultTuning = NULL; - return false; } Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2013-04-10 09:10:49 UTC (rev 1809) +++ trunk/OpenMPT/soundlib/Sndfile.h 2013-04-10 16:50:58 UTC (rev 1810) @@ -198,6 +198,7 @@ static void DeleteStaticdata(); static CTuningCollection& GetBuiltInTunings() {return *s_pTuningsSharedBuiltIn;} static CTuningCollection& GetLocalTunings() {return *s_pTuningsSharedLocal;} + static CTuning *GetDefaultTuning() {return nullptr;} CTuningCollection& GetTuneSpecificTunings() {return *m_pTuningsTuneSpecific;} std::string GetNoteName(const int16&, const INSTRUMENTINDEX inst = INSTRUMENTINDEX_INVALID) const; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2013-04-10 20:36:04
|
Revision: 1815 http://sourceforge.net/p/modplug/code/1815 Author: saga-games Date: 2013-04-10 20:35:54 +0000 (Wed, 10 Apr 2013) Log Message: ----------- [Ref] ModChannel and ModSample sample data pointers are now void*. Modified Paths: -------------- trunk/OpenMPT/mptrack/Autotune.cpp trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/Undo.cpp trunk/OpenMPT/mptrack/Undo.h trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/test/test.cpp trunk/OpenMPT/soundlib/Fastmix.cpp trunk/OpenMPT/soundlib/ITCompression.cpp trunk/OpenMPT/soundlib/Load_ams.cpp trunk/OpenMPT/soundlib/ModChannel.h trunk/OpenMPT/soundlib/ModSample.h trunk/OpenMPT/soundlib/SampleFormatConverters.h trunk/OpenMPT/soundlib/SampleFormats.cpp trunk/OpenMPT/soundlib/SampleIO.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/modsmp_ctrl.cpp trunk/OpenMPT/soundlib/modsmp_ctrl.h Modified: trunk/OpenMPT/mptrack/Autotune.cpp =================================================================== --- trunk/OpenMPT/mptrack/Autotune.cpp 2013-04-10 20:06:25 UTC (rev 1814) +++ trunk/OpenMPT/mptrack/Autotune.cpp 2013-04-10 20:35:54 UTC (rev 1815) @@ -121,11 +121,11 @@ switch(sample.GetElementarySampleSize()) { case 1: - CopySamples(reinterpret_cast<int8 *>(sample.pSample) + sampleOffset * sample.GetNumChannels(), sampleLoopStart, sampleLoopEnd); + CopySamples(static_cast<int8 *>(sample.pSample) + sampleOffset * sample.GetNumChannels(), sampleLoopStart, sampleLoopEnd); return true; case 2: - CopySamples(reinterpret_cast<int16 *>(sample.pSample) + sampleOffset * sample.GetNumChannels(), sampleLoopStart, sampleLoopEnd); + CopySamples(static_cast<int16 *>(sample.pSample) + sampleOffset * sample.GetNumChannels(), sampleLoopStart, sampleLoopEnd); return true; } Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2013-04-10 20:06:25 UTC (rev 1814) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2013-04-10 20:35:54 UTC (rev 1815) @@ -1989,10 +1989,10 @@ ::GdiFlush(); // Send sampledata for processing. - soundtouch_putSamples(handleSt, reinterpret_cast<int16*>(sample.pSample + pos * smpsize * nChn), len); + soundtouch_putSamples(handleSt, static_cast<int16 *>(sample.pSample) + pos * nChn, len); // Receive some processed samples (it's not guaranteed that there is any available). - nLengthCounter += soundtouch_receiveSamples(handleSt, reinterpret_cast<int16*>(pNewSample) + nChn * nLengthCounter, nNewSampleLength - nLengthCounter); + nLengthCounter += soundtouch_receiveSamples(handleSt, static_cast<int16 *>(pNewSample) + nChn * nLengthCounter, nNewSampleLength - nLengthCounter); // Next buffer chunk pos += len; @@ -2002,7 +2002,7 @@ soundtouch_flush(handleSt); while(soundtouch_numSamples(handleSt) > 0 && nNewSampleLength > nLengthCounter) { - nLengthCounter += soundtouch_receiveSamples(handleSt, reinterpret_cast<int16*>(pNewSample) + nChn * nLengthCounter, nNewSampleLength - nLengthCounter); + nLengthCounter += soundtouch_receiveSamples(handleSt, static_cast<int16 *>(pNewSample) + nChn * nLengthCounter, nNewSampleLength - nLengthCounter); } soundtouch_clear(handleSt); ASSERT(soundtouch_isEmpty(handleSt) != 0); @@ -2789,7 +2789,7 @@ if ((IsLocked()) || (!m_pSndFile)) return; UINT pinc = 1; ModSample &sample = m_pSndFile->GetSample(m_nSample); - LPSTR pSample = sample.pSample; + const uint8 *pSample = static_cast<const uint8 *>(sample.pSample); short int pos; bool redraw = false; @@ -2805,7 +2805,7 @@ if ((pos = (short int)m_SpinLoopStart.GetPos()) != 0) { bool bOk = false; - LPSTR p = pSample+sample.nLoopStart*pinc; + const uint8 *p = pSample + sample.nLoopStart * pinc; int find0 = (int)pSample[sample.nLoopEnd*pinc-pinc]; int find1 = (int)pSample[sample.nLoopEnd*pinc]; // Find Next LoopStart Point @@ -2851,7 +2851,7 @@ if ((pos) && (sample.nLoopEnd)) { bool bOk = false; - LPSTR p = pSample+sample.nLoopEnd*pinc; + const uint8 *p = pSample + sample.nLoopEnd * pinc; int find0 = (int)pSample[sample.nLoopStart*pinc]; int find1 = (int)pSample[sample.nLoopStart*pinc+pinc]; // Find Next LoopEnd Point @@ -2896,7 +2896,7 @@ if ((pos) && (sample.nSustainEnd)) { bool bOk = false; - LPSTR p = pSample+sample.nSustainStart*pinc; + const uint8 *p = pSample + sample.nSustainStart * pinc; int find0 = (int)pSample[sample.nSustainEnd*pinc-pinc]; int find1 = (int)pSample[sample.nSustainEnd*pinc]; // Find Next Sustain LoopStart Point @@ -2941,7 +2941,7 @@ if (pos) { bool bOk = false; - LPSTR p = pSample+sample.nSustainEnd*pinc; + const uint8 *p = pSample + sample.nSustainEnd * pinc; int find0 = (int)pSample[sample.nSustainStart*pinc]; int find1 = (int)pSample[sample.nSustainStart*pinc+pinc]; // Find Next LoopEnd Point Modified: trunk/OpenMPT/mptrack/Undo.cpp =================================================================== --- trunk/OpenMPT/mptrack/Undo.cpp 2013-04-10 20:06:25 UTC (rev 1814) +++ trunk/OpenMPT/mptrack/Undo.cpp 2013-04-10 20:35:54 UTC (rev 1815) @@ -327,7 +327,7 @@ undo.samplePtr = sndFile.AllocateSample((changeLen + 4) * bytesPerSample); if(undo.samplePtr == nullptr) return false; - memcpy(undo.samplePtr, oldSample.pSample + changeStart * bytesPerSample, changeLen * bytesPerSample); + memcpy(undo.samplePtr, static_cast<const char *>(oldSample.pSample) + changeStart * bytesPerSample, changeLen * bytesPerSample); #ifdef _DEBUG char s[64]; @@ -364,8 +364,8 @@ UndoInfo &undo = UndoBuffer[smp - 1].back(); ModSample &sample = sndFile.GetSample(smp); - LPSTR pCurrentSample = sample.pSample; - LPSTR pNewSample = nullptr; // a new sample is possibly going to be allocated, depending on what's going to be undone. + char *pCurrentSample = static_cast<char *>(sample.pSample); + char *pNewSample = nullptr; // a new sample is possibly going to be allocated, depending on what's going to be undone. bool replace = false; uint8 bytesPerSample = undo.OldSample.GetBytesPerSample(); @@ -407,7 +407,7 @@ case sundo_delete: // insert deleted data - pNewSample = sndFile.AllocateSample(undo.OldSample.GetSampleSizeInBytes() + 4 * bytesPerSample); + pNewSample = static_cast<char *>(sndFile.AllocateSample(undo.OldSample.GetSampleSizeInBytes() + 4 * bytesPerSample)); if(pNewSample == nullptr) return false; replace = true; memcpy(pNewSample, pCurrentSample, undo.changeStart * bytesPerSample); @@ -417,7 +417,7 @@ case sundo_replace: // simply exchange sample pointer - pNewSample = undo.samplePtr; + pNewSample = static_cast<char *>(undo.samplePtr); undo.samplePtr = nullptr; // prevent sample from being deleted replace = true; break; Modified: trunk/OpenMPT/mptrack/Undo.h =================================================================== --- trunk/OpenMPT/mptrack/Undo.h 2013-04-10 20:06:25 UTC (rev 1814) +++ trunk/OpenMPT/mptrack/Undo.h 2013-04-10 20:35:54 UTC (rev 1815) @@ -112,7 +112,7 @@ { ModSample OldSample; char oldName[MAX_SAMPLENAME]; - LPSTR samplePtr; + void *samplePtr; SmpLength changeStart, changeEnd; sampleUndoTypes changeType; }; Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2013-04-10 20:06:25 UTC (rev 1814) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2013-04-10 20:35:54 UTC (rev 1815) @@ -1268,7 +1268,7 @@ void CViewSample::SetInitialDrawPoint(void *pSample, const CPoint &point) //----------------------------------------------------------------------- { - T* data = reinterpret_cast<T*>(pSample); + T* data = static_cast<T *>(pSample); data[m_dwEndDrag] = GetSampleValueFromPoint<T, uT>(point); } @@ -1277,7 +1277,7 @@ void CViewSample::SetSampleData(void *pSample, const CPoint &point, const DWORD old) //---------------------------------------------------------------------------------- { - T* data = reinterpret_cast<T*>(pSample); + T* data = static_cast<T *>(pSample); const int oldvalue = data[old]; const int value = GetSampleValueFromPoint<T, uT>(point); for(DWORD i=old; i != m_dwEndDrag; i += (m_dwEndDrag > old ? 1 : -1)) @@ -1820,7 +1820,7 @@ sample.nLength -= cutlen; cutlen *= sample.GetBytesPerSample(); - LPSTR p = sample.pSample; + char *p = static_cast<char *>(sample.pSample); for (UINT i=istart; i<iend; i++) { p[i] = (i+cutlen < iend) ? p[i+cutlen] : (char)0; @@ -1909,7 +1909,7 @@ pdata->length = dwSmpLen; phdr->filesize += pdata->length; LPBYTE psamples = p + sizeof(WAVEFILEHEADER) + sizeof(WAVEFORMATHEADER) + sizeof(WAVEDATAHEADER); - memcpy(psamples, sample.pSample+dwSmpOffset, dwSmpLen); + memcpy(psamples, static_cast<const char *>(sample.pSample) + dwSmpOffset, dwSmpLen); if (pfmt->bitspersample == 8) { for (UINT i = 0; i < dwSmpLen; i++) psamples[i] += 0x80; Modified: trunk/OpenMPT/mptrack/test/test.cpp =================================================================== --- trunk/OpenMPT/mptrack/test/test.cpp 2013-04-10 20:06:25 UTC (rev 1814) +++ trunk/OpenMPT/mptrack/test/test.cpp 2013-04-10 20:35:54 UTC (rev 1815) @@ -629,7 +629,7 @@ // Sample Data (Stereo Interleaved) for(size_t i = 0; i < 7; i++) { - VERIFY_EQUAL_NONCONT(reinterpret_cast<int16 *>(sample.pSample)[4 + i], int16(-32768)); + VERIFY_EQUAL_NONCONT(static_cast<int16 *>(sample.pSample)[4 + i], int16(-32768)); } } @@ -861,7 +861,7 @@ // Sample Data (Stereo Interleaved) for(size_t i = 0; i < 7; i++) { - VERIFY_EQUAL_NONCONT(reinterpret_cast<int16 *>(sample.pSample)[4 + i], int16(-32768)); + VERIFY_EQUAL_NONCONT(static_cast<int16 *>(sample.pSample)[4 + i], int16(-32768)); } } @@ -1314,7 +1314,7 @@ for(size_t i = 0; i < 65536; i++) { - int16 normValue = reinterpret_cast<const int16 *>(sample.pSample)[i]; + int16 normValue = static_cast<const int16 *>(sample.pSample)[i]; if(abs(normValue - static_cast<int16>(i - 0x8000u)) > 1) { VERIFY_EQUAL_NONCONT(true, false); @@ -1348,7 +1348,7 @@ for(size_t i = 0; i < 65536; i++) { - int16 normValue = reinterpret_cast<const int16 *>(sample.pSample)[i]; + int16 normValue = static_cast<const int16 *>(sample.pSample)[i]; if(abs(normValue - static_cast<int16>(i- 0x8000u)) > 1) { VERIFY_EQUAL_NONCONT(true, false); Modified: trunk/OpenMPT/soundlib/Fastmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Fastmix.cpp 2013-04-10 20:06:25 UTC (rev 1814) +++ trunk/OpenMPT/soundlib/Fastmix.cpp 2013-04-10 20:35:54 UTC (rev 1815) @@ -46,7 +46,7 @@ #define SNDMIX_BEGINSAMPLELOOP8\ register ModChannel * const pChn = pChannel;\ nPos = pChn->nPosLo;\ - const signed char *p = (signed char *)(pChn->pCurrentSample+pChn->nPos);\ + const signed char *p = (signed char *)(pChn->pCurrentSample)+pChn->nPos;\ if (pChn->dwFlags[CHN_STEREO]) p += pChn->nPos;\ int *pvol = pbuffer;\ do { @@ -54,7 +54,7 @@ #define SNDMIX_BEGINSAMPLELOOP16\ register ModChannel * const pChn = pChannel;\ nPos = pChn->nPosLo;\ - const signed short *p = (signed short *)(pChn->pCurrentSample+(pChn->nPos*2));\ + const signed short *p = (signed short *)(pChn->pCurrentSample)+pChn->nPos;\ if (pChn->dwFlags[CHN_STEREO]) p += pChn->nPos;\ int *pvol = pbuffer;\ do { Modified: trunk/OpenMPT/soundlib/ITCompression.cpp =================================================================== --- trunk/OpenMPT/soundlib/ITCompression.cpp 2013-04-10 20:06:25 UTC (rev 1814) +++ trunk/OpenMPT/soundlib/ITCompression.cpp 2013-04-10 20:35:54 UTC (rev 1815) @@ -69,9 +69,9 @@ byteVal = 0; if(mptSample.GetElementarySampleSize() > 1) - Compress<IT16BitParams>(sample.pSample + 2 * chn, offset, remain); + Compress<IT16BitParams>(static_cast<int16 *>(sample.pSample) + chn, offset, remain); else - Compress<IT8BitParams>(sample.pSample + chn, offset, remain); + Compress<IT8BitParams>(static_cast<int8 *>(sample.pSample) + chn, offset, remain); if(file) fwrite(&packedData[0], packedLength, 1, file); packedTotalLength += packedLength; @@ -362,9 +362,9 @@ mem1 = mem2 = 0; if(mptSample.GetElementarySampleSize() > 1) - Uncompress<IT16BitParams>(mptSample.pSample + 2 * chn); + Uncompress<IT16BitParams>(static_cast<int16 *>(mptSample.pSample) + chn); else - Uncompress<IT8BitParams>(mptSample.pSample + chn); + Uncompress<IT8BitParams>(static_cast<int8 *>(mptSample.pSample) + chn); } } } Modified: trunk/OpenMPT/soundlib/Load_ams.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ams.cpp 2013-04-10 20:06:25 UTC (rev 1814) +++ trunk/OpenMPT/soundlib/Load_ams.cpp 2013-04-10 20:35:54 UTC (rev 1815) @@ -959,7 +959,7 @@ ///////////////////////////////////////////////////////////////////// // AMS Sample unpacking -void AMSUnpack(const char * const source, size_t sourceSize, char * const dest, const size_t destSize, char packCharacter) +void AMSUnpack(const char * const source, size_t sourceSize, void * const dest, const size_t destSize, char packCharacter) //------------------------------------------------------------------------------------------------------------------------ { int8 *tempBuf = new (std::nothrow) int8[destSize]; @@ -1008,6 +1008,7 @@ int8 *out = tempBuf; uint16 bitcount = 0x80; size_t k = 0; + uint8 *dst = static_cast<uint8 *>(dest); for(size_t i = 0; i < destSize; i++) { uint8 al = *out++; @@ -1017,7 +1018,7 @@ uint16 bl = al & bitcount; bl = ((bl | (bl << 8)) >> ((dh + 8 - count) & 7)) & 0xFF; bitcount = ((bitcount | (bitcount << 8)) >> 1) & 0xFF; - dest[k++] |= bl; + dst[k++] |= bl; if(k >= destSize) { k = 0; @@ -1031,7 +1032,7 @@ // Delta Unpack { int8 old = 0; - int8 *out = dest; + int8 *out = static_cast<int8 *>(dest); for(size_t i = destSize; i != 0; i--) { int pos = *reinterpret_cast<uint8 *>(out); Modified: trunk/OpenMPT/soundlib/ModChannel.h =================================================================== --- trunk/OpenMPT/soundlib/ModChannel.h 2013-04-10 20:06:25 UTC (rev 1814) +++ trunk/OpenMPT/soundlib/ModChannel.h 2013-04-10 20:35:54 UTC (rev 1815) @@ -30,11 +30,11 @@ }; // Information used in the mixer (should be kept tight for better caching) - LPSTR pCurrentSample; // Currently playing sample (nullptr if no sample is playing) - uint32 nPos; - uint32 nPosLo; // actually 16-bit (fractional part) - int32 nInc; // 16.16 fixed point - int32 nRightVol; + const void *pCurrentSample; // Currently playing sample (nullptr if no sample is playing) + uint32 nPos; // Current play position + uint32 nPosLo; // 16-bit fractional part of play position + int32 nInc; // 16.16 fixed point sample speed relative to mixing frequency (0x10000 = one sample per output sample, 0x20000 = two samples per output sample, etc...) + int32 nRightVol; // This is actually LEFT! >:( FIX THIS! int32 nLeftVol; int32 nRightRamp; int32 nLeftRamp; @@ -54,9 +54,9 @@ // Information not used in the mixer FlagSet<ChannelFlags> dwOldFlags; // Flags from previous tick - LPSTR pSample; // Currently playing sample, or previously played sample if no sample is playing. - ModSample *pModSample; // Currently assigned sample slot - ModInstrument *pModInstrument; // Currently assigned instrument slot + const void *pSample; // Currently playing sample, or previously played sample if no sample is playing. + ModSample *pModSample; // Currently assigned sample slot + ModInstrument *pModInstrument; // Currently assigned instrument slot int32 nNewRightVol, nNewLeftVol; int32 nRealVolume, nRealPan; int32 nVolume, nPan, nFadeOutVol; @@ -102,10 +102,25 @@ ModCommand rowCommand; //NOTE_PCs memory. + float m_plugParamValueStep, m_plugParamTargetValue; uint16 m_RowPlugParam; - float m_plugParamValueStep, m_plugParamTargetValue; PLUGINDEX m_RowPlug; + //-->Variables used to make user-definable tuning modes work with pattern effects. + int32 m_PortamentoFineSteps, m_PortamentoTickSlide; + + uint32 m_Freq; + float m_VibratoDepth; + + //If true, freq should be recalculated in ReadNote() on first tick. + //Currently used only for vibrato things - using in other context might be + //problematic. + bool m_ReCalculateFreqOnFirstTick; + + //To tell whether to calculate frequency. + bool m_CalculateFreq; + //<---- + void ClearRowCmd() { rowCommand = ModCommand::Empty(); } // Get a reference to a specific envelope of this channel @@ -152,22 +167,6 @@ // Check if the channel has a valid MIDI output. This function guarantees that pModInstrument != nullptr. bool HasMIDIOutput() const { return pModInstrument != nullptr && pModInstrument->HasValidMIDIChannel(); } - //-->Variables used to make user-definable tuning modes work with pattern effects. - bool m_ReCalculateFreqOnFirstTick; - //If true, freq should be recalculated in ReadNote() on first tick. - //Currently used only for vibrato things - using in other context might be - //problematic. - - bool m_CalculateFreq; - //To tell whether to calculate frequency. - - int32 m_PortamentoFineSteps; - long m_PortamentoTickSlide; - - uint32 m_Freq; - float m_VibratoDepth; - //<---- - ModChannel() { memset(this, 0, sizeof(*this)); Modified: trunk/OpenMPT/soundlib/ModSample.h =================================================================== --- trunk/OpenMPT/soundlib/ModSample.h 2013-04-10 20:06:25 UTC (rev 1814) +++ trunk/OpenMPT/soundlib/ModSample.h 2013-04-10 20:35:54 UTC (rev 1815) @@ -16,7 +16,7 @@ SmpLength nLength; // In samples, not bytes SmpLength nLoopStart, nLoopEnd; // Dito SmpLength nSustainStart, nSustainEnd; // Dito - LPSTR pSample; // Pointer to sample data + void *pSample; // Pointer to sample data uint32 nC5Speed; // Frequency of middle-C, in Hz (for IT/S3M/MPTM) uint16 nPan; // Default sample panning (if pan flag is set) uint16 nVolume; // Default volume Modified: trunk/OpenMPT/soundlib/SampleFormatConverters.h =================================================================== --- trunk/OpenMPT/soundlib/SampleFormatConverters.h 2013-04-10 20:06:25 UTC (rev 1814) +++ trunk/OpenMPT/soundlib/SampleFormatConverters.h 2013-04-10 20:35:54 UTC (rev 1815) @@ -364,7 +364,7 @@ // Read left channel CopySample<SampleConversion>(sample.pSample, sample.nLength, 2, sourceBuffer, sourceSize, 2); // Read right channel - return CopySample<SampleConversion>(sample.pSample + sizeof(SampleConversion::output_t), sample.nLength, 2, sourceBuffer + rightOffset, sourceSize - rightOffset, 2); + return CopySample<SampleConversion>(static_cast<SampleConversion::output_t *>(sample.pSample), sample.nLength, 2, sourceBuffer + rightOffset, sourceSize - rightOffset, 2); } else { // This is quicker (and smaller), but only possible if the functor doesn't care about what it actually processes: @@ -393,7 +393,7 @@ } else { // Read right channel - return rightOffset + CopySample<SampleConversion>(sample.pSample + sizeof(SampleConversion::output_t), sample.nLength, 2, sourceBuffer + rightOffset, sourceSize - rightOffset, 1); + return rightOffset + CopySample<SampleConversion>(static_cast<SampleConversion::output_t *>(sample.pSample) + 1, sample.nLength, 2, sourceBuffer + rightOffset, sourceSize - rightOffset, 1); } } @@ -401,7 +401,7 @@ // Copy a sample data buffer and normalize it. Requires slightly advanced sample conversion functor. template<typename SampleConversion> size_t CopyAndNormalizeSample(ModSample &sample, const uint8 *sourceBuffer, size_t sourceSize) -//------------------------------------------------------------------------------------------ +//-------------------------------------------------------------------------------------------- { static_assert(SampleConversion::hasState == false, "Implementation of this conversion function is stateless"); const size_t inSize = sizeof(SampleConversion::input_t); @@ -426,7 +426,7 @@ if(!sampleConv.IsSilent()) { // Copying buffer. - SampleConversion::output_t *outBuf = reinterpret_cast<SampleConversion::output_t *>(sample.pSample); + SampleConversion::output_t *outBuf = static_cast<SampleConversion::output_t *>(sample.pSample); inBuf = reinterpret_cast<const SampleConversion::input_t *>(sourceBuffer); for(size_t i = numSamples; i != 0; i--) Modified: trunk/OpenMPT/soundlib/SampleFormats.cpp =================================================================== --- trunk/OpenMPT/soundlib/SampleFormats.cpp 2013-04-10 20:06:25 UTC (rev 1814) +++ trunk/OpenMPT/soundlib/SampleFormats.cpp 2013-04-10 20:35:54 UTC (rev 1815) @@ -1936,8 +1936,8 @@ // Source bit depth const unsigned int bps = frame->header.bits_per_sample; - int8 *sampleData8 = reinterpret_cast<int8 *>(sample.pSample) + offset; - int16 *sampleData16 = reinterpret_cast<int16 *>(sample.pSample) + offset; + int8 *sampleData8 = static_cast<int8 *>(sample.pSample) + offset; + int16 *sampleData16 = static_cast<int16 *>(sample.pSample) + offset; ASSERT((bps <= 8 && sample.GetElementarySampleSize() == 1) || (bps > 8 && sample.GetElementarySampleSize() == 2)); ASSERT(modChannels <= FLAC__stream_decoder_get_channels(decoder)); @@ -2378,7 +2378,7 @@ Samples[sample].AllocateSample(); size_t ndecoded; - mpg123_read(mh, reinterpret_cast<unsigned char*>(Samples[sample].pSample), Samples[sample].GetSampleSizeInBytes(), &ndecoded); + mpg123_read(mh, static_cast<unsigned char *>(Samples[sample].pSample), Samples[sample].GetSampleSizeInBytes(), &ndecoded); mpg123_delete(mh); if(Samples[sample].pSample != nullptr) Modified: trunk/OpenMPT/soundlib/SampleIO.cpp =================================================================== --- trunk/OpenMPT/soundlib/SampleIO.cpp 2013-04-10 20:06:25 UTC (rev 1814) +++ trunk/OpenMPT/soundlib/SampleIO.cpp 2013-04-10 20:35:54 UTC (rev 1815) @@ -18,7 +18,7 @@ // External decompressors -extern void AMSUnpack(const char * const source, size_t sourceSize, char * const dest, const size_t destSize, char packCharacter); +extern void AMSUnpack(const char * const source, size_t sourceSize, void * const dest, const size_t destSize, char packCharacter); extern uint16 MDLReadBits(uint32 &bitbuf, uint32 &bitnum, const uint8 *(&ibuf), int8 n); extern int DMFUnpack(LPBYTE psample, const uint8 *ibuf, const uint8 *ibufmax, uint32 maxlen); @@ -269,7 +269,7 @@ LimitMax(readLength, file.BytesLeft()); const uint8 *inBuf = sourceBuf + sizeof(compressionTable); - int8 *outBuf = sample.pSample; + int8 *outBuf = static_cast<int8 *>(sample.pSample); int8 delta = 0; for(size_t i = readLength; i != 0; i--) @@ -312,8 +312,8 @@ { uint32 bitBuf = file.ReadUint32LE(), bitNum = 32; - uint8 *outBuf8 = reinterpret_cast<uint8 *>(sample.pSample); - uint16 *outBuf16 = reinterpret_cast<uint16 *>(sample.pSample); + uint8 *outBuf8 = static_cast<uint8 *>(sample.pSample); + uint16 *outBuf16 = static_cast<uint16 *>(sample.pSample); const uint8 *inBuf = sourceBuf + 4; uint8 dlt = 0, lowbyte = 0; @@ -355,7 +355,7 @@ { const uint8 *inBuf = sourceBuf; const uint8 *inBufMax = inBuf + fileSize; - uint8 *outBuf = reinterpret_cast<uint8 *>(sample.pSample); + uint8 *outBuf = static_cast<uint8 *>(sample.pSample); bytesRead = DMFUnpack(outBuf, inBuf, inBufMax, sample.GetSampleSizeInBytes()); } } Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-04-10 20:06:25 UTC (rev 1814) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-04-10 20:35:54 UTC (rev 1815) @@ -1302,7 +1302,6 @@ { ModChannel *pChn = &Chn[nChn]; ModInstrument *pIns = nullptr; - LPSTR pSample; if(!ModCommand::IsNote(note)) { return; @@ -1333,7 +1332,7 @@ return; } if(instr >= MAX_INSTRUMENTS) instr = 0; - pSample = pChn->pSample; + const void *pSample = pChn->pSample; pIns = pChn->pModInstrument; if(instr && note) { @@ -3637,7 +3636,8 @@ pChn->nEFxOffset = 0; // TRASH IT!!! (Yes, the sample!) - pModSample->pSample[pModSample->nLoopStart + pChn->nEFxOffset] = ~pModSample->pSample[pModSample->nLoopStart + pChn->nEFxOffset]; + uint8 &sample = static_cast<uint8 *>(pModSample->pSample)[pModSample->nLoopStart + pChn->nEFxOffset]; + sample = ~sample; //AdjustSampleLoop(pModSample); } Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2013-04-10 20:06:25 UTC (rev 1814) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2013-04-10 20:35:54 UTC (rev 1815) @@ -854,7 +854,7 @@ // Memory Allocation // Allocate sample memory. On sucess, a pointer to the silenced sample buffer is returned. On failure, nullptr is returned. -LPSTR CSoundFile::AllocateSample(UINT nbytes) +void *CSoundFile::AllocateSample(UINT nbytes) //------------------------------------------- { if(nbytes > SIZE_MAX - 0x29u) @@ -1320,7 +1320,7 @@ template<typename T> void AdjustSampleLoopImpl(ModSample &sample) { - T *data = reinterpret_cast<T *>(sample.pSample); + T *data = static_cast<T *>(sample.pSample); SmpLength numSamples = sample.nLength; // Adjust end of sample Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2013-04-10 20:06:25 UTC (rev 1814) +++ trunk/OpenMPT/soundlib/Sndfile.h 2013-04-10 20:35:54 UTC (rev 1815) @@ -673,7 +673,7 @@ // System-Dependant functions public: - static LPSTR AllocateSample(UINT nbytes); + static void *AllocateSample(UINT nbytes); static void FreeSample(void *p); ModInstrument *AllocateInstrument(INSTRUMENTINDEX instr, SAMPLEINDEX assignedSample = 0); Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.cpp =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2013-04-10 20:06:25 UTC (rev 1814) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2013-04-10 20:35:54 UTC (rev 1815) @@ -19,10 +19,10 @@ namespace ctrlSmp { -void ReplaceSample(ModSample &smp, const LPSTR pNewSample, const SmpLength nNewLength, CSoundFile &sndFile) -//--------------------------------------------------------------------------------------------------------- +void ReplaceSample(ModSample &smp, void *pNewSample, const SmpLength nNewLength, CSoundFile &sndFile) +//--------------------------------------------------------------------------------------------------- { - LPSTR const pOldSmp = smp.pSample; + void * const pOldSmp = smp.pSample; FlagSet<ChannelFlags> setFlags, resetFlags; setFlags.set(CHN_16BIT, smp.uFlags[CHN_16BIT]); @@ -51,7 +51,7 @@ const SmpLength nNewSmpBytes = nOldBytes + nSilenceBytes; const SmpLength nNewLength = smp.nLength + nSilenceLength; - LPSTR pNewSmp = 0; + char *pNewSmp = nullptr; #if 0 if( GetSampleCapacity(smp) >= nNewSmpBytes ) // If sample has room to expand. { @@ -62,7 +62,7 @@ else // Have to allocate new sample. #endif { - pNewSmp = CSoundFile::AllocateSample(nNewSmpBytes); + pNewSmp = static_cast<char *>(CSoundFile::AllocateSample(nNewSmpBytes)); if(pNewSmp == 0) return smp.nLength; //Sample allocation failed. if(nStartFrom == 0) @@ -111,9 +111,9 @@ const SmpLength nNewSmpBytes = nNewLength * smp.GetBytesPerSample(); - LPSTR pNewSmp = 0; + void *pNewSmp = nullptr; pNewSmp = CSoundFile::AllocateSample(nNewSmpBytes); - if(pNewSmp == 0) + if(pNewSmp == nullptr) return smp.nLength; //Sample allocation failed. // Copy over old data and replace sample by the new one @@ -149,7 +149,7 @@ { ModSample* const pSmp = &smp; const UINT len = pSmp->nLength; - T *p = reinterpret_cast<T *>(pSmp->pSample); + T *p = static_cast<T *>(pSmp->pSample); if (pSmp->uFlags & CHN_STEREO) { p[(len+3)*2] = p[(len+2)*2] = p[(len+1)*2] = p[(len)*2] = p[(len-1)*2]; @@ -379,9 +379,9 @@ // step 1: Calculate offset. OffsetData oData = {0,0,0}; if(smp.GetElementarySampleSize() == 2) - oData = CalculateOffset(reinterpret_cast<int16*>(smp.pSample) + iStart, iEnd - iStart); + oData = CalculateOffset(static_cast<int16 *>(smp.pSample) + iStart, iEnd - iStart); else if(smp.GetElementarySampleSize() == 1) - oData = CalculateOffset(reinterpret_cast<int8*>(smp.pSample) + iStart, iEnd - iStart); + oData = CalculateOffset(static_cast<int8*>(smp.pSample) + iStart, iEnd - iStart); double dMin = oData.dMin, dMax = oData.dMax, dOffset = oData.dOffset; @@ -400,9 +400,9 @@ // step 2: centralize + normalize sample dOffset *= dMaxAmplitude * dAmplify; if(smp.GetElementarySampleSize() == 2) - RemoveOffsetAndNormalize( reinterpret_cast<int16*>(smp.pSample) + iStart, iEnd - iStart, dOffset, dAmplify); + RemoveOffsetAndNormalize( static_cast<int16 *>(smp.pSample) + iStart, iEnd - iStart, dOffset, dAmplify); else if(smp.GetElementarySampleSize() == 1) - RemoveOffsetAndNormalize( reinterpret_cast<int8*>(smp.pSample) + iStart, iEnd - iStart, dOffset, dAmplify); + RemoveOffsetAndNormalize( static_cast<int8 *>(smp.pSample) + iStart, iEnd - iStart, dOffset, dAmplify); // step 3: adjust global vol (if available) if((modtype & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (iStart == 0) && (iEnd == smp.nLength * smp.GetNumChannels())) @@ -449,13 +449,13 @@ if(iEnd - iStart < 2) return false; if(smp.GetBytesPerSample() == 8) // unused (yet) - ReverseSampleImpl(reinterpret_cast<int64*>(smp.pSample) + iStart, iEnd - iStart); + ASSERT(false); //ReverseSampleImpl(static_cast<int64 *>(smp.pSample) + iStart, iEnd - iStart); else if(smp.GetBytesPerSample() == 4) // 16 bit stereo - ReverseSampleImpl(reinterpret_cast<int32*>(smp.pSample) + iStart, iEnd - iStart); + ReverseSampleImpl(static_cast<int32 *>(smp.pSample) + iStart, iEnd - iStart); else if(smp.GetBytesPerSample() == 2) // 16 bit mono / 8 bit stereo - ReverseSampleImpl(reinterpret_cast<int16*>(smp.pSample) + iStart, iEnd - iStart); + ReverseSampleImpl(static_cast<int16 *>(smp.pSample) + iStart, iEnd - iStart); else if(smp.GetBytesPerSample() == 1) // 8 bit mono - ReverseSampleImpl(reinterpret_cast<int8*>(smp.pSample) + iStart, iEnd - iStart); + ReverseSampleImpl(static_cast<int8 *>(smp.pSample) + iStart, iEnd - iStart); else return false; @@ -488,9 +488,9 @@ iStart *= smp.GetNumChannels(); iEnd *= smp.GetNumChannels(); if(smp.GetElementarySampleSize() == 2) - UnsignSampleImpl(reinterpret_cast<int16*>(smp.pSample) + iStart, iEnd - iStart); + UnsignSampleImpl(static_cast<int16 *>(smp.pSample) + iStart, iEnd - iStart); else if(smp.GetElementarySampleSize() == 1) - UnsignSampleImpl(reinterpret_cast<int8*>(smp.pSample) + iStart, iEnd - iStart); + UnsignSampleImpl(static_cast<int8 *>(smp.pSample) + iStart, iEnd - iStart); else return false; @@ -522,9 +522,9 @@ iStart *= smp.GetNumChannels(); iEnd *= smp.GetNumChannels(); if(smp.GetElementarySampleSize() == 2) - InvertSampleImpl(reinterpret_cast<int16*>(smp.pSample) + iStart, iEnd - iStart); + InvertSampleImpl(static_cast<int16 *>(smp.pSample) + iStart, iEnd - iStart); else if(smp.GetElementarySampleSize() == 1) - InvertSampleImpl(reinterpret_cast<int8*>(smp.pSample) + iStart, iEnd - iStart); + InvertSampleImpl(static_cast<int8 *>(smp.pSample) + iStart, iEnd - iStart); else return false; @@ -570,9 +570,9 @@ if(smp.pSample == nullptr || smpCount == 0) return false; if(smp.GetElementarySampleSize() == 2) - return EnableSmartSampleRampingImpl(reinterpret_cast<int16*>(smp.pSample) + sampleOffset, smpCount); + return EnableSmartSampleRampingImpl(static_cast<int16 *>(smp.pSample) + sampleOffset, smpCount); else if(smp.GetElementarySampleSize() == 1) - return EnableSmartSampleRampingImpl(reinterpret_cast<int8*>(smp.pSample) + sampleOffset, smpCount); + return EnableSmartSampleRampingImpl(static_cast<int8 *>(smp.pSample) + sampleOffset, smpCount); else return false; } @@ -604,9 +604,9 @@ iFadeLength *= smp.GetNumChannels(); if(smp.GetElementarySampleSize() == 2) - XFadeSampleImpl(reinterpret_cast<int16*>(smp.pSample) + iStart, iEnd - iStart, iFadeLength); + XFadeSampleImpl(static_cast<int16 *>(smp.pSample) + iStart, iEnd - iStart, iFadeLength); else if(smp.GetElementarySampleSize() == 1) - XFadeSampleImpl(reinterpret_cast<int8*>(smp.pSample) + iStart, iEnd - iStart, iFadeLength); + XFadeSampleImpl(static_cast<int8 *>(smp.pSample) + iStart, iEnd - iStart, iFadeLength); else return false; @@ -649,9 +649,9 @@ if(conversionMode == mixChannels) { if(smp.GetElementarySampleSize() == 2) - ConvertStereoToMonoMixImpl(reinterpret_cast<int16 *>(smp.pSample), smp.nLength); + ConvertStereoToMonoMixImpl(static_cast<int16 *>(smp.pSample), smp.nLength); else if(smp.GetElementarySampleSize() == 1) - ConvertStereoToMonoMixImpl(reinterpret_cast<int8 *>(smp.pSample), smp.nLength); + ConvertStereoToMonoMixImpl(static_cast<int8 *>(smp.pSample), smp.nLength); else return false; } else @@ -661,9 +661,9 @@ conversionMode = onlyLeft; } if(smp.GetElementarySampleSize() == 2) - ConvertStereoToMonoOneChannelImpl(reinterpret_cast<int16 *>(smp.pSample) + (conversionMode == onlyLeft ? 0 : 1), smp.nLength); + ConvertStereoToMonoOneChannelImpl(static_cast<int16 *>(smp.pSample) + (conversionMode == onlyLeft ? 0 : 1), smp.nLength); else if(smp.GetElementarySampleSize() == 1) - ConvertStereoToMonoOneChannelImpl(reinterpret_cast<int8 *>(smp.pSample) + (conversionMode == onlyLeft ? 0 : 1), smp.nLength); + ConvertStereoToMonoOneChannelImpl(static_cast<int8 *>(smp.pSample) + (conversionMode == onlyLeft ? 0 : 1), smp.nLength); else return false; } @@ -691,8 +691,8 @@ { void ReplaceSample( ModChannel (&Chn)[MAX_CHANNELS], - LPCSTR pOldSample, - LPSTR pNewSample, + const void * const pOldSample, + const void * const pNewSample, const SmpLength nNewLength, FlagSet<ChannelFlags> setFlags, FlagSet<ChannelFlags> resetFlags) Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.h =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.h 2013-04-10 20:06:25 UTC (rev 1814) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.h 2013-04-10 20:35:54 UTC (rev 1815) @@ -37,7 +37,7 @@ SmpLength ResizeSample(ModSample &smp, const SmpLength nNewLength, CSoundFile &sndFile); // Replaces sample in 'smp' with given sample and frees the old sample. -void ReplaceSample(ModSample &smp, const LPSTR pNewSample, const SmpLength nNewLength, CSoundFile &sndFile); +void ReplaceSample(ModSample &smp, void *pNewSample, const SmpLength nNewLength, CSoundFile &sndFile); bool AdjustEndOfSample(ModSample &smp, CSoundFile &sndFile); @@ -93,8 +93,8 @@ // Replaces sample from sound channels by given sample. void ReplaceSample( ModChannel (&Chn)[MAX_CHANNELS], - LPCSTR pOldSample, - LPSTR pNewSample, + const void * const pOldSample, + const void * const pNewSample, const SmpLength nNewLength, FlagSet<ChannelFlags> setFlags, FlagSet<ChannelFlags> resetFlags); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-04-10 20:51:02
|
Revision: 1819 http://sourceforge.net/p/modplug/code/1819 Author: manxorist Date: 2013-04-10 20:50:54 +0000 (Wed, 10 Apr 2013) Log Message: ----------- Merged revision(s) 1813 from branches/manx/profiler: [Var] Add a simple realtime profiler (for debugging purposes). (#define USE_PROFILER in Profiler.h to activate, otherwise it does nothing at all) ........ Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/mptrack_08.vcproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters Added Paths: ----------- trunk/OpenMPT/common/Profiler.cpp trunk/OpenMPT/common/Profiler.h Property Changed: ---------------- trunk/OpenMPT/ Index: trunk/OpenMPT =================================================================== --- trunk/OpenMPT 2013-04-10 20:47:43 UTC (rev 1818) +++ trunk/OpenMPT 2013-04-10 20:50:54 UTC (rev 1819) Property changes on: trunk/OpenMPT ___________________________________________________________________ Modified: svn:mergeinfo ## -1,4 +1,5 ## /branches/manx/build-speedup:1586-1589 /branches/manx/header-dependencies-cleanups:1394-1397,1401-1402,1405-1406 +/branches/manx/profiler:1813 /branches/manx/project-files-cleanups:1378-1382 /branches/manx/snddev-fixes:1605-1713 \ No newline at end of property Copied: trunk/OpenMPT/common/Profiler.cpp (from rev 1813, branches/manx/profiler/common/Profiler.cpp) =================================================================== --- trunk/OpenMPT/common/Profiler.cpp (rev 0) +++ trunk/OpenMPT/common/Profiler.cpp 2013-04-10 20:50:54 UTC (rev 1819) @@ -0,0 +1,214 @@ +/* + * Profiler.cpp + * ------------ + * Purpose: Performance measuring + * Notes : (currently none) + * Authors: OpenMPT Devs + * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. + */ + + +#include "Stdafx.h" +#include "Profiler.h" +#include <stdlib.h> + + +#ifdef USE_PROFILER + + +class Statistics +{ +public: + Profile &profile; + Profile::Data data; + double usage; + Statistics(Profile &p) : profile(p) + { + usage = 0.0; + Update(); + } + void Update() + { + data = profile.GetAndResetData(); + uint64 now = profile.GetTime(); + uint64 timewindow = now - data.Start; + if(data.Calls > 0 && timewindow > 0) + { + usage = (double)data.Sum / (double)timewindow; + } else + { + usage = 0.0; + } + } +}; + + +struct ProfileBlock +{ + class Profile * profile; + const char * name; + class Statistics * stats; +}; + +static const std::size_t MAX_PROFILES = 1024; + +static ProfileBlock Profiles[ MAX_PROFILES ]; + +static std::size_t NextProfile = 0; + + +static void RegisterProfile(Profile *newprofile) +{ + if(NextProfile < MAX_PROFILES) + { + Profiles[NextProfile].profile = newprofile; + Profiles[NextProfile].stats = 0; + NextProfile++; + } +} + + +static void UnregisterProfile(Profile *oldprofile) +{ + for(std::size_t i=0; i<NextProfile; i++) { + if(Profiles[i].profile == oldprofile) { + Profiles[i].profile = 0; + delete Profiles[i].stats; + Profiles[i].stats = 0; + } + } +} + + +void Profiler::Update() +{ + for(std::size_t i=0; i<NextProfile; i++) + { + if(!Profiles[i].stats) + { + Profiles[i].stats = new Statistics(*Profiles[i].profile); + } else + { + Profiles[i].stats->Update(); + } + } +} + + +std::string Profiler::DumpProfiles() +{ + std::string ret; + for(std::size_t i=0; i<NextProfile; i++) + { + if(Profiles[i].stats) + { + Statistics &stats = *Profiles[i].stats; + std::string cat; + switch(stats.profile.Category) + { + case Profiler::GUI: cat = "GUI"; break; + case Profiler::Audio: cat = "Audio"; break; + case Profiler::Notify: cat = "Notify"; break; + } + char dummy[128]; + sprintf(dummy, "%6.3f", (stats.usage * 100.0)); + ret += cat + " " + std::string(stats.profile.Name) + ": " + std::string(dummy) + "%\r\n"; + } + } + ret += "\r\n"; + return ret; +} + + +std::vector<double> Profiler::DumpCategories() +{ + std::vector<double> ret; + ret.resize(Profiler::CategoriesCount); + for(std::size_t i=0; i<NextProfile; i++) + { + if(Profiles[i].stats) + { + ret[Profiles[i].profile->Category] += Profiles[i].stats->usage; + } + } + return ret; +} + + +uint64 Profile::GetTime() const +{ + LARGE_INTEGER ret; + ret.QuadPart = 0; + QueryPerformanceCounter(&ret); + return ret.QuadPart; +} + + +uint64 Profile::GetFrequency() const +{ + LARGE_INTEGER ret; + ret.QuadPart = 0; + QueryPerformanceFrequency(&ret); + return ret.QuadPart; +} + + +Profile::Profile(Profiler::Category category, const char *name) : Category(category), Name(name) +{ + data.Calls = 0; + data.Sum = 0; + data.Overhead = 0; + data.Start = GetTime(); + EnterTime = 0; + RegisterProfile(this); +} + + +Profile::~Profile() +{ + UnregisterProfile(this); +} + + +Profile::Data Profile::GetAndResetData() +{ + Profile::Data ret; + datamutex.lock(); + ret = data; + data.Calls = 0; + data.Sum = 0; + data.Overhead = 0; + data.Start = GetTime(); + datamutex.unlock(); + return ret; +} + + +void Profile::Reset() +{ + datamutex.lock(); + data.Calls = 0; + data.Sum = 0; + data.Overhead = 0; + data.Start = GetTime(); + datamutex.unlock(); +} + + +void Profile::Enter() +{ + EnterTime = GetTime(); +} + + +void Profile::Leave() +{ + uint64 LeaveTime = GetTime(); + datamutex.lock(); + data.Calls += 1; + data.Sum += LeaveTime - EnterTime; + datamutex.unlock(); +} + + +#endif // USE_PROFILER Copied: trunk/OpenMPT/common/Profiler.h (from rev 1813, branches/manx/profiler/common/Profiler.h) =================================================================== --- trunk/OpenMPT/common/Profiler.h (rev 0) +++ trunk/OpenMPT/common/Profiler.h 2013-04-10 20:50:54 UTC (rev 1819) @@ -0,0 +1,116 @@ +/* + * Profiler.h + * ---------- + * Purpose: Performance measuring + * Notes : (currently none) + * Authors: OpenMPT Devs + * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. + */ + + +#pragma once + + +#include "../common/mutex.h" +#include <string> +#include <vector> + + +//#define USE_PROFILER + + +#ifdef USE_PROFILER + +class Profiler +{ +public: + enum Category + { + GUI, + Audio, + Notify, + CategoriesCount + }; + static std::vector<std::string> GetCategoryNames() + { + std::vector<std::string> ret; + ret.push_back("GUI"); + ret.push_back("Audio"); + ret.push_back("Notify"); + return ret; + } +public: + static void Update(); + static std::string DumpProfiles(); + static std::vector<double> DumpCategories(); +}; + + +class Profile +{ +private: + mutable Util::mutex datamutex; +public: + struct Data + { + uint64 Calls; + uint64 Sum; + int64 Overhead; + uint64 Start; + }; +public: + Data data; + uint64 EnterTime; + Profiler::Category Category; + const char * const Name; + uint64 GetTime() const; + uint64 GetFrequency() const; +public: + Profile(Profiler::Category category, const char *name); + ~Profile(); + void Reset(); + void Enter(); + void Leave(); + class Scope + { + private: + Profile &profile; + public: + Scope(Profile &p) : profile(p) { profile.Enter(); } + ~Scope() { profile.Leave(); } + }; +public: + Data GetAndResetData(); +}; + + +#define OPENMPT_PROFILE_SCOPE(cat, name) \ + static Profile OPENMPT_PROFILE_VAR(cat, name);\ + Profile::Scope OPENMPT_PROFILE_SCOPE_VAR(OPENMPT_PROFILE_VAR); \ +/**/ + + +#define OPENMPT_PROFILE_FUNCTION(cat) OPENMPT_PROFILE_SCOPE(cat, __FUNCTION__) + + +#else // !USE_PROFILER + + +class Profiler +{ +public: + enum Category + { + CategoriesCount + }; + static std::vector<std::string> GetCategoryNames() { return std::vector<std::string>(); } +public: + static void Update() { } + static std::string DumpProfiles() { return std::string(); } + static std::vector<double> DumpCategories() { return std::vector<double>(); } +}; +#define OPENMPT_PROFILE_SCOPE(cat, name) do { } while(0) +#define OPENMPT_PROFILE_FUNCTION(cat) do { } while(0) + + +#endif // USE_PROFILER Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2013-04-10 20:47:43 UTC (rev 1818) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2013-04-10 20:50:54 UTC (rev 1819) @@ -35,6 +35,7 @@ #include "SelectPluginDialog.h" #include "ExceptionHandler.h" #include "PatternClipboard.h" +#include "../common/Profiler.h" #ifdef _DEBUG #define new DEBUG_NEW @@ -783,6 +784,7 @@ ULONG CMainFrame::AudioRead(PVOID pvData, ULONG MaxSamples) //--------------------------------------------------------- { + OPENMPT_PROFILE_FUNCTION(Profiler::Audio); return m_pSndFile->Read(pvData, MaxSamples); } @@ -951,6 +953,7 @@ BOOL CMainFrame::DoNotification(DWORD dwSamplesRead, DWORD SamplesLatency, bool endOfStream) //------------------------------------------------------------------------------------------ { + OPENMPT_PROFILE_FUNCTION(Profiler::Notify); int64 notificationtimestamp = 0; { Util::lock_guard<Util::mutex> lock(m_NotificationBufferMutex); // protect m_TotalSamplesRendered @@ -2100,6 +2103,42 @@ m_SoundCardOptionsDialog->UpdateStatistics(); } +#ifdef USE_PROFILER + { + Profiler::Update(); + + CWnd * cwnd = CWnd::FromHandle(this->m_hWndMDIClient); + CClientDC dc(cwnd); + + int height = 16; + int width = 256; + + std::vector<std::string> catnames = Profiler::GetCategoryNames(); + std::vector<double> cats = Profiler::DumpCategories(); + + for(int i=0; i<Profiler::CategoriesCount; i++) + { + dc.FillSolidRect(0, i * height, (int)(width * cats[i]), height, RGB(255,0,0)); + dc.FillSolidRect((int)(width * cats[i]), i * height, width - (int)(width * cats[i]), height, RGB(192,192,192)); + RECT rect; + cwnd->GetClientRect(&rect); + rect.left += width; + rect.top += i * height; + char dummy[1024]; + sprintf(dummy, "%6.3f%% %s", cats[i] * 100.0, catnames[i].c_str()); + dc.DrawText(dummy, strlen(dummy), &rect, DT_LEFT); + } + + std::string dummy = Profiler::DumpProfiles(); + RECT rect; + cwnd->GetClientRect(&rect); + rect.top += Profiler::CategoriesCount * height; + dc.DrawText(dummy.c_str(), dummy.length(), &rect, DT_LEFT); + + cwnd->Detach(); + } +#endif + } @@ -2290,6 +2329,7 @@ LRESULT CMainFrame::OnUpdatePosition(WPARAM, LPARAM lParam) //--------------------------------------------------------- { + OPENMPT_PROFILE_FUNCTION(Profiler::GUI); Notification *pnotify = (Notification *)lParam; if (pnotify) { Modified: trunk/OpenMPT/mptrack/mptrack_08.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_08.vcproj 2013-04-10 20:47:43 UTC (rev 1818) +++ trunk/OpenMPT/mptrack/mptrack_08.vcproj 2013-04-10 20:50:54 UTC (rev 1819) @@ -473,6 +473,10 @@ > </File> <File + RelativePath="..\common\Profiler.cpp" + > + </File> + <File RelativePath="..\common\Reporting.cpp" > </File> @@ -1011,6 +1015,10 @@ > </File> <File + RelativePath="..\common\Profiler.h" + > + </File> + <File RelativePath=".\soundlib\plugins\PluginEventQueue.h" > </File> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2013-04-10 20:47:43 UTC (rev 1818) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2013-04-10 20:50:54 UTC (rev 1819) @@ -246,6 +246,7 @@ <ItemGroup> <ClCompile Include="..\common\AudioCriticalSection.cpp" /> <ClCompile Include="..\common\misc_util.cpp" /> + <ClCompile Include="..\common\Profiler.cpp" /> <ClCompile Include="..\common\Reporting.cpp" /> <ClCompile Include="..\sounddsp\AGC.cpp" /> <ClCompile Include="..\sounddsp\DSP.cpp" /> @@ -403,6 +404,7 @@ <ClInclude Include="..\common\misc_util.h" /> <ClInclude Include="..\common\mptString.h" /> <ClInclude Include="..\common\mutex.h" /> + <ClInclude Include="..\common\Profiler.h" /> <ClInclude Include="..\common\Reporting.h" /> <ClInclude Include="..\common\StringFixer.h" /> <ClInclude Include="..\common\typedefs.h" /> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2013-04-10 20:47:43 UTC (rev 1818) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2013-04-10 20:50:54 UTC (rev 1819) @@ -430,6 +430,9 @@ <ClCompile Include="..\sounddsp\AGC.cpp"> <Filter>Source Files\sounddsp</Filter> </ClCompile> + <ClCompile Include="..\common\Profiler.cpp"> + <Filter>Source Files</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="AbstractVstEditor.h"> @@ -786,6 +789,9 @@ <ClInclude Include="Notification.h"> <Filter>Header Files</Filter> </ClInclude> + <ClInclude Include="..\common\Profiler.h"> + <Filter>Header Files</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <None Include="res\bitmap1.bmp"> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-04-10 22:27:21
|
Revision: 1826 http://sourceforge.net/p/modplug/code/1826 Author: manxorist Date: 2013-04-10 22:27:14 +0000 (Wed, 10 Apr 2013) Log Message: ----------- [Ref] Replace superfluous flag m_bITBidiMode with a member function IsITPingPongMode(). Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/soundlib/Fastmix.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2013-04-10 21:34:00 UTC (rev 1825) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2013-04-10 22:27:14 UTC (rev 1826) @@ -1414,8 +1414,6 @@ const bool bPatLoop = m_pSndFile->m_SongFlags[SONG_PATTERNLOOP]; m_pSndFile->ResetChannels(); - // Select correct bidi loop mode when playing a module. - m_pSndFile->SetupITBidiMode(); if(!bPatLoop && bPaused) pSndFile->m_SongFlags.set(SONG_PAUSED); pSndFile->SetRepeatCount((TrackerSettings::Instance().gbLoopSong) ? -1 : 0); Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2013-04-10 21:34:00 UTC (rev 1825) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2013-04-10 22:27:14 UTC (rev 1826) @@ -378,8 +378,6 @@ sndFile.m_nDefaultRowsPerBeat = GetDlgItemInt(IDC_ROWSPERBEAT); sndFile.m_nDefaultRowsPerMeasure = GetDlgItemInt(IDC_ROWSPERMEASURE); - sndFile.SetupITBidiMode(); - if(CChannelManagerDlg::sharedInstance(FALSE) && CChannelManagerDlg::sharedInstance()->IsDisplayed()) CChannelManagerDlg::sharedInstance()->Update(); CDialog::OnOK(); Modified: trunk/OpenMPT/soundlib/Fastmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Fastmix.cpp 2013-04-10 21:34:00 UTC (rev 1825) +++ trunk/OpenMPT/soundlib/Fastmix.cpp 2013-04-10 22:27:14 UTC (rev 1826) @@ -1461,6 +1461,7 @@ if (!count) return 0; BOOL bSurround; + bool ITPingPongMode = IsITPingPongMode(); if (gnChannels > 2) X86_InitMixBuffer(MixRearBuffer, count*2); nchused = nchmixed = 0; for (UINT nChn=0; nChn<m_nMixChannels; nChn++) @@ -1559,7 +1560,7 @@ { if ((LONG)nrampsamples > pChannel->nRampLength) nrampsamples = pChannel->nRampLength; } - if ((nSmpCount = GetSampleCount(pChannel, nrampsamples, m_bITBidiMode)) <= 0) + if ((nSmpCount = GetSampleCount(pChannel, nrampsamples, ITPingPongMode)) <= 0) { // Stopping the channel pChannel->pCurrentSample = NULL; Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2013-04-10 21:34:00 UTC (rev 1825) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2013-04-10 22:27:14 UTC (rev 1826) @@ -445,7 +445,6 @@ #endif // MODPLUG_TRACKER m_ModFlags.reset(); - m_bITBidiMode = false; m_dwLastSavedWithVersion=0; m_dwCreatedWithVersion=0; @@ -1698,7 +1697,6 @@ return; SetupMODPanning(); // Setup LRRL panning scheme if needed - SetupITBidiMode(); // Setup IT bidi mode m_ModFlags = m_ModFlags & GetModFlagMask(oldtype, newType); @@ -1943,14 +1941,6 @@ } -// Set or unset the IT bidi loop mode (see Fastmix.cpp for an explanation). The variable has to be static... -void CSoundFile::SetupITBidiMode() -//-------------------------------- -{ - m_bITBidiMode = IsCompatibleMode(TRK_IMPULSETRACKER); -} - - // For old files made with MPT that don't have m_ModFlags set yet, set the flags appropriately. void CSoundFile::UpgradeModFlags() //-------------------------------- Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2013-04-10 21:34:00 UTC (rev 1825) +++ trunk/OpenMPT/soundlib/Sndfile.h 2013-04-10 22:27:14 UTC (rev 1826) @@ -188,6 +188,12 @@ return ((GetType() & type) && GetModFlag(MSF_COMPATIBLE_PLAY)); } + // Process pingpong loops like Impulse Tracker (see Fastmix.cpp for an explanation) + bool IsITPingPongMode() const + { + return IsCompatibleMode(TRK_IMPULSETRACKER); + } + // Check whether a filter algorithm closer to IT's should be used. bool UseITFilterMode() const { return IsCompatibleMode(TRK_IMPULSETRACKER) && !m_SongFlags[SONG_EXFILTERRANGE]; } @@ -235,7 +241,6 @@ private: //Misc data FlagSet<ModSpecificFlag, uint16> m_ModFlags; const CModSpecifications* m_pModSpecs; - bool m_bITBidiMode; // Process bidi loops like Impulse Tracker (see Fastmix.cpp for an explanation) public: // Static Members #ifndef NO_REVERB @@ -398,8 +403,6 @@ bool IsPaused() const { return m_SongFlags[SONG_PAUSED | SONG_STEP]; } // Added SONG_STEP as it seems to be desirable in most cases to check for this as well. void LoopPattern(PATTERNINDEX nPat, ROWINDEX nRow = 0); - void SetupITBidiMode(); - bool InitChannel(CHANNELINDEX nChn); // Module Loaders This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-04-10 23:07:38
|
Revision: 1830 http://sourceforge.net/p/modplug/code/1830 Author: manxorist Date: 2013-04-10 23:07:30 +0000 (Wed, 10 Apr 2013) Log Message: ----------- [Ref] Integrate tiny class CPlaybackEventer directly into CSoundFile Modified Paths: -------------- trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/mptrack_08.vcproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h Removed Paths: ------------- trunk/OpenMPT/soundlib/PlaybackEventer.cpp trunk/OpenMPT/soundlib/PlaybackEventer.h Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2013-04-10 22:44:03 UTC (rev 1829) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2013-04-10 23:07:30 UTC (rev 1830) @@ -6392,7 +6392,7 @@ CSoundFile *pSndFile = GetSoundFile(); if(pSndFile != nullptr) { - GetSoundFile()->GetPlaybackEventer().PatternTransitionChnUnmuteAll(); + GetSoundFile()->PatternTransitionChnUnmuteAll(); InvalidateChannelsHeaders(); } } @@ -6405,7 +6405,7 @@ CSoundFile *pSndFile = GetSoundFile(); if(pSndFile != nullptr) { - GetSoundFile()->GetPlaybackEventer().PatternTranstionChnSolo(nChn); + GetSoundFile()->PatternTranstionChnSolo(nChn); InvalidateChannelsHeaders(); } } Modified: trunk/OpenMPT/mptrack/mptrack_08.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_08.vcproj 2013-04-10 22:44:03 UTC (rev 1829) +++ trunk/OpenMPT/mptrack/mptrack_08.vcproj 2013-04-10 23:07:30 UTC (rev 1830) @@ -469,10 +469,6 @@ > </File> <File - RelativePath="..\soundlib\PlaybackEventer.cpp" - > - </File> - <File RelativePath="..\common\Profiler.cpp" > </File> @@ -1011,10 +1007,6 @@ > </File> <File - RelativePath="..\soundlib\PlaybackEventer.h" - > - </File> - <File RelativePath="..\common\Profiler.h" > </File> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2013-04-10 22:44:03 UTC (rev 1829) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2013-04-10 23:07:30 UTC (rev 1830) @@ -324,7 +324,6 @@ <ClCompile Include="PatternClipboard.cpp" /> <ClCompile Include="PatternEditorDialogs.cpp" /> <ClCompile Include="PatternGotoDialog.cpp" /> - <ClCompile Include="..\soundlib\PlaybackEventer.cpp" /> <ClCompile Include="PSRatioCalc.cpp" /> <ClCompile Include="SampleEditorDialogs.cpp" /> <ClCompile Include="ScaleEnvPointsDlg.cpp" /> @@ -483,7 +482,6 @@ <ClInclude Include="..\soundlib\patternContainer.h" /> <ClInclude Include="PatternEditorDialogs.h" /> <ClInclude Include="PatternGotoDialog.h" /> - <ClInclude Include="..\soundlib\PlaybackEventer.h" /> <ClInclude Include="PSRatioCalc.h" /> <ClInclude Include="Resource.h" /> <ClInclude Include="SampleEditorDialogs.h" /> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2013-04-10 22:44:03 UTC (rev 1829) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2013-04-10 23:07:30 UTC (rev 1830) @@ -283,9 +283,6 @@ <ClCompile Include="PatternGotoDialog.cpp"> <Filter>Source Files\Dialogs</Filter> </ClCompile> - <ClCompile Include="..\soundlib\PlaybackEventer.cpp"> - <Filter>Source Files</Filter> - </ClCompile> <ClCompile Include="..\soundlib\patternContainer.cpp"> <Filter>Source Files</Filter> </ClCompile> @@ -603,9 +600,6 @@ <ClInclude Include="..\soundlib\pattern.h"> <Filter>Header Files</Filter> </ClInclude> - <ClInclude Include="..\soundlib\PlaybackEventer.h"> - <Filter>Header Files</Filter> - </ClInclude> <ClInclude Include="Resource.h"> <Filter>Header Files</Filter> </ClInclude> Deleted: trunk/OpenMPT/soundlib/PlaybackEventer.cpp =================================================================== --- trunk/OpenMPT/soundlib/PlaybackEventer.cpp 2013-04-10 22:44:03 UTC (rev 1829) +++ trunk/OpenMPT/soundlib/PlaybackEventer.cpp 2013-04-10 23:07:30 UTC (rev 1830) @@ -1,37 +0,0 @@ -/* - * PlaybackEventer.cpp - * ------------------- - * Purpose: Class for scheduling playback events such as muting channels on pattern transitions. - * Notes : (currently none) - * Authors: OpenMPT Devs - * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. - */ - - -#include "stdafx.h" -#include "PlaybackEventer.h" -#include "sndfile.h" - - -void CPlaybackEventer::PatternTranstionChnSolo(const CHANNELINDEX chnIndex) -//------------------------------------------------------------------------- -{ - if(chnIndex >= m_rSndFile.m_nChannels) - return; - - for(CHANNELINDEX i = 0; i<m_rSndFile.m_nChannels; i++) - { - m_rSndFile.m_bChannelMuteTogglePending[i] = !m_rSndFile.ChnSettings[i].dwFlags[CHN_MUTE]; - } - m_rSndFile.m_bChannelMuteTogglePending[chnIndex] = m_rSndFile.ChnSettings[chnIndex].dwFlags[CHN_MUTE]; -} - - -void CPlaybackEventer::PatternTransitionChnUnmuteAll() -//---------------------------------------------------- -{ - for(CHANNELINDEX i = 0; i<m_rSndFile.m_nChannels; i++) - { - m_rSndFile.m_bChannelMuteTogglePending[i] = m_rSndFile.ChnSettings[i].dwFlags[CHN_MUTE]; - } -} Deleted: trunk/OpenMPT/soundlib/PlaybackEventer.h =================================================================== --- trunk/OpenMPT/soundlib/PlaybackEventer.h 2013-04-10 22:44:03 UTC (rev 1829) +++ trunk/OpenMPT/soundlib/PlaybackEventer.h 2013-04-10 23:07:30 UTC (rev 1830) @@ -1,28 +0,0 @@ -/* - * PlaybackEventer.h - * ----------------- - * Purpose: Class for scheduling playback events such as muting channels on pattern transitions. - * Notes : (currently none) - * Authors: OpenMPT Devs - * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. - */ - - -#pragma once - -#include "Snd_defs.h" -class CSoundFile; - -//==================== -class CPlaybackEventer -//==================== -{ -public: - CPlaybackEventer(CSoundFile &sndf) : m_rSndFile(sndf) {} - - void PatternTranstionChnSolo(const CHANNELINDEX chnIndex); - void PatternTransitionChnUnmuteAll(); - -private: - CSoundFile &m_rSndFile; -}; Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2013-04-10 22:44:03 UTC (rev 1829) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2013-04-10 23:07:30 UTC (rev 1830) @@ -410,7 +410,6 @@ CSoundFile::CSoundFile() : Patterns(*this), Order(*this), - m_PlaybackEventer(*this), m_pModSpecs(&ModSpecs::itEx), m_MIDIMapper(*this), visitedSongRows(*this) @@ -1207,7 +1206,30 @@ } +void CSoundFile::PatternTranstionChnSolo(const CHANNELINDEX chnIndex) +//------------------------------------------------------------------------- +{ + if(chnIndex >= m_nChannels) + return; + for(CHANNELINDEX i = 0; i<m_nChannels; i++) + { + m_bChannelMuteTogglePending[i] = !ChnSettings[i].dwFlags[CHN_MUTE]; + } + m_bChannelMuteTogglePending[chnIndex] = ChnSettings[chnIndex].dwFlags[CHN_MUTE]; +} + + +void CSoundFile::PatternTransitionChnUnmuteAll() +//---------------------------------------------------- +{ + for(CHANNELINDEX i = 0; i<m_nChannels; i++) + { + m_bChannelMuteTogglePending[i] = ChnSettings[i].dwFlags[CHN_MUTE]; + } +} + + void CSoundFile::LoopPattern(PATTERNINDEX nPat, ROWINDEX nRow) //------------------------------------------------------------ { Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2013-04-10 22:44:03 UTC (rev 1829) +++ trunk/OpenMPT/soundlib/Sndfile.h 2013-04-10 23:07:30 UTC (rev 1830) @@ -78,7 +78,6 @@ #include "pattern.h" #include "patternContainer.h" #include "ModSequence.h" -#include "PlaybackEventer.h" // Line ending types (for reading song messages from module files) @@ -214,9 +213,7 @@ static CTuningCollection* s_pTuningsSharedLocal; //<--Tuning -public: //Get 'controllers' - CPlaybackEventer& GetPlaybackEventer() {return m_PlaybackEventer;} - const CPlaybackEventer& GetPlaybackEventer() const {return m_PlaybackEventer;} +public: // get 'controllers' #ifdef MODPLUG_TRACKER CMIDIMapper& GetMIDIMapper() {return m_MIDIMapper;} @@ -232,7 +229,6 @@ ModSpecificFlag GetModFlagMask(MODTYPE oldtype, MODTYPE newtype) const; private: //'Controllers' - CPlaybackEventer m_PlaybackEventer; #ifdef MODPLUG_TRACKER CMIDIMapper m_MIDIMapper; @@ -375,6 +371,8 @@ const CModSpecifications& GetModSpecifications() const {return *m_pModSpecs;} static const CModSpecifications& GetModSpecifications(const MODTYPE type); + void PatternTranstionChnSolo(const CHANNELINDEX chnIndex); + void PatternTransitionChnUnmuteAll(); double GetCurrentBPM() const; void DontLoopPattern(PATTERNINDEX nPat, ROWINDEX nRow = 0); //rewbs.playSongFromCursor void SetCurrentPos(UINT nPos); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-04-11 14:29:19
|
Revision: 1834 http://sourceforge.net/p/modplug/code/1834 Author: manxorist Date: 2013-04-11 14:29:08 +0000 (Thu, 11 Apr 2013) Log Message: ----------- [Ref] At a bunch of places in CSoundFile, #ifdef MODPLUG_TRACKER was checked in case where log message were to be added to the CModDoc log. Add an AddToLog function directly to CSoundFile and do the #ifdef MODPLUG_TRACKER check there. Log to std::clog otherwise. [Ref] Replace the open-coded strcpy'ing and reallocating of the log in CModDoc with a straigt std::vector<std::string> instead. [Ref] Remove AddLogEvent and convert its single usage site to AddToLog. [Ref] Make log messages consistent, they should not contain a \n at the end. Modified Paths: -------------- trunk/OpenMPT/common/Reporting.cpp trunk/OpenMPT/common/misc_util.cpp trunk/OpenMPT/common/misc_util.h trunk/OpenMPT/mptrack/CleanupSong.cpp trunk/OpenMPT/mptrack/MPTHacks.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_mo3.cpp trunk/OpenMPT/soundlib/Load_mod.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/ModSequence.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h Modified: trunk/OpenMPT/common/Reporting.cpp =================================================================== --- trunk/OpenMPT/common/Reporting.cpp 2013-04-11 10:40:13 UTC (rev 1833) +++ trunk/OpenMPT/common/Reporting.cpp 2013-04-11 14:29:08 UTC (rev 1834) @@ -41,7 +41,7 @@ return result; #else - std::cout << caption << std::endl << text << std::endl; + std::clog << caption << std::endl << text << std::endl; return 0; #endif // MODPLUG_TRACKER } Modified: trunk/OpenMPT/common/misc_util.cpp =================================================================== --- trunk/OpenMPT/common/misc_util.cpp 2013-04-11 10:40:13 UTC (rev 1833) +++ trunk/OpenMPT/common/misc_util.cpp 2013-04-11 14:29:08 UTC (rev 1834) @@ -65,13 +65,6 @@ #endif // MODPLUG_TRACKER -std::basic_string<TCHAR> Util::sdTime::GetDateTimeStr() -{ - time_t t; - std::time(&t); - return _tctime(&t); -} - time_t Util::sdTime::MakeGmTime(tm& timeUtc) { return _mkgmtime(&timeUtc); Modified: trunk/OpenMPT/common/misc_util.h =================================================================== --- trunk/OpenMPT/common/misc_util.h 2013-04-11 10:40:13 UTC (rev 1833) +++ trunk/OpenMPT/common/misc_util.h 2013-04-11 14:29:08 UTC (rev 1834) @@ -355,8 +355,6 @@ #ifdef MODPLUG_TRACKER namespace Util { namespace sdTime { - // Returns string containing date and time ended with newline. - std::basic_string<TCHAR> GetDateTimeStr(); time_t MakeGmTime(tm& timeUtc); Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp =================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.cpp 2013-04-11 10:40:13 UTC (rev 1833) +++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2013-04-11 14:29:08 UTC (rev 1834) @@ -505,7 +505,7 @@ modDoc.GetPatternUndo().ClearUndo(); if (nPatRemoved) { - wsprintf(s, "%d pattern%s removed.\n", nPatRemoved, (nPatRemoved == 1) ? "" : "s"); + wsprintf(s, "%d pattern%s removed.", nPatRemoved, (nPatRemoved == 1) ? "" : "s"); modDoc.AddToLog(s); } return true; @@ -555,7 +555,7 @@ if(nRemoved > 0) { - wsprintf(s, "%d unused sample%s removed\n" , nRemoved, (nRemoved == 1) ? "" : "s"); + wsprintf(s, "%d unused sample%s removed" , nRemoved, (nRemoved == 1) ? "" : "s"); modDoc.AddToLog(s); } @@ -622,7 +622,7 @@ } } } - wsprintf(s, "%d sample loop%s optimized\n" ,numLoopOpt, (numLoopOpt == 1) ? "" : "s"); + wsprintf(s, "%d sample loop%s optimized" ,numLoopOpt, (numLoopOpt == 1) ? "" : "s"); modDoc.AddToLog(s); return true; } @@ -734,7 +734,7 @@ EndWaitCursor(); char s[64]; - wsprintf(s, "%d unused instrument%s removed\n", numRemoved, (numRemoved == 1) ? "" : "s"); + wsprintf(s, "%d unused instrument%s removed", numRemoved, (numRemoved == 1) ? "" : "s"); modDoc.AddToLog(s); return true; } Modified: trunk/OpenMPT/mptrack/MPTHacks.cpp =================================================================== --- trunk/OpenMPT/mptrack/MPTHacks.cpp 2013-04-11 10:40:13 UTC (rev 1833) +++ trunk/OpenMPT/mptrack/MPTHacks.cpp 2013-04-11 14:29:08 UTC (rev 1834) @@ -175,7 +175,7 @@ } bool foundHacks = false, foundHere = false; - CString message; + mpt::String message; ClearLog(); // Check for plugins @@ -190,7 +190,7 @@ // REQUIRES AUTOFIX } if(foundHere) - AddToLog("Found plugins\n"); + AddToLog("Found plugins"); // Check for invalid order items for(ORDERINDEX i = m_SndFile.Order.GetLengthTailTrimmed(); i > 0; i--) @@ -198,7 +198,7 @@ if(m_SndFile.Order[i - 1] == m_SndFile.Order.GetIgnoreIndex() && !originalSpecs->hasIgnoreIndex) { foundHacks = true; - AddToLog("This format does not support separator (+++) patterns\n"); + AddToLog("This format does not support separator (+++) patterns"); if(autofix) { @@ -212,7 +212,7 @@ if((m_SndFile.GetType() & (MOD_TYPE_MOD | MOD_TYPE_XM)) && m_SndFile.Order.GetLengthFirstEmpty() != m_SndFile.Order.GetLengthTailTrimmed()) { foundHacks = true; - AddToLog("The pattern sequence should end after the first stop (---) index in this format.\n"); + AddToLog("The pattern sequence should end after the first stop (---) index in this format."); if(autofix) { @@ -234,7 +234,7 @@ // Pattern count if(m_SndFile.Patterns.GetNumPatterns() > originalSpecs->patternsMax) { - message.Format("Found too many patterns (%d allowed)\n", originalSpecs->patternsMax); + message.Format("Found too many patterns (%d allowed)", originalSpecs->patternsMax); AddToLog(message); foundHacks = true; // REQUIRES (INTELLIGENT) AUTOFIX @@ -273,7 +273,7 @@ } if(foundHere) { - message.Format("Found incompatible pattern lengths (must be between %d and %d rows)\n", originalSpecs->patternRowsMin, originalSpecs->patternRowsMax); + message.Format("Found incompatible pattern lengths (must be between %d and %d rows)", originalSpecs->patternRowsMin, originalSpecs->patternRowsMax); AddToLog(message); } @@ -282,14 +282,14 @@ m_SndFile.Patterns.ForEachModCommand(FixHackedPatterns(originalSpecs, m_SndFile.GetType(), autofix, &foundHere)); if(foundHere) { - AddToLog("Found invalid pattern commands\n"); + AddToLog("Found invalid pattern commands"); foundHacks = true; } // Check for pattern names if(m_SndFile.Patterns.GetNumNamedPatterns() > 0 && !originalSpecs->hasPatternNames) { - AddToLog("Found pattern names\n"); + AddToLog("Found pattern names"); foundHacks = true; if(autofix) { @@ -303,7 +303,7 @@ // Check for too many channels if(m_SndFile.GetNumChannels() > originalSpecs->channelsMax || m_SndFile.GetNumChannels() < originalSpecs->channelsMin) { - message.Format("Found incompatible channel count (must be between %d and %d channels)\n", originalSpecs->channelsMin, originalSpecs->channelsMax); + message.Format("Found incompatible channel count (must be between %d and %d channels)", originalSpecs->channelsMin, originalSpecs->channelsMax); AddToLog(message); foundHacks = true; if(autofix) @@ -329,12 +329,12 @@ } } if(foundHere) - AddToLog("Found channel names\n"); + AddToLog("Found channel names"); // Check for too many samples if(m_SndFile.GetNumSamples() > originalSpecs->samplesMax) { - message.Format("Found too many samples (%d allowed)\n", originalSpecs->samplesMax); + message.Format("Found too many samples (%d allowed)", originalSpecs->samplesMax); AddToLog(message); foundHacks = true; // REQUIRES (INTELLIGENT) AUTOFIX @@ -358,12 +358,12 @@ } } if(foundHere) - AddToLog("Stereo samples are not supported in the original XM format\n"); + AddToLog("Stereo samples are not supported in the original XM format"); // Check for too many instruments if(m_SndFile.GetNumInstruments() > originalSpecs->instrumentsMax) { - message.Format("Found too many instruments (%d allowed)\n", originalSpecs->instrumentsMax); + message.Format("Found too many instruments (%d allowed)", originalSpecs->instrumentsMax); AddToLog(message); foundHacks = true; // REQUIRES (INTELLIGENT) AUTOFIX @@ -407,14 +407,14 @@ foundHacks |= foundEnvelopes; } if(foundHere) - AddToLog("Found MPT instrument extensions\n"); + AddToLog("Found MPT instrument extensions"); if(foundEnvelopes) - AddToLog("Two envelope points may not share the same tick.\n"); + AddToLog("Two envelope points may not share the same tick."); // Check for too many orders if(m_SndFile.Order.GetLengthTailTrimmed() > originalSpecs->ordersMax) { - message.Format("Found too many orders (%d allowed)\n", originalSpecs->ordersMax); + message.Format("Found too many orders (%d allowed)", originalSpecs->ordersMax); AddToLog(message); foundHacks = true; // REQUIRES (INTELLIGENT) AUTOFIX @@ -423,7 +423,7 @@ // Check for invalid default tempo if(m_SndFile.m_nDefaultTempo > originalSpecs->tempoMax || m_SndFile.m_nDefaultTempo < originalSpecs->tempoMin) { - message.Format("Found incompatible default tempo (must be between %d and %d)\n", originalSpecs->tempoMin, originalSpecs->tempoMax); + message.Format("Found incompatible default tempo (must be between %d and %d)", originalSpecs->tempoMin, originalSpecs->tempoMax); AddToLog(message); foundHacks = true; if(autofix) @@ -433,7 +433,7 @@ // Check for invalid default speed if(m_SndFile.m_nDefaultSpeed > originalSpecs->speedMax || m_SndFile.m_nDefaultSpeed < originalSpecs->speedMin) { - message.Format("Found incompatible default speed (must be between %d and %d)\n", originalSpecs->speedMin, originalSpecs->speedMax); + message.Format("Found incompatible default speed (must be between %d and %d)", originalSpecs->speedMin, originalSpecs->speedMax); AddToLog(message); foundHacks = true; if(autofix) @@ -443,7 +443,7 @@ // Check for invalid rows per beat / measure values if(m_SndFile.m_nDefaultRowsPerBeat >= originalSpecs->patternRowsMax || m_SndFile.m_nDefaultRowsPerMeasure >= originalSpecs->patternRowsMax) { - AddToLog("Found incompatible rows per beat / measure\n"); + AddToLog("Found incompatible rows per beat / measure"); foundHacks = true; if(autofix) { @@ -461,7 +461,7 @@ if(m_SndFile.Patterns[i].GetOverrideSignature()) { if(!foundHere) - AddToLog("Found pattern-specific time signatures\n"); + AddToLog("Found pattern-specific time signatures"); if(autofix) m_SndFile.Patterns[i].RemoveSignature(); @@ -476,7 +476,7 @@ // Check for new tempo modes if(m_SndFile.m_nTempoMode != tempo_mode_classic) { - AddToLog("Found incompatible tempo mode (only classic tempo mode allowed)\n"); + AddToLog("Found incompatible tempo mode (only classic tempo mode allowed)"); foundHacks = true; if(autofix) m_SndFile.m_nTempoMode = tempo_mode_classic; @@ -485,7 +485,7 @@ // Check for extended filter range flag if(m_SndFile.m_SongFlags[SONG_EXFILTERRANGE]) { - AddToLog("Found extended filter range\n"); + AddToLog("Found extended filter range"); foundHacks = true; if(autofix) m_SndFile.m_SongFlags.reset(SONG_EXFILTERRANGE); @@ -494,7 +494,7 @@ // Embedded MIDI configuration in XM files if(m_SndFile.m_SongFlags[SONG_EMBEDMIDICFG] != 0 && m_SndFile.GetType() == MOD_TYPE_XM) { - AddToLog("Found embedded MIDI macros\n"); + AddToLog("Found embedded MIDI macros"); foundHacks = true; if(autofix) { @@ -506,7 +506,7 @@ // Player flags if((m_SndFile.GetType() & (MOD_TYPE_XM|MOD_TYPE_IT)) && !m_SndFile.GetModFlag(MSF_COMPATIBLE_PLAY)) { - AddToLog("Compatible play is deactivated\n"); + AddToLog("Compatible play is deactivated"); foundHacks = true; if(autofix) m_SndFile.SetModFlag(MSF_COMPATIBLE_PLAY, true); @@ -515,7 +515,7 @@ // Check for restart position where it should not be if(m_SndFile.m_nRestartPos > 0 && !originalSpecs->hasRestartPos) { - AddToLog("Found restart position\n"); + AddToLog("Found restart position"); foundHacks = true; if(autofix) { @@ -525,7 +525,7 @@ if(m_SndFile.m_nMixLevels != mixLevels_compatible) { - AddToLog("Found incorrect mix levels (only compatible mix levels allowed)\n"); + AddToLog("Found incorrect mix levels (only compatible mix levels allowed)"); foundHacks = true; if(autofix) m_SndFile.m_nMixLevels = mixLevels_compatible; Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2013-04-11 10:40:13 UTC (rev 1833) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2013-04-11 14:29:08 UTC (rev 1834) @@ -122,7 +122,6 @@ //------------------------------------------------------------ { m_bHasValidPath = false; - m_lpszLog = NULL; m_hWndFollow = NULL; m_notifyType = Notification::Default; @@ -222,10 +221,10 @@ EndWaitCursor(); // Show log messages from loaders. - if (GetLog() != nullptr) + if (GetLog().size() > 0) { CString sTemp; - sTemp.Format("File: %s\nLast saved with: %s, your version is %s\n\n%s", lpszPathName, (LPCTSTR)MptVersion::ToStr(m_SndFile.m_dwLastSavedWithVersion), MptVersion::str, GetLog()); + sTemp.Format("File: %s\nLast saved with: %s, your version is %s\n\n%s", lpszPathName, (LPCTSTR)MptVersion::ToStr(m_SndFile.m_dwLastSavedWithVersion), MptVersion::str, GetLogString()); Reporting::Information(sTemp); ClearLog(); } @@ -810,72 +809,40 @@ } -void CModDoc::AddLogEvent(LogEventType eventType, LPCTSTR pszFuncName, LPCTSTR pszFormat, ...) -//-------------------------------------------------------------------------------------------- +void CModDoc::AddToLog(const std::string &text) +//--------------------------------------------- { - CString strMsg; - va_list args; - va_start(args, pszFormat); - strMsg.FormatV(pszFormat, args); - va_end(args); - - m_logEvents << Util::sdTime::GetDateTimeStr() - << _T("Event type: ") << eventType << std::endl - << _T("Function: ") << pszFuncName << std::endl - << _T("Message: ") << strMsg << std::endl << std::endl; + m_Log.push_back(text); } -BOOL CModDoc::AddToLog(LPCSTR lpszLog) -//------------------------------------ +std::string CModDoc::GetLogString() const +//--------------------------------------- { - UINT len; - if ((!lpszLog) || (!lpszLog[0])) return FALSE; - len = strlen(lpszLog); - if (m_lpszLog) + std::ostringstream ret; + for(std::vector<std::string>::const_iterator i=m_Log.begin(); i!=m_Log.end(); ++i) { - LPSTR p = new CHAR[strlen(m_lpszLog)+len+2]; - if (p) - { - strcpy(p, m_lpszLog); - strcat(p, lpszLog); - delete[] m_lpszLog; - m_lpszLog = p; - } - } else - { - m_lpszLog = new CHAR[len+2]; - if (m_lpszLog) strcpy(m_lpszLog, lpszLog); + ret << *i << std::endl; } - return TRUE; + return ret.str(); } -BOOL CModDoc::ClearLog() +void CModDoc::ClearLog() //---------------------- { - if (m_lpszLog) - { - delete[] m_lpszLog; - m_lpszLog = NULL; - } - return TRUE; + m_Log.clear(); } UINT CModDoc::ShowLog(LPCSTR lpszTitle, CWnd *parent) //--------------------------------------------------- { - if (!lpszTitle) lpszTitle = MAINFRAME_TITLE; - if (m_lpszLog) + if(!lpszTitle) lpszTitle = MAINFRAME_TITLE; + if(GetLog().size() > 0) { -#if 0 - CShowLogDlg dlg(parent); - return dlg.ShowLog(m_lpszLog, lpszTitle); -#else - Reporting::Information(m_lpszLog, lpszTitle, parent); + Reporting::Information(GetLogString().c_str(), lpszTitle, parent); return IDOK; -#endif } return IDCANCEL; } @@ -2530,7 +2497,7 @@ { if(!HasMPTHacks()) { - AddToLog("No hacks found.\n"); + AddToLog("No hacks found."); } ShowLog(); ClearLog(); Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2013-04-11 10:40:13 UTC (rev 1833) +++ trunk/OpenMPT/mptrack/Moddoc.h 2013-04-11 14:29:08 UTC (rev 1834) @@ -137,11 +137,6 @@ } }; -enum LogEventType -{ - LogEventUnexpectedError -}; - enum InputTargetContext; //============================= @@ -149,8 +144,7 @@ //============================= { protected: - LPSTR m_lpszLog; - std::basic_ostringstream<TCHAR> m_logEvents; // Log for general progress and error events. + std::vector<std::string> m_Log; CSoundFile m_SndFile; HWND m_hWndFollow; @@ -194,15 +188,15 @@ MODTYPE GetModType() const { return m_SndFile.m_nType; } INSTRUMENTINDEX GetNumInstruments() const { return m_SndFile.m_nInstruments; } SAMPLEINDEX GetNumSamples() const { return m_SndFile.m_nSamples; } - BOOL AddToLog(LPCSTR lpszLog); - LPCSTR GetLog() const { return m_lpszLog; } - BOOL ClearLog(); + + // Logging for general progress and error events. + void AddToLog(const std::string &text); + const std::vector<std::string> & GetLog() const { return m_Log; } + std::string GetLogString() const; + void ClearLog(); UINT ShowLog(LPCSTR lpszTitle=NULL, CWnd *parent=NULL); void ClearFilePath() { m_strPathName.Empty(); } - // Logging for general progress and error events. - void AddLogEvent(LogEventType eventType, LPCTSTR pszFuncName, LPCTSTR pszFormat, ...); - void ViewPattern(UINT nPat, UINT nOrd); void ViewSample(UINT nSmp); void ViewInstrument(UINT nIns); Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2013-04-11 10:40:13 UTC (rev 1833) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2013-04-11 14:29:08 UTC (rev 1834) @@ -22,10 +22,10 @@ #define str_tooMuchPatternData (GetStrI18N((_TEXT("Warning: File format limit was reached. Some pattern data may not get written to file.")))) #define str_pattern (GetStrI18N((_TEXT("pattern")))) -#define str_PatternSetTruncationNote (GetStrI18N((_TEXT("The module contains %u patterns but only %u patterns can be loaded in this OpenMPT version.\n")))) -#define str_SequenceTruncationNote (GetStrI18N((_TEXT("Module has sequence of length %u; it will be truncated to maximum supported length, %u.\n")))) -#define str_LoadingIncompatibleVersion TEXT("The file informed that it is incompatible with this version of OpenMPT. Loading was terminated.\n") -#define str_LoadingMoreRecentVersion TEXT("The loaded file was made with a more recent OpenMPT version and this version may not be able to load all the features or play the file correctly.\n") +#define str_PatternSetTruncationNote (GetStrI18N((_TEXT("The module contains %u patterns but only %u patterns can be loaded in this OpenMPT version.")))) +#define str_SequenceTruncationNote (GetStrI18N((_TEXT("Module has sequence of length %u; it will be truncated to maximum supported length, %u.")))) +#define str_LoadingIncompatibleVersion TEXT("The file informed that it is incompatible with this version of OpenMPT. Loading was terminated.") +#define str_LoadingMoreRecentVersion TEXT("The loaded file was made with a more recent OpenMPT version and this version may not be able to load all the features or play the file correctly.") const uint16 verMptFileVer = 0x891; const uint16 verMptFileVerLoadLimit = 0x1000; // If cwtv-field is greater or equal to this value, @@ -109,10 +109,7 @@ TNTS_MAP_ITER iter = tNameToShort_Map.find(sf.Instruments[i]->pTuning); if(iter == tNameToShort_Map.end()) //Should never happen { -#ifdef MODPLUG_TRACKER - if(sf.GetpModDoc()) - sf.GetpModDoc()->AddToLog(_T("Error: 210807_1\n")); -#endif // MODPLUG_TRACKER + sf.AddToLog("Error: 210807_1"); return; } srlztn::Binarywrite(oStrm, iter->second); @@ -198,11 +195,11 @@ if(iter == notFoundTunings.end()) { notFoundTunings.push_back(str); + std::string erm = std::string("Tuning ") + str + std::string(" used by the module was not found."); + csf.AddToLog(erm); #ifdef MODPLUG_TRACKER if(csf.GetpModDoc() != nullptr) { - string erm = string("Tuning ") + str + string(" used by the module was not found.\n"); - csf.GetpModDoc()->AddToLog(erm.c_str()); csf.GetpModDoc()->SetModified(); //The tuning is changed so the modified flag is set. } #endif // MODPLUG_TRACKER @@ -361,14 +358,12 @@ { if (fileHeader.cwtv >= verMptFileVerLoadLimit) { - if(GetpModDoc()) - GetpModDoc()->AddToLog(str_LoadingIncompatibleVersion); + AddToLog(str_LoadingIncompatibleVersion); return false; } else if (fileHeader.cwtv > verMptFileVer) { - if(GetpModDoc()) - GetpModDoc()->AddToLog(str_LoadingMoreRecentVersion); + AddToLog(str_LoadingMoreRecentVersion); } } } @@ -431,11 +426,9 @@ ORDERINDEX ordSize = fileHeader.ordnum; if(fileHeader.ordnum > GetModSpecifications().ordersMax) { -#ifdef MODPLUG_TRACKER - CString str; + mpt::String str; str.Format(str_SequenceTruncationNote, fileHeader.ordnum, GetModSpecifications().ordersMax); - if(GetpModDoc() != nullptr) GetpModDoc()->AddToLog(str); -#endif // MODPLUG_TRACKER + AddToLog(str); ordSize = GetModSpecifications().ordersMax; } @@ -663,14 +656,9 @@ if(numPats != patPos.size()) { // Hack: Notify user here if file contains more patterns than what can be read. -#ifdef MODPLUG_TRACKER - if(GetpModDoc() != nullptr) - { - CString str; - str.Format(str_PatternSetTruncationNote, patPos.size(), numPats); - GetpModDoc()->AddToLog(str); - } -#endif // MODPLUG_TRACKER + mpt::String str; + str.Format(str_PatternSetTruncationNote, patPos.size(), numPats); + AddToLog(str); } // Checking for number of used channels, which is not explicitely specified in the file. @@ -743,11 +731,9 @@ // Empty 64-row pattern if(Patterns.Insert(pat, 64)) { -#ifdef MODPLUG_TRACKER - CString s; - s.Format(TEXT("Allocating patterns failed starting from pattern %u\n"), pat); - if(GetpModDoc() != nullptr) GetpModDoc()->AddToLog(s); -#endif // MODPLUG_TRACKER + mpt::String s; + s.Format("Allocating patterns failed starting from pattern %u", pat); + AddToLog(s); break; } // Now (after the Insert() call), we can read the pattern name. @@ -937,17 +923,13 @@ if(ssb.m_Status & srlztn::SNT_FAILURE) { -#ifdef MODPLUG_TRACKER - if(GetpModDoc() != nullptr) GetpModDoc()->AddToLog(_T("Unknown error occured while deserializing file.\n")); -#endif // MODPLUG_TRACKER + AddToLog("Unknown error occured while deserializing file."); } } else //Loading for older files. { if(GetTuneSpecificTunings().Deserialize(iStrm)) { -#ifdef MODPLUG_TRACKER - if(GetpModDoc() != nullptr) GetpModDoc()->AddToLog(_T("Error occured - loading failed while trying to load tune specific tunings.\n")); -#endif // MODPLUG_TRACKER + AddToLog("Error occured - loading failed while trying to load tune specific tunings."); } else { ReadTuningMap(iStrm, *this); @@ -1004,9 +986,7 @@ if (p != nullptr) mptHistory.loadDate = *p; else if (pSndFile->GetpModDoc() != nullptr) - pSndFile->GetpModDoc()->AddLogEvent(LogEventUnexpectedError, - __FUNCTION__, - _T("localtime() returned nullptr.")); + pSndFile->AddToLog("localtime() returned nullptr."); mptHistory.openTime = (uint32)(difftime(time(nullptr), creationTime) * (double)HISTORY_TIMER_PRECISION); } @@ -1460,14 +1440,9 @@ buf[len++] = 0; if(patinfo[0] > uint16_max - len) { -#ifdef MODPLUG_TRACKER - if(GetpModDoc()) - { - CString str; - str.Format("%s (%s %u)\n", str_tooMuchPatternData, str_pattern, pat); - GetpModDoc()->AddToLog(str); - } -#endif // MODPLUG_TRACKER + mpt::String str; + str.Format("%s (%s %u)", str_tooMuchPatternData, str_pattern, pat); + AddToLog(str); break; } else { @@ -1551,10 +1526,7 @@ if(ssb.m_Status & srlztn::SNT_FAILURE) { -#ifdef MODPLUG_TRACKER - if(GetpModDoc()) - GetpModDoc()->AddToLog("Error occured in writing MPTM extensions.\n"); -#endif // MODPLUG_TRACKER + AddToLog("Error occured in writing MPTM extensions."); } //Last 4 bytes should tell where the hack mpt things begin. @@ -1979,10 +1951,7 @@ const size_t objectsize = GetMIDIMapper().GetSerializationSize(); if(objectsize > size_t(int16_max)) { -#ifdef MODPLUG_TRACKER - if(GetpModDoc()) - GetpModDoc()->AddToLog("Datafield overflow with MIDI to plugparam mappings; data won't be written.\n"); -#endif // MODPLUG_TRACKER + AddToLog("Datafield overflow with MIDI to plugparam mappings; data won't be written."); } else { Modified: trunk/OpenMPT/soundlib/Load_mo3.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mo3.cpp 2013-04-11 10:40:13 UTC (rev 1833) +++ trunk/OpenMPT/soundlib/Load_mo3.cpp 2013-04-11 14:29:08 UTC (rev 1834) @@ -38,9 +38,7 @@ return false; } -#ifdef MODPLUG_TRACKER - if(GetpModDoc() != nullptr) GetpModDoc()->AddToLog(GetStrI18N(_TEXT("The file appears to be a MO3 file, but this OpenMPT build does not support loading MO3 files."))); -#endif // MODPLUG_TRACKER + AddToLog(GetStrI18N(_TEXT("The file appears to be a MO3 file, but this OpenMPT build does not support loading MO3 files."))); return false; #else @@ -58,9 +56,7 @@ #endif // MODPLUG_TRACKER if(unmo3 == nullptr) // Didn't succeed. { -#ifdef MODPLUG_TRACKER - if(GetpModDoc() != nullptr) GetpModDoc()->AddToLog(GetStrI18N(_TEXT("Loading MO3 file failed because unmo3.dll could not be loaded."))); -#endif // MODPLUG_TRACKER + AddToLog(GetStrI18N(_TEXT("Loading MO3 file failed because unmo3.dll could not be loaded."))); } else // case: dll loaded succesfully. { Modified: trunk/OpenMPT/soundlib/Load_mod.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mod.cpp 2013-04-11 10:40:13 UTC (rev 1833) +++ trunk/OpenMPT/soundlib/Load_mod.cpp 2013-04-11 14:29:08 UTC (rev 1834) @@ -1181,19 +1181,14 @@ } //Check for unsaved patterns -#ifdef MODPLUG_TRACKER - if(GetpModDoc() != nullptr) + for(PATTERNINDEX pat = writePatterns; pat < Patterns.Size(); pat++) { - for(PATTERNINDEX pat = writePatterns; pat < Patterns.Size(); pat++) + if(Patterns.IsValidPat(pat)) { - if(Patterns.IsValidPat(pat)) - { - GetpModDoc()->AddToLog(_T("Warning: This track contains at least one pattern after the highest pattern number referred to in the sequence. Such patterns are not saved in the .mod format.\n")); - break; - } + AddToLog("Warning: This track contains at least one pattern after the highest pattern number referred to in the sequence. Such patterns are not saved in the .mod format."); + break; } } -#endif // Writing samples for(SAMPLEINDEX smp = 1; smp <= 31; smp++) Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2013-04-11 10:40:13 UTC (rev 1833) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2013-04-11 14:29:08 UTC (rev 1834) @@ -597,12 +597,10 @@ } } -#ifdef MODPLUG_TRACKER - if(hasAdlibPatches && GetpModDoc() != nullptr) + if(hasAdlibPatches) { - GetpModDoc()->AddToLog("This track uses Adlib instruments, which are not supported by OpenMPT."); + AddToLog("This track uses Adlib instruments, which are not supported by OpenMPT."); } -#endif // MODPLUG_TRACKER // Try to find out if Zxx commands are supposed to be panning commands (PixPlay). Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2013-04-11 10:40:13 UTC (rev 1833) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2013-04-11 14:29:08 UTC (rev 1834) @@ -557,8 +557,8 @@ \ if((len > uint16_max - (UINT)x) && GetpModDoc()) /*Reaching the limits of file format?*/ \ { \ - mpt::String str; str.Format("%s (%s %u)\n", str_tooMuchPatternData, str_pattern, pat); \ - GetpModDoc()->AddToLog(str); \ + mpt::String str; str.Format("%s (%s %u)", str_tooMuchPatternData, str_pattern, pat); \ + AddToLog(str); \ break; \ } Modified: trunk/OpenMPT/soundlib/ModSequence.cpp =================================================================== --- trunk/OpenMPT/soundlib/ModSequence.cpp 2013-04-11 10:40:13 UTC (rev 1833) +++ trunk/OpenMPT/soundlib/ModSequence.cpp 2013-04-11 14:29:08 UTC (rev 1834) @@ -120,10 +120,7 @@ std::fill(iter, end(), GetInvalidPatIndex()); if(GetLengthTailTrimmed() > specs.ordersMax) { -#ifdef MODPLUG_TRACKER - if(m_pSndFile->GetpModDoc()) - m_pSndFile->GetpModDoc()->AddToLog("WARNING: Order list has been trimmed!\n"); -#endif // MODPLUG_TRACKER + m_pSndFile->AddToLog("WARNING: Order list has been trimmed!"); } } resize(specs.ordersMax); @@ -536,11 +533,8 @@ const ORDERINDEX nFirstOrder = GetLengthTailTrimmed() + 1; // +1 for separator item if(nFirstOrder + GetSequence(1).GetLengthTailTrimmed() > m_pSndFile->GetModSpecifications().ordersMax) { -#ifdef MODPLUG_TRACKER - wsprintf(s, "WARNING: Cannot merge Sequence %d (too long!)\n", removedSequences); - if (m_pSndFile->GetpModDoc()) - m_pSndFile->GetpModDoc()->AddToLog(s); -#endif // MODPLUG_TRACKER + wsprintf(s, "WARNING: Cannot merge Sequence %d (too long!)", removedSequences); + m_pSndFile->AddToLog(s); RemoveSequence(1); continue; } @@ -575,11 +569,8 @@ } else { // cannot create new pattern: notify the user -#ifdef MODPLUG_TRACKER wsprintf(s, "CONFLICT: Pattern break commands in Pattern %d might be broken since it has been used in several sequences!", nPat); - if (m_pSndFile->GetpModDoc()) - m_pSndFile->GetpModDoc()->AddToLog(s); -#endif // MODPLUG_TRACKER + m_pSndFile->AddToLog(s); } } m->param = static_cast<BYTE>(m->param + nFirstOrder); Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2013-04-11 10:40:13 UTC (rev 1833) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2013-04-11 14:29:08 UTC (rev 1834) @@ -470,7 +470,18 @@ } +void CSoundFile::AddToLog(const std::string &text) const +//------------------------------------------------------ +{ #ifdef MODPLUG_TRACKER + if(GetpModDoc()) GetpModDoc()->AddToLog(text); +#else + Reporting::Warning(text.c_str()); +#endif +} + + +#ifdef MODPLUG_TRACKER BOOL CSoundFile::Create(LPCBYTE lpStream, CModDoc *pModDoc, DWORD dwMemLength) //---------------------------------------------------------------------------- { Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2013-04-11 10:40:13 UTC (rev 1833) +++ trunk/OpenMPT/soundlib/Sndfile.h 2013-04-11 14:29:08 UTC (rev 1834) @@ -343,6 +343,8 @@ public: + void AddToLog(const std::string &text) const; + #ifdef MODPLUG_TRACKER BOOL Create(LPCBYTE lpStream, CModDoc *pModDoc, DWORD dwMemLength=0); // Get parent CModDoc. Can be nullptr if previewing from tree view, and is always nullptr if we're not actually compiling OpenMPT. @@ -351,6 +353,7 @@ BOOL Create(LPCBYTE lpStream, void *pModDoc, DWORD dwMemLength=0); void *GetpModDoc() const { return nullptr; } #endif // MODPLUG_TRACKER + BOOL Destroy(); MODTYPE GetType() const { return m_nType; } bool TypeIsIT_MPT() const { return (m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) != 0; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2013-04-11 14:58:55
|
Revision: 1837 http://sourceforge.net/p/modplug/code/1837 Author: saga-games Date: 2013-04-11 14:58:49 +0000 (Thu, 11 Apr 2013) Log Message: ----------- [Fix] Switching to the volume envelope in the instrument editor broke some revisions ago. [Mod] OpenMPT: Version is now 1.22.01.02 Modified Paths: -------------- trunk/OpenMPT/common/version.h trunk/OpenMPT/mptrack/View_ins.cpp Modified: trunk/OpenMPT/common/version.h =================================================================== --- trunk/OpenMPT/common/version.h 2013-04-11 14:47:48 UTC (rev 1836) +++ trunk/OpenMPT/common/version.h 2013-04-11 14:58:49 UTC (rev 1837) @@ -19,7 +19,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 22 #define VER_MINOR 01 -#define VER_MINORMINOR 01 +#define VER_MINORMINOR 02 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2013-04-11 14:47:48 UTC (rev 1836) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2013-04-11 14:58:49 UTC (rev 1837) @@ -195,7 +195,7 @@ Notification::Type type; if ((!pModDoc) || (nIns < 1) || (nIns >= MAX_INSTRUMENTS)) return FALSE; - if (nEnv) m_nEnv = nEnv; + m_nEnv = nEnv; m_nInstrument = nIns; switch(m_nEnv) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-04-11 17:14:38
|
Revision: 1842 http://sourceforge.net/p/modplug/code/1842 Author: manxorist Date: 2013-04-11 17:14:21 +0000 (Thu, 11 Apr 2013) Log Message: ----------- merge branch nonglobal-mixer: r1841 [Ref] Remove CSoundFile::AssertAlignment(). It was checking alignment of gFastSinc (which is irrelevant since the MMX mixer was removed) and it was checking the size of struct ModChannel to be a multiple of 32 (which is enforced by a __decl... --------------------- r1836 [Fix] Fix building with NO_DSP or NO_REVERB. --------------------- r1825 [Ref] Make the whole mixer and DSP state local to each CSoundFile instance. Do a bunch of required and related cleanups. --------------------- r1801 [Ref] Put builtin and local tunings handling inside #ifdef MODPLUG_TRACKER. --------------------- r1800 [Ref] Only regenerate resampler tables when the settings actually changed. --------------------- r1799 [Ref] Put gpSndMixHook inside #ifdef MODPLUG_TRACKER. --------------------- r1798 [Ref] Put gpMixPluginCreateProc inside #ifndef NO_VST. --------------------- r1795 [Ref] Remove unused CAGC::Initialize declaration. --------------------- r1762 [Ref] Move the global preamp setting into struct MixerSettings. [Ref] Rename SetMasterVolume to SetPreAmp and remove its adjustAGC parameter which was always true except when rendering wave files when agc was disabled anyway. --------------------- r1748 [Ref] Move updating of EQ and AGC settings into UpdateDspEffects(). --------------------- r1747 [Ref] Split SNDMIX flags into SNDMIX and SNDDSP flags. [Ref] Split MixerSettings::gdwSoundSetup into MixerSettings::DSPMask and MixerSettings::MixerFlags. [Ref] Make SNDMIX and SNDDSP use the same bitmasks as SOUNDSETUP respectively QUALITY... --------------------- r1740 [Ref] MixBuffers are members of class CSoundFile now. --------------------- r1733 [Ref] Remove SNDMIX_DIRECTTODISK and replace usage sites wiht IsRenderingToDisc() based on the already existing m_bIsRendering. --------------------- r1732 [Ref] Remove SNDMIX_*SRCMODE resampler settings and always use enum ResamplingMode. --------------------- r1731 [Ref] Move a bunch of mixer-related settings into class MixerSettings. Might break some stuff, will be fixed and cleaned up later. --------------------- r1728 [Ref] Remove global cpu feature flags gdwSysInfo. [Ref] Split ResamplerSettings from MixerSettings. [Ref] Remove support code for win3.11 with win32s. --------------------- r1725 [Var] Fix debug builds. --------------------- r1718 [Ref] Encapsulate resampler tables into a seperate class CResampler. [Ref] Move some more reverb related code to Snd_rvb.h [Ref] Remove the unneeded MMX_EndMix() function. All mmx-using functions have the emms instruction at the end anyway.... --------------------- Revision Links: -------------- http://sourceforge.net/p/modplug/code/1841 http://sourceforge.net/p/modplug/code/1836 http://sourceforge.net/p/modplug/code/1825 http://sourceforge.net/p/modplug/code/1801 http://sourceforge.net/p/modplug/code/1800 http://sourceforge.net/p/modplug/code/1799 http://sourceforge.net/p/modplug/code/1798 http://sourceforge.net/p/modplug/code/1795 http://sourceforge.net/p/modplug/code/1762 http://sourceforge.net/p/modplug/code/1748 http://sourceforge.net/p/modplug/code/1747 http://sourceforge.net/p/modplug/code/1740 http://sourceforge.net/p/modplug/code/1733 http://sourceforge.net/p/modplug/code/1732 http://sourceforge.net/p/modplug/code/1731 http://sourceforge.net/p/modplug/code/1728 http://sourceforge.net/p/modplug/code/1725 http://sourceforge.net/p/modplug/code/1718 Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/Mod2wave.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/Mpdlgs.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/TrackerSettings.cpp trunk/OpenMPT/mptrack/TrackerSettings.h trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/mptrack_08.vcproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters trunk/OpenMPT/sounddsp/AGC.h trunk/OpenMPT/sounddsp/DSP.cpp trunk/OpenMPT/sounddsp/DSP.h trunk/OpenMPT/sounddsp/EQ.cpp trunk/OpenMPT/sounddsp/EQ.h trunk/OpenMPT/soundlib/Fastmix.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/MixerSettings.cpp trunk/OpenMPT/soundlib/MixerSettings.h trunk/OpenMPT/soundlib/Mmx_mix.cpp trunk/OpenMPT/soundlib/Snd_defs.h trunk/OpenMPT/soundlib/Snd_flt.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Snd_rvb.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp trunk/OpenMPT/soundlib/Tables.cpp trunk/OpenMPT/soundlib/Waveform.cpp trunk/OpenMPT/soundlib/WindowedFIR.cpp trunk/OpenMPT/soundlib/WindowedFIR.h trunk/OpenMPT/soundlib/snd_rvb.h Added Paths: ----------- trunk/OpenMPT/soundlib/Resampler.h Property Changed: ---------------- trunk/OpenMPT/ Index: trunk/OpenMPT =================================================================== --- trunk/OpenMPT 2013-04-11 16:32:02 UTC (rev 1841) +++ trunk/OpenMPT 2013-04-11 17:14:21 UTC (rev 1842) Property changes on: trunk/OpenMPT ___________________________________________________________________ Modified: svn:mergeinfo ## -1,5 +1,6 ## /branches/manx/build-speedup:1586-1589 /branches/manx/header-dependencies-cleanups:1394-1397,1401-1402,1405-1406 +/branches/manx/nonglobal-mixer:1715-1841 /branches/manx/profiler:1813 /branches/manx/project-files-cleanups:1378-1382 /branches/manx/snddev-fixes:1605-1713 \ No newline at end of property Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2013-04-11 16:32:02 UTC (rev 1841) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2013-04-11 17:14:21 UTC (rev 1842) @@ -264,8 +264,7 @@ // Setup Keyboard Hook ghKbdHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, AfxGetInstanceHandle(), GetCurrentThreadId()); - // Initialize Audio Mixer - UpdateAudioParameters(TRUE); + // Update the tree m_wndTree.Init(); @@ -832,9 +831,9 @@ if(!gpSoundDevice) return false; gpSoundDevice->SetSource(this); gpSoundDevice->Configure(m_hWnd, TrackerSettings::Instance().m_LatencyMS, TrackerSettings::Instance().m_UpdateIntervalMS, - ((TrackerSettings::Instance().m_dwSoundSetup & SOUNDSETUP_SECONDARY) ? 0 : SNDDEV_OPTIONS_EXCLUSIVE) + ((TrackerSettings::Instance().m_MixerSettings.MixerFlags & SOUNDSETUP_SECONDARY) ? 0 : SNDDEV_OPTIONS_EXCLUSIVE) | - ((TrackerSettings::Instance().m_dwSoundSetup & SOUNDSETUP_NOBOOSTTHREADPRIORITY) ? 0 : SNDDEV_OPTIONS_BOOSTTHREADPRIORITY) + ((TrackerSettings::Instance().m_MixerSettings.MixerFlags & SOUNDSETUP_NOBOOSTTHREADPRIORITY) ? 0 : SNDDEV_OPTIONS_BOOSTTHREADPRIORITY) ); if (!gpSoundDevice->Open(SNDDEV_GET_NUMBER(TrackerSettings::Instance().m_nWaveDevice), &WaveFormat.Format)) return false; return true; @@ -855,20 +854,20 @@ UINT nFixedBitsPerSample; bool err = false; - if (!TrackerSettings::Instance().m_dwRate) err = true; - if ((TrackerSettings::Instance().m_nChannels != 1) && (TrackerSettings::Instance().m_nChannels != 2) && (TrackerSettings::Instance().m_nChannels != 4)) err = true; + if (!TrackerSettings::Instance().m_MixerSettings.gdwMixingFreq) err = true; + if ((TrackerSettings::Instance().m_MixerSettings.gnChannels != 1) && (TrackerSettings::Instance().m_MixerSettings.gnChannels != 2) && (TrackerSettings::Instance().m_MixerSettings.gnChannels != 4)) err = true; if(!err) { - err = !audioTryOpeningDevice(TrackerSettings::Instance().m_nChannels, - TrackerSettings::Instance().m_nBitsPerSample, - TrackerSettings::Instance().m_dwRate); + err = !audioTryOpeningDevice(TrackerSettings::Instance().m_MixerSettings.gnChannels, + TrackerSettings::Instance().m_MixerSettings.gnBitsPerSample, + TrackerSettings::Instance().m_MixerSettings.gdwMixingFreq); nFixedBitsPerSample = (gpSoundDevice) ? gpSoundDevice->HasFixedBitsPerSample() : 0; - if(err && (nFixedBitsPerSample && (nFixedBitsPerSample != TrackerSettings::Instance().m_nBitsPerSample))) + if(err && (nFixedBitsPerSample && (nFixedBitsPerSample != TrackerSettings::Instance().m_MixerSettings.gnBitsPerSample))) { - if(nFixedBitsPerSample) TrackerSettings::Instance().m_nBitsPerSample = nFixedBitsPerSample; - err = !audioTryOpeningDevice(TrackerSettings::Instance().m_nChannels, - TrackerSettings::Instance().m_nBitsPerSample, - TrackerSettings::Instance().m_dwRate); + if(nFixedBitsPerSample) TrackerSettings::Instance().m_MixerSettings.gnBitsPerSample = nFixedBitsPerSample; + err = !audioTryOpeningDevice(TrackerSettings::Instance().m_MixerSettings.gnChannels, + TrackerSettings::Instance().m_MixerSettings.gnBitsPerSample, + TrackerSettings::Instance().m_MixerSettings.gdwMixingFreq); } } // Display error message box @@ -1069,7 +1068,7 @@ notification.masterVU[1] = rVu; if(gnClipLeft) notification.masterVU[0] |= Notification::ClipVU; if(gnClipRight) notification.masterVU[1] |= Notification::ClipVU; - uint32 dwVuDecay = Util::muldiv(dwSamplesRead, 120000, TrackerSettings::Instance().m_dwRate) + 1; + uint32 dwVuDecay = Util::muldiv(dwSamplesRead, 120000, TrackerSettings::Instance().m_MixerSettings.gdwMixingFreq) + 1; if (lVu >= dwVuDecay) gnLVuMeter = (lVu - dwVuDecay) << 11; else gnLVuMeter = 0; if (rVu >= dwVuDecay) gnRVuMeter = (rVu - dwVuDecay) << 11; else gnRVuMeter = 0; @@ -1088,63 +1087,36 @@ } -void CMainFrame::UpdateDspEffects() -//--------------------------------- +void CMainFrame::UpdateDspEffects(CSoundFile &sndFile, bool reset) +//---------------------------------------------------------------- { - CSoundFile::SetDspEffects( -#ifndef NO_DSP - TrackerSettings::Instance().m_dwQuality & QUALITY_SURROUND, -#else - FALSE, + CriticalSection cs; +#ifndef NO_REVERB + sndFile.m_Reverb.m_Settings = TrackerSettings::Instance().m_ReverbSettings; #endif - TrackerSettings::Instance().m_dwQuality & QUALITY_REVERB, #ifndef NO_DSP - TrackerSettings::Instance().m_dwQuality & QUALITY_MEGABASS, - TrackerSettings::Instance().m_dwQuality & QUALITY_NOISEREDUCTION, -#else - FALSE, - FALSE, + sndFile.m_DSP.m_Settings = TrackerSettings::Instance().m_DSPSettings; #endif #ifndef NO_EQ - TrackerSettings::Instance().m_dwQuality & QUALITY_EQ -#else - FALSE + sndFile.SetEQGains(TrackerSettings::Instance().m_EqSettings.Gains, MAX_EQ_BANDS, TrackerSettings::Instance().m_EqSettings.Freqs, reset?TRUE:FALSE); #endif - ); + sndFile.SetDspEffects(TrackerSettings::Instance().m_MixerSettings.DSPMask); + sndFile.InitPlayer(reset?TRUE:FALSE); } -void CMainFrame::UpdateAudioParameters(BOOL bReset) -//------------------------------------------------- +void CMainFrame::UpdateAudioParameters(CSoundFile &sndFile, bool reset) +//--------------------------------------------------------------------- { - if ((TrackerSettings::Instance().m_nBitsPerSample != 8) && (TrackerSettings::Instance().m_nBitsPerSample != 32)) TrackerSettings::Instance().m_nBitsPerSample = 16; - CSoundFile::SetWaveConfig(TrackerSettings::Instance().m_dwRate, - TrackerSettings::Instance().m_nBitsPerSample, - TrackerSettings::Instance().m_nChannels, - (TrackerSettings::Instance().m_dwSoundSetup & SOUNDSETUP_ENABLEMMX) ? TRUE : FALSE); - - // Soft panning - if (TrackerSettings::Instance().m_dwSoundSetup & SOUNDSETUP_SOFTPANNING) - CSoundFile::gdwSoundSetup |= SNDMIX_SOFTPANNING; - else - CSoundFile::gdwSoundSetup &= ~SNDMIX_SOFTPANNING; + CriticalSection cs; if (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_MUTECHNMODE) - CSoundFile::gdwSoundSetup |= SNDMIX_MUTECHNMODE; + TrackerSettings::Instance().m_MixerSettings.MixerFlags |= SNDMIX_MUTECHNMODE; else - CSoundFile::gdwSoundSetup &= ~SNDMIX_MUTECHNMODE; - CSoundFile::SetResamplingMode(TrackerSettings::Instance().m_nSrcMode); - UpdateDspEffects(); -#ifndef NO_AGC - CSoundFile::SetAGC(TrackerSettings::Instance().m_dwQuality & QUALITY_AGC); -#endif -#ifndef NO_EQ - CSoundFile::SetEQGains( TrackerSettings::Instance().m_EqSettings.Gains, MAX_EQ_BANDS, TrackerSettings::Instance().m_EqSettings.Freqs, bReset ); -#endif - if (bReset) - { - CSoundFile::SetMixerSettings(TrackerSettings::Instance().m_MixerSettings); - CSoundFile::InitPlayer(TRUE); - } + TrackerSettings::Instance().m_MixerSettings.MixerFlags &= ~SNDMIX_MUTECHNMODE; + sndFile.SetMixerSettings(TrackerSettings::Instance().m_MixerSettings); + sndFile.SetResamplerSettings(TrackerSettings::Instance().m_ResamplerSettings); + UpdateDspEffects(sndFile, false); // reset done in next line + sndFile.InitPlayer(reset?TRUE:FALSE); } @@ -1264,8 +1236,8 @@ void CMainFrame::SetPreAmp(UINT n) //-------------------------------- { - TrackerSettings::Instance().m_nPreAmp = n; - if (m_pSndFile) m_pSndFile->SetMasterVolume(TrackerSettings::Instance().m_nPreAmp, true); + TrackerSettings::Instance().m_MixerSettings.m_nPreAmp = n; + if (m_pSndFile) m_pSndFile->SetPreAmp(TrackerSettings::Instance().m_MixerSettings.m_nPreAmp); } @@ -1277,24 +1249,6 @@ } -void CMainFrame::ApplyTrackerSettings(CSoundFile *pSndFile) -//---------------------------------------------------------- -{ - if(!pSndFile) return; - pSndFile->SetWaveConfig(TrackerSettings::Instance().m_dwRate, TrackerSettings::Instance().m_nBitsPerSample, TrackerSettings::Instance().m_nChannels, (TrackerSettings::Instance().m_dwSoundSetup & SOUNDSETUP_ENABLEMMX) ? TRUE : FALSE); - pSndFile->SetResamplingMode(TrackerSettings::Instance().m_nSrcMode); - UpdateDspEffects(); -#ifndef NO_AGC - pSndFile->SetAGC(TrackerSettings::Instance().m_dwQuality & QUALITY_AGC); -#endif - pSndFile->SetMasterVolume(TrackerSettings::Instance().m_nPreAmp, true); - pSndFile->SetMixerSettings(TrackerSettings::Instance().m_MixerSettings); -#ifndef NO_AGC - CSoundFile::m_AGC.Reset(); -#endif -} - - bool CMainFrame::PreparePlayback() //-------------------------------- { @@ -1403,7 +1357,7 @@ if (!PreparePlayback()) return false; // set mixing parameters in CSoundFile - ApplyTrackerSettings(pSndFile); + UpdateAudioParameters(*pSndFile); SetPlaybackSoundFile(pSndFile); @@ -1510,7 +1464,7 @@ return false; } - ApplyTrackerSettings(pSndFile); + UpdateAudioParameters(*pSndFile); SetPlaybackSoundFile(pSndFile); @@ -1714,10 +1668,14 @@ BOOL CMainFrame::SetupSoundCard(DWORD q, DWORD rate, UINT nBits, UINT nChns, UINT latency_ms, UINT updateinterval_ms, LONG wd) //---------------------------------------------------------------------------------------------------------------------------- { - const bool isPlaying = (IsPlaying() != 0); - if ((TrackerSettings::Instance().m_dwRate != rate) || ((TrackerSettings::Instance().m_dwSoundSetup & SOUNDSETUP_RESTARTMASK) != (q & SOUNDSETUP_RESTARTMASK)) - || (TrackerSettings::Instance().m_nWaveDevice != wd) || (TrackerSettings::Instance().m_LatencyMS != latency_ms) || (TrackerSettings::Instance().m_UpdateIntervalMS != updateinterval_ms) || (nBits != TrackerSettings::Instance().m_nBitsPerSample) - || (TrackerSettings::Instance().m_nChannels != nChns)) + const bool isPlaying = IsPlaying(); + if (((TrackerSettings::Instance().m_MixerSettings.MixerFlags & SOUNDSETUP_RESTARTMASK) != (q & SOUNDSETUP_RESTARTMASK)) + || (TrackerSettings::Instance().m_MixerSettings.gdwMixingFreq != rate) + || (TrackerSettings::Instance().m_nWaveDevice != wd) + || (TrackerSettings::Instance().m_LatencyMS != latency_ms) + || (TrackerSettings::Instance().m_UpdateIntervalMS != updateinterval_ms) + || (TrackerSettings::Instance().m_MixerSettings.gnBitsPerSample != nBits) + || (TrackerSettings::Instance().m_MixerSettings.gnChannels != nChns)) { CModDoc *pActiveMod = NULL; if (isPlaying) @@ -1726,45 +1684,33 @@ PauseMod(); } TrackerSettings::Instance().m_nWaveDevice = wd; - TrackerSettings::Instance().m_dwRate = rate; - TrackerSettings::Instance().m_dwSoundSetup = q; + TrackerSettings::Instance().m_MixerSettings.gdwMixingFreq = rate; + TrackerSettings::Instance().m_MixerSettings.MixerFlags = q; TrackerSettings::Instance().m_LatencyMS = latency_ms; TrackerSettings::Instance().m_UpdateIntervalMS = updateinterval_ms; - TrackerSettings::Instance().m_nBitsPerSample = nBits; - TrackerSettings::Instance().m_nChannels = nChns; + TrackerSettings::Instance().m_MixerSettings.gnBitsPerSample = nBits; + TrackerSettings::Instance().m_MixerSettings.gnChannels = nChns; { CriticalSection cs; - UpdateAudioParameters(FALSE); + if (pActiveMod) UpdateAudioParameters(pActiveMod->GetrSoundFile(), FALSE); } if (pActiveMod) PlayMod(pActiveMod); UpdateWindow(); } else { // No need to restart playback - TrackerSettings::Instance().m_dwSoundSetup = q; - CSoundFile::EnableMMX((TrackerSettings::Instance().m_dwSoundSetup & SOUNDSETUP_ENABLEMMX) != 0); + CriticalSection cs; + if(GetSoundFilePlaying()) UpdateAudioParameters(*GetSoundFilePlaying(), FALSE); } return TRUE; } -BOOL CMainFrame::SetupPlayer(DWORD q, DWORD srcmode, BOOL bForceUpdate) -//--------------------------------------------------------------------- +BOOL CMainFrame::SetupPlayer() +//---------------------------- { - if ((q != TrackerSettings::Instance().m_dwQuality) || (srcmode != TrackerSettings::Instance().m_nSrcMode) || (bForceUpdate)) - { - TrackerSettings::Instance().m_nSrcMode = srcmode; - TrackerSettings::Instance().m_dwQuality = q; - { - CriticalSection cs; - CSoundFile::SetMixerSettings(TrackerSettings::Instance().m_MixerSettings); - CSoundFile::SetResamplingMode(TrackerSettings::Instance().m_nSrcMode); - UpdateDspEffects(); -#ifndef NO_AGC - CSoundFile::SetAGC(TrackerSettings::Instance().m_dwQuality & QUALITY_AGC); -#endif - } - } + CriticalSection cs; + if(GetSoundFilePlaying()) UpdateAudioParameters(*GetSoundFilePlaying(), FALSE); return TRUE; } @@ -1785,9 +1731,13 @@ //--------------------------------- { if (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_MUTECHNMODE) - CSoundFile::gdwSoundSetup |= SNDMIX_MUTECHNMODE; + TrackerSettings::Instance().m_MixerSettings.MixerFlags |= SNDMIX_MUTECHNMODE; else - CSoundFile::gdwSoundSetup &= ~SNDMIX_MUTECHNMODE; + TrackerSettings::Instance().m_MixerSettings.MixerFlags &= ~SNDMIX_MUTECHNMODE; + { + CriticalSection cs; + if(GetSoundFilePlaying()) UpdateAudioParameters(*GetSoundFilePlaying()); + } m_wndToolBar.EnableFlatButtons(TrackerSettings::Instance().m_dwPatternSetup & PATTERN_FLATBUTTONS); @@ -1900,7 +1850,7 @@ 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_LatencyMS, TrackerSettings::Instance().m_UpdateIntervalMS, TrackerSettings::Instance().m_nWaveDevice); + COptionsSoundcard sounddlg(TrackerSettings::Instance().m_MixerSettings.gdwMixingFreq, TrackerSettings::Instance().m_MixerSettings.MixerFlags, TrackerSettings::Instance().m_MixerSettings.gnBitsPerSample, TrackerSettings::Instance().m_MixerSettings.gnChannels, TrackerSettings::Instance().m_LatencyMS, TrackerSettings::Instance().m_UpdateIntervalMS, TrackerSettings::Instance().m_nWaveDevice); COptionsKeyboard keyboard; COptionsColors colors; COptionsPlayer playerdlg; @@ -2529,11 +2479,19 @@ } + //end rewbs.VSTTimeInfo long CMainFrame::GetSampleRate() //------------------------------ { - return CSoundFile::GetSampleRate(); + CriticalSection cs; + if(GetSoundFilePlaying()) + { + return GetSoundFilePlaying()->GetSampleRate(); + } else + { + return TrackerSettings::Instance().m_MixerSettings.gdwMixingFreq; + } } @@ -2555,7 +2513,7 @@ //------------------------------------------------- { CriticalSection cs; - pSndFile->m_bIsRendering=true; + pSndFile->m_bIsRendering = true; pSndFile->SuspendPlugins(); pSndFile->ResumePlugins(); return true; @@ -2566,7 +2524,7 @@ { CriticalSection cs; pSndFile->SuspendPlugins(); - pSndFile->m_bIsRendering=false; + pSndFile->m_bIsRendering = false; return true; } //end rewbs.VSTTimeInfo Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2013-04-11 16:32:02 UTC (rev 1841) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2013-04-11 17:14:21 UTC (rev 1842) @@ -108,26 +108,6 @@ }; -#define SOUNDSETUP_ENABLEMMX 0x08 -#define SOUNDSETUP_SOFTPANNING 0x10 -#define SOUNDSETUP_SECONDARY 0x40 -#define SOUNDSETUP_NOBOOSTTHREADPRIORITY 0x80 -#define SOUNDSETUP_RESTARTMASK (SOUNDSETUP_SECONDARY|SOUNDSETUP_NOBOOSTTHREADPRIORITY) - -#ifndef NO_DSP -#define QUALITY_NOISEREDUCTION 0x01 -#define QUALITY_MEGABASS 0x02 -#define QUALITY_SURROUND 0x08 -#endif -#define QUALITY_REVERB 0x20 -#ifndef NO_AGC -#define QUALITY_AGC 0x40 -#endif -#ifndef NO_EQ -#define QUALITY_EQ 0x80 -#endif - - #define NUM_VUMETER_PENS 32 @@ -336,8 +316,8 @@ // Low-Level Audio public: - static void UpdateDspEffects(); - static void UpdateAudioParameters(BOOL bReset=FALSE); + static void UpdateDspEffects(CSoundFile &sndFile, bool reset=false); + static void UpdateAudioParameters(CSoundFile &sndFile, bool reset=false); static void CalcStereoVuMeters(int *, unsigned long, unsigned long); static DWORD WINAPI NotifyThreadWrapper(LPVOID); DWORD NotifyThread(); @@ -403,7 +383,7 @@ bool m_bModTreeHasFocus; //rewbs.customKeys CWnd *m_pNoteMapHasFocus; //rewbs.customKeys CWnd* m_pOrderlistHasFocus; - long GetSampleRate(); + __declspec(deprecated) long GetSampleRate(); double GetApproxBPM(); void ThreadSafeSetModified(CModDoc* modified) {m_pJustModifiedDoc=modified;} void SetElapsedTime(double t) { m_dwTimeSec = static_cast<CSoundFile::samplecount_t>(t); } @@ -426,7 +406,6 @@ // Player functions public: - static void ApplyTrackerSettings(CSoundFile *pSndFile); // high level synchronous playback functions, do not hold AudioCriticalSection while calling these bool PreparePlayback(); @@ -434,6 +413,7 @@ void StopPlayback(); bool PausePlayback(); bool IsPlaybackRunning() const { return m_IsPlaybackRunning; } + static bool IsValidSoundFile(CSoundFile &sndFile) { return sndFile.GetType() ? true : false; } static bool IsValidSoundFile(CSoundFile *pSndFile) { return pSndFile && pSndFile->GetType(); } void SetPlaybackSoundFile(CSoundFile *pSndFile); void UnsetPlaybackSoundFile(); @@ -459,10 +439,12 @@ BOOL InitRenderer(CSoundFile*); BOOL StopRenderer(CSoundFile*); void SwitchToActiveView(); + BOOL SetupSoundCard(DWORD q, DWORD rate, UINT nbits, UINT chns, UINT latency_ms, UINT updateinterval_ms, LONG wd); + BOOL SetupMiscOptions(); + BOOL SetupPlayer(); + BOOL SetupDirectories(LPCTSTR szModDir, LPCTSTR szSampleDir, LPCTSTR szInstrDir, LPCTSTR szVstDir, LPCTSTR szPresetDir); - BOOL SetupMiscOptions(); - BOOL SetupPlayer(DWORD, DWORD, BOOL bForceUpdate=FALSE); BOOL SetupMidi(DWORD d, LONG n); void SetPreAmp(UINT n); HWND GetFollowSong() const; Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mod2wave.cpp 2013-04-11 16:32:02 UTC (rev 1841) +++ trunk/OpenMPT/mptrack/Mod2wave.cpp 2013-04-11 17:14:21 UTC (rev 1842) @@ -346,7 +346,7 @@ WaveFormat.Format.wFormatTag = WAVE_FORMAT_PCM; WaveFormat.Format.nSamplesPerSec = m_CbnSampleRate.GetItemData(m_CbnSampleRate.GetCurSel()); if (WaveFormat.Format.nSamplesPerSec < 11025) WaveFormat.Format.nSamplesPerSec = 11025; - if (WaveFormat.Format.nSamplesPerSec > MAX_SAMPLE_RATE) WaveFormat.Format.nSamplesPerSec = MAX_SAMPLE_RATE; + if (WaveFormat.Format.nSamplesPerSec > 192000) WaveFormat.Format.nSamplesPerSec = 192000; WaveFormat.Format.nChannels = (WORD)(dwFormat >> 8); if ((WaveFormat.Format.nChannels != 1) && (WaveFormat.Format.nChannels != 4)) WaveFormat.Format.nChannels = 2; WaveFormat.Format.wBitsPerSample = (WORD)(dwFormat & 0xFF); @@ -692,11 +692,11 @@ } } - int oldVol = m_pSndFile->GetMasterVolume(); - CSoundFile::gdwSoundSetup |= SNDMIX_DIRECTTODISK; - CSoundFile::gdwMixingFreq = m_pWaveFormat->nSamplesPerSec; - CSoundFile::gnBitsPerSample = m_pWaveFormat->wBitsPerSample; - CSoundFile::gnChannels = m_pWaveFormat->nChannels; + MixerSettings oldmixersettings = m_pSndFile->m_MixerSettings; + MixerSettings mixersettings = TrackerSettings::Instance().m_MixerSettings; + mixersettings.gdwMixingFreq = m_pWaveFormat->nSamplesPerSec; + mixersettings.gnBitsPerSample = m_pWaveFormat->wBitsPerSample; + mixersettings.gnChannels = m_pWaveFormat->nChannels; m_pSndFile->m_SongFlags.reset(SONG_PAUSED | SONG_STEP); // -> CODE#0024 // -> DESC="wav export update" @@ -704,19 +704,20 @@ if ((m_bNormalize) && (m_pWaveFormat->wBitsPerSample <= 24)) // -! NEW_FEATURE#0024 { - m_pSndFile->gnBitsPerSample = 24; + mixersettings.gnBitsPerSample = 24; #ifndef NO_AGC - m_pSndFile->SetAGC(FALSE); + mixersettings.DSPMask &= ~SNDDSP_AGC; #endif - if (oldVol > 128) m_pSndFile->SetMasterVolume(128); + if(mixersettings.m_nPreAmp > 128) mixersettings.m_nPreAmp = 128; } else { m_bNormalize = false; } m_pSndFile->ResetChannels(); - CSoundFile::SetMixerSettings(TrackerSettings::Instance().m_MixerSettings); - CSoundFile::InitPlayer(TRUE); + m_pSndFile->SetMixerSettings(mixersettings); + m_pSndFile->SetResamplerSettings(TrackerSettings::Instance().m_ResamplerSettings); + m_pSndFile->InitPlayer(TRUE); if ((!m_dwFileLimit) || (m_dwFileLimit > 2047*1024)) m_dwFileLimit = 2047*1024; // 2GB m_dwFileLimit <<= 10; // File Header @@ -768,7 +769,7 @@ m_pSndFile->m_PatternCuePoints.reserve(m_pSndFile->Order.GetLength()); // Process the conversion - UINT nBytesPerSample = (CSoundFile::gnBitsPerSample * CSoundFile::gnChannels) / 8; + UINT nBytesPerSample = (m_pSndFile->m_MixerSettings.gnBitsPerSample * m_pSndFile->m_MixerSettings.gnChannels) / 8; // For calculating the remaining time DWORD dwStartTime = timeGetTime(); // For giving away some processing time every now and then @@ -777,7 +778,7 @@ CMainFrame::GetMainFrame()->InitRenderer(m_pSndFile); //rewbs.VSTTimeInfo for (UINT n = 0; ; n++) { - UINT lRead = m_pSndFile->Read(buffer, sizeof(buffer)/(CSoundFile::gnChannels*CSoundFile::gnBitsPerSample/8)); + UINT lRead = m_pSndFile->Read(buffer, sizeof(buffer)/(m_pSndFile->m_MixerSettings.gnChannels*m_pSndFile->m_MixerSettings.gnBitsPerSample/8)); // Process cue points (add base offset), if there are any to process. vector<PatternCuePoint>::reverse_iterator iter; @@ -816,7 +817,7 @@ ullSamples += lRead; if (m_bNormalize) { - UINT imax = lRead*3*CSoundFile::gnChannels; + UINT imax = lRead*3*m_pSndFile->m_MixerSettings.gnChannels; for (UINT i=0; i<imax; i+=3) { LONG l = ((((buffer[i+2] << 8) + buffer[i+1]) << 8) + buffer[i]) << 8; @@ -848,7 +849,7 @@ break; if (!(n % 10)) { - DWORD l = (DWORD)(ullSamples / CSoundFile::gdwMixingFreq); + DWORD l = (DWORD)(ullSamples / m_pSndFile->m_MixerSettings.gdwMixingFreq); const DWORD dwCurrentTime = timeGetTime(); DWORD timeRemaining = 0; // estimated remainig time @@ -904,7 +905,7 @@ if (dwSize > dwCount) dwSize = dwCount; fseek(f, dwPos, SEEK_SET); if (fread(buffer, 1, dwSize, f) != dwSize) break; - CSoundFile::Normalize24BitBuffer(buffer, dwSize, lMax, dwBitSize); + m_pSndFile->Normalize24BitBuffer(buffer, dwSize, lMax, dwBitSize); fseek(f, dwOutPos, SEEK_SET); datahdr.length += (dwSize/3)*dwBitSize; fwrite(buffer, 1, (dwSize/3)*dwBitSize, f); @@ -959,11 +960,10 @@ fseek(f, dwDataOffset-sizeof(datahdr), SEEK_SET); fwrite(&datahdr, sizeof(datahdr), 1, f); fclose(f); - CSoundFile::gdwSoundSetup &= ~SNDMIX_DIRECTTODISK; m_pSndFile->m_nMaxOrderPosition = 0; if (m_bNormalize) { - m_pSndFile->SetMasterVolume(oldVol); + m_pSndFile->SetMixerSettings(oldmixersettings); CFile fw; if (fw.Open(m_lpszFileName, CFile::modeReadWrite | CFile::modeNoTruncate)) { @@ -971,7 +971,7 @@ fw.Close(); } } - CMainFrame::UpdateAudioParameters(TRUE); + CMainFrame::UpdateAudioParameters(*m_pSndFile, TRUE); EndDialog(ok); } @@ -1034,6 +1034,8 @@ bool bPrepared = false, bFinished = false; FILE *f; + MixerSettings mixersettings = TrackerSettings::Instance().m_MixerSettings; + progress = ::GetDlgItem(m_hWnd, IDC_PROGRESS1); if ((!m_pSndFile) || (!m_lpszFileName) || (!m_pwfx) || (!m_hadid)) goto OnError; _splitpath(m_lpszFileName, NULL, NULL, NULL, fext); @@ -1102,18 +1104,17 @@ m_FileTags.WriteID3v2Tags(f); } - static DWORD oldsndcfg = CSoundFile::gdwSoundSetup; + DWORD oldsndcfg = m_pSndFile->m_MixerSettings.MixerFlags; oldrepeat = m_pSndFile->GetRepeatCount(); const DWORD dwSongTime = m_pSndFile->GetSongTime(); - CSoundFile::gdwMixingFreq = wfxSrc.nSamplesPerSec; - CSoundFile::gnBitsPerSample = 16; -// CSoundFile::SetResamplingMode(SRCMODE_POLYPHASE); //rewbs.resamplerConf - we don't want this anymore. - CSoundFile::gnChannels = wfxSrc.nChannels; + mixersettings.gdwMixingFreq = wfxSrc.nSamplesPerSec; + mixersettings.gnBitsPerSample = 16; + mixersettings.gnChannels = wfxSrc.nChannels; m_pSndFile->SetRepeatCount(0); m_pSndFile->ResetChannels(); - CSoundFile::SetMixerSettings(TrackerSettings::Instance().m_MixerSettings); - CSoundFile::InitPlayer(TRUE); - CSoundFile::gdwSoundSetup |= SNDMIX_DIRECTTODISK; + m_pSndFile->SetMixerSettings(mixersettings); + m_pSndFile->SetResamplerSettings(TrackerSettings::Instance().m_ResamplerSettings); + m_pSndFile->InitPlayer(TRUE); m_pSndFile->m_SongFlags.reset(SONG_PAUSED | SONG_STEP); m_pSndFile->visitedSongRows.Initialize(true); @@ -1151,7 +1152,7 @@ UINT lRead = 0; if (!bFinished) { - lRead = m_pSndFile->Read(pcmBuffer + WAVECONVERTBUFSIZE - pcmBufSize, pcmBufSize/(CSoundFile::gnChannels*CSoundFile::gnBitsPerSample/8)); + lRead = m_pSndFile->Read(pcmBuffer + WAVECONVERTBUFSIZE - pcmBufSize, pcmBufSize/(m_pSndFile->m_MixerSettings.gnChannels*m_pSndFile->m_MixerSettings.gnBitsPerSample/8)); if (!lRead) bFinished = true; } ullSamples += lRead; @@ -1204,12 +1205,11 @@ } CMainFrame::GetMainFrame()->StopRenderer(m_pSndFile); //rewbs.VSTTimeInfo // Done - CSoundFile::gdwSoundSetup = oldsndcfg; - CSoundFile::gdwSoundSetup &= ~SNDMIX_DIRECTTODISK; + m_pSndFile->m_MixerSettings.MixerFlags = oldsndcfg; m_pSndFile->SetRepeatCount(oldrepeat); m_pSndFile->m_nMaxOrderPosition = 0; m_pSndFile->visitedSongRows.Initialize(true); - CMainFrame::UpdateAudioParameters(TRUE); + CMainFrame::UpdateAudioParameters(*m_pSndFile, TRUE); // Success Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2013-04-11 16:32:02 UTC (rev 1841) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2013-04-11 17:14:21 UTC (rev 1842) @@ -1734,7 +1734,6 @@ dwcdlg.m_bGivePlugsIdleTime = wsdlg.m_bGivePlugsIdleTime; dwcdlg.m_dwSongLimit = wsdlg.m_dwSongLimit; dwcdlg.m_nMaxPatterns = (wsdlg.m_bSelectPlay) ? wsdlg.m_nMaxOrder - wsdlg.m_nMinOrder + 1 : 0; - //if(wsdlg.m_bHighQuality) CSoundFile::SetResamplingMode(SRCMODE_POLYPHASE); if(dwcdlg.DoModal() != IDOK) break; } @@ -1767,7 +1766,7 @@ m_SndFile.SetRepeatCount(oldRepeat); m_SndFile.SetCurrentPos(pos); - CMainFrame::UpdateAudioParameters(TRUE); + CMainFrame::UpdateAudioParameters(m_SndFile, TRUE); } @@ -1825,7 +1824,7 @@ dwcdlg.m_dwSongLimit = wsdlg.m_dwSongLimit; dwcdlg.DoModal(); m_SndFile.SetCurrentPos(pos); - CMainFrame::UpdateAudioParameters(TRUE); + CMainFrame::UpdateAudioParameters(m_SndFile, TRUE); } Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2013-04-11 16:32:02 UTC (rev 1841) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2013-04-11 17:14:21 UTC (rev 1842) @@ -753,7 +753,7 @@ void CModDoc::InitializeInstrument(ModInstrument *pIns) //----------------------------------------------------- { - pIns->nPluginVolumeHandling = CSoundFile::s_DefaultPlugVolumeHandling; + pIns->nPluginVolumeHandling = TrackerSettings::Instance().DefaultPlugVolumeHandling; } Modified: trunk/OpenMPT/mptrack/Mpdlgs.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mpdlgs.cpp 2013-04-11 16:32:02 UTC (rev 1841) +++ trunk/OpenMPT/mptrack/Mpdlgs.cpp 2013-04-11 17:14:21 UTC (rev 1842) @@ -124,8 +124,8 @@ CHAR s[128]; CPropertyPage::OnInitDialog(); - if (m_dwSoundSetup & SOUNDSETUP_SOFTPANNING) CheckDlgButton(IDC_CHECK2, MF_CHECKED); - if (m_dwSoundSetup & SOUNDSETUP_ENABLEMMX) CheckDlgButton(IDC_CHECK3, MF_CHECKED); + if (m_dwSoundSetup & SNDMIX_SOFTPANNING) CheckDlgButton(IDC_CHECK2, MF_CHECKED); + if (m_dwSoundSetup & SNDMIX_ENABLEMMX) CheckDlgButton(IDC_CHECK3, MF_CHECKED); if (m_dwSoundSetup & SOUNDSETUP_SECONDARY) CheckDlgButton(IDC_CHECK4, MF_CHECKED); if (!(m_dwSoundSetup & SOUNDSETUP_NOBOOSTTHREADPRIORITY)) CheckDlgButton(IDC_CHECK5, MF_CHECKED); // Multimedia extensions @@ -147,7 +147,7 @@ { wsprintf(s, "%d (%s)", nCPUMix[n], szCPUNames[n]); m_CbnPolyphony.AddString(s); - if (CSoundFile::m_nMaxMixChannels == nCPUMix[n]) m_CbnPolyphony.SetCurSel(n); + if (TrackerSettings::Instance().m_MixerSettings.m_nMaxMixChannels == nCPUMix[n]) m_CbnPolyphony.SetCurSel(n); } } // latency @@ -191,7 +191,7 @@ m_SliderStereoSep.SetPos(2); for (int n=0; n<=4; n++) { - if ((int)CSoundFile::m_nStereoSeparation <= (int)(32 << n)) + if ((int)TrackerSettings::Instance().m_MixerSettings.m_nStereoSeparation <= (int)(32 << n)) { m_SliderStereoSep.SetPos(n); break; @@ -305,8 +305,9 @@ //--------------------------------------- { CHAR s[64]; - CSoundFile::m_nStereoSeparation = 32 << m_SliderStereoSep.GetPos(); - wsprintf(s, "%d%%", (CSoundFile::m_nStereoSeparation * 100) / 128); + TrackerSettings::Instance().m_MixerSettings.m_nStereoSeparation = 32 << m_SliderStereoSep.GetPos(); + CMainFrame::GetMainFrame()->SetupPlayer(); + wsprintf(s, "%d%%", (TrackerSettings::Instance().m_MixerSettings.m_nStereoSeparation * 100) / 128); SetDlgItemText(IDC_TEXT1, s); } @@ -315,7 +316,7 @@ void COptionsSoundcard::SetPreAmpSliderPosition() //----------------------------------------------- { - int n = (TrackerSettings::Instance().m_nPreAmp - 64) / 8; + int n = (TrackerSettings::Instance().m_MixerSettings.m_nPreAmp - 64) / 8; if ((n < 0) || (n > 40)) n = 16; m_SliderPreAmp.SetPos(n); } @@ -412,9 +413,9 @@ void COptionsSoundcard::OnOK() //---------------------------- { - m_dwSoundSetup &= ~(SOUNDSETUP_ENABLEMMX | SOUNDSETUP_SECONDARY | SOUNDSETUP_SOFTPANNING | SOUNDSETUP_NOBOOSTTHREADPRIORITY); - if (IsDlgButtonChecked(IDC_CHECK2)) m_dwSoundSetup |= SOUNDSETUP_SOFTPANNING; - if (IsDlgButtonChecked(IDC_CHECK3)) m_dwSoundSetup |= SOUNDSETUP_ENABLEMMX; + m_dwSoundSetup &= ~(SNDMIX_ENABLEMMX | SOUNDSETUP_SECONDARY | SNDMIX_SOFTPANNING | SOUNDSETUP_NOBOOSTTHREADPRIORITY); + if (IsDlgButtonChecked(IDC_CHECK2)) m_dwSoundSetup |= SNDMIX_SOFTPANNING; + if (IsDlgButtonChecked(IDC_CHECK3)) m_dwSoundSetup |= SNDMIX_ENABLEMMX; if (IsDlgButtonChecked(IDC_CHECK4)) m_dwSoundSetup |= SOUNDSETUP_SECONDARY; if (!IsDlgButtonChecked(IDC_CHECK5)) m_dwSoundSetup |= SOUNDSETUP_NOBOOSTTHREADPRIORITY; // Mixing Freq @@ -432,7 +433,11 @@ // Polyphony { int nmmx = m_CbnPolyphony.GetCurSel(); - if ((nmmx >= 0) && (nmmx < CountOf(nCPUMix))) CSoundFile::m_nMaxMixChannels = nCPUMix[nmmx]; + if ((nmmx >= 0) && (nmmx < CountOf(nCPUMix))) + { + TrackerSettings::Instance().m_MixerSettings.m_nMaxMixChannels = nCPUMix[nmmx]; + CMainFrame::GetMainFrame()->SetupPlayer(); + } } // Sound Device { @@ -460,12 +465,14 @@ m_CbnUpdateIntervalMS.SetWindowText(s); } // Soft Panning - if (m_dwSoundSetup & SOUNDSETUP_SOFTPANNING) - CSoundFile::gdwSoundSetup |= SNDMIX_SOFTPANNING; - else - CSoundFile::gdwSoundSetup &= ~SNDMIX_SOFTPANNING; - CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); - if (pMainFrm) pMainFrm->SetupSoundCard(m_dwSoundSetup, m_dwRate, m_nBitsPerSample, m_nChannels, m_LatencyMS, m_UpdateIntervalMS, m_nSoundDevice); + if (m_dwSoundSetup & SNDMIX_SOFTPANNING) + { + TrackerSettings::Instance().m_MixerSettings.MixerFlags |= SNDMIX_SOFTPANNING; + } else + { + TrackerSettings::Instance().m_MixerSettings.MixerFlags &= ~SNDMIX_SOFTPANNING; + } + CMainFrame::GetMainFrame()->SetupSoundCard(m_dwSoundSetup, m_dwRate, m_nBitsPerSample, m_nChannels, m_LatencyMS, m_UpdateIntervalMS, m_nSoundDevice); UpdateStatistics(); CPropertyPage::OnOK(); } @@ -543,7 +550,7 @@ DWORD dwQuality; CPropertyPage::OnInitDialog(); - dwQuality = TrackerSettings::Instance().m_dwQuality; + dwQuality = TrackerSettings::Instance().m_MixerSettings.DSPMask; // Resampling type { m_CbnResampling.AddString("No Interpolation"); @@ -553,28 +560,28 @@ m_CbnResampling.AddString("Polyphase"); m_CbnResampling.AddString("XMMS-ModPlug"); //end rewbs.resamplerConf - m_CbnResampling.SetCurSel(TrackerSettings::Instance().m_nSrcMode); + m_CbnResampling.SetCurSel(TrackerSettings::Instance().m_ResamplerSettings.SrcMode); } // Effects #ifndef NO_DSP - if (dwQuality & QUALITY_MEGABASS) CheckDlgButton(IDC_CHECK1, MF_CHECKED); + if (dwQuality & SNDDSP_MEGABASS) CheckDlgButton(IDC_CHECK1, MF_CHECKED); #else GetDlgItem(IDC_CHECK1)->ShowWindow(SW_HIDE); #endif #ifndef NO_AGC - if (dwQuality & QUALITY_AGC) CheckDlgButton(IDC_CHECK2, MF_CHECKED); + if (dwQuality & SNDDSP_AGC) CheckDlgButton(IDC_CHECK2, MF_CHECKED); #else GetDlgItem(IDC_CHECK2)->ShowWindow(SW_HIDE); #endif #ifndef NO_DSP - if (dwQuality & QUALITY_SURROUND) CheckDlgButton(IDC_CHECK4, MF_CHECKED); - if (dwQuality & QUALITY_NOISEREDUCTION) CheckDlgButton(IDC_CHECK5, MF_CHECKED); + if (dwQuality & SNDDSP_SURROUND) CheckDlgButton(IDC_CHECK4, MF_CHECKED); + if (dwQuality & SNDDSP_NOISEREDUCTION) CheckDlgButton(IDC_CHECK5, MF_CHECKED); #else GetDlgItem(IDC_CHECK4)->ShowWindow(SW_HIDE); GetDlgItem(IDC_CHECK5)->ShowWindow(SW_HIDE); #endif #ifndef NO_EQ - if (dwQuality & QUALITY_EQ) CheckDlgButton(IDC_CHECK3, MF_CHECKED); + if (dwQuality & SNDDSP_EQ) CheckDlgButton(IDC_CHECK3, MF_CHECKED); #else GetDlgItem(IDC_CHECK3)->ShowWindow(SW_HIDE); ::EnableWindow(::GetDlgItem(m_hWnd, IDC_CHECK3), FALSE); @@ -583,9 +590,9 @@ #ifndef NO_DSP // Bass Expansion m_SbXBassDepth.SetRange(0,4); - m_SbXBassDepth.SetPos(8-CSoundFile::m_DSP.m_Settings.m_nXBassDepth); + m_SbXBassDepth.SetPos(8-TrackerSettings::Instance().m_DSPSettings.m_nXBassDepth); m_SbXBassRange.SetRange(0,4); - m_SbXBassRange.SetPos(4 - (CSoundFile::m_DSP.m_Settings.m_nXBassRange - 1) / 5); + m_SbXBassRange.SetPos(4 - (TrackerSettings::Instance().m_DSPSettings.m_nXBassRange - 1) / 5); #else m_SbXBassDepth.ShowWindow(SW_HIDE); m_SbXBassRange.ShowWindow(SW_HIDE); @@ -594,7 +601,7 @@ #ifndef NO_REVERB // Reverb m_SbReverbDepth.SetRange(1, 16); - m_SbReverbDepth.SetPos(CSoundFile::m_Reverb.m_Settings.m_nReverbDepth); + m_SbReverbDepth.SetPos(TrackerSettings::Instance().m_ReverbSettings.m_nReverbDepth); UINT nSel = 0; for (UINT iRvb=0; iRvb<NUM_REVERBTYPES; iRvb++) { @@ -603,18 +610,18 @@ { UINT n = m_CbnReverbPreset.AddString(pszName); m_CbnReverbPreset.SetItemData(n, iRvb); - if (iRvb == CSoundFile::m_Reverb.m_Settings.m_nReverbType) nSel = n; + if (iRvb == TrackerSettings::Instance().m_ReverbSettings.m_nReverbType) nSel = n; } } m_CbnReverbPreset.SetCurSel(nSel); - if (!(CSoundFile::gdwSysInfo & SYSMIX_ENABLEMMX)) + if (!(CSoundFile::GetSysInfo() & SYSMIX_ENABLEMMX)) { ::EnableWindow(::GetDlgItem(m_hWnd, IDC_CHECK6), FALSE); m_SbReverbDepth.EnableWindow(FALSE); m_CbnReverbPreset.EnableWindow(FALSE); } else { - if (dwQuality & QUALITY_REVERB) CheckDlgButton(IDC_CHECK6, MF_CHECKED); + if (dwQuality & SNDDSP_REVERB) CheckDlgButton(IDC_CHECK6, MF_CHECKED); } #else GetDlgItem(IDC_CHECK6)->ShowWindow(SW_HIDE); @@ -625,13 +632,13 @@ #ifndef NO_DSP // Surround { - UINT n = CSoundFile::m_DSP.m_Settings.m_nProLogicDepth; + UINT n = TrackerSettings::Instance().m_DSPSettings.m_nProLogicDepth; if (n < 1) n = 1; if (n > 16) n = 16; m_SbSurroundDepth.SetRange(1, 16); m_SbSurroundDepth.SetPos(n); m_SbSurroundDelay.SetRange(0, 8); - m_SbSurroundDelay.SetPos((CSoundFile::m_DSP.m_Settings.m_nProLogicDelay-5)/5); + m_SbSurroundDelay.SetPos((TrackerSettings::Instance().m_DSPSettings.m_nProLogicDelay-5)/5); } #else m_SbSurroundDepth.ShowWindow(SW_HIDE); @@ -668,10 +675,9 @@ { #ifndef NO_REVERB UINT n = m_SbReverbDepth.GetPos(); - if (n != CSoundFile::m_Reverb.m_Settings.m_nReverbDepth) - { - if ((n) && (n <= 16)) CSoundFile::m_Reverb.m_Settings.m_nReverbDepth = n; - } + if ((n) && (n <= 16)) TrackerSettings::Instance().m_ReverbSettings.m_nReverbDepth = n; + //if ((n) && (n <= 16)) CSoundFile::m_Reverb.m_Settings.m_nReverbDepth = n; + CMainFrame::GetMainFrame()->SetupPlayer(); #endif } else { @@ -682,7 +688,7 @@ //rewbs.resamplerConf void COptionsPlayer::OnWFIRTypeChanged() { - TrackerSettings::Instance().m_MixerSettings.gbWFIRType = static_cast<BYTE>(m_CbnWFIRType.GetCurSel()); + TrackerSettings::Instance().m_ResamplerSettings.gbWFIRType = static_cast<BYTE>(m_CbnWFIRType.GetCurSel()); OnSettingsChanged(); } @@ -699,7 +705,7 @@ m_CbnWFIRType.SetCurSel(0); m_CbnWFIRType.EnableWindow(FALSE); m_CEditWFIRCutoff.EnableWindow(TRUE); - wsprintf(s, "%d", static_cast<int>((TrackerSettings::Instance().m_MixerSettings.gdWFIRCutoff * 100))); + wsprintf(s, "%d", static_cast<int>((TrackerSettings::Instance().m_ResamplerSettings.gdWFIRCutoff * 100))); break; case SRCMODE_FIRFILTER: m_CbnWFIRType.AddString("Hann"); @@ -710,10 +716,10 @@ m_CbnWFIRType.AddString("Blackman 4 Tap 92"); m_CbnWFIRType.AddString("Blackman 4 Tap 74"); m_CbnWFIRType.AddString("Kaiser 4 Tap"); - m_CbnWFIRType.SetCurSel(TrackerSettings::Instance().m_MixerSettings.gbWFIRType); + m_CbnWFIRType.SetCurSel(TrackerSettings::Instance().m_ResamplerSettings.gbWFIRType); m_CbnWFIRType.EnableWindow(TRUE); m_CEditWFIRCutoff.EnableWindow(TRUE); - wsprintf(s, "%d", static_cast<int>((TrackerSettings::Instance().m_MixerSettings.gdWFIRCutoff*100))); + wsprintf(s, "%d", static_cast<int>((TrackerSettings::Instance().m_ResamplerSettings.gdWFIRCutoff*100))); break; default: m_CbnWFIRType.AddString("None"); @@ -738,8 +744,7 @@ } -extern void SndMixInitializeTables(const MixerSettings & mixersettings); -//end rewbs.resamplerConf + void COptionsPlayer::OnOK() //------------------------- { @@ -747,19 +752,19 @@ DWORD dwSrcMode = 0; #ifndef NO_DSP - if (IsDlgButtonChecked(IDC_CHECK1)) dwQuality |= QUALITY_MEGABASS; + if (IsDlgButtonChecked(IDC_CHECK1)) dwQuality |= SNDDSP_MEGABASS; #endif #ifndef NO_AGC - if (IsDlgButtonChecked(IDC_CHECK2)) dwQuality |= QUALITY_AGC; + if (IsDlgButtonChecked(IDC_CHECK2)) dwQuality |= SNDDSP_AGC; #endif #ifndef NO_EQ - if (IsDlgButtonChecked(IDC_CHECK3)) dwQuality |= QUALITY_EQ; + if (IsDlgButtonChecked(IDC_CHECK3)) dwQuality |= SNDDSP_EQ; #endif #ifndef NO_DSP - if (IsDlgButtonChecked(IDC_CHECK4)) dwQuality |= QUALITY_SURROUND; - if (IsDlgButtonChecked(IDC_CHECK5)) dwQuality |= QUALITY_NOISEREDUCTION; + if (IsDlgButtonChecked(IDC_CHECK4)) dwQuality |= SNDDSP_SURROUND; + if (IsDlgButtonChecked(IDC_CHECK5)) dwQuality |= SNDDSP_NOISEREDUCTION; #endif - if (IsDlgButtonChecked(IDC_CHECK6)) dwQuality |= QUALITY_REVERB; + if (IsDlgButtonChecked(IDC_CHECK6)) dwQuality |= SNDDSP_REVERB; dwSrcMode = m_CbnResampling.GetCurSel(); #ifndef NO_DSP @@ -771,8 +776,9 @@ UINT nXBassRange = (4-m_SbXBassRange.GetPos()) * 5 + 1; if (nXBassRange < 5) nXBassRange = 5; if (nXBassRange > 21) nXBassRange = 21; - CSoundFile::m_DSP.m_Settings.m_nXBassDepth = nXBassDepth; - CSoundFile::m_DSP.m_Settings.m_nXBassRange = nXBassRange; + TrackerSettings::Instance().m_DSPSettings.m_nXBassDepth = nXBassDepth; + TrackerSettings::Instance().m_DSPSettings.m_nXBassRange = nXBassRange; + CMainFrame::GetMainFrame()->SetupPlayer(); } #endif #ifndef NO_REVERB @@ -780,7 +786,8 @@ { // Reverb depth is dynamically changed UINT nReverbType = m_CbnReverbPreset.GetItemData(m_CbnReverbPreset.GetCurSel()); - if (nReverbType < NUM_REVERBTYPES) CSoundFile::m_Reverb.m_Settings.m_nReverbType = nReverbType; + if (nReverbType < NUM_REVERBTYPES) TrackerSettings::Instance().m_ReverbSettings.m_nReverbType = nReverbType; + CMainFrame::GetMainFrame()->SetupPlayer(); } #endif #ifndef NO_DSP @@ -788,8 +795,9 @@ { UINT nProLogicDepth = m_SbSurroundDepth.GetPos(); UINT nProLogicDelay = 5 + (m_SbSurroundDelay.GetPos() * 5); - CSoundFile::m_DSP.m_Settings.m_nProLogicDepth = nProLogicDepth; - CSoundFile::m_DSP.m_Settings.m_nProLogicDelay = nProLogicDelay; + TrackerSettings::Instance().m_DSPSettings.m_nProLogicDepth = nProLogicDepth; + TrackerSettings::Instance().m_DSPSettings.m_nProLogicDelay = nProLogicDelay; + CMainFrame::GetMainFrame()->SetupPlayer(); } #endif // Notify CMainFrame @@ -798,17 +806,16 @@ CString s; m_CEditWFIRCutoff.GetWindowText(s); if (s != "") - TrackerSettings::Instance().m_MixerSettings.gdWFIRCutoff = atoi(s)/100.0; - //TrackerSettings::Instance().m_MixerSettings.gbWFIRType set in OnWFIRTypeChange + TrackerSettings::Instance().m_ResamplerSettings.gdWFIRCutoff = atoi(s)/100.0; + //TrackerSettings::Instance().m_ResamplerSettings.gbWFIRType set in OnWFIRTypeChange m_CEditRampUp.GetWindowText(s); TrackerSettings::Instance().m_MixerSettings.glVolumeRampUpSamples = atol(s); m_CEditRampDown.GetWindowText(s); TrackerSettings::Instance().m_MixerSettings.glVolumeRampDownSamples = atol(s); - - SndMixInitializeTables(TrackerSettings::Instance().m_MixerSettings); //regenerate resampling tables - //end rewbs.resamplerConf - if (pParent) pParent->SetupPlayer(dwQuality, dwSrcMode, TRUE); + TrackerSettings::Instance().m_ResamplerSettings.SrcMode = (ResamplingMode)dwSrcMode; + TrackerSettings::Instance().m_MixerSettings.DSPMask = dwQuality; + CMainFrame::GetMainFrame()->SetupPlayer(); CPropertyPage::OnOK(); } @@ -1020,7 +1027,8 @@ { #ifndef NO_EQ CriticalSection cs; - CSoundFile::SetEQGains( m_pEqPreset->Gains, MAX_EQ_BANDS, m_pEqPreset->Freqs, bReset); + if(CMainFrame::GetMainFrame()->GetSoundFilePlaying()) + CMainFrame::GetMainFrame()->GetSoundFilePlaying()->SetEQGains( m_pEqPreset->Gains, MAX_EQ_BANDS, m_pEqPreset->Freqs, bReset); #endif } Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2013-04-11 16:32:02 UTC (rev 1841) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2013-04-11 17:14:21 UTC (rev 1842) @@ -890,15 +890,15 @@ AddDocTemplate(m_pModTemplate); // Initialize Audio - CSoundFile::InitSysInfo(); - if (CSoundFile::gdwSysInfo & SYSMIX_ENABLEMMX) + DWORD sysinfo = CSoundFile::GetSysInfo(); + if(sysinfo & SYSMIX_ENABLEMMX) { - TrackerSettings::Instance().m_dwSoundSetup |= SOUNDSETUP_ENABLEMMX; - TrackerSettings::Instance().m_nSrcMode = SRCMODE_SPLINE; + TrackerSettings::Instance().m_MixerSettings.MixerFlags |= SNDMIX_ENABLEMMX; + TrackerSettings::Instance().m_ResamplerSettings.SrcMode = SRCMODE_SPLINE; } - if (CSoundFile::gdwSysInfo & SYSMIX_MMXEX) + if(sysinfo & SYSMIX_MMXEX) { - TrackerSettings::Instance().m_nSrcMode = SRCMODE_POLYPHASE; + TrackerSettings::Instance().m_ResamplerSettings.SrcMode = SRCMODE_POLYPHASE; } // Load Midi Library if (m_szConfigFileName[0]) ImportMidiConfig(m_szConfigFileName); Modified: trunk/OpenMPT/mptrack/TrackerSettings.cpp =================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.cpp 2013-04-11 16:32:02 UTC (rev 1841) +++ trunk/OpenMPT/mptrack/TrackerSettings.cpp 2013-04-11 17:14:21 UTC (rev 1842) @@ -62,13 +62,6 @@ gnMsgBoxVisiblityFlags = uint32_max; // Audio device - m_dwRate = 44100; // Default value will be overridden - m_dwSoundSetup = SOUNDSETUP_SECONDARY; - m_nChannels = 2; - m_dwQuality = 0; - m_nSrcMode = SRCMODE_FIRFILTER; - m_nBitsPerSample = 16; - m_nPreAmp = 128; gbLoopSong = TRUE; m_nWaveDevice = SNDDEV_BUILD_ID(0, SNDDEV_WAVEOUT); // Default value will be overridden m_LatencyMS = SNDDEV_DEFAULT_LATENCY_MS; @@ -142,6 +135,8 @@ defaultModType = MOD_TYPE_IT; + DefaultPlugVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE; + gnPlugWindowX = 243; gnPlugWindowY = 273; gnPlugWindowWidth = 370; @@ -320,14 +315,14 @@ CASIODevice::baseChannel = GetPrivateProfileInt("Sound Settings", "ASIOBaseChannel", CASIODevice::baseChannel, iniFile); #endif // NO_ASIO m_nWaveDevice = CMainFrame::GetPrivateProfileLong("Sound Settings", "WaveDevice", defaultDevice, iniFile); - m_dwSoundSetup = CMainFrame::GetPrivateProfileDWord("Sound Settings", "SoundSetup", m_dwSoundSetup, iniFile); + m_MixerSettings.MixerFlags = CMainFrame::GetPrivateProfileDWord("Sound Settings", "SoundSetup", m_MixerSettings.MixerFlags, iniFile); if(vIniVersion < MAKE_VERSION_NUMERIC(1, 21, 01, 26)) - m_dwSoundSetup &= ~0x20; // Reverse stereo - m_dwQuality = CMainFrame::GetPrivateProfileDWord("Sound Settings", "Quality", m_dwQuality, iniFile); - m_nSrcMode = CMainFrame::GetPrivateProfileDWord("Sound Settings", "SrcMode", m_nSrcMode, iniFile); - m_dwRate = CMainFrame::GetPrivateProfileDWord("Sound Settings", "Mixing_Rate", 0, iniFile); - m_nBitsPerSample = CMainFrame::GetPrivateProfileDWord("Sound Settings", "BitsPerSample", m_nBitsPerSample, iniFile); - m_nChannels = CMainFrame::GetPrivateProfileDWord("Sound Settings", "ChannelMode", m_nChannels, iniFile); + m_MixerSettings.MixerFlags &= ~0x20; // Reverse stereo + m_MixerSettings.DSPMask = CMainFrame::GetPrivateProfileDWord("Sound Settings", "Quality", m_MixerSettings.DSPMask, iniFile); + m_ResamplerSettings.SrcMode = (ResamplingMode)CMainFrame::GetPrivateProfileDWord("Sound Settings", "SrcMode", m_ResamplerSettings.SrcMode, iniFile); + m_MixerSettings.gdwMixingFreq = CMainFrame::GetPrivateProfileDWord("Sound Settings", "Mixing_Rate", 0, iniFile); + m_MixerSettings.gnBitsPerSample = CMainFrame::GetPrivateProfileDWord("Sound Settings", "BitsPerSample", m_MixerSettings.gnBitsPerSample, iniFile); + m_MixerSettings.gnChannels = CMainFrame::GetPrivateProfileDWord("Sound Settings", "ChannelMode", m_MixerSettings.gnChannels, iniFile); DWORD LatencyMS = CMainFrame::GetPrivateProfileDWord("Sound Settings", "Latency", 0, iniFile); DWORD UpdateIntervalMS = CMainFrame::GetPrivateProfileDWord("Sound Settings", "UpdateInterval", 0, iniFile); if(LatencyMS == 0 || UpdateIntervalMS == 0) @@ -358,9 +353,9 @@ m_LatencyMS = LatencyMS; m_UpdateIntervalMS = UpdateIntervalMS; } - if(m_dwRate == 0) + if(m_MixerSettings.gdwMixingFreq == 0) { - m_dwRate = 44100; + m_MixerSettings.gdwMixingFreq = 44100; #ifndef NO_ASIO // If no mixing rate is specified and we're using ASIO, get a mixing rate supported by the device. if(SNDDEV_GET_TYPE(m_nWaveDevice) == SNDDEV_ASIO) @@ -368,19 +363,19 @@ ISoundDevice *dummy = CreateSoundDevice(SNDDEV_ASIO); if(dummy) { - m_dwRate = dummy->GetCurrentSampleRate(SNDDEV_GET_NUMBER(m_nWaveDevice)); + m_MixerSettings.gdwMixingFreq = dummy->GetCurrentSampleRate(SNDDEV_GET_NUMBER(m_nWaveDevice)); delete dummy; } } #endif // NO_ASIO } - m_nPreAmp = CMainFrame::GetPrivateProfileDWord("Sound Settings", "PreAmp", m_nPreAmp, iniFile); - CSoundFile::m_nStereoSeparation = CMainFrame::GetPrivateProfileLong("Sound Settings", "StereoSeparation", CSoundFile::m_nStereoSeparation, iniFile); - CSoundFile::m_nMaxMixChannels = CMainFrame::GetPrivateProfileLong("Sound Settings", "MixChannels", CSoundFile::m_nMaxMixChannels, iniFile); - m_MixerSettings.gbWFIRType = static_cast<BYTE>(CMainFrame::GetPrivateProfileDWord("Sound Settings", "XMMSModplugResamplerWFIRType", m_MixerSettings.gbWFIRType, iniFile)); + m_MixerSettings.m_nPreAmp = CMainFrame::GetPrivateProfileDWord("Sound Settings", "PreAmp", m_MixerSettings.m_nPreAmp, iniFile); + m_MixerSettings.m_nStereoSeparation = CMainFrame::GetPrivateProfileLong("Sound Settings", "StereoSeparation", m_MixerSettings.m_nStereoSeparation, iniFile); + m_MixerSettings.m_nMaxMixChannels = CMainFrame::GetPrivateProfileLong("Sound Settings", "MixChannels", m_MixerSettings.m_nMaxMixChannels, iniFile); + m_ResamplerSettings.gbWFIRType = static_cast<BYTE>(CMainFrame::GetPrivateProfileDWord("Sound Settings", "XMMSModplugResamplerWFIRType", m_ResamplerSettings.gbWFIRType, iniFile)); //gdWFIRCutoff = static_cast<double>(CMainFrame::GetPrivateProfileLong("Sound Settings", "ResamplerWFIRCutoff", gdWFIRCutoff * 100.0, iniFile)) / 100.0; - m_MixerSettings.gdWFIRCutoff = static_cast<double>(CMainFrame::GetPrivateProfileLong("Sound Settings", "ResamplerWFIRCutoff", Util::Round<long>(m_MixerSettings.gdWFIRCutoff * 100.0), iniFile)) / 100.0; + m_ResamplerSettings.gdWFIRCutoff = static_cast<double>(CMainFrame::GetPrivateProfileLong("Sound Settings", "ResamplerWFIRCutoff", Util::Round<long>(m_ResamplerSettings.gdWFIRCutoff * 100.0), iniFile)) / 100.0; // Ramping... first try to read the old setting, then the new ones const long volRamp = CMainFrame::GetPrivateProfileLong("Sound Settings", "VolumeRampSamples", -1, iniFile); @@ -430,8 +425,8 @@ rowDisplayOffset = GetPrivateProfileInt("Pattern Editor", "RowDisplayOffset", rowDisplayOffset, iniFile); recordQuantizeRows = CMainFrame::GetPrivateProfileDWord("Pattern Editor", "RecordQuantize", recordQuantizeRows, iniFile); gbShowHackControls = (0 != CMainFrame::GetPrivateProfileDWord("Misc", "ShowHackControls", gbShowHackControls ? 1 : 0, iniFile)); - CSoundFile::s_DefaultPlugVolumeHandling = static_cast<uint8>(GetPrivateProfileInt("Misc", "DefaultPlugVolumeHandling", CSoundFile::s_DefaultPlugVolumeHandling, iniFile)); - if(CSoundFile::s_DefaultPlugVolumeHandling >= PLUGIN_VOLUMEHANDLING_MAX) CSoundFile::s_DefaultPlugVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE; + DefaultPlugVolumeHandling = static_cast<uint8>(GetPrivateProfileInt("Misc", "DefaultPlugVolumeHandling", DefaultPlugVolumeHandling, iniFile)); + if(DefaultPlugVolumeHandling >= PLUGIN_VOLUMEHANDLING_MAX) DefaultPlugVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE; m_nSampleUndoMaxBuffer = CMainFrame::GetPrivateProfileLong("Sample Editor" , "UndoBufferSize", m_nSampleUndoMaxBuffer >> 20, iniFile); m_nSampleUndoMaxBuffer = max(1, m_nSampleUndoMaxBuffer) << 20; @@ -456,16 +451,16 @@ // Effects Settings #ifndef NO_DSP - CSoundFile::m_DSP.m_Settings.m_nXBassDepth = CMainFrame::GetPrivateProfileLong("Effects", "XBassDepth", CSoundFile::m_DSP.m_Settings.m_nXBassDepth, iniFile); - CSoundFile::m_DSP.m_Settings.m_nXBassRange = CMainFrame::GetPrivateProfileLong("Effects", "XBassRange", CSoundFile::m_DSP.m_Settings.m_nXBassRange, iniFile); + m_DSPSettings.m_nXBassDepth = CMainFrame::GetPrivateProfileLong("Effects", "XBassDepth", m_DSPSettings.m_nXBassDepth, iniFile); + m_DSPSettings.m_nXBassRange = CMainFrame::GetPrivateProfileLong("Effects", "XBassRange", m_DSPSettings.m_nXBassRange, iniFile); #endif #ifndef NO_REVERB - CSoundFile::m_Reverb.m_Settings.m_nReverbDepth = CMainFrame::GetPrivateProfileLong("Effects", "ReverbDepth", CSoundFile::m_Reverb.m_Settings.m_nReverbDepth, iniFile); - CSoundFile::m_Reverb.m_Settings.m_nReverbType = CMainFrame::GetPrivateProfileLong("Effects", "ReverbType", CSoundFile::m_Reverb.m_Settings.m_nReverbType, iniFile); + m_ReverbSettings.m_nReverbDepth = CMainFrame::GetPrivateProfileLong("Effects", "ReverbDepth", m_ReverbSettings.m_nReverbDepth, iniFile); + m_ReverbSettings.m_nReverbType = CMainFrame::GetPrivateProfileLong("Effects", "ReverbType", m_ReverbSettings.m_nReverbType, iniFile); #endif #ifndef NO_DSP - CSoundFile::m_DSP.m_Settings.m_nProLogicDepth = CMainFrame::GetPrivateProfileLong("Effects", "ProLogicDepth", CSoundFile::m_DSP.m_Settings.m_nProLogicDepth, iniFile); - CSoundFile::m_DSP.m_Settings.m_nProLogicDelay = CMainFrame::GetPrivateProfileLong("Effects", "ProLogicDelay", CSoundFile::m_DSP.m_Settings.m_nProLogicDelay, iniFile); + m_DSPSettings.m_nProLogicDepth = CMainFrame::GetPrivateProfileLong("Effects", "ProLogicDepth", m_DSPSettings.m_nProLogicDepth, iniFile); + m_DSPSettings.m_nProLogicDelay = CMainFrame::GetPrivateProfileLong("Effects", "ProLogicDelay", m_DSPSettings.m_nProLogicDelay, iniFile); #endif @@ -584,11 +579,13 @@ if (RegOpenKeyEx(HKEY_CURRENT_USER, m_csRegKey, 0, KEY_READ, &key) == ERROR_SUCCESS) { - RegQueryValueEx(key, "SoundSetup", NULL, &dwREG_DWORD, (LPBYTE)&m_dwSoundSetup, &dwDWORDSize); - m_dwSoundSetup &= ~0x20; // Reverse stereo - RegQueryValueEx(key, "Quality", NULL, &dwREG_DWORD, (LPBYTE)&m_dwQuality, &dwDWORDSize); - RegQueryValueEx(key, "SrcMode", NULL, &dwREG_DWORD, (LPBYTE)&m_nSrcMode, &dwDWORDSize); - RegQueryValueEx(key, "Mixing_Rate", NULL, &dwREG_DWORD, (LPBYTE)&m_dwRate, &dwDWORDSize); + RegQueryValueEx(key, "SoundSetup", NULL, &dwREG_DWORD, (LPBYTE)&m_MixerSettings.MixerFlags, &dwDWORDSize); + m_MixerSettings.MixerFlags &= ~0x20; // Reverse stereo + RegQueryValueEx(key, "Quality", NULL, &dwREG_DWORD, (LPBYTE)&m_MixerSettings.DSPMask, &dwDWORDSize); + DWORD dummysrcmode = m_ResamplerSettings.SrcMode; + RegQueryValueEx(key, "SrcMode", NULL, &dwREG_DWORD, (LPBYTE)&dummysrcmode, &dwDWORDSize); + m_ResamplerSettings.SrcMode = (ResamplingMode)dummysrcmode; + RegQueryValueEx(key, "Mixing_Rate", NULL, &dwREG_DWORD, (LPBYTE)&m_MixerSettings.gdwMixingFreq, &dwDWORDSize); DWORD BufferLengthMS = 0; RegQueryValueEx(key, "BufferLength", NULL, &dwREG_DWORD, (LPBYTE)&BufferLengthMS, &dwDWORDSize); if(BufferLengthMS != 0) @@ -604,7 +601,7 @@ m_UpdateIntervalMS = BufferLengthMS / 8; } } - RegQueryValueEx(key, "PreAmp", NULL, &dwREG_DWORD, (LPBYTE)&m_nPreAmp, &dwDWORDSize); + RegQueryValueEx(key, "PreAmp", NULL, &dwREG_DWORD, (LPBYTE)&m_MixerSettings.m_nPreAmp, &dwDWORDSize); CHAR sPath[_MAX_PATH] = ""; DWORD dwSZSIZE = sizeof(sPath); @@ -623,19 +620,19 @@ RegQueryValueEx(key, "Key_Config_File", NULL, &dwREG_SZ, (LPBYTE)m_szKbdFile, &dwSZSIZE); #ifndef NO_DSP - RegQueryValueEx(key, "XBassDepth", NULL, &dwREG_DWORD, (LPBYTE)&CSoundFile::m_DSP.m_Settings.m_nXBassDepth, &dwDWORDSize); - RegQueryValueEx(key, "XBassRange", NULL, &dwREG_DWORD, (LPBYTE)&CSoundFile::m_DSP.m_Settings.m_nXBassRange, &dwDWORDSize); + RegQueryValueEx(key, "XBassDepth", NULL, &dwREG_DWORD, (LPBYTE)&m_DSPSettings.m_nXBassDepth, &dwDWORDSize); + RegQueryValueEx(key, "XBassRange", NULL, &dwREG_DWORD, (LPBYTE)&m_DSPSettings.m_nXBassRange, &dwDWORDSize); #endif #ifndef NO_REVERB - RegQueryValueEx(key, "ReverbDepth", NULL, &dwREG_DWORD, (LPBYTE)&CSoundFile::m_Reverb.m_Settings.m_nReverbDepth, &dwDWORDSize); - RegQueryValueEx(key, "ReverbType", NULL, &dwREG_DWORD, (LPBYTE)&CSoundFile::m_Reverb.m_Settings.m_nReverbType, &dwDWORDSize); + RegQueryValueEx(key, "ReverbDepth", NULL, &dwREG_DWORD, (LPBYTE)&m_ReverbSettings.m_nReverbDepth, &dwDWORDSize); + RegQueryValueEx(key, "ReverbType", NULL, &dwREG_DWORD, (LPBYTE)&m_ReverbSettings.m_nReverbType, &dwDWORDSize); #endif NO_REVERB #ifndef NO_DSP - RegQueryValueEx(key, "ProLogicDepth", NULL, &dwREG_DWORD, (LPBYTE)&CSoundFile::m_DSP.m_Settings.m_nProLogicDepth, &dwDWORDSize); - RegQueryValueEx(key, "ProLogicDelay", NULL, &dwREG_DWORD, (LPBYTE)&CSoundFile::m_DSP.m_Settings.m_nProLogicDelay, &dwDWORDSize); + RegQueryValueEx(key, "ProLogicDepth", NULL, &dwREG_DWORD, (LPBYTE)&m_DSPSettings.m_nProLogicDepth, &dwDWORDSize); + RegQueryValueEx(key, "ProLogicDelay", NULL, &dwREG_DWORD, (LPBYTE)&m_DSPSettings.m_nProLogicDelay, &dwDWORDSize); #endif - RegQueryValueEx(key, "StereoSeparation", NULL, &dwREG_DWORD, (LPBYTE)&CSoundFile::m_nStereoSeparation, &dwDWORDSize); - RegQueryValueEx(key, "MixChannels", NULL, &dwREG_DWORD, (LPBYTE)&CSoundFile::m_nMaxMixChannels, &dwDWORDSize); + RegQueryValueEx(key, "StereoSeparation", NULL, &dwREG_DWORD, (LPBYTE)&m_MixerSettings.m_nStereoSeparation, &dwDWORDSize); + RegQueryValueEx(key, "MixChannels", NULL, &dwREG_DWORD, (LPBYTE)&m_MixerSettings.m_nMaxMixChannels, &dwDW... [truncated message content] |
From: <man...@us...> - 2013-04-11 18:10:12
|
Revision: 1844 http://sourceforge.net/p/modplug/code/1844 Author: manxorist Date: 2013-04-11 18:09:59 +0000 (Thu, 11 Apr 2013) Log Message: ----------- [Ref] Rename soundlib/Snd_rvb to sounddsp/Reverb. Modified Paths: -------------- trunk/OpenMPT/mptrack/TrackerSettings.h trunk/OpenMPT/mptrack/mptrack_08.vcproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters trunk/OpenMPT/soundlib/Sndfile.h Added Paths: ----------- trunk/OpenMPT/sounddsp/Reverb.cpp trunk/OpenMPT/sounddsp/Reverb.h Removed Paths: ------------- trunk/OpenMPT/soundlib/Snd_rvb.cpp trunk/OpenMPT/soundlib/snd_rvb.h Modified: trunk/OpenMPT/mptrack/TrackerSettings.h =================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.h 2013-04-11 17:21:26 UTC (rev 1843) +++ trunk/OpenMPT/mptrack/TrackerSettings.h 2013-04-11 18:09:59 UTC (rev 1844) @@ -15,7 +15,7 @@ #include "../soundlib/Resampler.h" #include "../sounddsp/EQ.h" #include "../sounddsp/DSP.h" -#include "../soundlib/snd_rvb.h" +#include "../sounddsp/Reverb.h" ///////////////////////////////////////////////////////////////////////// // Default directories Modified: trunk/OpenMPT/mptrack/mptrack_08.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_08.vcproj 2013-04-11 17:21:26 UTC (rev 1843) +++ trunk/OpenMPT/mptrack/mptrack_08.vcproj 2013-04-11 18:09:59 UTC (rev 1844) @@ -513,16 +513,8 @@ > </File> <File - RelativePath="..\Soundlib\Snd_rvb.cpp" + RelativePath="..\sounddsp\Reverb.cpp" > - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - AssemblerOutput="4" - /> - </FileConfiguration> </File> <File RelativePath="..\Soundlib\snddev.cpp" @@ -1031,6 +1023,10 @@ > </File> <File + RelativePath="..\sounddsp\Reverb.h" + > + </File> + <File RelativePath=".\Resource.h" > </File> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2013-04-11 17:21:26 UTC (rev 1843) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2013-04-11 18:09:59 UTC (rev 1844) @@ -251,6 +251,7 @@ <ClCompile Include="..\sounddsp\AGC.cpp" /> <ClCompile Include="..\sounddsp\DSP.cpp" /> <ClCompile Include="..\sounddsp\EQ.cpp" /> + <ClCompile Include="..\sounddsp\Reverb.cpp" /> <ClCompile Include="..\soundlib\ITCompression.cpp" /> <ClCompile Include="..\soundlib\ITTools.cpp" /> <ClCompile Include="..\soundlib\MIDIEvents.cpp" /> @@ -331,7 +332,6 @@ <ClCompile Include="..\common\serialization_utils.cpp" /> <ClCompile Include="..\soundlib\snd_flt.cpp" /> <ClCompile Include="..\soundlib\Snd_fx.cpp" /> - <ClCompile Include="..\Soundlib\Snd_rvb.cpp" /> <ClCompile Include="..\Soundlib\snddev.cpp" /> <ClCompile Include="..\soundlib\Sndfile.cpp" /> <ClCompile Include="..\soundlib\Sndmix.cpp" /> @@ -410,6 +410,7 @@ <ClInclude Include="..\sounddsp\AGC.h" /> <ClInclude Include="..\sounddsp\DSP.h" /> <ClInclude Include="..\sounddsp\EQ.h" /> + <ClInclude Include="..\sounddsp\Reverb.h" /> <ClInclude Include="..\soundlib\ChunkReader.h" /> <ClInclude Include="..\soundlib\FileReader.h" /> <ClInclude Include="..\soundlib\ITCompression.h" /> @@ -428,7 +429,6 @@ <ClInclude Include="..\soundlib\RowVisitor.h" /> <ClInclude Include="..\soundlib\SampleFormatConverters.h" /> <ClInclude Include="..\soundlib\SampleIO.h" /> - <ClInclude Include="..\soundlib\snd_rvb.h" /> <ClInclude Include="..\soundlib\Tables.h" /> <ClInclude Include="..\soundlib\WAVTools.h" /> <ClInclude Include="..\soundlib\XMTools.h" /> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2013-04-11 17:21:26 UTC (rev 1843) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2013-04-11 18:09:59 UTC (rev 1844) @@ -250,9 +250,6 @@ <ClCompile Include="..\Soundlib\snddev.cpp"> <Filter>Source Files</Filter> </ClCompile> - <ClCompile Include="..\Soundlib\Snd_rvb.cpp"> - <Filter>Source Files</Filter> - </ClCompile> <ClCompile Include="..\soundlib\Snd_fx.cpp"> <Filter>Source Files</Filter> </ClCompile> @@ -430,6 +427,9 @@ <ClCompile Include="..\common\Profiler.cpp"> <Filter>Source Files</Filter> </ClCompile> + <ClCompile Include="..\sounddsp\Reverb.cpp"> + <Filter>Source Files\sounddsp</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="AbstractVstEditor.h"> @@ -762,9 +762,6 @@ <ClInclude Include="..\common\mutex.h"> <Filter>Header Files</Filter> </ClInclude> - <ClInclude Include="..\soundlib\snd_rvb.h"> - <Filter>Header Files</Filter> - </ClInclude> <ClInclude Include="..\common\mptString.h"> <Filter>Header Files</Filter> </ClInclude> @@ -789,6 +786,9 @@ <ClInclude Include="..\common\Profiler.h"> <Filter>Header Files</Filter> </ClInclude> + <ClInclude Include="..\sounddsp\Reverb.h"> + <Filter>Header Files\sounddsp</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <None Include="res\bitmap1.bmp"> Copied: trunk/OpenMPT/sounddsp/Reverb.cpp (from rev 1843, trunk/OpenMPT/soundlib/Snd_rvb.cpp) =================================================================== --- trunk/OpenMPT/sounddsp/Reverb.cpp (rev 0) +++ trunk/OpenMPT/sounddsp/Reverb.cpp 2013-04-11 18:09:59 UTC (rev 1844) @@ -0,0 +1,1096 @@ +/* + * Reverb.cpp + * ---------- + * Purpose: Mixing code for reverb. + * Notes : Ugh... This should really be removed at some point. + * Authors: Olivier Lapicque + * OpenMPT Devs + * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. + */ + + +#include "stdafx.h" +#include "../soundlib/Sndfile.h" +#include "Reverb.h" + +#ifndef NO_REVERB + +#pragma warning(disable:4725) // Pentium fdiv bug +#pragma warning(disable:4731) // ebp modified + +extern VOID MPPASMCALL X86_StereoFill(int *pBuffer, UINT nSamples, LPLONG lpROfs, LPLONG lpLOfs); + + + +CReverbSettings::CReverbSettings() +//-------------------------------- +{ + m_nReverbType = 0; + m_nReverbDepth = 8; // 50% +} + + +CReverb::CReverb() +//---------------- +{ + + // Shared reverb state + gnReverbSamples = 0; + gnReverbDecaySamples = 0; + gnReverbSend = 0; + gnRvbROfsVol = 0; + gnRvbLOfsVol = 0; + + // Internal reverb state + g_bLastInPresent = 0; + g_bLastOutPresent = 0; + g_nLastRvbIn_xl = 0; + g_nLastRvbIn_xr = 0; + g_nLastRvbIn_yl = 0; + g_nLastRvbIn_yr = 0; + g_nLastRvbOut_xl = 0; + g_nLastRvbOut_xr = 0; + gnDCRRvb_Y1 = 0; + gnDCRRvb_X1 = 0; + + // Reverb mix buffers + MemsetZero(g_RefDelay); + MemsetZero(g_LateReverb); + +} + + +// Misc functions +static LONG OnePoleLowPassCoef(LONG scale, FLOAT g, FLOAT F_c, FLOAT F_s); +static LONG mBToLinear(LONG scale, LONG value_mB); +static FLOAT mBToLinear(LONG value_mB); + +struct SNDMIX_REVERB_PROPERTIES +{ + LONG lRoom; // [-10000, 0] default: -10000 mB + LONG lRoomHF; // [-10000, 0] default: 0 mB + FLOAT flDecayTime; // [0.1, 20.0] default: 1.0 s + FLOAT flDecayHFRatio; // [0.1, 2.0] default: 0.5 + LONG lReflections; // [-10000, 1000] default: -10000 mB + FLOAT flReflectionsDelay; // [0.0, 0.3] default: 0.02 s + LONG lReverb; // [-10000, 2000] default: -10000 mB + FLOAT flReverbDelay; // [0.0, 0.1] default: 0.04 s + FLOAT flDiffusion; // [0.0, 100.0] default: 100.0 % + FLOAT flDensity; // [0.0, 100.0] default: 100.0 % +}; +typedef SNDMIX_REVERB_PROPERTIES* PSNDMIX_REVERB_PROPERTIES; + +typedef struct _SNDMIX_RVBPRESET +{ + SNDMIX_REVERB_PROPERTIES Preset; + LPCSTR lpszName; +} SNDMIX_RVBPRESET, *PSNDMIX_RVBPRESET; + + +static SNDMIX_RVBPRESET gRvbPresets[NUM_REVERBTYPES] = +{ + {{ SNDMIX_REVERB_PRESET_PLATE }, "GM Plate"}, + {{ SNDMIX_REVERB_PRESET_SMALLROOM }, "GM Small Room"}, + {{ SNDMIX_REVERB_PRESET_MEDIUMROOM }, "GM Medium Room"}, + {{ SNDMIX_REVERB_PRESET_LARGEROOM }, "GM Large Room"}, + {{ SNDMIX_REVERB_PRESET_MEDIUMHALL }, "GM Medium Hall"}, + {{ SNDMIX_REVERB_PRESET_LARGEHALL }, "GM Large Hall"}, + {{ SNDMIX_REVERB_PRESET_GENERIC }, "Generic"}, + {{ SNDMIX_REVERB_PRESET_PADDEDCELL }, "Padded Cell"}, + {{ SNDMIX_REVERB_PRESET_ROOM }, "Room"}, + {{ SNDMIX_REVERB_PRESET_BATHROOM }, "Bathroom"}, + {{ SNDMIX_REVERB_PRESET_LIVINGROOM }, "Living Room"}, + {{ SNDMIX_REVERB_PRESET_STONEROOM }, "Stone Room"}, + {{ SNDMIX_REVERB_PRESET_AUDITORIUM }, "Auditorium"}, + {{ SNDMIX_REVERB_PRESET_CONCERTHALL }, "Concert Hall"}, + {{ SNDMIX_REVERB_PRESET_CAVE }, "Cave"}, + {{ SNDMIX_REVERB_PRESET_ARENA }, "Arena"}, + {{ SNDMIX_REVERB_PRESET_HANGAR }, "Hangar"}, + {{ SNDMIX_REVERB_PRESET_CARPETEDHALLWAY }, "Carpeted Hallway"}, + {{ SNDMIX_REVERB_PRESET_HALLWAY }, "Hallway"}, + {{ SNDMIX_REVERB_PRESET_STONECORRIDOR }, "Stone Corridor"}, + {{ SNDMIX_REVERB_PRESET_ALLEY }, "Alley"}, + {{ SNDMIX_REVERB_PRESET_FOREST }, "Forest"}, + {{ SNDMIX_REVERB_PRESET_CITY }, "City"}, + {{ SNDMIX_REVERB_PRESET_MOUNTAINS }, "Mountains"}, + {{ SNDMIX_REVERB_PRESET_QUARRY }, "Quarry"}, + {{ SNDMIX_REVERB_PRESET_PLAIN }, "Plain"}, + {{ SNDMIX_REVERB_PRESET_PARKINGLOT }, "Parking Lot"}, + {{ SNDMIX_REVERB_PRESET_SEWERPIPE }, "Sewer Pipe"}, + {{ SNDMIX_REVERB_PRESET_UNDERWATER }, "Underwater"}, +}; + +LPCSTR GetReverbPresetName(UINT nPreset) +{ + return (nPreset < NUM_REVERBTYPES) ? gRvbPresets[nPreset].lpszName : NULL; +} + +////////////////////////////////////////////////////////////////////////// +// +// I3DL2 environmental reverb support +// + +typedef struct _REFLECTIONPRESET +{ + LONG lDelayFactor; + SHORT sGainLL, sGainRR, sGainLR, sGainRL; +} REFLECTIONPRESET, *PREFLECTIONPRESET; + +const REFLECTIONPRESET gReflectionsPreset[ENVIRONMENT_NUMREFLECTIONS] = +{ + // %Delay, ll, rr, lr, rl + {0, 9830, 6554, 0, 0}, + {10, 6554, 13107, 0, 0}, + {24, -9830, 13107, 0, 0}, + {36, 13107, -6554, 0, 0}, + {54, 16384, 16384, -1638, -1638}, + {61, -13107, 8192, -328, -328}, + {73, -11468, -11468, -3277, 3277}, + {87, 13107, -9830, 4916, -4916} +}; + +//////////////////////////////////////////////////////////////////////////////////// +// +// Implementation +// + +inline long ftol(float f) { return ((long)(f)); } + +static VOID I3dl2_to_Generic( + const SNDMIX_REVERB_PROPERTIES *pReverb, + PENVIRONMENTREVERB pRvb, + FLOAT flOutputFreq, + LONG lMinRefDelay, + LONG lMaxRefDelay, + LONG lMinRvbDelay, + LONG lMaxRvbDelay, + LONG lTankLength) +{ + FLOAT flDelayFactor, flDelayFactorHF, flDecayTimeHF; + LONG lDensity, lTailDiffusion; + + // Common parameters + pRvb->ReverbLevel = pReverb->lReverb; + pRvb->ReflectionsLevel = pReverb->lReflections; + pRvb->RoomHF = pReverb->lRoomHF; + + // HACK: Somewhat normalize the reverb output level + LONG lMaxLevel = (pRvb->ReverbLevel > pRvb->ReflectionsLevel) ? pRvb->ReverbLevel : pRvb->ReflectionsLevel; + if (lMaxLevel < -600) + { + lMaxLevel += 600; + pRvb->ReverbLevel -= lMaxLevel; + pRvb->ReflectionsLevel -= lMaxLevel; + } + + // Pre-Diffusion factor (for both reflections and late reverb) + lDensity = 8192 + ftol(79.31f * pReverb->flDensity); + pRvb->PreDiffusion = lDensity; + + // Late reverb diffusion + lTailDiffusion = ftol((0.15f + pReverb->flDiffusion * (0.36f*0.01f)) * 32767.0f); + if (lTailDiffusion > 0x7f00) lTailDiffusion = 0x7f00; + pRvb->TankDiffusion = lTailDiffusion; + + // Verify reflections and reverb delay parameters + FLOAT flRefDelay = pReverb->flReflectionsDelay; + if (flRefDelay > 0.100f) flRefDelay = 0.100f; + LONG lReverbDelay = ftol(pReverb->flReverbDelay * flOutputFreq); + LONG lReflectionsDelay = ftol(flRefDelay * flOutputFreq); + LONG lReverbDecayTime = ftol(pReverb->flDecayTime * flOutputFreq); + if (lReflectionsDelay < lMinRefDelay) + { + lReverbDelay -= (lMinRefDelay - lReflectionsDelay); + lReflectionsDelay = lMinRefDelay; + } + if (lReflectionsDelay > lMaxRefDelay) + { + lReverbDelay += (lReflectionsDelay - lMaxRefDelay); + lReflectionsDelay = lMaxRefDelay; + } + // Adjust decay time when adjusting reverb delay + if (lReverbDelay < lMinRvbDelay) + { + lReverbDecayTime -= (lMinRvbDelay - lReverbDelay); + lReverbDelay = lMinRvbDelay; + } + if (lReverbDelay > lMaxRvbDelay) + { + lReverbDecayTime += (lReverbDelay - lMaxRvbDelay); + lReverbDelay = lMaxRvbDelay; + } + pRvb->ReverbDelay = lReverbDelay; + pRvb->ReverbDecaySamples = lReverbDecayTime; + // Setup individual reflections delay and gains + for (UINT iRef=0; iRef<ENVIRONMENT_NUMREFLECTIONS; iRef++) + { + PENVIRONMENTREFLECTION pRef = &pRvb->Reflections[iRef]; + pRef->Delay = lReflectionsDelay + (gReflectionsPreset[iRef].lDelayFactor * lReverbDelay + 50)/100; + pRef->GainLL = gReflectionsPreset[iRef].sGainLL; + pRef->GainRL = gReflectionsPreset[iRef].sGainRL; + pRef->GainLR = gReflectionsPreset[iRef].sGainLR; + pRef->GainRR = gReflectionsPreset[iRef].sGainRR; + } + + // Late reverb decay time + if (lTankLength < 10) lTankLength = 10; + flDelayFactor = (lReverbDecayTime <= lTankLength) ? 1.0f : ((FLOAT)lTankLength / (FLOAT)lReverbDecayTime); + pRvb->ReverbDecay = ftol(pow(0.001f, flDelayFactor) * 32768.0f); + + // Late Reverb Decay HF + flDecayTimeHF = (FLOAT)lReverbDecayTime * pReverb->flDecayHFRatio; + flDelayFactorHF = (flDecayTimeHF <= (FLOAT)lTankLength) ? 1.0f : ((FLOAT)lTankLength / flDecayTimeHF); + pRvb->flReverbDamping = pow(0.001f, flDelayFactorHF); +} + + +void CReverb::Shutdown() +//---------------------- +{ + gnRvbLOfsVol = 0; + gnRvbROfsVol = 0; + + // Clear out all reverb state + g_bLastInPresent = FALSE; + g_bLastOutPresent = FALSE; + g_nLastRvbIn_xl = g_nLastRvbIn_xr = 0; + g_nLastRvbIn_yl = g_nLastRvbIn_yr = 0; + g_nLastRvbOut_xl = g_nLastRvbOut_xr = 0; + gnDCRRvb_X1 = 0; + gnDCRRvb_Y1 = 0; + + // Zero internal buffers + MemsetZero(g_LateReverb.Diffusion1); + MemsetZero(g_LateReverb.Diffusion2); + MemsetZero(g_LateReverb.Delay1); + MemsetZero(g_LateReverb.Delay2); + MemsetZero(g_RefDelay.RefDelayBuffer); + MemsetZero(g_RefDelay.PreDifBuffer); + MemsetZero(g_RefDelay.RefOut); +} + + +void CReverb::Initialize(BOOL bReset, DWORD MixingFreq) +//----------------------------------------------------- +{ + if (m_Settings.m_nReverbType >= NUM_REVERBTYPES) m_Settings.m_nReverbType = 0; + static PSNDMIX_REVERB_PROPERTIES spCurrentPreset = NULL; + PSNDMIX_REVERB_PROPERTIES pRvbPreset = &gRvbPresets[m_Settings.m_nReverbType].Preset; + + if ((pRvbPreset != spCurrentPreset) || (bReset)) + { + // Reverb output frequency is half of the dry output rate + FLOAT flOutputFrequency = (FLOAT)MixingFreq; + ENVIRONMENTREVERB rvb; + + // Reset reverb parameters + spCurrentPreset = pRvbPreset; + I3dl2_to_Generic(pRvbPreset, &rvb, flOutputFrequency, + RVBMINREFDELAY, RVBMAXREFDELAY, + RVBMINRVBDELAY, RVBMAXRVBDELAY, + ( RVBDIF1L_LEN + RVBDIF1R_LEN + + RVBDIF2L_LEN + RVBDIF2R_LEN + + RVBDLY1L_LEN + RVBDLY1R_LEN + + RVBDLY2L_LEN + RVBDLY2R_LEN) / 2); + + // Store reverb decay time (in samples) for reverb auto-shutdown + gnReverbDecaySamples = rvb.ReverbDecaySamples; + + // Room attenuation at high frequencies + LONG nRoomLP; + nRoomLP = OnePoleLowPassCoef(32768, mBToLinear(rvb.RoomHF), 5000, flOutputFrequency); + g_RefDelay.nCoeffs[0] = (SHORT)nRoomLP; + g_RefDelay.nCoeffs[1] = (SHORT)nRoomLP; + + // Pre-Diffusion factor (for both reflections and late reverb) + g_RefDelay.nPreDifCoeffs[0] = (SHORT)(rvb.PreDiffusion*2); + g_RefDelay.nPreDifCoeffs[1] = (SHORT)(rvb.PreDiffusion*2); + + // Setup individual reflections delay and gains + for (UINT iRef=0; iRef<8; iRef++) + { + PSWRVBREFLECTION pRef = &g_RefDelay.Reflections[iRef]; + pRef->DelayDest = rvb.Reflections[iRef].Delay; + pRef->Delay = pRef->DelayDest; + pRef->Gains[0] = rvb.Reflections[iRef].GainLL; + pRef->Gains[1] = rvb.Reflections[iRef].GainRL; + pRef->Gains[2] = rvb.Reflections[iRef].GainLR; + pRef->Gains[3] = rvb.Reflections[iRef].GainRR; + } + g_LateReverb.nReverbDelay = rvb.ReverbDelay; + + // Reflections Master Gain + ULONG lReflectionsGain = 0; + if (rvb.ReflectionsLevel > -9000) + { + lReflectionsGain = mBToLinear(32768, rvb.ReflectionsLevel); + } + g_RefDelay.lMasterGain = lReflectionsGain; + + // Late reverb master gain + ULONG lReverbGain = 0; + if (rvb.ReverbLevel > -9000) + { + lReverbGain = mBToLinear(32768, rvb.ReverbLevel); + } + g_LateReverb.lMasterGain = lReverbGain; + + // Late reverb diffusion + ULONG nTailDiffusion = rvb.TankDiffusion; + if (nTailDiffusion > 0x7f00) nTailDiffusion = 0x7f00; + g_LateReverb.nDifCoeffs[0] = (SHORT)nTailDiffusion; + g_LateReverb.nDifCoeffs[1] = (SHORT)nTailDiffusion; + g_LateReverb.nDifCoeffs[2] = (SHORT)nTailDiffusion; + g_LateReverb.nDifCoeffs[3] = (SHORT)nTailDiffusion; + g_LateReverb.Dif2InGains[0] = 0x7000; + g_LateReverb.Dif2InGains[1] = 0x1000; + g_LateReverb.Dif2InGains[2] = 0x1000; + g_LateReverb.Dif2InGains[3] = 0x7000; + + // Late reverb decay time + LONG nReverbDecay = rvb.ReverbDecay; + if (nReverbDecay < 0) nReverbDecay = 0; + if (nReverbDecay > 0x7ff0) nReverbDecay = 0x7ff0; + g_LateReverb.nDecayDC[0] = (SHORT)nReverbDecay; + g_LateReverb.nDecayDC[1] = 0; + g_LateReverb.nDecayDC[2] = 0; + g_LateReverb.nDecayDC[3] = (SHORT)nReverbDecay; + + // Late Reverb Decay HF + FLOAT fReverbDamping = rvb.flReverbDamping * rvb.flReverbDamping; + LONG nDampingLowPass; + + nDampingLowPass = OnePoleLowPassCoef(32768, fReverbDamping, 5000, flOutputFrequency); + if (nDampingLowPass < 0x100) nDampingLowPass = 0x100; + if (nDampingLowPass >= 0x7f00) nDampingLowPass = 0x7f00; + + g_LateReverb.nDecayLP[0] = (SHORT)nDampingLowPass; + g_LateReverb.nDecayLP[1] = 0; + g_LateReverb.nDecayLP[2] = 0; + g_LateReverb.nDecayLP[3] = (SHORT)nDampingLowPass; + } + if (bReset) + { + gnReverbSamples = 0; + Shutdown(); + } + // Wait at least 5 seconds before shutting down the reverb + if (gnReverbDecaySamples < MixingFreq*5) + { + gnReverbDecaySamples = MixingFreq*5; + } +} + + +// [Reverb level 0(quiet)-100(loud)], [type = REVERBTYPE_XXXX] +bool CReverb::SetReverbParameters(UINT nDepth, UINT nType) +//-------------------------------------------------------- +{ + if (nDepth > 100) nDepth = 100; + UINT gain = (nDepth * 16) / 100; + if (gain > 16) gain = 16; + if (gain < 1) gain = 1; + m_Settings.m_nReverbDepth = gain; + if (nType < NUM_REVERBTYPES) m_Settings.m_nReverbType = nType; + return true; +} + + +// Reverb +void CReverb::Process(int *MixSoundBuffer, int *MixReverbBuffer, UINT nSamples, DWORD sysinfo) +//-------------------------------------------------------------------------------------------- +{ + UINT nIn, nOut; + + if ((!gnReverbSend) && (!gnReverbSamples)) return; + if (!gnReverbSend) X86_StereoFill(MixReverbBuffer, nSamples, &gnRvbROfsVol, &gnRvbLOfsVol); + if (!(sysinfo & SYSMIX_ENABLEMMX)) return; + // Dynamically adjust reverb master gains + LONG lMasterGain; + lMasterGain = ((g_RefDelay.lMasterGain * m_Settings.m_nReverbDepth) >> 4); + if (lMasterGain > 0x7fff) lMasterGain = 0x7fff; + g_RefDelay.ReflectionsGain[0] = (SHORT)lMasterGain; + g_RefDelay.ReflectionsGain[1] = (SHORT)lMasterGain; + lMasterGain = ((g_LateReverb.lMasterGain * m_Settings.m_nReverbDepth) >> 4); + if (lMasterGain > 0x10000) lMasterGain = 0x10000; + g_LateReverb.RvbOutGains[0] = (SHORT)((lMasterGain+0x7f) >> 3); // l->l + g_LateReverb.RvbOutGains[1] = (SHORT)((lMasterGain+0xff) >> 4); // r->l + g_LateReverb.RvbOutGains[2] = (SHORT)((lMasterGain+0xff) >> 4); // l->r + g_LateReverb.RvbOutGains[3] = (SHORT)((lMasterGain+0x7f) >> 3); // r->r + // Process Dry/Wet Mix + LONG lMaxRvbGain = (g_RefDelay.lMasterGain > g_LateReverb.lMasterGain) ? g_RefDelay.lMasterGain : g_LateReverb.lMasterGain; + if (lMaxRvbGain > 32768) lMaxRvbGain = 32768; + LONG lDryVol = (36 - m_Settings.m_nReverbDepth)>>1; + if (lDryVol < 8) lDryVol = 8; + if (lDryVol > 16) lDryVol = 16; + lDryVol = 16 - (((16-lDryVol) * lMaxRvbGain) >> 15); + X86_ReverbDryMix(MixSoundBuffer, MixReverbBuffer, lDryVol, nSamples); + // Downsample 2x + 1st stage of lowpass filter + nIn = X86_ReverbProcessPreFiltering1x(MixReverbBuffer, nSamples); + nOut = nIn; + // Main reverb processing: split into small chunks (needed for short reverb delays) + // Reverb Input + Low-Pass stage #2 + Pre-diffusion + if (nIn > 0) MMX_ProcessPreDelay(&g_RefDelay, MixReverbBuffer, nIn); + // Process Reverb Reflections and Late Reverberation + int *pRvbOut = MixReverbBuffer; + UINT nRvbSamples = nOut, nCount = 0; + while (nRvbSamples > 0) + { + UINT nPosRef = g_RefDelay.nRefOutPos & SNDMIX_REVERB_DELAY_MASK; + UINT nPosRvb = (nPosRef - g_LateReverb.nReverbDelay) & SNDMIX_REVERB_DELAY_MASK; + UINT nmax1 = (SNDMIX_REVERB_DELAY_MASK+1) - nPosRef; + UINT nmax2 = (SNDMIX_REVERB_DELAY_MASK+1) - nPosRvb; + nmax1 = (nmax1 < nmax2) ? nmax1 : nmax2; + UINT n = nRvbSamples; + if (n > nmax1) n = nmax1; + if (n > 64) n = 64; + // Reflections output + late reverb delay + MMX_ProcessReflections(&g_RefDelay, &g_RefDelay.RefOut[nPosRef*2], pRvbOut, n); + // Late Reverberation + MMX_ProcessLateReverb(&g_LateReverb, &g_RefDelay.RefOut[nPosRvb*2], pRvbOut, n); + // Update delay positions + g_RefDelay.nRefOutPos = (g_RefDelay.nRefOutPos + n) & SNDMIX_REVERB_DELAY_MASK; + g_RefDelay.nDelayPos = (g_RefDelay.nDelayPos + n) & SNDMIX_REFLECTIONS_DELAY_MASK; + nCount += n*2; + pRvbOut += n*2; + nRvbSamples -= n; + } + // Adjust nDelayPos, in case nIn != nOut + g_RefDelay.nDelayPos = (g_RefDelay.nDelayPos - nOut + nIn) & SNDMIX_REFLECTIONS_DELAY_MASK; + // Upsample 2x + MMX_ReverbProcessPostFiltering1x(MixReverbBuffer, MixSoundBuffer, nSamples); + // Automatically shut down if needed + if (gnReverbSend) gnReverbSamples = gnReverbDecaySamples; + else if (gnReverbSamples > nSamples) gnReverbSamples -= nSamples; + else + { + if (gnReverbSamples) Shutdown(); + gnReverbSamples = 0; + } +} + + +VOID CReverb::X86_ReverbDryMix(int *pDry, int *pWet, int lDryVol, UINT nSamples) +//------------------------------------------------------------------------------ +{ + for (UINT i=0; i<nSamples; i++) + { + pDry[i*2] += (pWet[i*2]>>4) * lDryVol; + pDry[i*2+1] += (pWet[i*2+1]>>4) * lDryVol; + } +} + + +UINT CReverb::X86_ReverbProcessPreFiltering2x(int *pWet, UINT nSamples) +//--------------------------------------------------------------------- +{ + UINT nOutSamples = 0; + int lowpass = g_RefDelay.nCoeffs[0]; + int y1_l = g_nLastRvbIn_yl, y1_r = g_nLastRvbIn_yr; + UINT n = nSamples; + + if (g_bLastInPresent) + { + int x1_l = g_nLastRvbIn_xl, x1_r = g_nLastRvbIn_xr; + int x2_l = pWet[0], x2_r = pWet[1]; + x1_l = (x1_l+x2_l)>>13; + x1_r = (x1_r+x2_r)>>13; + y1_l = x1_l + (((x1_l - y1_l)*lowpass)>>15); + y1_r = x1_r + (((x1_r - y1_r)*lowpass)>>15); + pWet[0] = y1_l; + pWet[1] = y1_r; + pWet+=2; + n--; + nOutSamples = 1; + g_bLastInPresent = FALSE; + } + if (n & 1) + { + n--; + g_nLastRvbIn_xl = pWet[n*2]; + g_nLastRvbIn_xr = pWet[n*2+1]; + g_bLastInPresent = TRUE; + } + n >>= 1; + for (UINT i=0; i<n; i++) + { + int x1_l = pWet[i*4]; + int x2_l = pWet[i*4+2]; + x1_l = (x1_l+x2_l)>>13; + int x1_r = pWet[i*4+1]; + int x2_r = pWet[i*4+3]; + x1_r = (x1_r+x2_r)>>13; + y1_l = x1_l + (((x1_l - y1_l)*lowpass)>>15); + y1_r = x1_r + (((x1_r - y1_r)*lowpass)>>15); + pWet[i*2] = y1_l; + pWet[i*2+1] = y1_r; + } + g_nLastRvbIn_yl = y1_l; + g_nLastRvbIn_yr = y1_r; + return nOutSamples + n; +} + + +UINT CReverb::X86_ReverbProcessPreFiltering1x(int *pWet, UINT nSamples) +//--------------------------------------------------------------------- +{ + int lowpass = g_RefDelay.nCoeffs[0]; + int y1_l = g_nLastRvbIn_yl, y1_r = g_nLastRvbIn_yr; + + for (UINT i=0; i<nSamples; i++) + { + int x_l = pWet[i*2] >> 12; + int x_r = pWet[i*2+1] >> 12; + y1_l = x_l + (((x_l - y1_l)*lowpass)>>15); + y1_r = x_r + (((x_r - y1_r)*lowpass)>>15); + pWet[i*2] = y1_l; + pWet[i*2+1] = y1_r; + } + g_nLastRvbIn_yl = y1_l; + g_nLastRvbIn_yr = y1_r; + return nSamples; +} + + +VOID CReverb::X86_ReverbProcessPostFiltering2x(const int *pRvb, int *pDry, UINT nSamples) +//--------------------------------------------------------------------------------------- +{ + UINT n0 = nSamples, n; + int x1_l = g_nLastRvbOut_xl, x1_r = g_nLastRvbOut_xr; + + if (g_bLastOutPresent) + { + pDry[0] += x1_l; + pDry[1] += x1_r; + pDry += 2; + n0--; + g_bLastOutPresent = FALSE; + } + n = n0 >> 1; + for (UINT i=0; i<n; i++) + { + int x_l = pRvb[i*2], x_r = pRvb[i*2+1]; + pDry[i*4] += (x_l + x1_l)>>1; + pDry[i*4+1] += (x_r + x1_r)>>1; + pDry[i*4+2] += x_l; + pDry[i*4+3] += x_r; + x1_l = x_l; + x1_r = x_r; + } + if (n0 & 1) + { + int x_l = pRvb[n*2], x_r = pRvb[n*2+1]; + pDry[n*4] += (x_l + x1_l)>>1; + pDry[n*4+1] += (x_r + x1_r)>>1; + x1_l = x_l; + x1_r = x_r; + g_bLastOutPresent = TRUE; + } + g_nLastRvbOut_xl = x1_l; + g_nLastRvbOut_xr = x1_r; +} + + +#define DCR_AMOUNT 9 + +// Stereo Add + DC removal +VOID CReverb::MMX_ReverbProcessPostFiltering1x(const int *pRvb, int *pDry, UINT nSamples) +//--------------------------------------------------------------------------------------- +{ + __int64 nDCRRvb_X1 = gnDCRRvb_X1; + __int64 nDCRRvb_Y1 = gnDCRRvb_Y1; + _asm { + movq mm4, nDCRRvb_Y1 // mm4 = [ y1r | y1l ] + movq mm1, nDCRRvb_X1 // mm5 = [ x1r | x1l ] + mov ebx, pDry + mov ecx, pRvb + mov edx, nSamples +stereodcr: + movq mm5, qword ptr [ecx] // mm0 = [ xr | xl ] + movq mm3, qword ptr [ebx] // mm3 = dry mix + add ecx, 8 + psubd mm1, mm5 // mm1 = x(n-1) - x(n) + add ebx, 8 + movq mm0, mm1 + psrad mm0, DCR_AMOUNT+1 + psubd mm0, mm1 + paddd mm4, mm0 + dec edx + paddd mm3, mm4 // add with dry mix + movq mm0, mm4 + psrad mm0, DCR_AMOUNT + movq mm1, mm5 + psubd mm4, mm0 + movq qword ptr [ebx-8], mm3 + jnz stereodcr + movq nDCRRvb_Y1, mm4 + movq nDCRRvb_X1, mm5 + emms + } + gnDCRRvb_X1 = nDCRRvb_X1; + gnDCRRvb_Y1 = nDCRRvb_Y1; +} + + +VOID CReverb::MMX_ReverbDCRemoval(int *pBuffer, UINT nSamples) +//------------------------------------------------------------ +{ + __int64 nDCRRvb_X1 = gnDCRRvb_X1; + __int64 nDCRRvb_Y1 = gnDCRRvb_Y1; + _asm { + movq mm4, nDCRRvb_Y1 // mm4 = [ y1r | y1l ] + movq mm1, nDCRRvb_X1 // mm5 = [ x1r | x1l ] + mov ecx, pBuffer + mov edx, nSamples +stereodcr: + movq mm5, qword ptr [ecx] // mm0 = [ xr | xl ] + add ecx, 8 + psubd mm1, mm5 // mm1 = x(n-1) - x(n) + movq mm0, mm1 + psrad mm0, DCR_AMOUNT+1 + psubd mm0, mm1 + paddd mm4, mm0 + dec edx + movq qword ptr [ecx-8], mm4 + movq mm0, mm4 + psrad mm0, DCR_AMOUNT + movq mm1, mm5 + psubd mm4, mm0 + jnz stereodcr + movq nDCRRvb_Y1, mm4 + movq nDCRRvb_X1, mm5 + emms + } + gnDCRRvb_X1 = nDCRRvb_X1; + gnDCRRvb_Y1 = nDCRRvb_Y1; +} + + +////////////////////////////////////////////////////////////////////////// +// +// Pre-Delay: +// +// 1. Saturate and low-pass the reverb input (stage 2 of roomHF) +// 2. Process pre-diffusion +// 3. Insert the result in the reflections delay buffer +// + +VOID CReverb::MMX_ProcessPreDelay(PSWRVBREFDELAY pPreDelay, const int *pIn, UINT nSamples) +//---------------------------------------------------------------------------------------- +{ + _asm { + mov eax, pPreDelay + mov ecx, pIn + mov esi, nSamples + lea edi, [eax+SWRVBREFDELAY.RefDelayBuffer] + mov ebx, dword ptr [eax+SWRVBREFDELAY.nDelayPos] + mov edx, dword ptr [eax+SWRVBREFDELAY.nPreDifPos] + movd mm6, dword ptr [eax+SWRVBREFDELAY.nCoeffs] + movd mm7, dword ptr [eax+SWRVBREFDELAY.History] + movd mm4, dword ptr [eax+SWRVBREFDELAY.nPreDifCoeffs] + lea eax, [eax+SWRVBREFDELAY.PreDifBuffer] + dec ebx +rvbloop: + movq mm0, qword ptr [ecx] // mm0 = 16-bit unsaturated reverb input [ r | l ] + inc ebx + add ecx, 8 + packssdw mm0, mm0 // mm0 = [ r | l | r | l ] + and ebx, SNDMIX_REFLECTIONS_DELAY_MASK + // Low-pass + psubsw mm7, mm0 + pmulhw mm7, mm6 + movd mm5, dword ptr [eax+edx*4] // mm5 = [ 0 | 0 |rd |ld ] XD(n-D) + paddsw mm7, mm7 + paddsw mm7, mm0 + // Pre-Diffusion + movq mm0, mm7 // mm0 = [ ? | ? | r | l ] X(n) + inc edx + movq mm3, mm5 + and edx, SNDMIX_PREDIFFUSION_DELAY_MASK + pmulhw mm3, mm4 // mm3 = k.Xd(n-D) + movq mm2, mm4 + dec esi + psubsw mm0, mm3 // mm0 = X(n) - k.Xd(n-D) = Xd(n) + pmulhw mm2, mm0 // mm2 = k.Xd(n) + paddsw mm2, mm5 // mm2 = Xd(n-D) + k.Xd(n) + movd dword ptr [eax+edx*4], mm0 + movd dword ptr [edi+ebx*4], mm2 + jnz rvbloop + mov eax, pPreDelay + mov dword ptr [eax+SWRVBREFDELAY.nPreDifPos], edx + movd dword ptr [eax+SWRVBREFDELAY.History], mm7 + emms + } +} + + +//////////////////////////////////////////////////////////////////// +// +// ProcessReflections: +// First stage: +// - process 4 reflections, output to pRefOut +// - output results to pRefOut +// Second stage: +// - process another 3 reflections +// - sum with pRefOut +// - apply reflections master gain and accumulate in the given output +// + +typedef struct _DUMMYREFARRAY +{ + SWRVBREFLECTION Ref1; + SWRVBREFLECTION Ref2; + SWRVBREFLECTION Ref3; + SWRVBREFLECTION Ref4; + SWRVBREFLECTION Ref5; + SWRVBREFLECTION Ref6; + SWRVBREFLECTION Ref7; + SWRVBREFLECTION Ref8; +} DUMMYREFARRAY, *PDUMMYREFARRAY; + + +VOID CReverb::MMX_ProcessReflections(PSWRVBREFDELAY pPreDelay, short int *pRefOut, int *pOut, UINT nSamples) +//---------------------------------------------------------------------------------------------------------- +{ + _asm { + // First stage + push ebp + mov edi, pPreDelay + mov eax, pRefOut + mov ebp, nSamples + push eax + lea esi, [edi+SWRVBREFDELAY.RefDelayBuffer] + mov eax, dword ptr [edi+SWRVBREFDELAY.nDelayPos] + lea edi, [edi+SWRVBREFDELAY.Reflections] + mov ebx, eax + mov ecx, eax + mov edx, eax + sub eax, dword ptr [edi+DUMMYREFARRAY.Ref1.Delay] + movq mm4, qword ptr [edi+DUMMYREFARRAY.Ref1.Gains] + sub ebx, dword ptr [edi+DUMMYREFARRAY.Ref2.Delay] + movq mm5, qword ptr [edi+DUMMYREFARRAY.Ref2.Gains] + sub ecx, dword ptr [edi+DUMMYREFARRAY.Ref3.Delay] + movq mm6, qword ptr [edi+DUMMYREFARRAY.Ref3.Gains] + sub edx, dword ptr [edi+DUMMYREFARRAY.Ref4.Delay] + movq mm7, qword ptr [edi+DUMMYREFARRAY.Ref4.Gains] + pop edi + and eax, SNDMIX_REFLECTIONS_DELAY_MASK + and ebx, SNDMIX_REFLECTIONS_DELAY_MASK + and ecx, SNDMIX_REFLECTIONS_DELAY_MASK + and edx, SNDMIX_REFLECTIONS_DELAY_MASK +refloop1: + movd mm3, dword ptr [esi+edx*4] + movd mm2, dword ptr [esi+ecx*4] + inc edx + inc ecx + movd mm1, dword ptr [esi+ebx*4] + movd mm0, dword ptr [esi+eax*4] + punpckldq mm3, mm3 + punpckldq mm2, mm2 + pmaddwd mm3, mm7 + inc ebx + inc eax + pmaddwd mm2, mm6 + punpckldq mm1, mm1 + punpckldq mm0, mm0 + pmaddwd mm1, mm5 + and eax, SNDMIX_REFLECTIONS_DELAY_MASK + and ebx, SNDMIX_REFLECTIONS_DELAY_MASK + pmaddwd mm0, mm4 + and ecx, SNDMIX_REFLECTIONS_DELAY_MASK + paddd mm2, mm3 + paddd mm0, mm1 + paddd mm0, mm2 + and edx, SNDMIX_REFLECTIONS_DELAY_MASK + psrad mm0, 15 + add edi, 4 + packssdw mm0, mm0 + dec ebp + movd dword ptr [edi-4], mm0 + jnz refloop1 + pop ebp + // Second stage + push ebp + mov edi, pPreDelay + mov eax, pRefOut + mov edx, pOut + mov ebp, nSamples + movd mm7, dword ptr [edi+SWRVBREFDELAY.ReflectionsGain] + pxor mm0, mm0 + push eax + punpcklwd mm7, mm0 // mm7 = [ 0 |g_r| 0 |g_l] + mov eax, dword ptr [edi+SWRVBREFDELAY.nDelayPos] + lea edi, [edi+SWRVBREFDELAY.Reflections] + mov ebx, eax + mov ecx, eax + sub eax, dword ptr [edi+DUMMYREFARRAY.Ref5.Delay] + movq mm4, qword ptr [edi+DUMMYREFARRAY.Ref5.Gains] + sub ebx, dword ptr [edi+DUMMYREFARRAY.Ref6.Delay] + movq mm5, qword ptr [edi+DUMMYREFARRAY.Ref6.Gains] + sub ecx, dword ptr [edi+DUMMYREFARRAY.Ref7.Delay] + movq mm6, qword ptr [edi+DUMMYREFARRAY.Ref7.Gains] + pop edi + and ecx, SNDMIX_REFLECTIONS_DELAY_MASK + and ebx, SNDMIX_REFLECTIONS_DELAY_MASK + and eax, SNDMIX_REFLECTIONS_DELAY_MASK + psrad mm7, 3 // For 28-bit final output: 16+15-3 = 28 +refloop2: + movd mm2, dword ptr [esi+ecx*4] + movd mm1, dword ptr [esi+ebx*4] + movd mm0, dword ptr [esi+eax*4] + movd mm3, dword ptr [edi] // mm3 = output of previous reflections + punpckldq mm2, mm2 + inc ecx + pmaddwd mm2, mm6 + punpckldq mm1, mm1 + inc ebx + pmaddwd mm1, mm5 + punpckldq mm0, mm0 + inc eax + pmaddwd mm0, mm4 + and ecx, SNDMIX_REFLECTIONS_DELAY_MASK + and ebx, SNDMIX_REFLECTIONS_DELAY_MASK + paddd mm0, mm2 + paddd mm0, mm1 + add edi, 4 + psrad mm0, 15 + and eax, SNDMIX_REFLECTIONS_DELAY_MASK + packssdw mm0, mm0 + paddsw mm0, mm3 + add edx, 8 + movd dword ptr [edi-4], mm0 // late reverb stereo input + punpcklwd mm0, mm0 + pmaddwd mm0, mm7 // Apply reflections gain + dec ebp + movq qword ptr [edx-8], mm0 // At this, point, this is the only output of the reverb + jnz refloop2 + pop ebp + emms + } +} + + +////////////////////////////////////////////////////////////////////////// +// +// Late reverberation (with SW reflections) +// + +VOID CReverb::MMX_ProcessLateReverb(PSWLATEREVERB pReverb, short int *pRefOut, int *pMixOut, UINT nSamples) +//--------------------------------------------------------------------------------------------------------- +{ + _asm { + push ebp + mov ebx, pReverb + mov esi, pRefOut + mov edi, pMixOut + mov ebp, nSamples + mov ecx, dword ptr [ebx+SWLATEREVERB.nDelayPos] + movq mm3, qword ptr [ebx+SWLATEREVERB.RvbOutGains] + movq mm5, qword ptr [ebx+SWLATEREVERB.nDifCoeffs] + movq mm6, qword ptr [ebx+SWLATEREVERB.nDecayLP] + movq mm7, qword ptr [ebx+SWLATEREVERB.LPHistory] +rvbloop: + sub ecx, RVBDLY2L_LEN + movd mm0, dword ptr [esi] + lea edx, [ecx+RVBDLY2L_LEN - RVBDLY2R_LEN] + and ecx, RVBDLY_MASK + and edx, RVBDLY_MASK + movd mm1, dword ptr [ebx+SWLATEREVERB.Delay2+ecx*4] + movd mm2, dword ptr [ebx+SWLATEREVERB.Delay2+edx*4] + add ecx, RVBDLY2L_LEN - RVBDIF1R_LEN + punpckldq mm0, mm0 + and ecx, RVBDLY_MASK + punpckldq mm1, mm2 + psraw mm0, 2 // mm0 = stereo input + psubsw mm7, mm1 + movzx eax, word ptr [ebx+SWLATEREVERB.Diffusion1+ecx*4+2] + pmulhw mm7, mm6 + add ecx, RVBDIF1R_LEN - RVBDIF1L_LEN + add esi, 4 + paddsw mm7, mm7 + paddsw mm7, mm1 // mm7 = low-passed decay + movq mm1, qword ptr [ebx+SWLATEREVERB.nDecayDC] + and ecx, RVBDLY_MASK + shl eax, 16 + pmaddwd mm1, mm7 // apply decay gain + movzx edx, word ptr [ebx+SWLATEREVERB.Diffusion1+ecx*4] + add ecx, RVBDIF1L_LEN + psrad mm1, 15 // mm1 = decay [ r | l ] + and ecx, RVBDLY_MASK + packssdw mm1, mm1 + or eax, edx + paddsw mm1, mm0 // mm1 = input + decay [ r | l | r | l ] + movd mm2, eax // mm2 = diffusion1 history [ 0 | 0 | rd| ld] Xd(n-D) + pmulhw mm2, mm5 // mm2 = k.Xd(n-D) + movq mm4, mm1 // mm4 = reverb output + movq mm0, mm5 + psubsw mm1, mm2 // mm1 = X(n) - k.Xd(n-D) = Xd(n) + movd mm2, eax + pmulhw mm0, mm1 // mm0 = k.Xd(n) + movd dword ptr [ebx+SWLATEREVERB.Diffusion1+ecx*4], mm1 + paddsw mm0, mm2 // mm0 = Xd(n-D) + k.Xd(n) + mov eax, ecx + // Insert the diffusion output in the reverb delay line + movd dword ptr [ebx+SWLATEREVERB.Delay1+ecx*4], mm0 + sub ecx, RVBDLY1R_LEN + sub eax, RVBDLY1L_LEN + punpckldq mm0, mm0 + and ecx, RVBDLY_MASK + and eax, RVBDLY_MASK + paddsw mm4, mm0 // accumulate with reverb output + // Input to second diffuser + movd mm0, dword ptr [ebx+SWLATEREVERB.Delay1+ecx*4] + movd mm1, dword ptr [ebx+SWLATEREVERB.Delay1+eax*4] + add ecx, RVBDLY1R_LEN - RVBDIF2R_LEN + and ecx, RVBDLY_MASK + punpckldq mm1, mm0 + movzx eax, word ptr [ebx+SWLATEREVERB.Diffusion2+ecx*4+2] + paddsw mm4, mm1 + pmaddwd mm1, qword ptr [ebx+SWLATEREVERB.Dif2InGains] + add ecx, RVBDIF2R_LEN - RVBDIF2L_LEN + and ecx, RVBDLY_MASK + psrad mm1, 15 + movzx edx, word ptr [ebx+SWLATEREVERB.Diffusion2+ecx*4] + packssdw mm1, mm1 // mm1 = 2nd diffuser input [ r | l | r | l ] + shl eax, 16 + psubsw mm4, mm1 // accumulate with reverb output + or eax, edx + add ecx, RVBDIF2L_LEN + movd mm2, eax // mm2 = diffusion2 history + and ecx, RVBDLY_MASK + pmulhw mm2, mm5 // mm2 = k.Xd(n-D) + movq mm0, mm5 + psubsw mm1, mm2 // mm1 = X(n) - k.Xd(n-D) = Xd(n) + movd mm2, eax + pmulhw mm0, mm1 // mm0 = k.Xd(n) + movd dword ptr [ebx+SWLATEREVERB.Diffusion2+ecx*4], mm1 + movq mm1, qword ptr [edi] + paddsw mm0, mm2 // mm0 = Xd(n-D) + k.Xd(n) + paddsw mm4, mm0 // accumulate with reverb output + movd dword ptr [ebx+SWLATEREVERB.Delay2+ecx*4], mm0 + pmaddwd mm4, mm3 // mm4 = [ r | l ] + inc ecx + add edi, 8 + and ecx, RVBDLY_MASK + paddd mm4, mm1 + dec ebp + movq qword ptr [edi-8], mm4 + jnz rvbloop + pop ebp + movq qword ptr [ebx+SWLATEREVERB.LPHistory], mm7 + mov dword ptr [ebx+SWLATEREVERB.nDelayPos], ecx + emms + } +} + + +// (1-gcos(w)-sqrt(2g(1-cos w) - g2(1-(cos w)^2))) / (1-g) +static LONG OnePoleLowPassCoef(LONG scale, FLOAT g, FLOAT F_c, FLOAT F_s) +//---------------------------------------------------------------- +{ + FLOAT cosw; // cos(2*PI*Fc/Fs) + FLOAT scale_over_1mg; // scale / (1.0f - g); + LONG result; + + if (g > 0.999999f) return 0; + _asm { + fild scale + fld1 + fld g + fld ST(0) + fmulp ST(1), ST(0) + fst g + fsubp ST(1), ST(0) + fdivp ST(1), ST(0) + fstp scale_over_1mg + fld F_c + fld F_s + fdivp ST(1), ST(0) + fldpi + fadd ST(0), ST(0) + fmulp ST(1), ST(0) + fcos + fstp cosw + fld g + fadd ST(0), ST(0) + fld1 + fld cosw + fsubp ST(1), ST(0) + fmulp ST(1), ST(0) // 2g*(1 cos(w)) + fld g + fmul ST(0), ST(0) + fld1 + fld cosw + fmul ST(0), ST(0) + fsubp ST(1), ST(0) + fmulp ST(1), ST(0) // g*g*((1-cos w)^2) + fsubp ST(1), ST(0) + fsqrt + fld g + fmul cosw + faddp ST(1), ST(0) + fld1 + fsubrp ST(1), ST(0) // (1-gcos(w)-sqrt(2g(1-cos w) - g2(1-(cos w)^2))) + fld scale_over_1mg + fmulp ST(1), ST(0) + fistp result + } + return result; +} + + +static LONG mBToLinear(LONG scale, LONG value_mB) +{ + // factor = log2(10)/(100*20) + const float _factor = 3.321928094887362304f / (100.0f * 20.0f); + long result; + + if (!value_mB) return scale; + if (value_mB <= -10000) return 0; + _asm { + fild value_mB // Load dB value + fld _factor // Load the log2(10)/(20*65536) factor + fmulp ST(1), ST(0) // ST(0) = value_dB/(20*65536) + fist result // Store integer exponent + fisub result // ST(0) = -1 <= (value_dB*log2(10)/(65536*20)) <= 1 + f2xm1 // ST(0) = 2^(value_dB*log2(10)/(65536*20))-1 + fild result // load integer exponent + fild scale // Load scale factor + fscale // ST(0) = scale * 2^ST(1) + fstp ST(1) // Remove the integer from the stack + fmul ST(1), ST(0) // multiply with fractional part + faddp ST(1), ST(0) // add 1*scale*integer_part + fistp result // Convert to integer + } + return result; +} + + +static FLOAT mBToLinear(LONG value_mB) +{ + // factor = log2(10)/(100*20) + const float _factor = 3.321928094887362304f / (100.0f * 20.0f); + long result; + float fresult; + + if (!value_mB) return 1; + if (value_mB <= -100000) return 0; + _asm { + fild value_mB // Load dB value + fld _factor // Load the log2(10)/(20*65536) factor + fmulp ST(1), ST(0) // ST(0) = value_dB/(20*65536) + fist result // Store integer exponent + fisub result // ST(0) = -1 <= (value_dB*log2(10)/(65536*20)) <= 1 + f2xm1 // ST(0) = 2^(value_dB*log2(10)/(65536*20))-1 + fild result // load integer exponent + fld1 // Load scale factor + fscale // ST(0) = scale * 2^ST(1) + fstp ST(1) // Remove the integer from the stack + fmul ST(1), ST(0) // multiply with fractional part + faddp ST(1), ST(0) // add 1*scale*integer_part + fstp fresult // Convert to integer + } + return fresult; +} + +#endif // NO_REVERB Copied: trunk/OpenMPT/sounddsp/Reverb.h (from rev 1843, trunk/OpenMPT/soundlib/snd_rvb.h) =================================================================== --- trunk/OpenMPT/sounddsp/Reverb.h (rev 0) +++ trunk/OpenMPT/sounddsp/Reverb.h 2013-04-11 18:09:59 UTC (rev 1844) @@ -0,0 +1,260 @@ +/* + * Reverb.h + * -------- + * Purpose: Mixing code for reverb. + * Notes : Ugh... This should really be removed at some point. + * Authors: Olivier Lapicque + * OpenMPT Devs + * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. + */ + +#pragma once + +#ifndef NO_REVERB + +///////////////////////////////////////////////////////////////////////////// +// +// SW Reverb structures +// + +// Length-1 (in samples) of the reflections delay buffer: 32K, 371ms@22kHz +#define SNDMIX_REFLECTIONS_DELAY_MASK 0x1fff +#define SNDMIX_PREDIFFUSION_DELAY_MASK 0x7f // 128 samples +#define SNDMIX_REVERB_DELAY_MASK 0xfff // 4K samples (92ms @ 44kHz) + +typedef struct _SWRVBREFLECTION +{ + ULONG Delay, DelayDest; + SHORT Gains[4]; // g_ll, g_rl, g_lr, g_rr +} SWRVBREFLECTION, *PSWRVBREFLECTION; + +typedef struct _SWRVBREFDELAY +{ + ULONG nDelayPos, nPreDifPos, nRefOutPos; + LONG lMasterGain; // reflections linear master gain + SHORT nCoeffs[2]; // room low-pass coefficients + SHORT History[2]; // room low-pass history + SHORT nPreDifCoeffs[2]; // prediffusion coefficients + SHORT ReflectionsGain[2]; // master reflections gain + SWRVBREFLECTION Reflections[8]; // Up to 8 SW Reflections + short int RefDelayBuffer[(SNDMIX_REFLECTIONS_DELAY_MASK+1)*2]; // reflections delay buffer + short int PreDifBuffer[(SNDMIX_PREDIFFUSION_DELAY_MASK+1)*2]; // pre-diffusion + short int RefOut[(SNDMIX_REVERB_DELAY_MASK+1)*2]; // stereo output of reflections +} SWRVBREFDELAY, *PSWRVBREFDELAY; + + +// Late reverberation +// Tank diffusers lengths +#define RVBDIF1L_LEN (149*2) // 6.8ms +#define RVBDIF1R_LEN (223*2) // 10.1ms +#define RVBDIF2L_LEN (421*2) // 19.1ms +#define RVBDIF2R_LEN (647*2) // 29.3ms +// Tank delay lines lengths +#define RVBDLY1L_LEN (683*2) // 30.9ms +#define RVBDLY1R_LEN (811*2) // 36.7ms +#define RVBDLY2L_LEN (773*2) // 35.1ms +#define RVBDLY2R_LEN (1013*2) // 45.9ms +// Tank delay lines mask +#define RVBDLY_MASK 2047 + +// Min/Max reflections delay +#define RVBMINREFDELAY 96 // 96 samples +#define RVBMAXREFDELAY 7500 // 7500 samples +// Min/Max reverb delay +#define RVBMINRVBDELAY 128 // 256 samples (11.6ms @ 22kHz) +#define RVBMAXRVBDELAY 3800 // 1900 samples (86ms @ 24kHz) + +typedef struct _SWLATEREVERB +{ + ULONG nReverbDelay; // Reverb delay (in samples) + ULONG nDelayPos; // Delay line position + SHORT nDifCoeffs[4]; // Reverb diffusion + SHORT nDecayDC[4]; // Reverb DC decay + SHORT nDecayLP[4]; // Reverb HF decay + SHORT LPHistory[4]; // Low-pass history + SHORT Dif2InGains[4]; // 2nd diffuser input gains + SHORT RvbOutGains[4]; // 4x2 Reverb output gains + LONG lMasterGain; // late reverb master gain + LONG lDummyAlign; + // Tank Delay lines + short int Diffusion1[(RVBDLY_MASK+1)*2]; // {dif1_l, dif1_r} + short int Diffusion2[(RVBDLY_MASK+1)*2]; // {dif2_l, dif2_r} + short int Delay1[(RVBDLY_MASK+1)*2]; // {dly1_l, dly1_r} + short int Delay2[(RVBDLY_MASK+1)*2]; // {dly2_l, dly2_r} +} SWLATEREVERB, *PSWLATEREVERB; + +#define ENVIRONMENT_NUMREFLECTIONS 8 + +typedef struct _ENVIRONMENTREFLECTION +{ + SHORT GainLL, GainRR, GainLR, GainRL; // +/- 32K scale + ULONG Delay; // In samples +} ENVIRONMENTREFLECTION, *PENVIRONMENTREFLECTION; + +typedef struct _ENVIRONMENTREVERB +{ + LONG ReverbLevel; // Late reverb gain (mB) + LONG ReflectionsLevel; // Master reflections gain (mB) + LONG RoomHF; // Room gain HF (mB) + ULONG ReverbDecay; // Reverb tank decay (0-7fff scale) + LONG PreDiffusion; // Reverb pre-diffusion amount (+/- 32K scale) + LONG TankDiffusion; // Reverb tank diffusion (+/- 32K scale) + ULONG ReverbDelay; // Reverb delay (in samples) + FLOAT flReverbDamping; // HF tank gain [0.0, 1.0] + LONG ReverbDecaySamples;// Reverb decay time (in samples) + ENVIRONMENTREFLECTION Reflections[ENVIRONMENT_NUMREFLECTIONS]; +} ENVIRONMENTREVERB, *PENVIRONMENTREVERB; + + +//=================== +class CReverbSettings +//=================== +{ +public: + UINT m_nReverbDepth; + UINT m_nReverbType; +public: + CReverbSettings(); +}; + + +//=========== +class CReverb +//=========== +{ +public: + CReverbSettings m_Settings; + + // Shared reverb state + UINT gnReverbSend; + LONG gnRvbROfsVol; + LONG gnRvbLOfsVol; + +private: + + UINT gnReverbSamples; + UINT gnReverbDecaySamples; + + // Internal reverb state + BOOL g_bLastInPresent; + BOOL g_bLastOutPresent; + int g_nLastRvbIn_xl; + int g_nLastRvbIn_xr; + int g_nLastRvbIn_yl; + int g_nLastRvbIn_yr; + int g_nLastRvbOut_xl; + int g_nLastRvbOut_xr; + __int64 gnDCRRvb_Y1; + __int64 gnDCRRvb_X1; + + // Reverb mix buffers + SWRVBREFDELAY g_RefDelay; + SWLATEREVERB g_LateReverb; + +public: + CReverb(); + ~CReverb() {} +public: + void Initialize(BOOL bReset, DWORD MixingFreq); + void Process(int *MixSoundBuffer, int *MixReverbBuffer, UINT nSamples, DWORD sysinfo); + // [Reverb level 0(quiet)-100(loud)], [REVERBTYPE_XXXX] + bool SetReverbParameters(UINT nDepth, UINT nType); +private: + void Shutdown(); + // Pre/Post resampling and filtering + UINT X86_ReverbProcessPreFiltering1x(int *pWet, UINT nSamples); + UINT X86_ReverbProcessPreFiltering2x(int *pWet, UINT nSamples); + VOID MMX_ReverbProcessPostFiltering1x(const int *pRvb, int *pDry, UINT nSamples); + VOID X86_ReverbProcessPostFiltering2x(const int *pRvb, int *pDry, UINT nSamples); + VOID MMX_ReverbDCRemoval(int *pBuffer, UINT nSamples); + VOID X86_ReverbDryMix(int *pDry, int *pWet, int lDryVol, UINT nSamples); + // Process pre-diffusion and pre-delay + VOID MMX_ProcessPreDelay(PSWRVBREFDELAY pPreDelay, const int *pIn, UINT nSamples); + // Process reflections + VOID MMX_ProcessReflections(PSWRVBREFDELAY pPreDelay, short int *pRefOut, int *pMixOut, UINT nSamples); + // Process Late Reverb (SW Reflections): stereo reflections output, 32-bit reverb output, SW reverb gain + VOID MMX_ProcessLateReverb(PSWLATEREVERB pReverb, short int *pRefOut, int *pMixOut, UINT nSamples); +}; + + +///////////////////////////////////////////////////////////////////////////////// +// +// I3DL2 reverb presets +// + +#define SNDMIX_REVERB_PRESET_DEFAULT \ +-10000, 0, 1.00f,0.50f,-10000,0.020f,-10000,0.040f,100.0f,100.0f + +#define SNDMIX_REVERB_PRESET_GENERIC \ + -1000, -100, 1.49f,0.83f, -2602,0.007f, 200,0.011f,100.0f,100.0f +#define SNDMIX_REVERB_PRESET_PADDEDCELL \ + -1000,-6000, 0.17f,0.10f, -1204,0.001f, 207,0.002f,100.0f,100.0f +#define SNDMIX_REVERB_PRESET_ROOM \ + -1000, -454, 0.40f,0.83f, -1646,0.002f, 53,0.003f,100.0f,100.0f +#define SNDMIX_REVERB_PRESET_BATHROOM \ + -1000,-1200, 1.49f,0.54f, -370,0.007f, 1030,0.011f,100.0f, 60.0f +#define SNDMIX_REVERB_PRESET_LIVINGROOM \ + -1000,-6000, 0.50f,0.10f, -1376,0.003f, -1104,0.004f,100.0f,100.0f +#define SNDMIX_REVERB_PRESET_STONEROOM \ + -1000, -300, 2.31f,0.64f, -711,0.012f, 83,0.017f,100.0f,100.0f +#define SNDMIX_REVERB_PRESET_AUDITORIUM \ + -1000, -476, 4.32f,0.59f, -789,0.020f, -289,0.030f,100.0f,100.0f +#define SNDMIX_REVERB_PRESET_CONCERTHALL \ + -1000, -500, 3.92f,0.70f, -1230,0.020f, -2,0.029f,100.0f,100.0f +#define SNDMIX_REVERB_PRESET_CAVE \ + -1000, 0, 2.91f,1.30f, -602,0.015f, -302,0.022f,100.0f,100.0f +#define SNDMIX_REVERB_PRESET_ARENA \ + -1000, -698, 7.24f,0.33f, -1166,0.020f, 16,0.030f,100.0f,100.0f +#define SNDMIX_REVERB_PRESET_HANGAR \ + -1000,-1000,10.05f,0.23f, -602,0.020f, 198,0.030f,100.0f,100.0f +#define SNDMIX_REVERB_PRESET_CARPETEDHALLWAY \ + -1000,-4000, 0.30f,0.10f, -1831,0.002f, -1630,0.030f,100.0f,100.0f +#define SNDMIX_REVERB_PRESET_HALLWAY \ + -1000, -300, 1.49f,0.59f, -1219,0.007f, 441,0.011f,100.0f,100.0f +#define SNDMIX_REVERB_PRESET_STONECORRIDOR \ + -1000, -237, 2.70f,0.79f, -1214,0.013f, 395,0.020f,100.0f,100.0f +#define SNDMIX_REVERB_PRESET_ALLEY \ + -1000, -270, 1.49f,0.86f, -1204,0.007f, -4,0.011f,100.0f,100.0f +#define SNDMIX_REVERB_PRESET_FOREST \ + -1000,-3300, 1.49f,0.54f, -2560,0.162f, -613,0.088f, 79.0f,100.0f +#define SNDMIX_REVERB_PRESET_CITY \ + -1000, -800, 1.49f,0.67f, -2273,0.007f, -2217,0.011f, 50.0f,100.0f +#define SNDMIX_REVERB_PRESET_MOUNTAINS \ + -1000,-2500, 1.49f,0.21f, -2780,0.300f, -2014,0.100f, 27.0f,100.0f +#define SNDMIX_REVERB_PRESET_QUARRY \ + -1000,-1000, 1.49f,0.83f,-10000,0.061f, 500,0.025f,100.0f,100.0f +#define SNDMIX_REVERB_PRESET_PLAIN \ + -1000,-2000, 1.49f,0.50f, -2466,0.179f, -2514,0.100f, 21.0f,100.0f +#define SNDMIX_REVERB_PRESET_PARKINGLOT \ + -1000, 0, 1.65f,1.50f, -1363,0.008f, -1153,0.012f,100.0f,100.0f +#define SNDMIX_REVERB_PRESET_SEWERPIPE \ + -1000,-1000, 2.81f,0.14f, 429,0.014f, 648,0.021f, 80.0f, 60.0f +#define SNDMIX_REVERB_PRESET_UNDERWATER \ + -1000,-4000, 1.49f,0.10f, -449,0.007f, 1700,0.011f,100.0f,100.0f + +// Examples simulating General MIDI 2'musical' reverb presets +// +// Name (Decay time) Description +// +// Small Room (1.1s) A small size room with a length of 5m or so. +// Medium Room (1.3s) A medium size room with a length of 10m or so. +// Large Room (1.5s) A large size room suitable for live performances. +// Medium Hall (1.8s) A medium size concert hall. +// Large Hall (1.8s) A large size concert hall suitable for a full orchestra. +// Plate (1.3s) A plate reverb simulation. + +#define SNDMIX_REVERB_PRESET_SMALLROOM \ + -1000, -600, 1.10f,0.83f, -400,0.005f, 500,0.010f,100.0f,100.0f +#define SNDMIX_REVERB_PRESET_MEDIUMROOM \ + -1000, -600, 1.30f,0.83f, -1000,0.010f, -200,0.020f,100.0f,100.0f +#define SNDMIX_REVERB_PRESET_LARGEROOM \ + -1000, -600, 1.50f,0.83f, -1600,0.020f, -1000,0.040f,100.0f,100.0f +#define SNDMIX_REVERB_PRESET_MEDIUMHALL \ + -1000, -600, 1.80f,0.70f, -1300,0.015f, -800,0.030f,100.0f,100.0f +#define SNDMIX_REVERB_PRESET_LARGEHALL \ + -1000, -600, 1.80f,0.70f, -2000,0.030f, -1400,0.060f,100.0f,100.0f +#define SNDMIX_REVERB_PRESET_PLATE \ + -1000, -200, 1.30f,0.90f, 0,0.002f, 0,0.010f,100.0f, 75.0f + + +#endif // NO_REVERB Deleted: trunk/OpenMPT/soundlib/Snd_rvb.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_rvb.cpp 2013-04-11 17:21:26 UTC (rev 1843) +++ trunk/OpenMPT/soundlib/Snd_rvb.cpp 2013-04-11 18:09:59 UTC (rev 1844) @@ -1,1096 +0,0 @@ -/* - * Snd_rvb.cpp - * ----------- - * Purpose: Mixing code for reverb. - * Notes : Ugh... This should really be removed at some point. - * Authors: Olivier Lapicque - * OpenMPT Devs - * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. - */ - - -#include "stdafx.h" -#include "sndfile.h" -#include "snd_rvb.h" - -#ifndef NO_REVERB - -#pragma warning(disable:4725) // Pentium fdiv bug -#pragma warning(disable:4731) // ebp modified - -extern VOID MPPASMCALL X86_StereoFill(int *pBuffer, UINT nSamples, LPLONG lpROfs, LPLONG lpLOfs); - - - -CReverbSettings::CReverbSettings() -//-------------------------------- -{ - m_nReverbType = 0; - m_nReverbDepth = 8; // 50% -} - - -CReverb::CReverb() -//---------------- -{ - - // Shared reverb state - gnReverbSamples = 0; - gnReverbDecaySamples = 0; - gnReverbSend = 0; - gnRvbROfsVol = 0; - gnRvbLOfsVol = 0; - - // Internal reverb state - g_bLastInPresent = 0; - g_bLastOutPresent = 0; - g_nLastRvbIn_xl = 0; - g_nLastRvbIn_xr = 0; - g_nLastRvbIn_yl = 0; - g_nLastRvbIn_yr = 0; - g_nLastRvbOut_xl = 0; - g_nLastRvbOut_xr = 0; - gnDCRRvb_Y1 = 0; - gnDCRRvb_X1 = 0; - - // Reverb mix buffers - MemsetZero(g_RefDelay); - MemsetZero(g_LateReverb); - -} - - -// Misc functions -static LONG OnePoleLowPassCoef(LONG scale, FLOAT g, FLOAT F_c, FLOAT F_s); -static LONG mBToLinear(LONG scale, LONG value_mB); -static FLOAT mBToLinear(LONG value_mB); - -struct SNDMIX_REVERB_PROPERTIES -{ - LONG lRoom; // [-10000, 0] default: -10000 mB - LONG lRoomHF; // [-10000, 0] default: 0 mB - FLOAT flDecayTime; // [0.1, 20.0] default: 1.0 s - FLOAT flDecayHFRatio; // [0.1, 2.0] default: 0.5 - LONG lReflections; // [-10000, 1000] default: -10000 mB - FLOAT flReflectionsDelay; // [0.0, 0.3] default: 0.02 s - LONG lReverb; // [-10000, 2000] default: -10000 mB - FLOAT flReverbDelay; // [0.0, 0.1] default: 0.04 s - FLOAT flDiffusion; // [0.0, 100.0] default: 100.0 % - FLOAT flDensity; // [0.0, 100.0] default: 100.0 % -}; -typedef SNDMIX_REVERB_PROPERTIES* PSNDMIX_REVERB_PROPERTIES; - -typedef struct _SNDMIX_RVBPRESET -{ - SNDMIX_REVERB_PROPERTIES Preset; - LPCSTR lpszName; -} SNDMIX_RVBPRESET, *PSNDMIX_RVBPRESET; - - -static SNDMIX_RVBPRESET gRvbPresets[NUM_REVERBTYPES] = -{ - {{ SNDMIX_REVERB_PRESET_PLATE }, "GM Plate"}, - {{ SNDMIX_REVERB_PRESET_SMALLROOM }, "GM Small Room"}, - {{ SNDMIX_REVERB_PRESET_MEDIUMROOM }, "GM Medium Room"}, - {{ SNDMIX_REVERB_PRESET_LARGEROOM }, "GM Large Room"}, - {{ SNDMIX_REVERB_PRESET_MEDIUMHALL }, "GM Medium Hall"}, - {{ SNDMIX_REVERB_PRESET_LARGEHALL }, "GM Large Hall"}, - {{ SNDMIX_REVERB_PRESET_GENERIC }, "Generic"}, - {{ SNDMIX_REVERB_PRESET_PADDEDCELL }, "Padded Cell"}, - {{ SNDMIX_REVERB_PRESET_ROOM }, "Room"}, - {{ SNDMIX_REVERB_PRESET_BATHROOM }, "Bathroom"}, - {{ SNDMIX_REVERB_PRESET_LIVINGROOM }, "Living Room"}, - {{ SNDMIX_REVERB_PRESET_STONEROOM }, "Stone Room"}, - {{ SNDMIX_REVERB_PRESET_AUDITORIUM }, "Auditorium"}, - {{ SNDMIX_REVERB_PRESET_CONCERTHALL }, "Concert Hall"}, - {{ SNDMIX_REVERB_PRESET_CAVE }, "Cave"}, - {{ SNDMIX_REVERB_PRESET_ARENA }, "Arena"}, - {{ SNDMIX_REVERB_PRESET_HANGAR }, "Hangar"}, - {{ SNDMIX_REVERB_PRESET_CARPETEDHALLWAY }, "Carpeted Hallway"}, - {{ SNDMIX_REVERB_PRESET_HALLWAY }, "Hallway"}, - {{ SNDMIX_REVERB_PRESET_STONECORRIDOR }, "Stone Corridor"}, - {{ SNDMIX_REVERB_PRESET_ALLEY }, "Alley"}, - {{ SNDMIX_REVERB_PRESET_FOREST }, "Forest"}, - {{ SNDMIX_REVERB_PRESET_CITY }, "City"}, - {{ SNDMIX_REVERB_PRESET_MOUNTAINS }, "Mountains"}, - {{ SNDMIX_REVERB_PRESET_QUARRY }, "Quarry"}, - {{ SNDMIX_REVERB_PRESET_PLAIN }, "Plain"}, - {{ SNDMIX_REVERB_PRESET_PARKINGLOT }, "Parking Lot"}, - {{ SNDMIX_REVERB_PRESET_SEWERPIPE }, "Sewer Pipe"}, - {{ SNDMIX_REVERB_PRESET_UNDERWATER }, "Underwater"}, -}; - -LPCSTR GetReverbPresetName(UINT nPreset) -{ - return (nPreset < NUM_REVERBTYPES) ? gRvbPresets[nPreset].lpszName : NULL; -} - -////////////////////////////////////////////////////////////////////////// -// -// I3DL2 environmental reverb support -// - -typedef struct _REFLECTIONPRESET -{ - LONG lDelayFactor; - SHORT sGainLL, sGainRR, sGainLR, sGainRL; -} REFLECTIONPRESET, *PREFLECTIONPRESET; - -const REFLECTIONPRESET gReflectionsPreset[ENVIRONMENT_NUMREFLECTIONS] = -{ - // %Delay, ll, rr, lr, rl - {0, 9830, 6554, 0, 0}, - {10, 6554, 13107, 0, 0}, - {24, -9830, 13107, 0, 0}, - {36, 13107, -6554, 0, 0}, - {54, 16384, 16384, -1638, -1638}, - {61, -13107, 8192, -328, -328}, - {73, -11468, -11468, -3277, 3277}, - {87, 13107, -9830, 4916, -4916} -}; - -//////////////////////////////////////////////////////////////////////////////////// -// -// Implementation -// - -inline long ftol(float f) { return ((long)(f)); } - -static VOID I3dl2_to_Generic( - const SNDMIX_REVERB_PROPERTIES *pReverb, - PENVIRONMENTREVERB pRvb, - FLOAT flOutputFreq, - LONG lMinRefDelay, - LONG lMaxRefDelay, - LONG lMinRvbDelay, - LONG lMaxRvbDelay, - LONG lTankLength) -{ - FLOAT flDelayFactor, flDelayFactorHF, flDecayTimeHF; - LONG lDensity, lTailDiffusion; - - // Common parameters - pRvb->ReverbLevel = pReverb->lReverb; - pRvb->ReflectionsLevel = pReverb->lReflections; - pRvb->RoomHF = pReverb->lRoomHF; - - // HACK: Somewhat normalize the reverb output level - LONG lMaxLevel = (pRvb->ReverbLevel > pRvb->ReflectionsLevel) ? pRvb->ReverbLevel : pRvb->ReflectionsLevel; - if (lMaxLevel < -600) - { - lMaxLevel += 600; - pRvb->ReverbLevel -= lMaxLevel; - pRvb->ReflectionsLevel -= lMaxLevel; - } - - // Pre-Diffusion factor (for both reflections and late reverb) - lDensity = 8192 + ftol(79.31f * pReverb->flDensity); - pRvb->PreDiffusion = lDensity; - - // Late reverb diffusion - lTailDiffusion = ftol((0.15f + pReverb->flDiffusion * (0.36f*0.01f)) * 32767.0f); - if (lTailDiffusion > 0x7f00) lTailDiffusion = 0x7f00; - pRvb->TankDiffusion = lTailDiffusion; - - // Verify reflections and reverb delay parameters - FLOAT flRefDelay = pReverb->flReflectionsDelay; - if (flRefDelay > 0.100f) flRefDelay = 0.100f; - LONG lReverbDelay = ftol(pReverb->flReverbDelay * flOutputFreq); - LONG lReflectionsDelay = ftol(flRefDelay * flOutputFreq); - LONG lReverbDecayTime = ftol(pReverb->flDecayTime * flOutputFreq); - if (lReflectionsDelay < lMinRefDelay) - { - lReverbDelay -= (lMinRefDelay - lReflectionsDelay); - lReflectionsDelay = lMinRefDelay; - } - if (lReflectionsDelay > lMaxRefDelay) - { - lReverbDelay += (lReflectionsDelay - lMaxRefDelay); - lReflectionsDelay = lMaxRefDelay; - } - // Adjust decay time when adjusting reverb delay - if (lReverbDelay < lMinRvbDelay) - { - lReverbDecayTime -= (lMinRvbDelay - lReverbDelay); - lReverbDelay = lMinRvbDelay; - } - if (lReverbDelay > lMaxRvbDelay) - { - lReverbDecayTime += (lReverbDelay - lMaxRvbDelay); - lReverbDelay = lMaxRvbDelay; - } - pRvb->ReverbDelay = lReverbDelay; - pRvb->ReverbDecaySamples = lReverbDecayTime; - // Setup individual reflections delay and gains - for (UINT iRef=0; iRef<ENVIRONMENT_NUMREFLECTIONS; iRef++) - { - PENVIRONMENTREFLECTION pRef = &pRvb->Reflections[iRef]; - pRef->Delay = lReflectionsDelay + (gReflectionsPreset[iRef].lDelayFactor * lReverbDelay + 50)/100; - pRef->GainLL = gReflectionsPreset[iRef].sGainLL; - pRef->GainRL = gReflectionsPreset[iRef].sGainRL; - pRef->GainLR = gReflectionsPreset[iRef].sGainLR; - pRef->GainRR = gReflectionsPreset[iRef].sGainRR; - } - - // Late reverb decay time - if (lTankLength < 10) lTankLength = 10; - flDelayFactor = (lReverbDecayTime <= lTankLength) ? 1.0f : ((FLOAT)lTankLength / (FLOAT)lReverbDecayTime); - pRvb->ReverbDecay = ftol(pow(0.001f, flDelayFactor) * 32768.0f); - - // Late Reverb Decay HF - flDecayTimeHF = (FLOAT)lReverbDecayTime * pReverb->flDecayHFRatio; - flDelayFactorHF = (flDecayTimeHF <= (FLOAT)lTankLength) ? 1.0f : ((FLOAT)lTankLength / flDecayTimeHF); - pRvb->flReverbDamping = pow(0.001f, flDelayFactorHF); -} - - -void CReverb::Shutdown() -//---------------------- -{ - gnRvbLOfsVol = 0; - gnRvbROfsVol = 0; - - // Clear out all reverb state - g_bLastInPresent = FALSE; - g_bLastOutPresent = FALSE; - g_nLastRvbIn_xl = g_nLastRvbIn_xr = 0; - g_nLastRvbIn_yl = g_nLastRvbIn_yr = 0; - g_nLastRvbOut_xl = g_nLastRvbOut_xr = 0; - gnDCRRvb_X1 = 0; - gnDCRRvb_Y1 = 0; - - // Zero internal buffers - MemsetZero(g_LateReverb.Diffusion1); - MemsetZero(g_LateReverb.Diffusion2); - MemsetZero(g_LateReverb.Delay1); - MemsetZero(g_LateReverb.Delay2); - MemsetZero(g_RefDelay.RefDelayBuffer); - MemsetZero(g_RefDelay.PreDifBuffer); - MemsetZero(g_RefDelay.RefOut); -} - - -void CReverb::Initialize(BOOL bReset, DWORD MixingFreq) -//----------------------------------------------------- -{ - if (m_Settings.m_nReverbType >= NUM_REVERBTYPES) m_Settings.m_nReverbType = 0; - static PSNDMIX_REVERB_PROPERTIES spCurrentPreset = NULL; - PSNDMIX_REVERB_PROPERTIES pRvbPreset = &gRvbPresets[m_Settings.m_nReverbType].Preset; - - if ((pRvbPreset != spCurrentPreset) || (bReset)) - { - // Reverb output frequency is half of the dry output rate - FLOAT flOutputFrequency = (FLOAT)MixingFreq; - ENVIRONMENTREVERB rvb; - - // Reset reverb parameters - spCurrentPreset = pRvbPreset; - I3dl2_to_Generic(pRvbPreset, &rvb, flOutputFrequency, - RVBMINREFDELAY, RVBMAXREFDELAY, - RVBMINRVBDELAY, RVBMAXRVBDELAY, - ( RVBDIF1L_LEN + RVBDIF1R_LEN - + RVBDIF2L_LEN + RVBDIF2R_LEN - + RVBDLY1L_LEN + RVBDLY1R_LEN - + RVBDLY2L_LEN + RVBDLY2R_LEN) / 2); - - // Store reverb decay time (in samples) for reverb auto-shutdown - gnReverbDecaySamples = rvb.ReverbDecaySamples; - - // Room attenuation at high frequencies - LONG nRoomLP; - nRoomLP = OnePoleLowPassCoef(32768, mBToLinear(rvb.RoomHF), 5000, flOutputFrequency); - g_RefDelay.nCoeffs[0] = (SHORT)nRoomLP; - g_RefDelay.nCoeffs[1] = (SHORT)nRoomLP; - - // Pre-Diffusion factor (for both reflections and late reverb) - g_RefDelay.nPreDifCoeffs[0] = (SHORT)(rvb.PreDiffusion*2); - g_RefDelay.nPreDifCoeffs[1] = (SHORT)(rvb.PreDiffusion*2); - - // Setup individual reflections delay and gains - for (UINT iRef=0; iRef<8; iRef++) - { - PSWRVBREFLECTION pRef = &g_RefDelay.Reflections[iRef]; - pRef->DelayDest = rvb.Reflections[iRef].Delay; - pR... [truncated message content] |
From: <man...@us...> - 2013-04-11 18:38:22
|
Revision: 1847 http://sourceforge.net/p/modplug/code/1847 Author: manxorist Date: 2013-04-11 18:38:07 +0000 (Thu, 11 Apr 2013) Log Message: ----------- [Ref] Move all SoundDevice related code out of soundlib/ into its own new directory sounddev/. Modified Paths: -------------- trunk/OpenMPT/mptrack/ExceptionHandler.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/Mpdlgs.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/TrackerSettings.cpp trunk/OpenMPT/mptrack/mptrack_08.vcproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters Added Paths: ----------- trunk/OpenMPT/sounddev/ trunk/OpenMPT/sounddev/SoundDevice.cpp trunk/OpenMPT/sounddev/SoundDevice.h trunk/OpenMPT/sounddev/SoundDevices.h Removed Paths: ------------- trunk/OpenMPT/soundlib/SNDDEV.H trunk/OpenMPT/soundlib/SNDDEVX.H trunk/OpenMPT/soundlib/Snddev.cpp Modified: trunk/OpenMPT/mptrack/ExceptionHandler.cpp =================================================================== --- trunk/OpenMPT/mptrack/ExceptionHandler.cpp 2013-04-11 18:35:08 UTC (rev 1846) +++ trunk/OpenMPT/mptrack/ExceptionHandler.cpp 2013-04-11 18:38:07 UTC (rev 1847) @@ -10,7 +10,7 @@ #include "stdafx.h" #include "Mainfrm.h" -#include "snddev.h" +#include "../sounddev/SoundDevice.h" #include "Moddoc.h" #include <shlwapi.h> #include "ExceptionHandler.h" Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2013-04-11 18:35:08 UTC (rev 1846) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2013-04-11 18:38:07 UTC (rev 1847) @@ -11,7 +11,7 @@ #include "stdafx.h" #include "mptrack.h" #include "MainFrm.h" -#include "snddev.h" +#include "../sounddev/SoundDevice.h" #include "moddoc.h" #include "childfrm.h" #include "dlsbank.h" Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2013-04-11 18:35:08 UTC (rev 1846) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2013-04-11 18:38:07 UTC (rev 1847) @@ -14,7 +14,7 @@ #include "InputHandler.h" #include "../common/AudioCriticalSection.h" #include "../common/mutex.h" -#include "../soundlib/snddev.h" +#include "../sounddev/SoundDevice.h" #include "../soundlib/Sndfile.h" class CInputHandler; Modified: trunk/OpenMPT/mptrack/Mpdlgs.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mpdlgs.cpp 2013-04-11 18:35:08 UTC (rev 1846) +++ trunk/OpenMPT/mptrack/Mpdlgs.cpp 2013-04-11 18:38:07 UTC (rev 1847) @@ -16,7 +16,7 @@ #include "mpdlgs.h" #include "moptions.h" #include "moddoc.h" -#include "snddev.h" +#include "../sounddev/SoundDevice.h" #include ".\mpdlgs.h" #define str_preampChangeNote GetStrI18N(_TEXT("Note: The Pre-Amp setting affects sample volume only. Changing it may cause undesired effects on volume balance between sample based instruments and plugin instruments.\nIn other words: Don't touch this slider unless you know what you are doing.")) Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2013-04-11 18:35:08 UTC (rev 1846) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2013-04-11 18:38:07 UTC (rev 1847) @@ -15,7 +15,7 @@ #include "moddoc.h" #include "globals.h" #include "dlsbank.h" -#include "snddev.h" +#include "../sounddev/SoundDevice.h" #include "vstplug.h" #include "CreditStatic.h" #include "hyperEdit.h" Modified: trunk/OpenMPT/mptrack/TrackerSettings.cpp =================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.cpp 2013-04-11 18:35:08 UTC (rev 1846) +++ trunk/OpenMPT/mptrack/TrackerSettings.cpp 2013-04-11 18:38:07 UTC (rev 1847) @@ -13,8 +13,8 @@ #include "Mptrack.h" #include "Moddoc.h" #include "Mainfrm.h" -#include "snddev.h" -#include "SNDDEVX.H" +#include "../sounddev/SoundDevice.h" +#include "../sounddev/SoundDevices.h" #include "../common/version.h" #include "UpdateCheck.h" #include "Mpdlgs.h" Modified: trunk/OpenMPT/mptrack/mptrack_08.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_08.vcproj 2013-04-11 18:35:08 UTC (rev 1846) +++ trunk/OpenMPT/mptrack/mptrack_08.vcproj 2013-04-11 18:38:07 UTC (rev 1847) @@ -517,7 +517,7 @@ > </File> <File - RelativePath="..\Soundlib\snddev.cpp" + RelativePath="..\sounddev\SoundDevice.cpp" > </File> <File @@ -1055,11 +1055,11 @@ > </File> <File - RelativePath="..\Soundlib\snddev.h" + RelativePath="..\sounddev\SoundDevice.h" > </File> <File - RelativePath="..\Soundlib\snddevx.h" + RelativePath="..\sounddev\SoundDevices.h" > </File> <File Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2013-04-11 18:35:08 UTC (rev 1846) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2013-04-11 18:38:07 UTC (rev 1847) @@ -248,6 +248,7 @@ <ClCompile Include="..\common\misc_util.cpp" /> <ClCompile Include="..\common\Profiler.cpp" /> <ClCompile Include="..\common\Reporting.cpp" /> + <ClCompile Include="..\sounddev\SoundDevice.cpp" /> <ClCompile Include="..\sounddsp\AGC.cpp" /> <ClCompile Include="..\sounddsp\DSP.cpp" /> <ClCompile Include="..\sounddsp\EQ.cpp" /> @@ -332,7 +333,6 @@ <ClCompile Include="..\common\serialization_utils.cpp" /> <ClCompile Include="..\soundlib\snd_flt.cpp" /> <ClCompile Include="..\soundlib\Snd_fx.cpp" /> - <ClCompile Include="..\Soundlib\snddev.cpp" /> <ClCompile Include="..\soundlib\Sndfile.cpp" /> <ClCompile Include="..\soundlib\Sndmix.cpp" /> <ClCompile Include="..\soundlib\SoundFilePlayConfig.cpp" /> @@ -407,6 +407,8 @@ <ClInclude Include="..\common\Reporting.h" /> <ClInclude Include="..\common\StringFixer.h" /> <ClInclude Include="..\common\typedefs.h" /> + <ClInclude Include="..\sounddev\SoundDevice.h" /> + <ClInclude Include="..\sounddev\SoundDevices.h" /> <ClInclude Include="..\sounddsp\AGC.h" /> <ClInclude Include="..\sounddsp\DSP.h" /> <ClInclude Include="..\sounddsp\EQ.h" /> @@ -489,8 +491,6 @@ <ClInclude Include="ScaleEnvPointsDlg.h" /> <ClInclude Include="..\common\serialization_utils.h" /> <ClInclude Include="..\soundlib\Snd_defs.h" /> - <ClInclude Include="..\Soundlib\snddev.h" /> - <ClInclude Include="..\Soundlib\snddevx.h" /> <ClInclude Include="..\Soundlib\Sndfile.h" /> <ClInclude Include="..\soundlib\SoundFilePlayConfig.h" /> <ClInclude Include="..\common\stdafx.h" /> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2013-04-11 18:35:08 UTC (rev 1846) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2013-04-11 18:38:07 UTC (rev 1847) @@ -247,9 +247,6 @@ <ClCompile Include="..\soundlib\Sndfile.cpp"> <Filter>Source Files</Filter> </ClCompile> - <ClCompile Include="..\Soundlib\snddev.cpp"> - <Filter>Source Files</Filter> - </ClCompile> <ClCompile Include="..\soundlib\Snd_fx.cpp"> <Filter>Source Files</Filter> </ClCompile> @@ -430,6 +427,9 @@ <ClCompile Include="..\sounddsp\Reverb.cpp"> <Filter>Source Files\sounddsp</Filter> </ClCompile> + <ClCompile Include="..\sounddev\SoundDevice.cpp"> + <Filter>Source Files\sounddev</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="AbstractVstEditor.h"> @@ -609,12 +609,6 @@ <ClInclude Include="..\soundlib\Snd_defs.h"> <Filter>Header Files</Filter> </ClInclude> - <ClInclude Include="..\Soundlib\snddev.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="..\Soundlib\snddevx.h"> - <Filter>Header Files</Filter> - </ClInclude> <ClInclude Include="..\Soundlib\Sndfile.h"> <Filter>Header Files</Filter> </ClInclude> @@ -789,6 +783,12 @@ <ClInclude Include="..\sounddsp\Reverb.h"> <Filter>Header Files\sounddsp</Filter> </ClInclude> + <ClInclude Include="..\sounddev\SoundDevices.h"> + <Filter>Header Files\sounddev</Filter> + </ClInclude> + <ClInclude Include="..\sounddev\SoundDevice.h"> + <Filter>Header Files\sounddev</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <None Include="res\bitmap1.bmp"> @@ -901,6 +901,12 @@ <Filter Include="Header Files\sounddsp"> <UniqueIdentifier>{2174b62f-1cac-4ad9-9db3-e3447eaa1bd0}</UniqueIdentifier> </Filter> + <Filter Include="Source Files\sounddev"> + <UniqueIdentifier>{909d97bd-08e7-4142-9061-5b493c80ee05}</UniqueIdentifier> + </Filter> + <Filter Include="Header Files\sounddev"> + <UniqueIdentifier>{fdcc47cc-1845-4b7b-be8a-1e96fa99e0fd}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ResourceCompile Include="mptrack.rc"> Copied: trunk/OpenMPT/sounddev/SoundDevice.cpp (from rev 1843, trunk/OpenMPT/soundlib/Snddev.cpp) =================================================================== --- trunk/OpenMPT/sounddev/SoundDevice.cpp (rev 0) +++ trunk/OpenMPT/sounddev/SoundDevice.cpp 2013-04-11 18:38:07 UTC (rev 1847) @@ -0,0 +1,2180 @@ +/* + * SoundDevice.cpp + * --------------- + * Purpose: Actual sound device driver classes. + * Notes : (currently none) + * Authors: Olivier Lapicque + * OpenMPT Devs + * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. + */ + + +#include "stdafx.h" + +#include "SoundDevice.h" +#include "SoundDevices.h" +#include "../common/misc_util.h" +#include "../common/Reporting.h" +#include "../common/StringFixer.h" + + +/////////////////////////////////////////////////////////////////////////////////////// +// +// ISoundDevice base class +// + +ISoundDevice::ISoundDevice() +//-------------------------- +{ + m_Source = nullptr; + m_LatencyMS = SNDDEV_DEFAULT_LATENCY_MS; + m_UpdateIntervalMS = SNDDEV_DEFAULT_UPDATEINTERVAL_MS; + m_fulCfgOptions = 0; + + m_RealLatencyMS = static_cast<float>(m_LatencyMS); + m_RealUpdateIntervalMS = static_cast<float>(m_UpdateIntervalMS); +} + +ISoundDevice::~ISoundDevice() +//--------------------------- +{ +} + + +VOID ISoundDevice::Configure(HWND hwnd, UINT LatencyMS, UINT UpdateIntervalMS, DWORD fdwCfgOptions) +//------------------------------------------------------------------------------------------------- +{ + if(LatencyMS < SNDDEV_MINLATENCY_MS) LatencyMS = SNDDEV_MINLATENCY_MS; + if(LatencyMS > SNDDEV_MAXLATENCY_MS) LatencyMS = SNDDEV_MAXLATENCY_MS; + if(UpdateIntervalMS < SNDDEV_MINUPDATEINTERVAL_MS) UpdateIntervalMS = SNDDEV_MINUPDATEINTERVAL_MS; + if(UpdateIntervalMS > SNDDEV_MAXUPDATEINTERVAL_MS) UpdateIntervalMS = SNDDEV_MAXUPDATEINTERVAL_MS; + m_LatencyMS = LatencyMS; + m_UpdateIntervalMS = UpdateIntervalMS; + m_fulCfgOptions = fdwCfgOptions; + m_hWnd = hwnd; + m_RealLatencyMS = static_cast<float>(m_LatencyMS); + m_RealUpdateIntervalMS = static_cast<float>(m_UpdateIntervalMS); +} + + +CAudioThread::CAudioThread(CSoundDeviceWithThread &SoundDevice) : m_SoundDevice(SoundDevice) +//----------------------------------------------------------------------------------- +{ + m_hPlayThread = NULL; + m_dwPlayThreadId = 0; + m_hAudioWakeUp = NULL; + m_hAudioThreadTerminateRequest = NULL; + m_hAudioThreadGoneIdle = NULL; + m_AudioThreadActive = 0; + m_hAudioWakeUp = CreateEvent(NULL, FALSE, FALSE, NULL); + m_hAudioThreadTerminateRequest = CreateEvent(NULL, FALSE, FALSE, NULL); + m_hAudioThreadGoneIdle = CreateEvent(NULL, TRUE, FALSE, NULL); + m_hPlayThread = CreateThread(NULL, 0, AudioThreadWrapper, (LPVOID)this, 0, &m_dwPlayThreadId); +} + + +CAudioThread::~CAudioThread() +//--------------------------- +{ + if(m_hPlayThread != NULL) + { + SetEvent(m_hAudioThreadTerminateRequest); + WaitForSingleObject(m_hPlayThread, INFINITE); + m_dwPlayThreadId = 0; + m_hPlayThread = NULL; + } + if(m_hAudioThreadTerminateRequest) + { + CloseHandle(m_hAudioThreadTerminateRequest); + m_hAudioThreadTerminateRequest = 0; + } + if(m_hAudioThreadGoneIdle != NULL) + { + CloseHandle(m_hAudioThreadGoneIdle); + m_hAudioThreadGoneIdle = 0; + } + if(m_hAudioWakeUp != NULL) + { + CloseHandle(m_hAudioWakeUp); + m_hAudioWakeUp = NULL; + } +} + + +DWORD WINAPI CAudioThread::AudioThreadWrapper(LPVOID user) +{ + return ((CAudioThread*)user)->AudioThread(); +} +DWORD CAudioThread::AudioThread() +//------------------------------- +{ + HANDLE sleepEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + HANDLE waithandles[3]; + waithandles[0] = m_hAudioThreadTerminateRequest; + waithandles[1] = m_hAudioWakeUp; + waithandles[2] = sleepEvent; + + bool idle = true; + bool terminate = false; + while(!terminate) + { + + if(idle) + { + SetEvent(m_hAudioThreadGoneIdle); + switch(WaitForMultipleObjects(2, waithandles, FALSE, INFINITE)) + { + case WAIT_OBJECT_0: + terminate = true; + break; + case WAIT_OBJECT_0+1: + idle = false; + break; + } + continue; + } + +#ifdef NDEBUG + typedef HANDLE (WINAPI *FAvSetMmThreadCharacteristics) (LPCTSTR,LPDWORD); + typedef BOOL (WINAPI *FAvRevertMmThreadCharacteristics)(HANDLE); + FAvSetMmThreadCharacteristics pAvSetMmThreadCharacteristics = NULL; + FAvRevertMmThreadCharacteristics pAvRevertMmThreadCharacteristics = NULL; + HMODULE hAvrtDLL = NULL; + DWORD task_idx = 0; + HANDLE hTask = NULL; + + OSVERSIONINFO versioninfo; + MemsetZero(versioninfo); + versioninfo.dwOSVersionInfoSize = sizeof(versioninfo); + GetVersionEx(&versioninfo); + + bool boostPriority = (m_SoundDevice.m_fulCfgOptions & SNDDEV_OPTIONS_BOOSTTHREADPRIORITY); + + if(boostPriority) + { + if(versioninfo.dwMajorVersion >= 6) // vista + { + hAvrtDLL = LoadLibrary("avrt.dll"); + if(hAvrtDLL) + { + pAvSetMmThreadCharacteristics = (FAvSetMmThreadCharacteristics)GetProcAddress(hAvrtDLL, "AvSetMmThreadCharacteristicsA"); + pAvRevertMmThreadCharacteristics = (FAvRevertMmThreadCharacteristics)GetProcAddress(hAvrtDLL, "AvRevertMmThreadCharacteristics"); + } + if(pAvSetMmThreadCharacteristics && pAvRevertMmThreadCharacteristics) + { + hTask = pAvSetMmThreadCharacteristics("Pro Audio", &task_idx); + } + } else + { + SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL); + } + } +#endif + + // increase resolution of multimedia timer + bool period_set = (timeBeginPeriod(1) == TIMERR_NOERROR); + + m_SoundDevice.Start(); + + while(!idle && !terminate) + { + + UINT nSleep = 50; + + { + if(IsActive()) + { + // we are playing, everything is fine + m_SoundDevice.FillAudioBufferLocked(); + nSleep = static_cast<UINT>(m_SoundDevice.GetRealUpdateIntervalMS()); + if(nSleep < 1) nSleep = 1; + } else + { + idle = true; + } + } + + if(!idle) + { + timeSetEvent(nSleep, 1, (LPTIMECALLBACK)sleepEvent, NULL, TIME_ONESHOT | TIME_CALLBACK_EVENT_SET); + if(WaitForMultipleObjects(3, waithandles, FALSE, nSleep) == WAIT_OBJECT_0) terminate = true; + } + + } + + m_SoundDevice.Stop(); + + if(period_set) timeEndPeriod(1); + +#ifdef NDEBUG + if(boostPriority) + { + if(versioninfo.dwMajorVersion >= 6) // vista + { + if(pAvSetMmThreadCharacteristics && pAvRevertMmThreadCharacteristics) + { + pAvRevertMmThreadCharacteristics(hTask); + } + if(hAvrtDLL) + { + pAvRevertMmThreadCharacteristics = NULL; + pAvSetMmThreadCharacteristics = NULL; + FreeLibrary(hAvrtDLL); + hAvrtDLL = NULL; + } + } else + { + SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL); + } + } +#endif + + } + + SetEvent(m_hAudioThreadGoneIdle); + + CloseHandle(sleepEvent); + return 0; +} + + +void CAudioThread::Activate() +//--------------------------- +{ + if(InterlockedExchangeAdd(&m_AudioThreadActive, 0)) return; + ResetEvent(m_hAudioThreadGoneIdle); + InterlockedExchange(&m_AudioThreadActive, 1); + SetEvent(m_hAudioWakeUp); +} + + +void CAudioThread::Deactivate() +//----------------------------- +{ + if(!InterlockedExchangeAdd(&m_AudioThreadActive, 0)) return; + InterlockedExchange(&m_AudioThreadActive, 0); + WaitForSingleObject(m_hAudioThreadGoneIdle, INFINITE); + +} + + +void CSoundDeviceWithThread::FillAudioBufferLocked() +//-------------------------------------------------- +{ + m_Source->FillAudioBufferLocked(*this); +} + + +void CSoundDeviceWithThread::Start() +//---------------------------------- +{ + m_AudioThread.Activate(); +} + + +void CSoundDeviceWithThread::Stop() +//--------------------------------- +{ + m_AudioThread.Deactivate(); +} + + +void CSoundDeviceWithThread::Reset() +//---------------------------------- +{ + m_AudioThread.Deactivate(); + ResetFromOutsideSoundThread(); +} + + +/////////////////////////////////////////////////////////////////////////////////////// +// +// MMSYSTEM WaveOut Device +// + +static UINT gnNumWaveDevs = 0; + +CWaveDevice::CWaveDevice() +//------------------------ +{ + m_hWaveOut = NULL; + m_nWaveBufferSize = 0; + m_nPreparedHeaders = 0; + m_nBytesPerSec = 0; + m_BytesPerSample = 0; + MemsetZero(m_WaveBuffers); +} + + +CWaveDevice::~CWaveDevice() +//------------------------- +{ + if (m_hWaveOut) + { + Close(); + } +} + + +BOOL CWaveDevice::Open(UINT nDevice, LPWAVEFORMATEX pwfx) +//------------------------------------------------------- +{ + LONG nWaveDev; + + if (m_hWaveOut) Close(); + nWaveDev = (nDevice) ? nDevice-1 : WAVE_MAPPER; + if (waveOutOpen(&m_hWaveOut, nWaveDev, pwfx, (DWORD)WaveOutCallBack, (DWORD)this, CALLBACK_FUNCTION)) + { + sndPlaySound(NULL, 0); + LONG err = waveOutOpen(&m_hWaveOut, nWaveDev, pwfx, (DWORD)WaveOutCallBack, (DWORD)this, CALLBACK_FUNCTION); + if (err) return FALSE; + } + m_nBytesPerSec = pwfx->nAvgBytesPerSec; + m_BytesPerSample = (pwfx->wBitsPerSample/8) * pwfx->nChannels; + m_nWaveBufferSize = (m_UpdateIntervalMS * pwfx->nAvgBytesPerSec) / 1000; + m_nWaveBufferSize = (m_nWaveBufferSize + 7) & ~7; + if (m_nWaveBufferSize < WAVEOUT_MINBUFFERSIZE) m_nWaveBufferSize = WAVEOUT_MINBUFFERSIZE; + if (m_nWaveBufferSize > WAVEOUT_MAXBUFFERSIZE) m_nWaveBufferSize = WAVEOUT_MAXBUFFERSIZE; + ULONG NumBuffers = m_LatencyMS * pwfx->nAvgBytesPerSec / ( m_nWaveBufferSize * 1000 ); + NumBuffers = CLAMP(NumBuffers, 3, WAVEOUT_MAXBUFFERS); + m_nPreparedHeaders = 0; + for(UINT iBuf=0; iBuf<NumBuffers; iBuf++) + { + if (iBuf >= WAVEOUT_MAXBUFFERS) break; + if (!m_WaveBuffers[iBuf]) + { + m_WaveBuffers[iBuf] = (LPWAVEHDR)GlobalAllocPtr(GMEM_FIXED, sizeof(WAVEHDR)+m_nWaveBufferSize); + if (!m_WaveBuffers[iBuf]) break; + } + RtlZeroMemory(m_WaveBuffers[iBuf], sizeof(WAVEHDR)); + m_WaveBuffers[iBuf]->dwFlags = WHDR_DONE; + m_WaveBuffers[iBuf]->lpData = ((char *)(m_WaveBuffers[iBuf])) + sizeof(WAVEHDR); + m_WaveBuffers[iBuf]->dwBufferLength = m_nWaveBufferSize; + if (waveOutPrepareHeader(m_hWaveOut, m_WaveBuffers[iBuf], sizeof(WAVEHDR)) != 0) + { + break; + } + m_nPreparedHeaders++; + } + if (!m_nPreparedHeaders) + { + Close(); + return FALSE; + } + m_RealLatencyMS = m_nWaveBufferSize * m_nPreparedHeaders * 1000.0f / m_nBytesPerSec; + m_RealUpdateIntervalMS = m_nWaveBufferSize * 1000.0f / m_nBytesPerSec; + m_nBuffersPending = 0; + m_nWriteBuffer = 0; + return TRUE; +} + +BOOL CWaveDevice::Close() +//----------------------- +{ + if (m_hWaveOut) + { + while (m_nPreparedHeaders > 0) + { + m_nPreparedHeaders--; + waveOutUnprepareHeader(m_hWaveOut, m_WaveBuffers[m_nPreparedHeaders], sizeof(WAVEHDR)); + GlobalFreePtr(m_WaveBuffers[m_nPreparedHeaders]); + m_WaveBuffers[m_nPreparedHeaders] = NULL; + } + waveOutClose(m_hWaveOut); + m_hWaveOut = NULL; + Sleep(1); // Linux WINE-friendly + } + return TRUE; +} + + +void CWaveDevice::StartFromSoundThread() +//----------------------- +{ + if(m_hWaveOut) + { + waveOutRestart(m_hWaveOut); + } +} + + +void CWaveDevice::StopFromSoundThread() +//---------------------- +{ + if(m_hWaveOut) + { + waveOutPause(m_hWaveOut); + } +} + + +void CWaveDevice::ResetFromOutsideSoundThread() +//----------------------- +{ + if(m_hWaveOut) + { + waveOutReset(m_hWaveOut); + } + InterlockedExchange(&m_nBuffersPending, 0); + m_nWriteBuffer = 0; +} + + +void CWaveDevice::FillAudioBuffer() +//--------------------------------- +{ + ISoundSource *pSource = m_Source; + ULONG nBytesWritten; + ULONG nLatency; + LONG oldBuffersPending; + if (!m_hWaveOut) return; + nBytesWritten = 0; + oldBuffersPending = InterlockedExchangeAdd(&m_nBuffersPending, 0); // read + nLatency = oldBuffersPending * m_nWaveBufferSize; + + bool eos = false; + bool wasempty = false; + if(oldBuffersPending == 0) wasempty = true; + // When there were no pending buffers at all, pause the output, fill the buffers completely and then restart the output. + // This avoids buffer underruns which result in audible crackling on stream start with small buffers. + if(wasempty) waveOutPause(m_hWaveOut); + + while((ULONG)oldBuffersPending < m_nPreparedHeaders) + { + ULONG len = m_BytesPerSample * pSource->AudioRead(m_WaveBuffers[m_nWriteBuffer]->lpData, m_nWaveBufferSize/m_BytesPerSample); + if(len < m_nWaveBufferSize) + { + eos = true; + } + nLatency += m_nWaveBufferSize; + nBytesWritten += m_nWaveBufferSize; + m_WaveBuffers[m_nWriteBuffer]->dwBufferLength = m_nWaveBufferSize; + InterlockedIncrement(&m_nBuffersPending); + oldBuffersPending++; // increment separately to avoid looping without leaving at all when rendering takes more than 100% CPU + waveOutWrite(m_hWaveOut, m_WaveBuffers[m_nWriteBuffer], sizeof(WAVEHDR)); + m_nWriteBuffer++; + m_nWriteBuffer %= m_nPreparedHeaders; + pSource->AudioDone(m_nWaveBufferSize/m_BytesPerSample, nLatency/m_BytesPerSample, eos); + } + + if(wasempty) waveOutRestart(m_hWaveOut); + +} + + +int64 CWaveDevice::GetStreamPositionSamples() const +//------------------------------------------------------ +{ + if(!IsOpen()) return 0; + MMTIME mmtime; + MemsetZero(mmtime); + mmtime.wType = TIME_SAMPLES; + if(waveOutGetPosition(m_hWaveOut, &mmtime, sizeof(mmtime)) != MMSYSERR_NOERROR) return 0; + switch(mmtime.wType) + { + case TIME_BYTES: return mmtime.u.cb / m_BytesPerSample; break; + case TIME_MS: return mmtime.u.ms * m_nBytesPerSec / (1000 * m_BytesPerSample); break; + case TIME_SAMPLES: return mmtime.u.sample; break; + default: return 0; break; + } +} + + +VOID CWaveDevice::WaveOutCallBack(HWAVEOUT, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR, DWORD_PTR) +//-------------------------------------------------------------------------------- +{ + if ((uMsg == MM_WOM_DONE) && (dwUser)) + { + CWaveDevice *that = (CWaveDevice *)dwUser; + InterlockedDecrement(&that->m_nBuffersPending); + } +} + + +BOOL CWaveDevice::EnumerateDevices(UINT nIndex, LPSTR pszDescription, UINT cbSize) +//-------------------------------------------------------------------------------- +{ + WAVEOUTCAPS woc; + + if (!gnNumWaveDevs) + { + gnNumWaveDevs = waveOutGetNumDevs(); + } + if (nIndex > gnNumWaveDevs) return FALSE; + if (nIndex) + { + MemsetZero(woc); + waveOutGetDevCaps(nIndex-1, &woc, sizeof(woc)); + if (pszDescription) lstrcpyn(pszDescription, woc.szPname, cbSize); + } else + { + if (pszDescription) lstrcpyn(pszDescription, "Auto (Wave Mapper)", cbSize); + } + return TRUE; +} + + +//////////////////////////////////////////////////////////////////////////////////// +// +// DirectSound device +// + +#ifndef NO_DSOUND + +#ifndef DSBCAPS_GLOBALFOCUS +#define DSBCAPS_GLOBALFOCUS 0x8000 +#endif + +#define MAX_DSOUND_DEVICES 16 + +typedef BOOL (WINAPI * LPDSOUNDENUMERATE)(LPDSENUMCALLBACK lpDSEnumCallback, LPVOID lpContext); +typedef HRESULT (WINAPI * LPDSOUNDCREATE)(GUID * lpGuid, LPDIRECTSOUND * ppDS, IUnknown * pUnkOuter); + +static HINSTANCE ghDSoundDLL = NULL; +static LPDSOUNDENUMERATE gpDSoundEnumerate = NULL; +static LPDSOUNDCREATE gpDSoundCreate = NULL; +static BOOL gbDSoundEnumerated = FALSE; +static UINT gnDSoundDevices = 0; +static GUID *glpDSoundGUID[MAX_DSOUND_DEVICES]; +static CHAR gszDSoundDrvNames[MAX_DSOUND_DEVICES][64]; + + +static BOOL WINAPI DSEnumCallback(GUID * lpGuid, LPCSTR lpstrDescription, LPCSTR, LPVOID) +//--------------------------------------------------------------------------------------- +{ + if (gnDSoundDevices >= MAX_DSOUND_DEVICES) return FALSE; + if ((lpstrDescription)) + { + if (lpGuid) + { + //if ((gnDSoundDevices) && (!glpDSoundGUID[gnDSoundDevices-1])) gnDSoundDevices--; + glpDSoundGUID[gnDSoundDevices] = new GUID; + *glpDSoundGUID[gnDSoundDevices] = *lpGuid; + } else glpDSoundGUID[gnDSoundDevices] = NULL; + lstrcpyn(gszDSoundDrvNames[gnDSoundDevices], lpstrDescription, 64); + gnDSoundDevices++; + gbDSoundEnumerated = TRUE; + } + return TRUE; +} + + +BOOL CDSoundDevice::EnumerateDevices(UINT nIndex, LPSTR pszDescription, UINT cbSize) +//---------------------------------------------------------------------------------- +{ + if (!gpDSoundEnumerate) return FALSE; + if (!gbDSoundEnumerated) + { + gpDSoundEnumerate((LPDSENUMCALLBACK)DSEnumCallback, NULL); + } + if (nIndex >= gnDSoundDevices) return FALSE; + lstrcpyn(pszDescription, gszDSoundDrvNames[nIndex], cbSize); + return TRUE; +} + + +CDSoundDevice::CDSoundDevice() +//---------------------------- +{ + m_piDS = NULL; + m_pPrimary = NULL; + m_pMixBuffer = NULL; + m_bMixRunning = FALSE; + m_nBytesPerSec = 0; + m_BytesPerSample = 0; +} + + +CDSoundDevice::~CDSoundDevice() +//----------------------------- +{ + if (m_piDS) + { + Close(); + } +} + + +BOOL CDSoundDevice::Open(UINT nDevice, LPWAVEFORMATEX pwfx) +//--------------------------------------------------------- +{ + DSBUFFERDESC dsbd; + DSBCAPS dsc; + UINT nPriorityLevel = (m_fulCfgOptions & SNDDEV_OPTIONS_EXCLUSIVE) ? DSSCL_WRITEPRIMARY : DSSCL_PRIORITY; + + if (m_piDS) return TRUE; + if (!gpDSoundEnumerate) return FALSE; + if (!gbDSoundEnumerated) gpDSoundEnumerate((LPDSENUMCALLBACK)DSEnumCallback, NULL); + if ((nDevice >= gnDSoundDevices) || (!gpDSoundCreate)) return FALSE; + if (gpDSoundCreate(glpDSoundGUID[nDevice], &m_piDS, NULL) != DS_OK) return FALSE; + if (!m_piDS) return FALSE; + m_piDS->SetCooperativeLevel(m_hWnd, nPriorityLevel); + m_bMixRunning = FALSE; + m_nDSoundBufferSize = (m_LatencyMS * pwfx->nAvgBytesPerSec) / 1000; + m_nDSoundBufferSize = (m_nDSoundBufferSize + 15) & ~15; + if(m_nDSoundBufferSize < DSOUND_MINBUFFERSIZE) m_nDSoundBufferSize = DSOUND_MINBUFFERSIZE; + if(m_nDSoundBufferSize > DSOUND_MAXBUFFERSIZE) m_nDSoundBufferSize = DSOUND_MAXBUFFERSIZE; + m_nBytesPerSec = pwfx->nAvgBytesPerSec; + m_BytesPerSample = (pwfx->wBitsPerSample/8) * pwfx->nChannels; + if(!(m_fulCfgOptions & SNDDEV_OPTIONS_EXCLUSIVE)) + { + // Set the format of the primary buffer + dsbd.dwSize = sizeof(dsbd); + dsbd.dwFlags = DSBCAPS_PRIMARYBUFFER; + dsbd.dwBufferBytes = 0; + dsbd.dwReserved = 0; + dsbd.lpwfxFormat = NULL; + if (m_piDS->CreateSoundBuffer(&dsbd, &m_pPrimary, NULL) != DS_OK) + { + Close(); + return FALSE; + } + m_pPrimary->SetFormat(pwfx); + /////////////////////////////////////////////////// + // Create the secondary buffer + dsbd.dwSize = sizeof(dsbd); + dsbd.dwFlags = DSBCAPS_GLOBALFOCUS | DSBCAPS_GETCURRENTPOSITION2; + dsbd.dwBufferBytes = m_nDSoundBufferSize; + dsbd.dwReserved = 0; + dsbd.lpwfxFormat = pwfx; + if (m_piDS->CreateSoundBuffer(&dsbd, &m_pMixBuffer, NULL) != DS_OK) + { + Close(); + return FALSE; + } + } else + { + dsbd.dwSize = sizeof(dsbd); + dsbd.dwFlags = DSBCAPS_PRIMARYBUFFER | DSBCAPS_STICKYFOCUS | DSBCAPS_GETCURRENTPOSITION2; + dsbd.dwBufferBytes = 0; + dsbd.dwReserved = 0; + dsbd.lpwfxFormat = NULL; + if (m_piDS->CreateSoundBuffer(&dsbd, &m_pPrimary, NULL) != DS_OK) + { + Close(); + return FALSE; + } + if (m_pPrimary->SetFormat(pwfx) != DS_OK) + { + Close(); + return FALSE; + } + dsc.dwSize = sizeof(dsc); + if (m_pPrimary->GetCaps(&dsc) != DS_OK) + { + Close(); + return FALSE; + } + m_nDSoundBufferSize = dsc.dwBufferBytes; + m_pMixBuffer = m_pPrimary; + m_pMixBuffer->AddRef(); + } + LPVOID lpBuf1, lpBuf2; + DWORD dwSize1, dwSize2; + if (m_pMixBuffer->Lock(0, m_nDSoundBufferSize, &lpBuf1, &dwSize1, &lpBuf2, &dwSize2, 0) == DS_OK) + { + UINT zero = (pwfx->wBitsPerSample == 8) ? 0x80 : 0x00; + if ((lpBuf1) && (dwSize1)) memset(lpBuf1, zero, dwSize1); + if ((lpBuf2) && (dwSize2)) memset(lpBuf2, zero, dwSize2); + m_pMixBuffer->Unlock(lpBuf1, dwSize1, lpBuf2, dwSize2); + } else + { + DWORD dwStat = 0; + m_pMixBuffer->GetStatus(&dwStat); + if (dwStat & DSBSTATUS_BUFFERLOST) m_pMixBuffer->Restore(); + } + m_RealLatencyMS = m_nDSoundBufferSize * 1000.0f / m_nBytesPerSec; + m_RealUpdateIntervalMS = CLAMP(static_cast<float>(m_UpdateIntervalMS), 1.0f, m_nDSoundBufferSize * 1000.0f / ( 2.0f * m_nBytesPerSec ) ); + m_dwWritePos = 0xFFFFFFFF; + return TRUE; +} + + +BOOL CDSoundDevice::Close() +//------------------------- +{ + if (m_pMixBuffer) + { + m_pMixBuffer->Release(); + m_pMixBuffer = NULL; + } + if (m_pPrimary) + { + m_pPrimary->Release(); + m_pPrimary = NULL; + } + if (m_piDS) + { + m_piDS->Release(); + m_piDS = NULL; + } + m_bMixRunning = FALSE; + return TRUE; +} + + +void CDSoundDevice::StartFromSoundThread() +//------------------------- +{ + if(!m_pMixBuffer) return; + // done in FillAudioBuffer for now +} + + +void CDSoundDevice::StopFromSoundThread() +//------------------------ +{ + if(!m_pMixBuffer) return; + if(m_bMixRunning) + { + m_bMixRunning = FALSE; + m_pMixBuffer->Stop(); + } +} + + +void CDSoundDevice::ResetFromOutsideSoundThread() +//------------------------- +{ + if (m_pMixBuffer) m_pMixBuffer->Stop(); + m_bMixRunning = FALSE; +} + + +DWORD CDSoundDevice::LockBuffer(DWORD dwBytes, LPVOID *lpBuf1, LPDWORD lpSize1, LPVOID *lpBuf2, LPDWORD lpSize2) +//-------------------------------------------------------------------------------------------------------------- +{ + DWORD d, dwPlay = 0, dwWrite = 0; + + if ((!m_pMixBuffer) || (!m_nDSoundBufferSize)) return 0; + if (m_pMixBuffer->GetCurrentPosition(&dwPlay, &dwWrite) != DS_OK) return 0; + if ((m_dwWritePos >= m_nDSoundBufferSize) || (!m_bMixRunning)) + { + m_dwWritePos = dwWrite; + m_dwLatency = 0; + d = m_nDSoundBufferSize/2; + } else + { + dwWrite = m_dwWritePos; + m_dwLatency = (m_nDSoundBufferSize + dwWrite - dwPlay) % m_nDSoundBufferSize; + if (dwPlay >= dwWrite) + d = dwPlay - dwWrite; + else + d = m_nDSoundBufferSize + dwPlay - dwWrite; + } + if (d > m_nDSoundBufferSize) return FALSE; + if (d > m_nDSoundBufferSize/2) d = m_nDSoundBufferSize/2; + if (dwBytes) + { + if (m_dwLatency > dwBytes) return 0; + if (m_dwLatency+d > dwBytes) d = dwBytes - m_dwLatency; + } + d &= ~0x0f; + if (d <= 16) return 0; + HRESULT hr = m_pMixBuffer->Lock(m_dwWritePos, d, lpBuf1, lpSize1, lpBuf2, lpSize2, 0); + if(hr == DSERR_BUFFERLOST) + { + // buffer lost, restore buffer and try again, fail if it fails again + if(m_pMixBuffer->Restore() != DS_OK) return 0; + if(m_pMixBuffer->Lock(m_dwWritePos, d, lpBuf1, lpSize1, lpBuf2, lpSize2, 0) != DS_OK) return 0; + return d; + } else if(hr != DS_OK) + { + return 0; + } + return d; +} + + +BOOL CDSoundDevice::UnlockBuffer(LPVOID lpBuf1, DWORD dwSize1, LPVOID lpBuf2, DWORD dwSize2) +//------------------------------------------------------------------------------------------ +{ + if (!m_pMixBuffer) return FALSE; + if (m_pMixBuffer->Unlock(lpBuf1, dwSize1, lpBuf2, dwSize2) == DS_OK) + { + m_dwWritePos += dwSize1 + dwSize2; + if (m_dwWritePos >= m_nDSoundBufferSize) m_dwWritePos -= m_nDSoundBufferSize; + return TRUE; + } + return FALSE; +} + + +void CDSoundDevice::FillAudioBuffer() +//----------------------------------- +{ + ISoundSource *pSource = m_Source; + LPVOID lpBuf1=NULL, lpBuf2=NULL; + DWORD dwSize1=0, dwSize2=0; + DWORD dwBytes; + + bool eos = false; + if (!m_pMixBuffer) return; + dwBytes = LockBuffer(m_nDSoundBufferSize, &lpBuf1, &dwSize1, &lpBuf2, &dwSize2); + if (dwBytes) + { + DWORD nRead1=0, nRead2=0; + + if ((lpBuf1) && (dwSize1)) nRead1 = m_BytesPerSample * pSource->AudioRead(lpBuf1, dwSize1/m_BytesPerSample); + if ((lpBuf2) && (dwSize2)) nRead2 = m_BytesPerSample * pSource->AudioRead(lpBuf2, dwSize2/m_BytesPerSample); + UnlockBuffer(lpBuf1, dwSize1, lpBuf2, dwSize2); + if(nRead1+nRead2 < dwSize1+dwSize2) + { + eos = true; + } + DWORD dwStatus = 0; + m_pMixBuffer->GetStatus(&dwStatus); + if(!m_bMixRunning || !(dwStatus & DSBSTATUS_PLAYING)) + { + HRESULT hr; + if(!(dwStatus & DSBSTATUS_BUFFERLOST)) + { + // start playing + hr = m_pMixBuffer->Play(0, 0, DSBPLAY_LOOPING); + } else + { + // buffer lost flag is set, do not try start playing, we know it will fail with DSERR_BUFFERLOST. + hr = DSERR_BUFFERLOST; + } + if(hr == DSERR_BUFFERLOST) + { + // buffer lost, restore buffer and try again, fail if it fails again + if(m_pMixBuffer->Restore() != DS_OK) return; + if(m_pMixBuffer->Play(0, 0, DSBPLAY_LOOPING) != DS_OK) return; + } else if(hr != DS_OK) + { + return; + } + m_bMixRunning = TRUE; + } + pSource->AudioDone((dwSize1+dwSize2)/m_BytesPerSample, m_dwLatency/m_BytesPerSample, eos); + } +} + +#endif // NO_DIRECTSOUND + + +/////////////////////////////////////////////////////////////////////////////////////// +// +// ASIO Device implementation +// + +#ifndef NO_ASIO + +#define ASIO_MAX_DRIVERS 8 +#define ASIO_MAXDRVNAMELEN 128 + +typedef struct _ASIODRIVERDESC +{ + CLSID clsid; + CHAR name[80]; +} ASIODRIVERDESC; + +CASIODevice *CASIODevice::gpCurrentAsio = NULL; +LONG CASIODevice::gnFillBuffers = 0; +int CASIODevice::baseChannel = 0; +static UINT gnNumAsioDrivers = 0; +static BOOL gbAsioEnumerated = FALSE; +static ASIODRIVERDESC gAsioDrivers[ASIO_MAX_DRIVERS]; + +static DWORD g_dwBuffer = 0; + +static int g_asio_startcount = 0; + + +BOOL CASIODevice::EnumerateDevices(UINT nIndex, LPSTR pszDescription, UINT cbSize) +//-------------------------------------------------------------------------------- +{ + if (!gbAsioEnumerated) + { + HKEY hkEnum = NULL; + CHAR keyname[ASIO_MAXDRVNAMELEN]; + CHAR s[256]; + WCHAR w[100]; + LONG cr; + DWORD index; + + cr = RegOpenKey(HKEY_LOCAL_MACHINE, "software\\asio", &hkEnum); + index = 0; + while ((cr == ERROR_SUCCESS) && (gnNumAsioDrivers < ASIO_MAX_DRIVERS)) + { + if ((cr = RegEnumKey(hkEnum, index, (LPTSTR)keyname, ASIO_MAXDRVNAMELEN)) == ERROR_SUCCESS) + { + #ifdef ASIO_LOG + Log("ASIO: Found \"%s\":\n", keyname); + #endif + HKEY hksub; + + if ((RegOpenKeyEx(hkEnum, (LPCTSTR)keyname, 0, KEY_READ, &hksub)) == ERROR_SUCCESS) + { + DWORD datatype = REG_SZ; + DWORD datasize = 64; + + if (ERROR_SUCCESS == RegQueryValueEx(hksub, "description", 0, &datatype, (LPBYTE)gAsioDrivers[gnNumAsioDrivers].name, &datasize)) + { + #ifdef ASIO_LOG + Log(" description =\"%s\":\n", gAsioDrivers[gnNumAsioDrivers].name); + #endif + } else + { + lstrcpyn(gAsioDrivers[gnNumAsioDrivers].name, keyname, 64); + } + datatype = REG_SZ; + datasize = sizeof(s); + if (ERROR_SUCCESS == RegQueryValueEx(hksub, "clsid", 0, &datatype, (LPBYTE)s, &datasize)) + { + MultiByteToWideChar(CP_ACP, 0, (LPCSTR)s,-1,(LPWSTR)w,100); + if (CLSIDFromString((LPOLESTR)w, (LPCLSID)&gAsioDrivers[gnNumAsioDrivers].clsid) == S_OK) + { + #ifdef ASIO_LOG + Log(" clsid=\"%s\"\n", s); + #endif + gnNumAsioDrivers++; + } + } + RegCloseKey(hksub); + } + } + index++; + } + if (hkEnum) RegCloseKey(hkEnum); + gbAsioEnumerated = TRUE; + } + if (nIndex < gnNumAsioDrivers) + { + if (pszDescription) lstrcpyn(pszDescription, gAsioDrivers[nIndex].name, cbSize); + return TRUE; + } + return FALSE; +} + + +CASIODevice::CASIODevice() +//------------------------ +{ + m_pAsioDrv = NULL; + m_Callbacks.bufferSwitch = BufferSwitch; + m_Callbacks.sampleRateDidChange = SampleRateDidChange; + m_Callbacks.asioMessage = AsioMessage; + m_Callbacks.bufferSwitchTimeInfo = BufferSwitchTimeInfo; + m_nBitsPerSample = 0; // Unknown + m_nCurrentDevice = (ULONG)-1; + m_nSamplesPerSec = 0; + m_bMixRunning = FALSE; + InterlockedExchange(&m_RenderSilence, 0); +} + + +CASIODevice::~CASIODevice() +//------------------------- +{ + if (gpCurrentAsio == this) + { + gpCurrentAsio = NULL; + } + CloseDevice(); +} + + +BOOL CASIODevice::Open(UINT nDevice, LPWAVEFORMATEX pwfx) +//------------------------------------------------------- +{ + BOOL bOk = FALSE; + + if (IsOpen()) Close(); + if (!gbAsioEnumerated) EnumerateDevices(nDevice, NULL, 0); + if (nDevice >= gnNumAsioDrivers) return FALSE; + if (nDevice != m_nCurrentDevice) + { + m_nCurrentDevice = nDevice; + m_nBitsPerSample = 0; + } +#ifdef ASIO_LOG + Log("CASIODevice::Open(%d:\"%s\"): %d-bit, %d channels, %dHz\n", + nDevice, gAsioDrivers[nDevice].name, pwfx->wBitsPerSample, pwfx->nChannels, pwfx->nSamplesPerSec); +#endif + OpenDevice(nDevice); + + if (IsOpen()) + { + long nInputChannels = 0, nOutputChannels = 0; + long minSize = 0, maxSize = 0, preferredSize = 0, granularity = 0; + + if ((pwfx->nChannels > ASIO_MAX_CHANNELS) + || ((pwfx->wBitsPerSample != 16) && (pwfx->wBitsPerSample != 32))) goto abort; + m_nChannels = pwfx->nChannels; + m_pAsioDrv->getChannels(&nInputChannels, &nOutputChannels); + #ifdef ASIO_LOG + Log(" getChannels: %d inputs, %d outputs\n", nInputChannels, nOutputChannels); + #endif + if (pwfx->nChannels > nOutputChannels) goto abort; + if (m_pAsioDrv->setSampleRate(pwfx->nSamplesPerSec) != ASE_OK) + { + #ifdef ASIO_LOG + Log(" setSampleRate(%d) failed (sample rate not supported)!\n", pwfx->nSamplesPerSec); + #endif + goto abort; + } + m_nBitsPerSample = pwfx->wBitsPerSample; + for (UINT ich=0; ich<pwfx->nChannels; ich++) + { + m_ChannelInfo[ich].channel = ich; + m_ChannelInfo[ich].isInput = ASIOFalse; + m_pAsioDrv->getChannelInfo(&m_ChannelInfo[ich]); + #ifdef ASIO_LOG + Log(" getChannelInfo(%d): isActive=%d channelGroup=%d type=%d name=\"%s\"\n", + ich, m_ChannelInfo[ich].isActive, m_ChannelInfo[ich].channelGroup, m_ChannelInfo[ich].type, m_ChannelInfo[ich].name); + #endif + m_BufferInfo[ich].isInput = ASIOFalse; + m_BufferInfo[ich].channelNum = ich + CASIODevice::baseChannel; // map MPT channel i to ASIO channel i + m_BufferInfo[ich].buffers[0] = NULL; + m_BufferInfo[ich].buffers[1] = NULL; + if ((m_ChannelInfo[ich].type & 0x0f) == ASIOSTInt16MSB) + { + if (m_nBitsPerSample < 16) + { + m_nBitsPerSample = 16; + goto abort; + } + } else + { + if (m_nBitsPerSample != 32) + { + m_nBitsPerSample = 32; + goto abort; + } + } + switch(m_ChannelInfo[ich].type & 0x0f) + { + case ASIOSTInt16MSB: m_nAsioSampleSize = 2; break; + case ASIOSTInt24MSB: m_nAsioSampleSize = 3; break; + case ASIOSTFloat64MSB: m_nAsioSampleSize = 8; break; + default: m_nAsioSampleSize = 4; + } + } + m_pAsioDrv->getBufferSize(&minSize, &maxSize, &preferredSize, &granularity); + #ifdef ASIO_LOG + Log(" getBufferSize(): minSize=%d maxSize=%d preferredSize=%d granularity=%d\n", + minSize, maxSize, preferredSize, granularity); + #endif + m_nAsioBufferLen = ((m_LatencyMS * pwfx->nSamplesPerSec) / 2000); + if (m_nAsioBufferLen < (UINT)minSize) m_nAsioBufferLen = minSize; else + if (m_nAsioBufferLen > (UINT)maxSize) m_nAsioBufferLen = maxSize; else + if (granularity < 0) + { + //rewbs.ASIOfix: + /*UINT n = (minSize < 32) ? 32 : minSize; + if (n % granularity) n = (n + granularity - 1) - (n % granularity); + while ((n+(n>>1) < m_nAsioBufferLen) && (n*2 <= (UINT)maxSize)) + { + n *= 2; + } + m_nAsioBufferLen = n;*/ + //end rewbs.ASIOfix + m_nAsioBufferLen = preferredSize; + + } else + if (granularity > 0) + { + int n = (minSize < 32) ? 32 : minSize; + n = (n + granularity-1); + n -= (n % granularity); + while ((n+(granularity>>1) < (int)m_nAsioBufferLen) && (n+granularity <= maxSize)) + { + n += granularity; + } + m_nAsioBufferLen = n; + } + m_nSamplesPerSec = pwfx->nSamplesPerSec; + m_RealLatencyMS = m_nAsioBufferLen * 2 * 1000.0f / m_nSamplesPerSec; + m_RealUpdateIntervalMS = m_nAsioBufferLen * 1000.0f / m_nSamplesPerSec; + #ifdef ASIO_LOG + Log(" Using buffersize=%d samples\n", m_nAsioBufferLen); + #endif + if (m_pAsioDrv->createBuffers(m_BufferInfo, m_nChannels, m_nAsioBufferLen, &m_Callbacks) == ASE_OK) + { + for (UINT iInit=0; iInit<m_nChannels; iInit++) + { + if (m_BufferInfo[iInit].buffers[0]) + { + memset(m_BufferInfo[iInit].buffers[0], 0, m_nAsioBufferLen * m_nAsioSampleSize); + } + if (m_BufferInfo[iInit].buffers[1]) + { + memset(m_BufferInfo[iInit].buffers[1], 0, m_nAsioBufferLen * m_nAsioSampleSize); + } + } + m_bPostOutput = (m_pAsioDrv->outputReady() == ASE_OK) ? TRUE : FALSE; + bOk = TRUE; + } + #ifdef ASIO_LOG + else Log(" createBuffers failed!\n"); + #endif + } +abort: + if (bOk) + { + gpCurrentAsio = this; + gnFillBuffers = 2; + } else + { + #ifdef ASIO_LOG + Log("Error opening ASIO device!\n"); + #endif + CloseDevice(); + } + return bOk; +} + + +void CASIODevice::Start() +//----------------------- +{ + if (IsOpen()) + { + ALWAYS_ASSERT(g_asio_startcount==0); + g_asio_startcount++; + + InterlockedExchange(&m_RenderSilence, 0); + if(!m_bMixRunning) + { + m_bMixRunning = TRUE; + try + { + m_pAsioDrv->start(); + } catch(...) + { + CASIODevice::ReportASIOException("ASIO crash in start()\n"); + } + } + } +} + + +void CASIODevice::Stop() +//----------------------- +{ + if (IsOpen()) + { + InterlockedExchange(&m_RenderSilence, 1); + g_asio_startcount--; + ALWAYS_ASSERT(g_asio_startcount==0); + } +} + + +BOOL CASIODevice::Close() +//----------------------- +{ + if (IsOpen()) + { + if (m_bMixRunning) + { + m_bMixRunning = FALSE; + try + { + m_pAsioDrv->stop(); + } catch(...) + { + CASIODevice::ReportASIOException("ASIO crash in stop()\n"); + } + } + try + { + m_pAsioDrv->disposeBuffers(); + } catch(...) + { + CASIODevice::ReportASIOException("ASIO crash in disposeBuffers()\n"); + } + CloseDevice(); + } + if (gpCurrentAsio == this) + { + gpCurrentAsio = NULL; + } + return TRUE; +} + + +void CASIODevice::Reset() +//----------------------- +{ + if (IsOpen()) + { + if(m_bMixRunning) + { + m_bMixRunning = FALSE; + try + { + m_pAsioDrv->stop(); + } catch(...) + { + CASIODevice::ReportASIOException("ASIO crash in stop()\n"); + } + g_asio_startcount = 0; + InterlockedExchange(&m_RenderSilence, 0); + } + } +} + + +void CASIODevice::OpenDevice(UINT nDevice) +//---------------------------------------- +{ + if (IsOpen()) + { + return; + } + + CLSID clsid = gAsioDrivers[nDevice].clsid; + if (CoCreateInstance(clsid,0,CLSCTX_INPROC_SERVER, clsid, (VOID **)&m_pAsioDrv) == S_OK) + { + m_pAsioDrv->init((void *)m_hWnd); + } else + { +#ifdef ASIO_LOG + Log(" CoCreateInstance failed!\n"); +#endif + m_pAsioDrv = NULL; + } +} + + +void CASIODevice::CloseDevice() +//----------------------------- +{ + if (IsOpen()) + { + try + { + m_pAsioDrv->Release(); + } catch(...) + { + CASIODevice::ReportASIOException("ASIO crash in Release()\n"); + } + m_pAsioDrv = NULL; + } +} + +void CASIODevice::FillAudioBuffer() +//--------------------------------- +{ + ISoundSource *pSource = m_Source; + bool rendersilence = (InterlockedExchangeAdd(&m_RenderSilence, 0) == 1); + + DWORD dwSampleSize = m_nChannels*(m_nBitsPerSample>>3); + DWORD dwSamplesLeft = m_nAsioBufferLen; + DWORD dwFrameLen = (ASIO_BLOCK_LEN*sizeof(int)) / dwSampleSize; + DWORD dwBufferOffset = 0; + + bool eos = false; + g_dwBuffer &= 1; + //Log("FillAudioBuffer(%d): dwSampleSize=%d dwSamplesLeft=%d dwFrameLen=%d\n", g_dwBuffer, dwSampleSize, dwSamplesLeft, dwFrameLen); + while ((LONG)dwSamplesLeft > 0) + { + UINT n = (dwSamplesLeft < dwFrameLen) ? dwSamplesLeft : dwFrameLen; + if(rendersilence) + { + memset(m_FrameBuffer, 0, n*dwSampleSize); + } else + { + UINT readn = pSource->AudioRead(m_FrameBuffer, n); + if(readn < n) + { + eos = true; + } + } + dwSamplesLeft -= n; + for (UINT ich=0; ich<m_nChannels; ich++) + { + char *psrc = (char *)m_FrameBuffer; + char *pbuffer = (char *)m_BufferInfo[ich].buffers[g_dwBuffer]; + switch(m_ChannelInfo[ich].type) + { + case ASIOSTInt16MSB: + if (m_nBitsPerSample == 32) + Cvt32To16msb(pbuffer+dwBufferOffset*2, psrc+ich*4, m_nChannels*4, n); + else + Cvt16To16msb(pbuffer+dwBufferOffset*2, psrc+ich*2, m_nChannels*2, n); + break; + case ASIOSTInt16LSB: + if (m_nBitsPerSample == 32) + Cvt32To16(pbuffer+dwBufferOffset*2, psrc+ich*4, m_nChannels*4, n); + else + Cvt16To16(pbuffer+dwBufferOffset*2, psrc+ich*2, m_nChannels*2, n); + break; + case ASIOSTInt24MSB: + Cvt32To24msb(pbuffer+dwBufferOffset*3, psrc+ich*4, m_nChannels*4, n); + break; + case ASIOSTInt24LSB: + Cvt32To24(pbuffer+dwBufferOffset*3, psrc+ich*4, m_nChannels*4, n); + break; + case ASIOSTInt32MSB: + Cvt32To32msb(pbuffer+dwBufferOffset*4, psrc+ich*4, m_nChannels*4, n, 0); + break; + case ASIOSTInt32LSB: + Cvt32To32(pbuffer+dwBufferOffset*4, psrc+ich*4, m_nChannels*4, n, 0); + break; + case ASIOSTFloat32MSB: + Cvt32To32f(pbuffer+dwBufferOffset*4, psrc+ich*4, m_nChannels*4, n); + EndianSwap32(pbuffer+dwBufferOffset*4, n); + break; + case ASIOSTFloat32LSB: + Cvt32To32f(pbuffer+dwBufferOffset*4, psrc+ich*4, m_nChannels*4, n); + break; + case ASIOSTFloat64MSB: + Cvt32To64f(pbuffer+dwBufferOffset*8, psrc+ich*4, m_nChannels*4, n); + EndianSwap64(pbuffer+dwBufferOffset*4, n); + break; + case ASIOSTFloat64LSB: + Cvt32To64f(pbuffer+dwBufferOffset*8, psrc+ich*4, m_nChannels*4, n); + break; + case ASIOSTInt32MSB16: + Cvt32To32msb(pbuffer+dwBufferOffset*4, psrc+ich*4, m_nChannels*4, n, 16); + break; + case ASIOSTInt32LSB16: + Cvt32To32(pbuffer+dwBufferOffset*4, psrc+ich*4, m_nChannels*4, n, 16); + break; + case ASIOSTInt32MSB18: + Cvt32To32msb(pbuffer+dwBufferOffset*4, psrc+ich*4, m_nChannels*4, n, 14); + break; + case ASIOSTInt32LSB18: + Cvt32To32(pbuffer+dwBufferOffset*4, psrc+ich*4, m_nChannels*4, n, 14); + break; + case ASIOSTInt32MSB20: + Cvt32To32msb(pbuffer+dwBufferOffset*4, psrc+ich*4, m_nChannels*4, n, 12); + break; + case ASIOSTInt32LSB20: + Cvt32To32(pbuffer+dwBufferOffset*4, psrc+ich*4, m_nChannels*4, n, 12); + break; + case ASIOSTInt32MSB24: + Cvt32To32msb(pbuffer+dwBufferOffset*4, psrc+ich*4, m_nChannels*4, n, 8); + break; + case ASIOSTInt32LSB24: + Cvt32To32(pbuffer+dwBufferOffset*4, psrc+ich*4, m_nChannels*4, n, 8); + break; + } + } + dwBufferOffset += n; + } + if (m_bPostOutput) m_pAsioDrv->outputReady(); + if(!rendersilence) + { + pSource->AudioDone(dwBufferOffset, m_nAsioBufferLen, eos); + } + return; +} + + +void CASIODevice::BufferSwitch(long doubleBufferIndex, ASIOBool directProcess) +//---------------------------------------------------------------------------- +{ + UNREFERENCED_PARAMETER(directProcess); + g_dwBuffer = doubleBufferIndex; + if (gpCurrentAsio && gpCurrentAsio->m_Source) gpCurrentAsio->m_Source->FillAudioBufferLocked(*gpCurrentAsio); +} + + +void CASIODevice::SampleRateDidChange(ASIOSampleRate sRate) +//--------------------------------------------------------- +{ + UNREFERENCED_PARAMETER(sRate); +} + + +long CASIODevice::AsioMessage(long selector, long value, void* message, double* opt) +//---------------------------------------------------------------------------------- +{ + UNREFERENCED_PARAMETER(value); + UNREFERENCED_PARAMETER(message); + UNREFERENCED_PARAMETER(opt); +#ifdef ASIO_LOG + // Log("AsioMessage(%d, %d)\n", selector, value); +#endif + switch(selector) + { + case kAsioEngineVersion: return 2; + } + return 0; +} + + +ASIOTime* CASIODevice::BufferSwitchTimeInfo(ASIOTime* params, long doubleBufferIndex, ASIOBool directProcess) +//----------------------------------------------------------------------------------------------------------- +{ + BufferSwitch(doubleBufferIndex, directProcess); + return params; +} + + +void CASIODevice::EndianSwap64(void *pbuffer, UINT nSamples) +//---------------------------------------------------------- +{ + _asm { + mov edx, pbuffer + mov ecx, nSamples +swaploop: + mov eax, dword ptr [edx] + mov ebx, dword ptr [edx+4] + add edx, 8 + bswap eax + bswap ebx + dec ecx + mov dword ptr [edx-8], ebx + mov dword ptr [edx-4], eax + jnz swaploop + } +} + + +void CASIODevice::EndianSwap32(void *pbuffer, UINT nSamples) +//---------------------------------------------------------- +{ + _asm { + mov edx, pbuffer + mov ecx, nSamples +swaploop: + mov eax, dword ptr [edx] + add edx, 4 + bswap eax + dec ecx + mov dword ptr [edx-4], eax + jnz swaploop + } +} + + +void CASIODevice::Cvt16To16(void *pdst, void *psrc, UINT nSampleSize, UINT nSamples) +//---------------------------------------------------------------------------------- +{ + _asm { + mov ebx, psrc + mov edi, pdst + mov esi, nSampleSize + mov ecx, nSamples +cvtloop: + movsx eax, word ptr [ebx] + add ebx, esi + add edi, 2 + dec ecx + mov word ptr [edi-2], ax + jnz cvtloop + } +} + + +void CASIODevice::Cvt16To16msb(void *pdst, void *psrc, UINT nSampleSize, UINT nSamples) +//------------------------------------------------------------------------------------- +{ + _asm { + mov ebx, psrc + mov edi, pdst + mov esi, nSampleSize + mov ecx, nSamples +cvtloop: + movsx eax, word ptr [ebx] + add ebx, esi + add edi, 2 + dec ecx + mov byte ptr [edi-2], ah + mov byte ptr [edi-1], al + jnz cvtloop + } +} + + +void CASIODevice::Cvt32To24(void *pdst, void *psrc, UINT nSampleSize, UINT nSamples) +//---------------------------------------------------------------------------------- +{ + _asm { + mov ebx, psrc + mov edi, pdst + mov esi, nSampleSize + mov ecx, nSamples +cvtloop: + mov eax, dword ptr [ebx] + add ebx, esi + add edi, 3 + mov edx, eax + shr eax, 8 + shr edx, 24 + dec ecx + mov byte ptr [edi-3], al + mov byte ptr [edi-2], ah + mov byte ptr [edi-1], dl + jnz cvtloop + } +} + + +void CASIODevice::Cvt32To24msb(void *pdst, void *psrc, UINT nSampleSize, UINT nSamples) +//------------------------------------------------------------------------------------- +{ + _asm { + mov ebx, psrc + mov edi, pdst + mov esi, nSampleSize + mov ecx, nSamples +cvtloop: + mov eax, dword ptr [ebx] + add ebx, esi + add edi, 3 + mov edx, eax + shr eax, 8 + shr edx, 24 + dec ecx + mov byte ptr [edi-3], dl + mov byte ptr [edi-2], ah + mov byte ptr [edi-1], al + jnz cvtloop + } +} + + +void CASIODevice::Cvt32To32(void *pdst, void *psrc, UINT nSampleSize, UINT nSamples, UINT nShift) +//----------------------------------------------------------------------------------------------- +{ + _asm { + mov ebx, psrc + mov edi, pdst + mov esi, nSampleSize + mov edx, nSamples + mov ecx, nShift +cvtloop: + mov eax, dword ptr [ebx] + add ebx, esi + add edi, 4 + sar eax, cl + dec edx + mov dword ptr [edi-4], eax + jnz cvtloop + } +} + + +void CASIODevice::Cvt32To32msb(void *pdst, void *psrc, UINT nSampleSize, UINT nSamples, UINT nShift) +//-------------------------------------------------------------------------------------------------- +{ + _asm { + mov ebx, psrc + mov edi, pdst + mov esi, nSampleSize + mov edx, nSamples + mov ecx, nShift +cvtloop: + mov eax, dword ptr [ebx] + add ebx, esi + add edi, 4 + sar eax, cl + bswap eax + dec edx + mov dword ptr [edi-4], eax + jnz cvtloop + } +} + + +const float _pow2_31 = 1.0f / 2147483648.0f; + +void CASIODevice::Cvt32To32f(void *pdst, void *psrc, UINT nSampleSize, UINT nSamples) +//----------------------------------------------------------------------------------- +{ + _asm { + mov ebx, psrc + mov edi, pdst + mov esi, nSampleSize + mov edx, nSamples + fld _pow2_31 +cvtloop: + fild dword ptr [ebx] + add ebx, esi + add edi, 4 + fmul st(0), st(1) + dec edx + fstp dword ptr [edi-4] + jnz cvtloop + fstp st(1) + } +} + + +void CASIODevice::Cvt32To64f(void *pdst, void *psrc, UINT nSampleSize, UINT nSamples) +//----------------------------------------------------------------------------------- +{ + _asm { + mov ebx, psrc + mov edi, pdst + mov esi, nSampleSize + mov edx, nSamples + fld _pow2_31 +cvtloop: + fild dword ptr [ebx] + add ebx, esi + add edi, 8 + fmul st(0), st(1) + dec edx + fstp qword ptr [edi-8] + jnz cvtloop + fstp st(1) + } +} + + +void CASIODevice::Cvt32To16(void *pdst, void *psrc, UINT nSampleSize, UINT nSamples) +//---------------------------------------------------------------------------------- +{ + _asm { + mov ebx, psrc + mov edi, pdst + mov esi, nSampleSize + mov ecx, nSamples +cvtloop: + mov eax, dword ptr [ebx] + add ebx, esi + add edi, 2 + sar eax, 16 + dec ecx + mov word ptr [edi-2], ax + jnz cvtloop + } +} + + +void CASIODevice::Cvt32To16msb(void *pdst, void *psrc, UINT nSampleSize, UINT nSamples) +//------------------------------------------------------------------------------------- +{ + _asm { + mov ebx, psrc + mov edi, pdst + mov esi, nSampleSize + mov ecx, nSamples +cvtloop: + mov eax, dword ptr [ebx] + add ebx, esi + add edi, 2 + bswap eax + dec ecx + mov word ptr [edi-2], ax + jnz cvtloop + } +} + +BOOL CASIODevice::ReportASIOException(LPCSTR format,...) +//------------------------------------------------------ +{ + CHAR cBuf[1024]; + va_list va; + va_start(va, format); + wvsprintf(cBuf, format, va); + Reporting::Notification(cBuf); + Log(cBuf); + va_end(va); + + return TRUE; +} + + +bool CASIODevice::CanSampleRate(UINT nDevice, std::vector<UINT> &samplerates, std::vector<bool> &result) +//-------------------------------------------------------------------------------------------- +{ + const bool wasOpen = (m_pAsioDrv != NULL); + if(!wasOpen) + { + OpenDevice(nDevice); + if(m_pAsioDrv == NULL) + { + return false; + } + } + + bool foundSomething = false; // is at least one sample rate supported by the device? + result.clear(); + for(size_t i = 0; i < samplerates.size(); i++) + { + result.push_back((m_pAsioDrv->canSampleRate((ASIOSampleRate)samplerates[i]) == ASE_OK)); + if(result.back()) + { + foundSomething = true; + } + } + + if(!wasOpen) + { + CloseDevice(); + } + + return foundSomething; +} + + +// If the device is open, this returns the current sample rate. If it's not open, it returns some sample rate supported by the device. +UINT CASIODevice::GetCurrentSampleRate(UINT nDevice) +//-------------------------------------------------- +{ + const bool wasOpen = (m_pAsioDrv != NULL); + if(!wasOpen) + { + OpenDevice(nDevice); + if(m_pAsioDrv == NULL) + { + return 0; + } + } + + ASIOSampleRate samplerate; + if(m_pAsioDrv->getSampleRate(&samplerate) != ASE_OK) + { + samplerate = 0; + } + + if(!wasOpen) + { + CloseDevice(); + } + + return (UINT)samplerate; +} + +#endif // NO_ASIO + + +/////////////////////////////////////////////////////////////////////////////////////// +// +// Portaudio Device implementation +// + +#ifndef NO_PORTAUDIO + +CPortaudioDevice::CPortaudioDevice(PaHostApiIndex hostapi) +//-------------------------------------------------------- +{ + m_HostApi = hostapi; + MemsetZero(m_StreamParameters); + m_Stream = 0; + m_CurrentFrameCount = 0; + m_CurrentRealLatencyMS = 0.0f; +} + + +CPortaudioDevice::~CPortaudioDevice() +//----------------------------------- +{ + if(IsOpen()) + { + Close(); + } +} + + +BOOL CPortaudioDevice::Open(UINT nDevice, LPWAVEFORMATEX pwfx) +//------------------------------------------------------------ +{ + MemsetZero(m_StreamParameters); + m_Stream = 0; + m_CurrentFrameBuffer = 0; + m_CurrentFrameCount = 0; + m_StreamParameters.device = HostApiOutputIndexToGlobalDeviceIndex(nDevice, m_HostApi); + if(m_StreamParameters.device == -1) return false; + m_StreamParameters.channelCount = pwfx->nChannels; + switch(pwfx->wBitsPerSample) + { + case 8: m_StreamParameters.sampleFormat = paUInt8; break; + case 16: m_StreamParameters.sampleFormat = paInt16; break; + case 24: m_StreamParameters.sampleFormat = paInt24; break; + case 32: m_StreamParameters.sampleFormat = paInt32; break; + default: return false; break; + } + m_StreamParameters.suggestedLatency = m_LatencyMS / 1000.0; + m_StreamParameters.hostApiSpecificStreamInfo = NULL; + if(false && (m_HostApi == Pa_HostApiTypeIdToHostApiIndex(paWASAPI)) && (m_fulCfgOptions & SNDDEV_OPTIONS_EXCLUSIVE)) + { + MemsetZero(m_WasapiStreamInfo); + m_WasapiStreamInfo.size = sizeof(PaWasapiStreamInfo); + m_WasapiStreamInfo.hostApiType = paWASAPI; + m_WasapiStreamInfo.version = 1; + m_WasapiStreamInfo.flags = paWinWasapiExclusive; + m_StreamParameters.hostApiSpecificStreamInfo = &m_WasapiStreamInfo; + } + if(Pa_IsFormatSupported(NULL, &m_StreamParameters, pwfx->nSamplesPerSec) != paFormatIsSupported) return false; + if(Pa_OpenStream(&m_Stream, NULL, &m_StreamParameters, pwfx->nSamplesPerSec, /*static_cast<long>(m_UpdateIntervalMS * pwfx->nSamplesPerSec / 1000.0f)*/ paFramesPerBufferUnspecified, paNoFlag, StreamCallbackWrapper, (void*)this) != paNoError) return false; + if(!Pa_GetStreamInfo(m_Stream)) + { + Pa_CloseStream(m_Stream); + m_Stream = 0; + return false; + } + m_RealLatencyMS = static_cast<float>(Pa_GetStreamInfo(m_Stream)->outputLatency) * 1000.0f; + m_RealUpdateIntervalMS = static_cast<float>(m_UpdateIntervalMS); + return true; +} + + +BOOL CPortaudioDevice::Close() +//---------------------------- +{ + if(m_Stream) + { + Pa_AbortStream(m_Stream); + Pa_CloseStream(m_Stream); + if(Pa_GetDeviceInfo(m_StreamParameters.device)->hostApi == Pa_HostApiTypeIdToHostApiIndex(paWDMKS)) Pa_Sleep((long)(m_RealLatencyMS*2)); // wait for broken wdm drivers not closing the stream immediatly + MemsetZero(m_StreamParameters); + m_Stream = 0; + m_CurrentFrameCount = 0; + m_CurrentFrameBuffer = 0; + } + return true; +} + + +void CPortaudioDevice::Reset() +//---------------------------- +{ + if(!IsOpen()) return; + Pa_AbortStream(m_Stream); +} + + +void CPortaudioDevice::Start() +//---------------------------- +{ + if(!IsOpen()) return; + Pa_StartStream(m_Stream); +} + + +void CPortaudioDevice::Stop() +//--------------------------- +{ + if(!IsOpen()) return; + Pa_StopStream(m_Stream); +} + + +void CPortaudioDevice::FillAudioBuffer() +//-------------------------------------- +{ + ISoundSource *pSource = m_Source; + if(m_CurrentFrameCount == 0) return; + bool eos = false; + ULONG read = pSource->AudioRead(m_CurrentFrameBuffer, m_CurrentFrameCount); + if(read < m_CurrentFrameCount) + { + eos = true; + } + pSource->AudioDone(m_CurrentFrameCount, static_cast<ULONG>(m_CurrentRealLatencyMS * Pa_GetStreamInfo(m_Stream)->sampleRate / 1000.0f), eos); +} + + +int64 CPortaudioDevice::GetStreamPositionSamples() const +//------------------------------------------------------ +{ + if(!IsOpen()) return 0; + if(Pa_IsStreamActive(m_Stream) != 1) return 0; + return static_cast<int64>(Pa_GetStreamTime(m_Stream) * Pa_GetStreamInfo(m_Stream)->sampleRate); +} + + +float CPortaudioDevice::GetCurrentRealLatencyMS() +//----------------------------------------------- +{ + if(!IsOpen()) return 0.0f; + return m_CurrentRealLatencyMS; +} + + +bool CPortaudioDevice::CanSampleRate(UINT nDevice, std::vector<UINT> &samplerates, std::vector<bool> &result) +//----------------------------------------------------------------------------------------------------------- +{ + result.clear(); + for(UINT n=0; n<samplerates.size(); n++) + { + PaStreamParameters StreamParameters; + MemsetZero(StreamParameters); + StreamParameters.device = HostApiOutputIndexToGlobalDeviceIndex(nDevice, m_HostApi); + if(StreamParameters.device == -1) + { + result.assign(samplerates.size(), false); + return false; + } + StreamParameters.channelCount = 2; + StreamParameters.sampleFormat = paInt16; + StreamParameters.suggestedLatency = 0.0; + StreamParameters.hostApiSpecificStreamInfo = NULL; + if(false && (m_HostApi == Pa_HostApiTypeIdToHostApiIndex(paWASAPI)) && (m_fulCfgOptions & SNDDEV_OPTIONS_EXCLUSIVE)) + { + MemsetZero(m_WasapiStreamInfo); + m_WasapiStreamInfo.size = sizeof(PaWasapiStreamInfo); + m_WasapiStreamInfo.hostApiType = paWASAPI; + m_WasapiStreamInfo.version = 1; + m_WasapiStreamInfo.flags = paWinWasapiExclusive; + m_StreamParameters.hostApiSpecificStreamInfo = &m_WasapiStreamInfo; + } + result.push_back(Pa_IsFormatSupported(NULL, &StreamParameters, samplerates[n]) ... [truncated message content] |
From: <man...@us...> - 2013-04-11 20:15:29
|
Revision: 1848 http://sourceforge.net/p/modplug/code/1848 Author: manxorist Date: 2013-04-11 20:15:19 +0000 (Thu, 11 Apr 2013) Log Message: ----------- [Imp] Support output of unclippped 32bit floats in CSoundFile::Read(). Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/Mod2wave.cpp trunk/OpenMPT/mptrack/Mpdlgs.cpp trunk/OpenMPT/mptrack/Mpdlgs.h trunk/OpenMPT/mptrack/TrackerSettings.cpp trunk/OpenMPT/soundlib/Fastmix.cpp trunk/OpenMPT/soundlib/MixerSettings.cpp trunk/OpenMPT/soundlib/MixerSettings.h trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2013-04-11 18:38:07 UTC (rev 1847) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2013-04-11 20:15:19 UTC (rev 1848) @@ -859,14 +859,14 @@ if(!err) { err = !audioTryOpeningDevice(TrackerSettings::Instance().m_MixerSettings.gnChannels, - TrackerSettings::Instance().m_MixerSettings.gnBitsPerSample, + TrackerSettings::Instance().m_MixerSettings.m_SampleFormat, TrackerSettings::Instance().m_MixerSettings.gdwMixingFreq); nFixedBitsPerSample = (gpSoundDevice) ? gpSoundDevice->HasFixedBitsPerSample() : 0; - if(err && (nFixedBitsPerSample && (nFixedBitsPerSample != TrackerSettings::Instance().m_MixerSettings.gnBitsPerSample))) + if(err && (nFixedBitsPerSample && (nFixedBitsPerSample != TrackerSettings::Instance().m_MixerSettings.m_SampleFormat))) { - if(nFixedBitsPerSample) TrackerSettings::Instance().m_MixerSettings.gnBitsPerSample = nFixedBitsPerSample; + if(nFixedBitsPerSample) TrackerSettings::Instance().m_MixerSettings.m_SampleFormat = (SampleFormat)nFixedBitsPerSample; err = !audioTryOpeningDevice(TrackerSettings::Instance().m_MixerSettings.gnChannels, - TrackerSettings::Instance().m_MixerSettings.gnBitsPerSample, + TrackerSettings::Instance().m_MixerSettings.m_SampleFormat, TrackerSettings::Instance().m_MixerSettings.gdwMixingFreq); } } @@ -1665,8 +1665,8 @@ } -BOOL CMainFrame::SetupSoundCard(DWORD q, DWORD rate, UINT nBits, UINT nChns, UINT latency_ms, UINT updateinterval_ms, LONG wd) -//---------------------------------------------------------------------------------------------------------------------------- +BOOL CMainFrame::SetupSoundCard(DWORD q, DWORD rate, SampleFormat sampleformat, UINT nChns, UINT latency_ms, UINT updateinterval_ms, LONG wd) +//--------------------------------------------------------------------------------------------------------------------------------------------- { const bool isPlaying = IsPlaying(); if (((TrackerSettings::Instance().m_MixerSettings.MixerFlags & SOUNDSETUP_RESTARTMASK) != (q & SOUNDSETUP_RESTARTMASK)) @@ -1674,7 +1674,7 @@ || (TrackerSettings::Instance().m_nWaveDevice != wd) || (TrackerSettings::Instance().m_LatencyMS != latency_ms) || (TrackerSettings::Instance().m_UpdateIntervalMS != updateinterval_ms) - || (TrackerSettings::Instance().m_MixerSettings.gnBitsPerSample != nBits) + || (TrackerSettings::Instance().m_MixerSettings.m_SampleFormat != sampleformat) || (TrackerSettings::Instance().m_MixerSettings.gnChannels != nChns)) { CModDoc *pActiveMod = NULL; @@ -1688,7 +1688,7 @@ TrackerSettings::Instance().m_MixerSettings.MixerFlags = q; TrackerSettings::Instance().m_LatencyMS = latency_ms; TrackerSettings::Instance().m_UpdateIntervalMS = updateinterval_ms; - TrackerSettings::Instance().m_MixerSettings.gnBitsPerSample = nBits; + TrackerSettings::Instance().m_MixerSettings.m_SampleFormat = sampleformat; TrackerSettings::Instance().m_MixerSettings.gnChannels = nChns; { CriticalSection cs; @@ -1850,7 +1850,7 @@ CPropertySheet dlg("OpenMPT Setup", this, m_nLastOptionsPage); COptionsGeneral general; - COptionsSoundcard sounddlg(TrackerSettings::Instance().m_MixerSettings.gdwMixingFreq, TrackerSettings::Instance().m_MixerSettings.MixerFlags, TrackerSettings::Instance().m_MixerSettings.gnBitsPerSample, TrackerSettings::Instance().m_MixerSettings.gnChannels, TrackerSettings::Instance().m_LatencyMS, TrackerSettings::Instance().m_UpdateIntervalMS, TrackerSettings::Instance().m_nWaveDevice); + COptionsSoundcard sounddlg(TrackerSettings::Instance().m_MixerSettings.gdwMixingFreq, TrackerSettings::Instance().m_MixerSettings.MixerFlags, TrackerSettings::Instance().m_MixerSettings.m_SampleFormat, TrackerSettings::Instance().m_MixerSettings.gnChannels, TrackerSettings::Instance().m_LatencyMS, TrackerSettings::Instance().m_UpdateIntervalMS, TrackerSettings::Instance().m_nWaveDevice); COptionsKeyboard keyboard; COptionsColors colors; COptionsPlayer playerdlg; Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2013-04-11 18:38:07 UTC (rev 1847) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2013-04-11 20:15:19 UTC (rev 1848) @@ -439,7 +439,7 @@ BOOL StopRenderer(CSoundFile*); void SwitchToActiveView(); - BOOL SetupSoundCard(DWORD q, DWORD rate, UINT nbits, UINT chns, UINT latency_ms, UINT updateinterval_ms, LONG wd); + BOOL SetupSoundCard(DWORD q, DWORD rate, SampleFormat sampleformat, UINT chns, UINT latency_ms, UINT updateinterval_ms, LONG wd); BOOL SetupMiscOptions(); BOOL SetupPlayer(); Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mod2wave.cpp 2013-04-11 18:38:07 UTC (rev 1847) +++ trunk/OpenMPT/mptrack/Mod2wave.cpp 2013-04-11 20:15:19 UTC (rev 1848) @@ -695,7 +695,7 @@ MixerSettings oldmixersettings = m_pSndFile->m_MixerSettings; MixerSettings mixersettings = TrackerSettings::Instance().m_MixerSettings; mixersettings.gdwMixingFreq = m_pWaveFormat->nSamplesPerSec; - mixersettings.gnBitsPerSample = m_pWaveFormat->wBitsPerSample; + mixersettings.m_SampleFormat = (SampleFormat)m_pWaveFormat->wBitsPerSample; mixersettings.gnChannels = m_pWaveFormat->nChannels; m_pSndFile->m_SongFlags.reset(SONG_PAUSED | SONG_STEP); // -> CODE#0024 @@ -704,7 +704,7 @@ if ((m_bNormalize) && (m_pWaveFormat->wBitsPerSample <= 24)) // -! NEW_FEATURE#0024 { - mixersettings.gnBitsPerSample = 24; + mixersettings.m_SampleFormat = SampleFormatInt24; #ifndef NO_AGC mixersettings.DSPMask &= ~SNDDSP_AGC; #endif @@ -769,7 +769,7 @@ m_pSndFile->m_PatternCuePoints.reserve(m_pSndFile->Order.GetLength()); // Process the conversion - UINT nBytesPerSample = (m_pSndFile->m_MixerSettings.gnBitsPerSample * m_pSndFile->m_MixerSettings.gnChannels) / 8; + UINT nBytesPerSample = (m_pSndFile->m_MixerSettings.GetBitsPerSample() * m_pSndFile->m_MixerSettings.gnChannels) / 8; // For calculating the remaining time DWORD dwStartTime = timeGetTime(); // For giving away some processing time every now and then @@ -778,7 +778,7 @@ CMainFrame::GetMainFrame()->InitRenderer(m_pSndFile); //rewbs.VSTTimeInfo for (UINT n = 0; ; n++) { - UINT lRead = m_pSndFile->Read(buffer, sizeof(buffer)/(m_pSndFile->m_MixerSettings.gnChannels*m_pSndFile->m_MixerSettings.gnBitsPerSample/8)); + UINT lRead = m_pSndFile->Read(buffer, sizeof(buffer)/(m_pSndFile->m_MixerSettings.gnChannels*m_pSndFile->m_MixerSettings.GetBitsPerSample()/8)); // Process cue points (add base offset), if there are any to process. vector<PatternCuePoint>::reverse_iterator iter; @@ -1108,7 +1108,7 @@ oldrepeat = m_pSndFile->GetRepeatCount(); const DWORD dwSongTime = m_pSndFile->GetSongTime(); mixersettings.gdwMixingFreq = wfxSrc.nSamplesPerSec; - mixersettings.gnBitsPerSample = 16; + mixersettings.m_SampleFormat = SampleFormatInt16; mixersettings.gnChannels = wfxSrc.nChannels; m_pSndFile->SetRepeatCount(0); m_pSndFile->ResetChannels(); @@ -1152,7 +1152,7 @@ UINT lRead = 0; if (!bFinished) { - lRead = m_pSndFile->Read(pcmBuffer + WAVECONVERTBUFSIZE - pcmBufSize, pcmBufSize/(m_pSndFile->m_MixerSettings.gnChannels*m_pSndFile->m_MixerSettings.gnBitsPerSample/8)); + lRead = m_pSndFile->Read(pcmBuffer + WAVECONVERTBUFSIZE - pcmBufSize, pcmBufSize/(m_pSndFile->m_MixerSettings.gnChannels*m_pSndFile->m_MixerSettings.GetBitsPerSample()/8)); if (!lRead) bFinished = true; } ullSamples += lRead; Modified: trunk/OpenMPT/mptrack/Mpdlgs.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mpdlgs.cpp 2013-04-11 18:38:07 UTC (rev 1847) +++ trunk/OpenMPT/mptrack/Mpdlgs.cpp 2013-04-11 20:15:19 UTC (rev 1848) @@ -263,7 +263,7 @@ wsprintf(s, "%s, %d Bit", gszChnCfgNames[j/3], nBits); UINT ndx = m_CbnQuality.AddString(s); m_CbnQuality.SetItemData( ndx, (nChannels << 8) | nBits ); - if ((nBits == m_nBitsPerSample) && (nChannels == m_nChannels)) n = ndx; + if (((SampleFormat)nBits == m_SampleFormat) && (nChannels == m_nChannels)) n = ndx; } } m_CbnQuality.SetCurSel(n); @@ -426,9 +426,8 @@ { UINT n = m_CbnQuality.GetItemData( m_CbnQuality.GetCurSel() ); m_nChannels = n >> 8; - m_nBitsPerSample = n & 0xFF; + m_SampleFormat = (SampleFormat)(n & 0xFF); if ((m_nChannels != 1) && (m_nChannels != 4)) m_nChannels = 2; - if ((m_nBitsPerSample != 8) && (m_nBitsPerSample != 32)) m_nBitsPerSample = 16; } // Polyphony { @@ -472,7 +471,7 @@ { TrackerSettings::Instance().m_MixerSettings.MixerFlags &= ~SNDMIX_SOFTPANNING; } - CMainFrame::GetMainFrame()->SetupSoundCard(m_dwSoundSetup, m_dwRate, m_nBitsPerSample, m_nChannels, m_LatencyMS, m_UpdateIntervalMS, m_nSoundDevice); + CMainFrame::GetMainFrame()->SetupSoundCard(m_dwSoundSetup, m_dwRate, m_SampleFormat, m_nChannels, m_LatencyMS, m_UpdateIntervalMS, m_nSoundDevice); UpdateStatistics(); CPropertyPage::OnOK(); } Modified: trunk/OpenMPT/mptrack/Mpdlgs.h =================================================================== --- trunk/OpenMPT/mptrack/Mpdlgs.h 2013-04-11 18:38:07 UTC (rev 1847) +++ trunk/OpenMPT/mptrack/Mpdlgs.h 2013-04-11 20:15:19 UTC (rev 1848) @@ -24,15 +24,17 @@ CComboBox m_CbnLatencyMS, m_CbnUpdateIntervalMS, m_CbnMixingFreq, m_CbnPolyphony, m_CbnQuality; CSliderCtrl m_SliderStereoSep, m_SliderPreAmp; CEdit m_EditStatistics; - DWORD m_dwRate, m_dwSoundSetup, m_nBitsPerSample, m_nChannels; + DWORD m_dwRate, m_dwSoundSetup; + SampleFormat m_SampleFormat; + DWORD m_nChannels; DWORD m_LatencyMS; DWORD m_UpdateIntervalMS; DWORD m_nSoundDevice; bool m_PreAmpNoteShowed; public: - COptionsSoundcard(DWORD rate, DWORD q, DWORD bits, DWORD chns, DWORD latency_ms, DWORD updateinterval_ms, DWORD sd):CPropertyPage(IDD_OPTIONS_SOUNDCARD) - { m_dwRate = rate; m_dwSoundSetup = q; m_nBitsPerSample = bits; m_nChannels = chns; + COptionsSoundcard(DWORD rate, DWORD q, SampleFormat sampleformat, DWORD chns, DWORD latency_ms, DWORD updateinterval_ms, DWORD sd):CPropertyPage(IDD_OPTIONS_SOUNDCARD) + { m_dwRate = rate; m_dwSoundSetup = q; m_SampleFormat = sampleformat; m_nChannels = chns; m_LatencyMS = latency_ms; m_UpdateIntervalMS = updateinterval_ms; m_nSoundDevice = sd; m_PreAmpNoteShowed = false; } void UpdateStatistics(); Modified: trunk/OpenMPT/mptrack/TrackerSettings.cpp =================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.cpp 2013-04-11 18:38:07 UTC (rev 1847) +++ trunk/OpenMPT/mptrack/TrackerSettings.cpp 2013-04-11 20:15:19 UTC (rev 1848) @@ -321,7 +321,7 @@ m_MixerSettings.DSPMask = CMainFrame::GetPrivateProfileDWord("Sound Settings", "Quality", m_MixerSettings.DSPMask, iniFile); m_ResamplerSettings.SrcMode = (ResamplingMode)CMainFrame::GetPrivateProfileDWord("Sound Settings", "SrcMode", m_ResamplerSettings.SrcMode, iniFile); m_MixerSettings.gdwMixingFreq = CMainFrame::GetPrivateProfileDWord("Sound Settings", "Mixing_Rate", 0, iniFile); - m_MixerSettings.gnBitsPerSample = CMainFrame::GetPrivateProfileDWord("Sound Settings", "BitsPerSample", m_MixerSettings.gnBitsPerSample, iniFile); + m_MixerSettings.m_SampleFormat = (SampleFormat)CMainFrame::GetPrivateProfileDWord("Sound Settings", "BitsPerSample", (DWORD)m_MixerSettings.m_SampleFormat, iniFile); m_MixerSettings.gnChannels = CMainFrame::GetPrivateProfileDWord("Sound Settings", "ChannelMode", m_MixerSettings.gnChannels, iniFile); DWORD LatencyMS = CMainFrame::GetPrivateProfileDWord("Sound Settings", "Latency", 0, iniFile); DWORD UpdateIntervalMS = CMainFrame::GetPrivateProfileDWord("Sound Settings", "UpdateInterval", 0, iniFile); @@ -648,7 +648,9 @@ RegQueryValueEx(key, "RowSpacing", NULL, &dwREG_DWORD, (LPBYTE)&m_nRowHighlightMeasures, &dwDWORDSize); RegQueryValueEx(key, "RowSpacing2", NULL, &dwREG_DWORD, (LPBYTE)&m_nRowHighlightBeats, &dwDWORDSize); RegQueryValueEx(key, "LoopSong", NULL, &dwREG_DWORD, (LPBYTE)&gbLoopSong, &dwDWORDSize); - RegQueryValueEx(key, "BitsPerSample", NULL, &dwREG_DWORD, (LPBYTE)&m_MixerSettings.gnBitsPerSample, &dwDWORDSize); + DWORD dummy_sampleformat = (DWORD)m_MixerSettings.m_SampleFormat; + RegQueryValueEx(key, "BitsPerSample", NULL, &dwREG_DWORD, (LPBYTE)&dummy_sampleformat, &dwDWORDSize); + m_MixerSettings.m_SampleFormat = (SampleFormat)dummy_sampleformat; RegQueryValueEx(key, "ChannelMode", NULL, &dwREG_DWORD, (LPBYTE)&m_MixerSettings.gnChannels, &dwDWORDSize); RegQueryValueEx(key, "MidiImportSpeed", NULL, &dwREG_DWORD, (LPBYTE)&midiImportSpeed, &dwDWORDSize); RegQueryValueEx(key, "MidiImportPatLen", NULL, &dwREG_DWORD, (LPBYTE)&midiImportPatternLen, &dwDWORDSize); @@ -792,7 +794,7 @@ CMainFrame::WritePrivateProfileDWord("Sound Settings", "Quality", m_MixerSettings.DSPMask, iniFile); CMainFrame::WritePrivateProfileDWord("Sound Settings", "SrcMode", m_ResamplerSettings.SrcMode, iniFile); CMainFrame::WritePrivateProfileDWord("Sound Settings", "Mixing_Rate", m_MixerSettings.gdwMixingFreq, iniFile); - CMainFrame::WritePrivateProfileDWord("Sound Settings", "BitsPerSample", m_MixerSettings.gnBitsPerSample, iniFile); + CMainFrame::WritePrivateProfileDWord("Sound Settings", "BitsPerSample", (DWORD)m_MixerSettings.m_SampleFormat, iniFile); CMainFrame::WritePrivateProfileDWord("Sound Settings", "ChannelMode", m_MixerSettings.gnChannels, iniFile); CMainFrame::WritePrivateProfileDWord("Sound Settings", "Latency", m_LatencyMS, iniFile); CMainFrame::WritePrivateProfileDWord("Sound Settings", "UpdateInterval", m_UpdateIntervalMS, iniFile); Modified: trunk/OpenMPT/soundlib/Fastmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Fastmix.cpp 2013-04-11 18:38:07 UTC (rev 1847) +++ trunk/OpenMPT/soundlib/Fastmix.cpp 2013-04-11 20:15:19 UTC (rev 1848) @@ -2043,6 +2043,20 @@ } +// convert to 32 bit floats and do NOT clip to [-1,1] +DWORD MPPASMCALL Convert32ToFloat32(LPVOID lpBuffer, int *pBuffer, DWORD lSampleCount) +//------------------------------------------------------------------------------------ +{ + const float factor = (1.0f/(float)MIXING_CLIPMAX); + float *out = (float*)lpBuffer; + for(DWORD i=0; i<lSampleCount; i++) + { + out[i] = pBuffer[i] * factor; + } + return lSampleCount * 4; +} + + void MPPASMCALL X86_InitMixBuffer(int *pBuffer, UINT nSamples) //------------------------------------------------------------ { Modified: trunk/OpenMPT/soundlib/MixerSettings.cpp =================================================================== --- trunk/OpenMPT/soundlib/MixerSettings.cpp 2013-04-11 18:38:07 UTC (rev 1847) +++ trunk/OpenMPT/soundlib/MixerSettings.cpp 2013-04-11 20:15:19 UTC (rev 1848) @@ -24,7 +24,7 @@ // Mixing Configuration gnChannels = 2; gdwMixingFreq = 44100; - gnBitsPerSample = 16; + m_SampleFormat = SampleFormatInt16; m_nPreAmp = 128; Modified: trunk/OpenMPT/soundlib/MixerSettings.h =================================================================== --- trunk/OpenMPT/soundlib/MixerSettings.h 2013-04-11 18:38:07 UTC (rev 1847) +++ trunk/OpenMPT/soundlib/MixerSettings.h 2013-04-11 20:15:19 UTC (rev 1848) @@ -10,6 +10,16 @@ #pragma once +enum SampleFormat +{ + SampleFormatUnsigned8 = 8, // do not change value (for compatibility with old configuration settings) + SampleFormatInt16 = 16, // do not change value (for compatibility with old configuration settings) + SampleFormatInt24 = 24, // do not change value (for compatibility with old configuration settings) + SampleFormatInt32 = 32, // do not change value (for compatibility with old configuration settings) + SampleFormatFloat32 = 32 + 128, // Only supported as mixer output and NOT supported by Mod2Wave or ISoundDevice or settings dialog yet. Keep in mind to update all 3 cases at once. + SampleFormatInvalid = 0 +}; + struct MixerSettings { @@ -17,13 +27,46 @@ UINT m_nMaxMixChannels; DWORD DSPMask; DWORD MixerFlags; - DWORD gdwMixingFreq, gnBitsPerSample, gnChannels; + DWORD gdwMixingFreq; + SampleFormat m_SampleFormat; + DWORD gnChannels; DWORD m_nPreAmp; //rewbs.resamplerConf long glVolumeRampUpSamples, glVolumeRampDownSamples; //end rewbs.resamplerConf + bool IsUnsignedSampleFormat() const + { + return m_SampleFormat == SampleFormatUnsigned8; + } + bool IsFloatSampleFormat() const + { + return m_SampleFormat == SampleFormatFloat32; + } + uint8 GetBitsPerSample() const + { + switch(m_SampleFormat) + { + case SampleFormatUnsigned8: + return 8; + break; + case SampleFormatInt16: + return 16; + break; + case SampleFormatInt24: + return 24; + break; + case SampleFormatInt32: + return 32; + break; + case SampleFormatFloat32: + return 32; + break; + default: return 8; break; + } + } + MixerSettings(); }; Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2013-04-11 18:38:07 UTC (rev 1847) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2013-04-11 20:15:19 UTC (rev 1848) @@ -39,6 +39,7 @@ extern DWORD MPPASMCALL X86_Convert32To16(LPVOID lpBuffer, int *, DWORD nSamples); extern DWORD MPPASMCALL X86_Convert32To24(LPVOID lpBuffer, int *, DWORD nSamples); extern DWORD MPPASMCALL X86_Convert32To32(LPVOID lpBuffer, int *, DWORD nSamples); +extern DWORD MPPASMCALL Convert32ToFloat32(LPVOID lpBuffer, int *pBuffer, DWORD lSampleCount); extern UINT MPPASMCALL X86_AGC(int *pBuffer, UINT nSamples, UINT nAGC); extern VOID MPPASMCALL X86_Dither(int *pBuffer, UINT nSamples, UINT nBits); extern VOID MPPASMCALL X86_InterleaveFrontRear(int *pFrontBuf, int *pRearBuf, DWORD nSamples); @@ -94,7 +95,7 @@ if( (mixersettings.gdwMixingFreq != m_MixerSettings.gdwMixingFreq) || - (mixersettings.gnBitsPerSample != m_MixerSettings.gnBitsPerSample) + (mixersettings.m_SampleFormat != m_MixerSettings.m_SampleFormat) || (mixersettings.gnChannels != m_MixerSettings.gnChannels) || @@ -178,7 +179,7 @@ //------------------------------------------------------- { LPBYTE lpBuffer = (LPBYTE)lpDestBuffer; - LPCONVERTPROC pCvt = X86_Convert32To8; + LPCONVERTPROC pCvt = nullptr; samplecount_t lMax, lCount, lSampleCount; size_t lSampleSize; UINT nStat = 0; @@ -189,9 +190,15 @@ m_nMixStat = 0; lSampleSize = m_MixerSettings.gnChannels; - if(m_MixerSettings.gnBitsPerSample == 16) { lSampleSize *= 2; pCvt = X86_Convert32To16; } - else if(m_MixerSettings.gnBitsPerSample == 24) { lSampleSize *= 3; pCvt = X86_Convert32To24; } - else if(m_MixerSettings.gnBitsPerSample == 32) { lSampleSize *= 4; pCvt = X86_Convert32To32; } + switch(m_MixerSettings.m_SampleFormat) + { + case SampleFormatUnsigned8: pCvt = X86_Convert32To8 ; break; + case SampleFormatInt16: pCvt = X86_Convert32To16; break; + case SampleFormatInt24: pCvt = X86_Convert32To24; break; + case SampleFormatInt32: pCvt = X86_Convert32To32; break; + case SampleFormatFloat32: pCvt = Convert32ToFloat32; break; + } + lSampleSize *= m_MixerSettings.GetBitsPerSample()/8; lMax = count; if ((!lMax) || (!lpBuffer) || (!m_nChannels)) return 0; @@ -324,10 +331,10 @@ } // Noise Shaping - if (m_MixerSettings.gnBitsPerSample <= 16) + if (m_MixerSettings.GetBitsPerSample() <= 16) { if(m_Resampler.IsHQ()) - X86_Dither(MixSoundBuffer, lTotalSampleCount, m_MixerSettings.gnBitsPerSample); + X86_Dither(MixSoundBuffer, lTotalSampleCount, m_MixerSettings.GetBitsPerSample()); } #ifdef MODPLUG_TRACKER @@ -350,7 +357,7 @@ gnVolumeRampUpSamplesActual = m_MixerSettings.glVolumeRampUpSamples; } MixDone: - if (lRead) memset(lpBuffer, (m_MixerSettings.gnBitsPerSample == 8) ? 0x80 : 0, lRead * lSampleSize); + if (lRead) memset(lpBuffer, (m_MixerSettings.m_SampleFormat == SampleFormatUnsigned8) ? 0x80 : 0, lRead * lSampleSize); if (nStat) { m_nMixStat += nStat-1; m_nMixStat /= nStat; } return lMax - lRead; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-04-11 21:32:58
|
Revision: 1850 http://sourceforge.net/p/modplug/code/1850 Author: manxorist Date: 2013-04-11 21:32:52 +0000 (Thu, 11 Apr 2013) Log Message: ----------- [Ref] Replace ArrayCopy with std::copy [Ref] Remove all references to tr1. It was just used for static assertions which are now disabled for older compilers (VS2008) which do not support c++11 type_traits. Modified Paths: -------------- trunk/OpenMPT/common/misc_util.h trunk/OpenMPT/soundlib/ModSequence.cpp Modified: trunk/OpenMPT/common/misc_util.h =================================================================== --- trunk/OpenMPT/common/misc_util.h 2013-04-11 21:08:35 UTC (rev 1849) +++ trunk/OpenMPT/common/misc_util.h 2013-04-11 21:32:52 UTC (rev 1850) @@ -17,33 +17,9 @@ #include "typedefs.h" #include <io.h> // for _taccess -#if(_MSC_VER < 1600) -#if defined(_HAS_TR1) -// vs2008sp1 has tr1 +#if defined(HAS_TYPE_TRAITS) #include <type_traits> -#else - // has_trivial_assign for VS2008 - namespace std - { - namespace tr1 - { - template <class T> struct has_trivial_assign {static const bool value = false;}; - #define SPECIALIZE_TRIVIAL_ASSIGN(type) template <> struct has_trivial_assign<type> {static const bool value = true;} - SPECIALIZE_TRIVIAL_ASSIGN(int8); - SPECIALIZE_TRIVIAL_ASSIGN(uint8); - SPECIALIZE_TRIVIAL_ASSIGN(int16); - SPECIALIZE_TRIVIAL_ASSIGN(uint16); - SPECIALIZE_TRIVIAL_ASSIGN(int32); - SPECIALIZE_TRIVIAL_ASSIGN(uint32); - SPECIALIZE_TRIVIAL_ASSIGN(int64); - SPECIALIZE_TRIVIAL_ASSIGN(uint64); - #undef SPECIALIZE_TRIVIAL_ASSIGN - }; - }; #endif -#else -#include <type_traits> -#endif //Convert object(typically number) to string template<class T> @@ -60,8 +36,8 @@ inline T ConvertStrTo(const char *str) //------------------------------------ { - #if _HAS_TR1 - static_assert(std::tr1::is_const<T>::value == false && std::tr1::is_volatile<T>::value == false, "Const and volatile types are not handled correctly."); + #ifdef HAS_TYPE_TRAITS + static_assert(std::is_const<T>::value == false && std::is_volatile<T>::value == false, "Const and volatile types are not handled correctly."); #endif if(std::numeric_limits<T>::is_integer) return static_cast<T>(atoi(str)); @@ -79,9 +55,9 @@ inline void MemsetZero(T &a) //-------------------------- { -#if _HAS_TR1 - static_assert(std::tr1::is_pointer<T>::value == false, "Won't memset pointers."); - static_assert(std::tr1::is_pod<T>::value == true, "Won't memset non-pods."); +#ifdef HAS_TYPE_TRAITS + static_assert(std::is_pointer<T>::value == false, "Won't memset pointers."); + static_assert(std::is_pod<T>::value == true, "Won't memset non-pods."); #endif memset(&a, 0, sizeof(T)); } @@ -92,9 +68,9 @@ inline T &MemCopy(T &destination, const T &source) //------------------------------------------------ { -#if _HAS_TR1 - static_assert(std::tr1::is_pointer<T>::value == false, "Won't copy pointers."); - static_assert(std::tr1::is_pod<T>::value == true, "Won't copy non-pods."); +#ifdef HAS_TYPE_TRAITS + static_assert(std::is_pointer<T>::value == false, "Won't copy pointers."); + static_assert(std::is_pod<T>::value == true, "Won't copy non-pods."); #endif return *static_cast<T *>(memcpy(&destination, &source, sizeof(T))); } @@ -145,37 +121,7 @@ std::string GetErrorMessage(DWORD nErrorCode); #endif // MODPLUG_TRACKER -namespace utilImpl -{ - template <bool bMemcpy> - struct ArrayCopyImpl {}; - template <> - struct ArrayCopyImpl<true> - { - template <class T> - static void Do(T* pDst, const T* pSrc, const size_t n) {memcpy(pDst, pSrc, sizeof(T) * n);} - }; - - template <> - struct ArrayCopyImpl<false> - { - template <class T> - static void Do(T* pDst, const T* pSrc, const size_t n) {std::copy(pSrc, pSrc + n, pDst);} - }; -} // namespace utilImpl - - -// Copies n elements from array pSrc to array pDst. -// If the source and destination arrays overlap, behaviour is undefined. -template <class T> -void ArrayCopy(T* pDst, const T* pSrc, const size_t n) -//---------------------------------------------------- -{ - utilImpl::ArrayCopyImpl<std::tr1::has_trivial_assign<T>::value>::Do(pDst, pSrc, n); -} - - // Sanitize a filename (remove special chars) template <size_t size> void SanitizeFilename(char (&buffer)[size]) Modified: trunk/OpenMPT/soundlib/ModSequence.cpp =================================================================== --- trunk/OpenMPT/soundlib/ModSequence.cpp 2013-04-11 21:08:35 UTC (rev 1849) +++ trunk/OpenMPT/soundlib/ModSequence.cpp 2013-04-11 21:32:52 UTC (rev 1850) @@ -244,7 +244,7 @@ const PATTERNINDEX* const pOld = m_pArray; m_nCapacity = nNewSize + 100; m_pArray = new PATTERNINDEX[m_nCapacity]; - ArrayCopy(m_pArray, pOld, m_nSize); + std::copy(pOld, pOld+m_nSize, m_pArray); std::fill(m_pArray + m_nSize, m_pArray + nNewSize, nFill); m_nSize = nNewSize; if (m_bDeletableArray) @@ -269,7 +269,7 @@ m_nIgnoreIndex = seq.m_nIgnoreIndex; m_nInvalidIndex = seq.m_nInvalidIndex; resize(seq.GetLength()); - ArrayCopy(begin(), seq.begin(), m_nSize); + std::copy(seq.begin(), seq.end(), begin()); m_sName = seq.m_sName; return *this; } @@ -354,7 +354,7 @@ m_nSize = rSeq.GetLength(); m_nCapacity = s_nCacheSize; m_sName = rSeq.m_sName; - ArrayCopy(m_pArray, rSeq.m_pArray, m_nSize); + std::copy(rSeq.m_pArray, rSeq.m_pArray+m_nSize, m_pArray); if (m_bDeletableArray) delete[] pOld; m_bDeletableArray = false; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-04-12 13:19:38
|
Revision: 1852 http://sourceforge.net/p/modplug/code/1852 Author: manxorist Date: 2013-04-12 13:19:24 +0000 (Fri, 12 Apr 2013) Log Message: ----------- [Ref] The min and max macros conflict with STL. Prevent windows from defining those and add our own MIN and MAX macros as a replacement. Convert all usage sites. Modified Paths: -------------- trunk/OpenMPT/common/StringFixer.h trunk/OpenMPT/common/misc_util.h trunk/OpenMPT/common/serialization_utils.cpp trunk/OpenMPT/common/serialization_utils.h trunk/OpenMPT/common/stdafx.h trunk/OpenMPT/common/typedefs.h trunk/OpenMPT/mptrack/AbstractVstEditor.cpp trunk/OpenMPT/mptrack/Autotune.cpp trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Ctrl_seq.cpp trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/DefaultVstEditor.cpp trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/MIDIMapping.cpp trunk/OpenMPT/mptrack/Mainbar.cpp trunk/OpenMPT/mptrack/Mod2wave.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/PatternCursor.h trunk/OpenMPT/mptrack/TrackerSettings.cpp trunk/OpenMPT/mptrack/View_gen.cpp trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/VstPresets.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/soundlib/ITTools.cpp trunk/OpenMPT/soundlib/LOAD_DMF.CPP trunk/OpenMPT/soundlib/Load_gdm.cpp trunk/OpenMPT/soundlib/Load_imf.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_itp.cpp trunk/OpenMPT/soundlib/Load_med.cpp trunk/OpenMPT/soundlib/Load_mod.cpp trunk/OpenMPT/soundlib/Load_okt.cpp trunk/OpenMPT/soundlib/Load_psm.cpp trunk/OpenMPT/soundlib/Load_ptm.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Load_ult.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/MIDIMacros.cpp trunk/OpenMPT/soundlib/ModInstrument.h trunk/OpenMPT/soundlib/ModSequence.cpp trunk/OpenMPT/soundlib/SampleFormats.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp trunk/OpenMPT/soundlib/XMTools.cpp trunk/OpenMPT/soundlib/load_j2b.cpp trunk/OpenMPT/soundlib/modcommand.cpp trunk/OpenMPT/soundlib/modsmp_ctrl.cpp trunk/OpenMPT/soundlib/pattern.cpp trunk/OpenMPT/soundlib/patternContainer.cpp trunk/OpenMPT/soundlib/plugins/PluginEventQueue.h trunk/OpenMPT/soundlib/tuning.cpp Modified: trunk/OpenMPT/common/StringFixer.h =================================================================== --- trunk/OpenMPT/common/StringFixer.h 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/common/StringFixer.h 2013-04-12 13:19:24 UTC (rev 1852) @@ -85,7 +85,7 @@ STATIC_ASSERT(destSize > 0); //ASSERT(srcSize > 0); - const size_t maxSize = min(destSize, srcSize); + const size_t maxSize = MIN(destSize, srcSize); char *dst = destBuffer; const char *src = srcBuffer; @@ -111,7 +111,7 @@ } else { // Last character of source buffer may actually be a valid character. - destBuffer[min(destSize - 1, srcSize)] = '\0'; + destBuffer[MIN(destSize - 1, srcSize)] = '\0'; } } else if(mode == spacePadded || mode == spacePaddedNull) @@ -181,7 +181,7 @@ STATIC_ASSERT(destSize > 0); ASSERT(srcSize > 0); - const size_t maxSize = min(destSize, srcSize); + const size_t maxSize = MIN(destSize, srcSize); char *dst = destBuffer; const char *src = srcBuffer; @@ -229,7 +229,7 @@ void CopyN(char (&destBuffer)[destSize], const char *srcBuffer, const size_t srcSize = SIZE_T_MAX) //------------------------------------------------------------------------------------------------ { - const size_t copySize = min(destSize - 1, srcSize); + const size_t copySize = MIN(destSize - 1, srcSize); strncpy(destBuffer, srcBuffer, copySize); destBuffer[copySize] = '\0'; } Modified: trunk/OpenMPT/common/misc_util.h =================================================================== --- trunk/OpenMPT/common/misc_util.h 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/common/misc_util.h 2013-04-12 13:19:24 UTC (rev 1852) @@ -112,7 +112,7 @@ // Like Limit, but returns value #ifndef CLAMP -#define CLAMP(number, low, high) min(high, max(low, number)) +#define CLAMP(number, low, high) MIN(high, MAX(low, number)) #endif Modified: trunk/OpenMPT/common/serialization_utils.cpp =================================================================== --- trunk/OpenMPT/common/serialization_utils.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/common/serialization_utils.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -163,9 +163,9 @@ Binaryread(iStrm, id, 1); const uint8 nSizeBytes = (id & 12) >> 2; // 12 == 1100b if (nSizeBytes > 0) - iStrm.read(reinterpret_cast<char*>(&id) + 1, min(3, nSizeBytes)); + iStrm.read(reinterpret_cast<char*>(&id) + 1, MIN(3, nSizeBytes)); // Limit to 1 MB. - str.resize(min(id >> 4, 1000000)); + str.resize(MIN(id >> 4, 1000000)); for(size_t i = 0; i < str.size(); i++) iStrm.read(&str[i], 1); @@ -906,7 +906,7 @@ } // Seek to end. - oStrm.seekp(max(posMapEnd, posDataEnd)); + oStrm.seekp(MAX(posMapEnd, posDataEnd)); if (m_fpLogFunc) m_fpLogFunc(tstrEndOfStream, uint32(oStrm.tellp() - m_posStart)); Modified: trunk/OpenMPT/common/serialization_utils.h =================================================================== --- trunk/OpenMPT/common/serialization_utils.h 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/common/serialization_utils.h 2013-04-12 13:19:24 UTC (rev 1852) @@ -413,7 +413,7 @@ inline void Binarywrite(OutStream& oStrm, const T& data, const Offtype bytecount) //-------------------------------------------------------------------------- { - oStrm.write(reinterpret_cast<const char*>(&data), min(bytecount, sizeof(data))); + oStrm.write(reinterpret_cast<const char*>(&data), MIN(bytecount, sizeof(data))); } template <class T> Modified: trunk/OpenMPT/common/stdafx.h =================================================================== --- trunk/OpenMPT/common/stdafx.h 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/common/stdafx.h 2013-04-12 13:19:24 UTC (rev 1852) @@ -15,6 +15,8 @@ #define _WIN32_WINNT 0x0500 // 0x0500 = Windows 2000 +// no stupid min/max macros +#define NOMINMAX // windows excludes #define NOMCX // mmreg excludes Modified: trunk/OpenMPT/common/typedefs.h =================================================================== --- trunk/OpenMPT/common/typedefs.h 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/common/typedefs.h 2013-04-12 13:19:24 UTC (rev 1852) @@ -32,6 +32,14 @@ #define CountOf(x) (sizeof(x)/sizeof(x[0])) #endif +#ifndef MAX +#define MAX(a,b) (((a) > (b)) ? (a) : (b)) +#endif + +#ifndef MIN +#define MIN(a,b) (((a) < (b)) ? (a) : (b)) +#endif + // Compile time assert. #ifndef C_ASSERT #define C_ASSERT(expr) typedef char __C_ASSERT__[(expr)?1:-1] Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -823,14 +823,14 @@ void CAbstractVstEditor::OnVSTPresetBackwardJump() //------------------------------------------------ { - OnSetPreset(max(ID_PRESET_SET + m_VstPlugin.GetCurrentProgram() - 10, ID_PRESET_SET)); + OnSetPreset(MAX(ID_PRESET_SET + m_VstPlugin.GetCurrentProgram() - 10, ID_PRESET_SET)); } void CAbstractVstEditor::OnVSTPresetForwardJump() //----------------------------------------------- { - OnSetPreset(min(ID_PRESET_SET + m_VstPlugin.GetCurrentProgram() + 10, ID_PRESET_SET + m_VstPlugin.GetNumPrograms() - 1)); + OnSetPreset(MIN(ID_PRESET_SET + m_VstPlugin.GetCurrentProgram() + 10, ID_PRESET_SET + m_VstPlugin.GetNumPrograms() - 1)); } Modified: trunk/OpenMPT/mptrack/Autotune.cpp =================================================================== --- trunk/OpenMPT/mptrack/Autotune.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/mptrack/Autotune.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -39,7 +39,7 @@ //--------------------------------------------------------------------------------------- { const double fundamentalFrequency = NoteToFrequency((double)note / BINS_PER_NOTE, pitchReference); - return (SmpLength)max(Util::Round((double)sampleFreq / fundamentalFrequency), 1); + return (SmpLength)MAX(Util::Round((double)sampleFreq / fundamentalFrequency), 1); } @@ -103,7 +103,7 @@ } // We should analyse at least a one second (= GetSampleRate() samples) long sample. - sampleLength = max(sampleLoopEnd, sample.GetSampleRate(modType)) + maxShift; + sampleLength = MAX(sampleLoopEnd, sample.GetSampleRate(modType)) + maxShift; if(sampleData != nullptr) { Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -909,7 +909,7 @@ m_OrderList.SetCurSel(nInsertWhere); // If the first duplicated order is e.g. a +++ item, we need to move the pattern display on or else we'll still edit the previously shown pattern. - ORDERINDEX showPattern = min(nInsertWhere, pSndFile->Order.GetLastIndex()); + ORDERINDEX showPattern = MIN(nInsertWhere, pSndFile->Order.GetLastIndex()); while(!pSndFile->Patterns.IsValidPat(pSndFile->Order[showPattern]) && showPattern < pSndFile->Order.GetLastIndex()) { showPattern++; Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -1142,9 +1142,9 @@ nInsertEnd + i + 1 < sndFile.Order.GetLength()) sndFile.Order[nInsertEnd + i + 1] = sndFile.Order[nInsertEnd - nInsertCount + i]; } - m_nScrollPos = min(nInsertEnd + 1, sndFile.Order.GetLastIndex()); + m_nScrollPos = MIN(nInsertEnd + 1, sndFile.Order.GetLastIndex()); if(nInsertCount > 0) - m_nScrollPos2nd = min(m_nScrollPos + nInsertCount, sndFile.Order.GetLastIndex()); + m_nScrollPos2nd = MIN(m_nScrollPos + nInsertCount, sndFile.Order.GetLastIndex()); else m_nScrollPos2nd = ORDERINDEX_INVALID; @@ -1375,7 +1375,7 @@ else if(nSeq < sndFile.Order.GetNumSequences()) sndFile.Order.SetSequence(nSeq); ORDERINDEX nPosCandidate = sndFile.Order.GetLengthTailTrimmed() - 1; - SetCurSel(min(m_nScrollPos, nPosCandidate), true, false, true); + SetCurSel(MIN(m_nScrollPos, nPosCandidate), true, false, true); if (m_pParent) m_pParent->SetCurrentPattern(sndFile.Order[m_nScrollPos]); Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -1766,10 +1766,10 @@ //Update loop points only if no error occured. if(errorcode == 0) { - sample.nLoopStart = (UINT)min(sample.nLoopStart * (m_dTimeStretchRatio / 100.0), sample.nLength); - sample.nLoopEnd = (UINT)min(sample.nLoopEnd * (m_dTimeStretchRatio/100.0), sample.nLength); - sample.nSustainStart = (UINT)min(sample.nSustainStart * (m_dTimeStretchRatio/100.0), sample.nLength); - sample.nSustainEnd = (UINT)min(sample.nSustainEnd * (m_dTimeStretchRatio/100.0), sample.nLength); + sample.nLoopStart = (UINT)MIN(sample.nLoopStart * (m_dTimeStretchRatio / 100.0), sample.nLength); + sample.nLoopEnd = (UINT)MIN(sample.nLoopEnd * (m_dTimeStretchRatio/100.0), sample.nLength); + sample.nSustainStart = (UINT)MIN(sample.nSustainStart * (m_dTimeStretchRatio/100.0), sample.nLength); + sample.nSustainEnd = (UINT)MIN(sample.nSustainEnd * (m_dTimeStretchRatio/100.0), sample.nLength); } } Modified: trunk/OpenMPT/mptrack/DefaultVstEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/DefaultVstEditor.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/mptrack/DefaultVstEditor.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -240,7 +240,7 @@ //----------------------------------------------------------- { const PlugParamIndex numParams = m_VstPlugin.GetNumParameters(); - const PlugParamIndex scrollMax = numParams - min(numParams, NUM_PLUGINEDITOR_PARAMETERS); + const PlugParamIndex scrollMax = numParams - MIN(numParams, NUM_PLUGINEDITOR_PARAMETERS); LimitMax(paramOffset, scrollMax); int curScrollMin, curScrollMax; @@ -341,14 +341,14 @@ case SB_PAGELEFT: // Scroll one page left. if(curpos > minpos) { - curpos = max(minpos, curpos - (int)sbInfo.nPage); + curpos = MAX(minpos, curpos - (int)sbInfo.nPage); } break; case SB_PAGERIGHT: // Scroll one page right. if(curpos < maxpos) { - curpos = min(maxpos, curpos + (int)sbInfo.nPage); + curpos = MIN(maxpos, curpos + (int)sbInfo.nPage); } break; Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -466,7 +466,7 @@ if(mc.IsPcNote()) { //If note is parameter control note, drawing volume command differently. - const int val = min(ModCommand::maxColumnValue, mc.GetValueVolCol()); + const int val = MIN(ModCommand::maxColumnValue, mc.GetValueVolCol()); m_Dib.TextBlt(x, y, 1, COLUMN_HEIGHT, pfnt->nClrX, pfnt->nClrY); m_Dib.TextBlt(x + 1, y, pfnt->nVolCmdWidth, COLUMN_HEIGHT, @@ -687,7 +687,7 @@ if(pSndFile->Patterns.IsValidPat(nPrevPat)) { ROWINDEX nPrevRows = pSndFile->Patterns[nPrevPat].GetNumRows(); - ROWINDEX n = min(static_cast<ROWINDEX>(nSkip), nPrevRows); + ROWINDEX n = MIN(static_cast<ROWINDEX>(nSkip), nPrevRows); ypaint += (nSkip - n) * m_szCell.cy; rect.SetRect(0, m_szHeader.cy, nColumnWidth * ncols + m_szHeader.cx, ypaint - 1); @@ -733,7 +733,7 @@ if(pSndFile->Patterns.IsValidPat(nNextPat)) { ROWINDEX nNextRows = pSndFile->Patterns[nNextPat].GetNumRows(); - ROWINDEX n = min(static_cast<ROWINDEX>(nVisRows), nNextRows); + ROWINDEX n = MIN(static_cast<ROWINDEX>(nVisRows), nNextRows); m_Dib.SetBlendMode(0x80); DrawPatternData(hdc, pSndFile, nNextPat, false, false, Modified: trunk/OpenMPT/mptrack/MIDIMapping.cpp =================================================================== --- trunk/OpenMPT/mptrack/MIDIMapping.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/mptrack/MIDIMapping.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -105,7 +105,7 @@ memcpy(&i16, ptr, 2); ptr += 2; //Channel, event, MIDIbyte1. memcpy(&i8, ptr, 1); ptr++; //Plugindex const BYTE remainingbytes = psize - 4; - memcpy(&i32, ptr, min(4, remainingbytes)); ptr += remainingbytes; + memcpy(&i32, ptr, MIN(4, remainingbytes)); ptr += remainingbytes; s.SetChannel(((i16 & 1) != 0) ? 0 : 1 + ((i16 >> 1) & 0xF)); s.SetEvent(static_cast<BYTE>((i16 >> 5) & 0xF)); Modified: trunk/OpenMPT/mptrack/Mainbar.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mainbar.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/mptrack/Mainbar.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -508,9 +508,9 @@ if ((n = (short int)m_SpinTempo.GetPos()) != 0) { if (n < 0) - pSndFile->SetTempo(max(nCurrentTempo - 1, pSndFile->GetModSpecifications().tempoMin), true); + pSndFile->SetTempo(MAX(nCurrentTempo - 1, pSndFile->GetModSpecifications().tempoMin), true); else - pSndFile->SetTempo(min(nCurrentTempo + 1, pSndFile->GetModSpecifications().tempoMax), true); + pSndFile->SetTempo(MIN(nCurrentTempo + 1, pSndFile->GetModSpecifications().tempoMax), true); m_SpinTempo.SetPos(0); } Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mod2wave.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/mptrack/Mod2wave.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -616,7 +616,7 @@ m_EditAlbum.GetWindowText(sText, sizeof(sText)); m_FileTags.album = sText; - m_EditYear.GetWindowText(sText, min(5, sizeof(sText))); + m_EditYear.GetWindowText(sText, MIN(5, sizeof(sText))); m_FileTags.year = sText; if(m_FileTags.year == "0") m_FileTags.year = ""; Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -693,7 +693,7 @@ m_SndFile.m_nMixLevels = m_SndFile.GetModSpecifications().defaultMixLevels; m_SndFile.m_PlayConfig.SetMixLevels(m_SndFile.m_nMixLevels); // ...and the order length - m_SndFile.Order.resize(min(ModSequenceSet::s_nCacheSize, m_SndFile.GetModSpecifications().ordersMax)); + m_SndFile.Order.resize(MIN(ModSequenceSet::s_nCacheSize, m_SndFile.GetModSpecifications().ordersMax)); if (m_SndFile.Order[0] >= m_SndFile.Patterns.Size()) m_SndFile.Order[0] = 0; Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -513,7 +513,7 @@ } const INSTRUMENTINDEX nInstrumentMax = m_SndFile.GetModSpecifications().instrumentsMax; - const SAMPLEINDEX nInstruments = min(m_SndFile.GetNumSamples(), nInstrumentMax); + const SAMPLEINDEX nInstruments = MIN(m_SndFile.GetNumSamples(), nInstrumentMax); for(SAMPLEINDEX smp = 1; smp <= nInstruments; smp++) { @@ -544,7 +544,7 @@ { //Remove all plugins whose keepMask[plugindex] is false. UINT nRemoved = 0; - const PLUGINDEX maxPlug = min(MAX_MIXPLUGINS, keepMask.size()); + const PLUGINDEX maxPlug = MIN(MAX_MIXPLUGINS, keepMask.size()); for (PLUGINDEX nPlug = 0; nPlug < maxPlug; nPlug++) { @@ -844,12 +844,12 @@ bool CModDoc::MoveOrder(ORDERINDEX nSourceNdx, ORDERINDEX nDestNdx, bool bUpdate, bool bCopy, SEQUENCEINDEX nSourceSeq, SEQUENCEINDEX nDestSeq) //--------------------------------------------------------------------------------------------------------------------------------------------- { - if (max(nSourceNdx, nDestNdx) >= m_SndFile.Order.size()) return false; + if (MAX(nSourceNdx, nDestNdx) >= m_SndFile.Order.size()) return false; if (nDestNdx >= m_SndFile.GetModSpecifications().ordersMax) return false; if(nSourceSeq == SEQUENCEINDEX_INVALID) nSourceSeq = m_SndFile.Order.GetCurrentSequenceIndex(); if(nDestSeq == SEQUENCEINDEX_INVALID) nDestSeq = m_SndFile.Order.GetCurrentSequenceIndex(); - if (max(nSourceSeq, nDestSeq) >= m_SndFile.Order.GetNumSequences()) return false; + if (MAX(nSourceSeq, nDestSeq) >= m_SndFile.Order.GetNumSequences()) return false; PATTERNINDEX nSourcePat = m_SndFile.Order.GetSequence(nSourceSeq)[nSourceNdx]; // save current working sequence @@ -1013,7 +1013,7 @@ sscanf(p + dwPos, pszEnvFmt, &nPoints, &susBegin, &susEnd, &loopBegin, &loopEnd, &bSus, &bLoop, &bCarry); while ((dwPos < dwMemSize) && (p[dwPos] != '\r') && (p[dwPos] != '\n')) dwPos++; - nPoints = min(nPoints, m_SndFile.GetModSpecifications().envelopePointsMax); + nPoints = MIN(nPoints, m_SndFile.GetModSpecifications().envelopePointsMax); if (susEnd >= nPoints) susEnd = 0; if (susBegin > susEnd) susBegin = susEnd; if (loopEnd >= nPoints) loopEnd = 0; Modified: trunk/OpenMPT/mptrack/PatternCursor.h =================================================================== --- trunk/OpenMPT/mptrack/PatternCursor.h 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/mptrack/PatternCursor.h 2013-04-12 13:19:24 UTC (rev 1852) @@ -114,7 +114,7 @@ // Move the cursor relatively. void Move(int rows, int channels, int columns) { - int row = max(0, static_cast<int>(GetRow()) + rows); + int row = MAX(0, static_cast<int>(GetRow()) + rows); int chn = static_cast<int>(GetChannel()) + channels; int col = static_cast<int>(GetColumnType() + columns); @@ -179,7 +179,7 @@ // Ensure that the point lies within a given pattern size. void Sanitize(ROWINDEX maxRows, CHANNELINDEX maxChans) { - ROWINDEX row = min(GetRow(), maxRows - 1); + ROWINDEX row = MIN(GetRow(), maxRows - 1); CHANNELINDEX chn = GetChannel(); Columns col = GetColumnType(); Modified: trunk/OpenMPT/mptrack/TrackerSettings.cpp =================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/mptrack/TrackerSettings.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -429,7 +429,7 @@ if(DefaultPlugVolumeHandling >= PLUGIN_VOLUMEHANDLING_MAX) DefaultPlugVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE; m_nSampleUndoMaxBuffer = CMainFrame::GetPrivateProfileLong("Sample Editor" , "UndoBufferSize", m_nSampleUndoMaxBuffer >> 20, iniFile); - m_nSampleUndoMaxBuffer = max(1, m_nSampleUndoMaxBuffer) << 20; + m_nSampleUndoMaxBuffer = MAX(1, m_nSampleUndoMaxBuffer) << 20; PatternClipboard::SetClipboardSize(GetPrivateProfileInt("Pattern Editor", "NumClipboards", PatternClipboard::GetClipboardSize(), iniFile)); Modified: trunk/OpenMPT/mptrack/View_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_gen.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/mptrack/View_gen.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -346,7 +346,7 @@ m_TabCtrl.DeleteAllItems(); for (int iItem=0; iItem<nTabCount; iItem++) { - const int lastItem = min(iItem * 4 + 4, MAX_BASECHANNELS); + const int lastItem = MIN(iItem * 4 + 4, MAX_BASECHANNELS); wsprintf(s, "%d - %d", iItem * 4 + 1, lastItem); tci.mask = TCIF_TEXT | TCIF_PARAM; tci.pszText = s; @@ -699,7 +699,7 @@ short int pos; LockControls(); - const CHANNELINDEX nLoopLimit = min(4, pModDoc->GetSoundFile()->GetNumChannels() - nChn); + const CHANNELINDEX nLoopLimit = MIN(4, pModDoc->GetSoundFile()->GetNumChannels() - nChn); for (CHANNELINDEX iCh = 0; iCh < nLoopLimit; iCh++) { // Volume sliders Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -836,9 +836,9 @@ nPrevTick = nTick; nRow = nTick / speed; - if (nRow % max(1, nRowsPerMeasure) == 0) + if (nRow % MAX(1, nRowsPerMeasure) == 0) m_dcGrid.SelectObject(CMainFrame::penGray80); - else if (nRow % max(1, nRowsPerBeat) == 0) + else if (nRow % MAX(1, nRowsPerBeat) == 0) m_dcGrid.SelectObject(CMainFrame::penGray55); else m_dcGrid.SelectObject(CMainFrame::penGray33); Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -860,7 +860,7 @@ } // Adjust selection - m_Selection = PatternRect(startSel, PatternCursor(min(finalDest, pSndFile->Patterns[m_nPattern].GetNumRows() - 1), endSel)); + m_Selection = PatternRect(startSel, PatternCursor(MIN(finalDest, pSndFile->Patterns[m_nPattern].GetNumRows() - 1), endSel)); InvalidatePattern(false); SetModified(); @@ -961,7 +961,7 @@ } // Adjust selection - m_Selection = PatternRect(startSel, PatternCursor(min(finalDest, pSndFile->Patterns[m_nPattern].GetNumRows() - 1), endSel)); + m_Selection = PatternRect(startSel, PatternCursor(MIN(finalDest, pSndFile->Patterns[m_nPattern].GetNumRows() - 1), endSel)); InvalidatePattern(false); SetModified(); @@ -2057,15 +2057,15 @@ if(m_findReplace.findFlags[FindReplace::InChannels]) { // Limit search to given channels - firstChannel = min(m_findReplace.findMinChn, lastChannel); - lastChannel = min(m_findReplace.findMaxChn, lastChannel); + firstChannel = MIN(m_findReplace.findMinChn, lastChannel); + lastChannel = MIN(m_findReplace.findMaxChn, lastChannel); } if(m_findReplace.findFlags[FindReplace::InPatSelection]) { // Limit search to pattern selection - firstChannel = min(m_findReplace.selection.GetStartChannel(), lastChannel); - lastChannel = min(m_findReplace.selection.GetEndChannel(), lastChannel); + firstChannel = MIN(m_findReplace.selection.GetStartChannel(), lastChannel); + lastChannel = MIN(m_findReplace.selection.GetEndChannel(), lastChannel); } for(PATTERNINDEX pat = patStart; pat < patEnd; pat++) @@ -4812,7 +4812,7 @@ if(usePlaybackPosition && m_nPlayTick && pTarget->command == CMD_NONE && !doQuantize) { pTarget->command = (sndFile.TypeIsS3M_IT_MPT()) ? CMD_S3MCMDEX : CMD_MODCMDEX; - pTarget->param = 0xD0 | min(0xF, m_nPlayTick); + pTarget->param = 0xD0 | MIN(0xF, m_nPlayTick); } //Enter note off @@ -4831,7 +4831,7 @@ if(usePlaybackPosition && m_nPlayTick && !doQuantize) // ECx { pTarget->command = (sndFile.TypeIsS3M_IT_MPT()) ? CMD_S3MCMDEX : CMD_MODCMDEX; - pTarget->param = 0xC0 | min(0xF, m_nPlayTick); + pTarget->param = 0xC0 | MIN(0xF, m_nPlayTick); } else // C00 { pTarget->note = NOTE_NONE; @@ -5104,8 +5104,8 @@ { newcmd.command = (sndFile.TypeIsS3M_IT_MPT()) ? CMD_S3MCMDEX : CMD_MODCMDEX; UINT maxSpeed = 0x0F; - if(sndFile.m_nMusicSpeed > 0) maxSpeed = min(0x0F, sndFile.m_nMusicSpeed - 1); - newcmd.param = 0xD0 + min(maxSpeed, m_nPlayTick); + if(sndFile.m_nMusicSpeed > 0) maxSpeed = MIN(0x0F, sndFile.m_nMusicSpeed - 1); + newcmd.param = 0xD0 + MIN(maxSpeed, m_nPlayTick); } } Modified: trunk/OpenMPT/mptrack/VstPresets.cpp =================================================================== --- trunk/OpenMPT/mptrack/VstPresets.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/mptrack/VstPresets.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -196,7 +196,7 @@ const uint32 numParams = plugin.GetNumParameters(); WriteBE(numParams, f); - char name[max(kVstMaxProgNameLen + 1, 256)]; + char name[MAX(kVstMaxProgNameLen + 1, 256)]; plugin.Dispatch(effGetProgramName, 0, 0, name, 0); f.write(name, 28); Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -778,7 +778,7 @@ // Time signature. numerator = rows per beats / rows pear measure (should sound somewhat logical to you). // the denominator is a bit more tricky, since it cannot be set explicitely. so we just assume quarters for now. - timeInfo.timeSigNumerator = sndFile.m_nCurrentRowsPerMeasure / max(sndFile.m_nCurrentRowsPerBeat, 1); + timeInfo.timeSigNumerator = sndFile.m_nCurrentRowsPerMeasure / MAX(sndFile.m_nCurrentRowsPerBeat, 1); timeInfo.timeSigDenominator = 4; //gcd(pSndFile->m_nCurrentRowsPerMeasure, pSndFile->m_nCurrentRowsPerBeat); } } @@ -1442,7 +1442,7 @@ m_nOutputs = m_Effect.numOutputs; // Input pointer array size must be >= 2 for now - the input buffer assignment might write to non allocated mem. otherwise - bool result = mixBuffer.Initialize(max(m_nInputs, 2), m_nOutputs); + bool result = mixBuffer.Initialize(MAX(m_nInputs, 2), m_nOutputs); m_MixState.pOutBufferL = mixBuffer.GetInputBuffer(0); m_MixState.pOutBufferR = mixBuffer.GetInputBuffer(1); @@ -1613,7 +1613,7 @@ defaultDir = defaultDir.substr(0, defaultDir.find_last_of("\\/")); } - char rawname[max(kVstMaxProgNameLen + 1, 256)] = ""; // kVstMaxProgNameLen is 24... + char rawname[MAX(kVstMaxProgNameLen + 1, 256)] = ""; // kVstMaxProgNameLen is 24... Dispatch(effGetProgramName, 0, 0, rawname, 0); SanitizeFilename(rawname); StringFixer::SetNullTerminator(rawname); @@ -1745,7 +1745,7 @@ CString CVstPlugin::GetFormattedProgramName(VstInt32 index) //--------------------------------------------------------- { - char rawname[max(kVstMaxProgNameLen + 1, 256)]; // kVstMaxProgNameLen is 24... + char rawname[MAX(kVstMaxProgNameLen + 1, 256)]; // kVstMaxProgNameLen is 24... if(!GetProgramNameIndexed(index, -1, rawname)) { // Fallback: Try to get current program name. @@ -1841,7 +1841,7 @@ CString CVstPlugin::GetParamPropertyString(VstInt32 param, VstInt32 opcode) //------------------------------------------------------------------------- { - CHAR s[max(kVstMaxParamStrLen + 1, 64)]; // Increased to 64 bytes since 32 bytes doesn't seem to suffice for all plugs. Kind of ridiculous if you consider that kVstMaxParamStrLen = 8... + CHAR s[MAX(kVstMaxParamStrLen + 1, 64)]; // Increased to 64 bytes since 32 bytes doesn't seem to suffice for all plugs. Kind of ridiculous if you consider that kVstMaxParamStrLen = 8... s[0] = '\0'; if(m_Effect.numParams > 0 && param < m_Effect.numParams) @@ -2041,7 +2041,7 @@ void CVstPlugin::SetDryRatio(UINT param) //-------------------------------------- { - param = min(param, 127); + param = MIN(param, 127); m_pMixStruct->fDryRatio = static_cast<float>(1.0-(static_cast<double>(param)/127.0)); } Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -526,7 +526,7 @@ BOOL CRemoveChannelsDlg::OnInitDialog() //------------------------------------- { - CHAR label[max(100, 20 + MAX_CHANNELNAME)]; + CHAR label[MAX(100, 20 + MAX_CHANNELNAME)]; CDialog::OnInitDialog(); for (UINT n = 0; n < m_nChannels; n++) { @@ -1324,7 +1324,7 @@ void AppendNotesToControl(CComboBox& combobox, const ModCommand::NOTE noteStart, const ModCommand::NOTE noteEnd) //------------------------------------------------------------------------------------------------------------------ { - const ModCommand::NOTE upperLimit = min(CountOf(szDefaultNoteNames) - 1, noteEnd); + const ModCommand::NOTE upperLimit = MIN(CountOf(szDefaultNoteNames) - 1, noteEnd); for(ModCommand::NOTE note = noteStart; note <= upperLimit; ++note) combobox.SetItemData(combobox.AddString(szDefaultNoteNames[note]), note); } Modified: trunk/OpenMPT/soundlib/ITTools.cpp =================================================================== --- trunk/OpenMPT/soundlib/ITTools.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/soundlib/ITTools.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -44,7 +44,7 @@ if(mptEnv.dwFlags[ENV_CARRY]) flags |= ITEnvelope::envCarry; // Nodes and Loops - num = (uint8)min(mptEnv.nNodes, 25); + num = (uint8)MIN(mptEnv.nNodes, 25); lpb = (uint8)mptEnv.nLoopStart; lpe = (uint8)mptEnv.nLoopEnd; slb = (uint8)mptEnv.nSustainStart; @@ -82,10 +82,10 @@ mptEnv.dwFlags.set(ENV_CARRY, (flags & ITEnvelope::envCarry) != 0); // Nodes and Loops - mptEnv.nNodes = min(num, maxNodes); - mptEnv.nLoopStart = min(lpb, static_cast<uint8>(maxNodes)); + mptEnv.nNodes = MIN(num, maxNodes); + mptEnv.nLoopStart = MIN(lpb, static_cast<uint8>(maxNodes)); mptEnv.nLoopEnd = Clamp(lpe, mptEnv.nLoopStart, static_cast<uint8>(maxNodes)); - mptEnv.nSustainStart = min(slb, static_cast<uint8>(maxNodes)); + mptEnv.nSustainStart = MIN(slb, static_cast<uint8>(maxNodes)); mptEnv.nSustainEnd = Clamp(sle, mptEnv.nSustainStart, static_cast<uint8>(maxNodes)); // Envelope Data @@ -187,8 +187,8 @@ mptIns.VolEnv.Values[i] = nodes[i * 2 + 1]; } - if(max(mptIns.VolEnv.nLoopStart, mptIns.VolEnv.nLoopEnd) >= mptIns.VolEnv.nNodes) mptIns.VolEnv.dwFlags.reset(ENV_LOOP); - if(max(mptIns.VolEnv.nSustainStart, mptIns.VolEnv.nSustainEnd) >= mptIns.VolEnv.nNodes) mptIns.VolEnv.dwFlags.reset(ENV_SUSTAIN); + if(MAX(mptIns.VolEnv.nLoopStart, mptIns.VolEnv.nLoopEnd) >= mptIns.VolEnv.nNodes) mptIns.VolEnv.dwFlags.reset(ENV_LOOP); + if(MAX(mptIns.VolEnv.nSustainStart, mptIns.VolEnv.nSustainEnd) >= mptIns.VolEnv.nNodes) mptIns.VolEnv.dwFlags.reset(ENV_SUSTAIN); } @@ -218,14 +218,14 @@ StringFixer::WriteString<StringFixer::nullTerminated>(name, mptIns.name); // Volume / Panning - fadeout = static_cast<uint16>(min(mptIns.nFadeOut >> 5, 256)); - gbv = static_cast<uint8>(min(mptIns.nGlobalVol * 2, 128)); - dfp = static_cast<uint8>(min(mptIns.nPan / 4, 64)); + fadeout = static_cast<uint16>(MIN(mptIns.nFadeOut >> 5, 256)); + gbv = static_cast<uint8>(MIN(mptIns.nGlobalVol * 2, 128)); + dfp = static_cast<uint8>(MIN(mptIns.nPan / 4, 64)); if(!mptIns.dwFlags[INS_SETPANNING]) dfp |= ITInstrument::ignorePanning; // Random Variation - rv = min(mptIns.nVolSwing, 100); - rp = min(mptIns.nPanSwing, 64); + rv = MIN(mptIns.nVolSwing, 100); + rp = MIN(mptIns.nPanSwing, 64); // NNA Stuff nna = mptIns.nNNA; @@ -307,8 +307,8 @@ mptIns.dwFlags.set(INS_SETPANNING, !(dfp & ITInstrument::ignorePanning)); // Random Variation - mptIns.nVolSwing = min(rv, 100); - mptIns.nPanSwing = min(rp, 64); + mptIns.nVolSwing = MIN(rv, 100); + mptIns.nPanSwing = MIN(rp, 64); // NNA Stuff mptIns.nNNA = nna; @@ -529,9 +529,9 @@ // Auto Vibrato settings static const uint8 autovibxm2it[8] = { 0, 2, 4, 1, 3, 0, 0, 0 }; // OpenMPT VibratoType -> IT Vibrato vit = autovibxm2it[mptSmp.nVibType & 7]; - vis = min(mptSmp.nVibRate, 64); - vid = min(mptSmp.nVibDepth, 32); - vir = min(mptSmp.nVibSweep, 255); + vis = MIN(mptSmp.nVibRate, 64); + vid = MIN(mptSmp.nVibDepth, 32); + vir = MIN(mptSmp.nVibSweep, 255); if((vid | vis) != 0 && (fromType & MOD_TYPE_XM)) { Modified: trunk/OpenMPT/soundlib/LOAD_DMF.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2013-04-12 13:19:24 UTC (rev 1852) @@ -239,7 +239,7 @@ else if((val <= 0x0F || internalTicks < 2) && hasFine) return (val | 0xF0); else - return max(1, (val / (internalTicks - 1))); // no porta on first tick! + return MAX(1, (val / (internalTicks - 1))); // no porta on first tick! } @@ -247,10 +247,10 @@ static uint8 DMFslide2MPT(uint8 val, const uint8 internalTicks, const bool up) //---------------------------------------------------------------------------- { - val = max(1, val / 4); + val = MAX(1, val / 4); const bool isFine = (val < 0x0F) || (internalTicks < 2); if(!isFine) - val = max(1, (val + internalTicks - 2) / (internalTicks - 1)); // no slides on first tick! "+ internalTicks - 2" for rounding precision + val = MAX(1, (val + internalTicks - 2) / (internalTicks - 1)); // no slides on first tick! "+ internalTicks - 2" for rounding precision if(up) return (isFine ? 0x0F : 0x00) | (val << 4); @@ -288,9 +288,9 @@ { // MPT: 1 vibrato period == 64 ticks... we have internalTicks ticks per row. // X-Tracker: Period length specified in rows! - const int periodInTicks = max(1, (val >> 4)) * internalTicks; + const int periodInTicks = MAX(1, (val >> 4)) * internalTicks; const uint8 matchingPeriod = (uint8)CLAMP((128 / periodInTicks), 1, 15); - return (matchingPeriod << 4) | max(1, (val & 0x0F)); + return (matchingPeriod << 4) | MAX(1, (val & 0x0F)); } @@ -513,7 +513,7 @@ // => Tempo = 60 * Rows per Second * Speed / 24 // For some reason, using settings.tempoTicks + 1 gives more accurate results than just settings.tempoTicks... (same problem in the old libmodplug DMF loader) // Original unoptimized formula: - //const int tickspeed = (tempoRealBPMmode) ? max(1, (tempoData * beat * 4) / 60) : tempoData; + //const int tickspeed = (tempoRealBPMmode) ? MAX(1, (tempoData * beat * 4) / 60) : tempoData; const int tickspeed = (settings.realBPMmode) ? Util::Max(1, settings.tempoBPM * settings.beat * 2) : ((settings.tempoTicks + 1) * 30); // Try to find matching speed - try higher speeds first, so that effects like arpeggio and tremor work better. for(speed = 255; speed > 1; speed--) @@ -645,7 +645,7 @@ } break; case 5: // Tremolo Retrig Sample (who invented those stupid effect names?) - effectParam1 = max(1, DMFdelay2MPT(effectParam1, settings.internalTicks)); + effectParam1 = MAX(1, DMFdelay2MPT(effectParam1, settings.internalTicks)); effect1 = CMD_RETRIG; settings.channels[chn].playDir = false; break; @@ -690,7 +690,7 @@ case 1: // Note Finetune effect2 = static_cast<ModCommand::COMMAND>(effectParam2 < 128 ? CMD_PORTAMENTOUP : CMD_PORTAMENTODOWN); if(effectParam2 > 128) effectParam2 = 255 - effectParam2 + 1; - effectParam2 = 0xF0 | min(0x0F, effectParam2); // Well, this is not too accurate... + effectParam2 = 0xF0 | MIN(0x0F, effectParam2); // Well, this is not too accurate... break; case 2: // Note Delay (wtf is the difference to Sample Delay?) effectParam2 = DMFdelay2MPT(effectParam2, settings.internalTicks); Modified: trunk/OpenMPT/soundlib/Load_gdm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_gdm.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/soundlib/Load_gdm.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -159,7 +159,7 @@ { if(fileHeader.panMap[i] < 16) { - ChnSettings[i].nPan = min((fileHeader.panMap[i] * 16) + 8, 256); + ChnSettings[i].nPan = MIN((fileHeader.panMap[i] * 16) + 8, 256); } else if(fileHeader.panMap[i] == 16) { ChnSettings[i].nPan = 128; @@ -171,7 +171,7 @@ } } - m_nDefaultGlobalVolume = min(fileHeader.masterVol * 4, 256); + m_nDefaultGlobalVolume = MIN(fileHeader.masterVol * 4, 256); m_nDefaultSpeed = fileHeader.tempo; m_nDefaultTempo = fileHeader.bpm; m_nRestartPos = 0; // Not supported in this format, so use the default value @@ -216,8 +216,8 @@ Samples[smp].nLength /= 2; } - Samples[smp].nLoopStart = min(gdmSample.loopBegin, Samples[smp].nLength); // in samples - Samples[smp].nLoopEnd = min(gdmSample.loopEnd - 1, Samples[smp].nLength); // dito + Samples[smp].nLoopStart = MIN(gdmSample.loopBegin, Samples[smp].nLength); // in samples + Samples[smp].nLoopEnd = MIN(gdmSample.loopEnd - 1, Samples[smp].nLength); // dito Samples[smp].FrequencyToTranspose(); // set transpose + finetune for mod files // Fix transpose + finetune for some rare cases where transpose is not C-5 (e.g. sample 4 in wander2.gdm) @@ -244,7 +244,7 @@ if(gdmSample.flags & GDMSampleHeader::smpVolume) { // Default volume is used... 0...64, 255 = no default volume - Samples[smp].nVolume = min(gdmSample.volume, 64) * 4; + Samples[smp].nVolume = MIN(gdmSample.volume, 64) * 4; } else { Samples[smp].nVolume = 256; @@ -255,7 +255,7 @@ // Default panning is used Samples[smp].uFlags |= CHN_PANNING; // 0...15, 16 = surround (not supported), 255 = no default panning - Samples[smp].nPan = (gdmSample.panning > 15) ? 128 : min((gdmSample.panning * 16) + 8, 256); + Samples[smp].nPan = (gdmSample.panning > 15) ? 128 : MIN((gdmSample.panning * 16) + 8, 256); } else { Samples[smp].nPan = 128; @@ -277,7 +277,7 @@ } // Read patterns - Patterns.ResizeArray(max(MAX_PATTERNS, fileHeader.lastPattern + 1)); + Patterns.ResizeArray(MAX(MAX_PATTERNS, fileHeader.lastPattern + 1)); const CModSpecifications &modSpecs = GetModSpecifications(GetBestSaveFormat()); @@ -406,7 +406,7 @@ break; case CMD_VOLUME: - m.param = min(m.param, 64); + m.param = MIN(m.param, 64); if(modSpecs.HasVolCommand(VOLCMD_VOLUME)) { m.volcmd = VOLCMD_VOLUME; Modified: trunk/OpenMPT/soundlib/Load_imf.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_imf.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/soundlib/Load_imf.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -302,13 +302,13 @@ break; case 0xF: // set finetune // we don't implement this, but let's at least import the value - m.param = 0x20 | min(m.param >> 4, 0x0F); + m.param = 0x20 | MIN(m.param >> 4, 0x0F); break; case 0x14: // fine slide up case 0x15: // fine slide down // this is about as close as we can do... if(m.param >> 4) - m.param = 0xF0 | min(m.param >> 4, 0x0F); + m.param = 0xF0 | MIN(m.param >> 4, 0x0F); else m.param |= 0xE0; break; @@ -316,7 +316,7 @@ m.param >>= 1; break; case 0x1F: // set global volume - m.param = min(m.param << 1, 0xFF); + m.param = MIN(m.param << 1, 0xFF); break; case 0x21: n = 0; @@ -506,13 +506,13 @@ if(e1c == 0x0C) { - m.vol = min(e1d, 0x40); + m.vol = MIN(e1d, 0x40); m.volcmd = VOLCMD_VOLUME; m.command = e2c; m.param = e2d; } else if(e2c == 0x0C) { - m.vol = min(e2d, 0x40); + m.vol = MIN(e2d, 0x40); m.volcmd = VOLCMD_VOLUME; m.command = e1c; m.param = e1d; Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -229,7 +229,7 @@ static uint8 ConvertVolParam(const ModCommand *m) //----------------------------------------------- { - return min(m->vol, 9); + return MIN(m->vol, 9); } @@ -956,7 +956,7 @@ const size_t num = 0; #endif // MODPLUG_TRACKER - uint16 fnum = (uint16)min(num, uint16_max); // Number of entries that are actually going to be written + uint16 fnum = (uint16)MIN(num, uint16_max); // Number of entries that are actually going to be written const size_t bytes_written = 2 + fnum * 8; // Number of bytes that are actually going to be written if(f == nullptr) @@ -1032,7 +1032,7 @@ if(GetType() == MOD_TYPE_MPT) { if(!Order.NeedsExtraDatafield()) itHeader.ordnum = Order.size(); - else itHeader.ordnum = min(Order.size(), MAX_ORDERS); //Writing MAX_ORDERS at max here, and if there's more, writing them elsewhere. + else itHeader.ordnum = MIN(Order.size(), MAX_ORDERS); //Writing MAX_ORDERS at max here, and if there's more, writing them elsewhere. //Crop unused orders from the end. while(itHeader.ordnum > 1 && Order[itHeader.ordnum - 1] == Order.GetInvalidPatIndex()) itHeader.ordnum--; @@ -1091,9 +1091,9 @@ if(m_SongFlags[SONG_EXFILTERRANGE] && !compatibilityExport) itHeader.flags |= ITFileHeader::extendedFilterRange; itHeader.globalvol = (uint8)(m_nDefaultGlobalVolume >> 1); - itHeader.mv = (uint8)min(m_nSamplePreAmp, 128); - itHeader.speed = (uint8)min(m_nDefaultSpeed, 255); - itHeader.tempo = (uint8)min(m_nDefaultTempo, 255); //Limit this one to 255, we save the real one as an extension below. + itHeader.mv = (uint8)MIN(m_nSamplePreAmp, 128); + itHeader.speed = (uint8)MIN(m_nDefaultSpeed, 255); + itHeader.tempo = (uint8)MIN(m_nDefaultTempo, 255); //Limit this one to 255, we save the real one as an extension below. itHeader.sep = 128; // pan separation // IT doesn't have a per-instrument Pitch Wheel Depth setting, so we just store the first non-zero PWD setting in the header. for(INSTRUMENTINDEX ins = 1; ins < GetNumInstruments(); ins++) @@ -1110,7 +1110,7 @@ memset(itHeader.chnpan, 0xA0, 64); memset(itHeader.chnvol, 64, 64); - for (CHANNELINDEX ich = 0; ich < min(m_nChannels, 64); ich++) // Header only has room for settings for 64 chans... + for (CHANNELINDEX ich = 0; ich < MIN(m_nChannels, 64); ich++) // Header only has room for settings for 64 chans... { itHeader.chnpan[ich] = (uint8)(ChnSettings[ich].nPan >> 2); if (ChnSettings[ich].dwFlags[CHN_SURROUND]) itHeader.chnpan[ich] = 100; @@ -1159,7 +1159,7 @@ if(m_lpszSongComments) { itHeader.special |= ITFileHeader::embedSongMessage; - itHeader.msglength = msglength = (uint16)min(strlen(m_lpszSongComments) + 1, uint16_max); + itHeader.msglength = msglength = (uint16)MIN(strlen(m_lpszSongComments) + 1, uint16_max); itHeader.msgoffset = dwHdrPos + dwExtra + (itHeader.insnum + itHeader.smpnum + itHeader.patnum) * 4; } @@ -1300,7 +1300,7 @@ fwrite(patinfo, 8, 1, f); dwPos += 8; - const CHANNELINDEX maxChannels = min(specs.channelsMax, GetNumChannels()); + const CHANNELINDEX maxChannels = MIN(specs.channelsMax, GetNumChannels()); vector<BYTE> chnmask(maxChannels, 0xFF); vector<ModCommand> lastvalue(maxChannels, ModCommand::Empty()); @@ -1794,9 +1794,9 @@ UINT maxNodes = 0; for(INSTRUMENTINDEX nIns = 1; nIns <= m_nInstruments; nIns++) if(Instruments[nIns] != nullptr) { - maxNodes = max(maxNodes, Instruments[nIns]->VolEnv.nNodes); - maxNodes = max(maxNodes, Instruments[nIns]->PanEnv.nNodes); - maxNodes = max(maxNodes, Instruments[nIns]->PitchEnv.nNodes); + maxNodes = MAX(maxNodes, Instruments[nIns]->VolEnv.nNodes); + maxNodes = MAX(maxNodes, Instruments[nIns]->PanEnv.nNodes); + maxNodes = MAX(maxNodes, Instruments[nIns]->PitchEnv.nNodes); } // write full envelope information for MPTM files (more env points) if(maxNodes > 25) Modified: trunk/OpenMPT/soundlib/Load_itp.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_itp.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/soundlib/Load_itp.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -390,7 +390,7 @@ // number of pattern name strings PATTERNINDEX numNamedPats = Patterns.GetNumNamedPatterns(); - numNamedPats = min(numNamedPats, MAX_PATTERNS); + numNamedPats = MIN(numNamedPats, MAX_PATTERNS); id = numNamedPats; fwrite(&id, 1, sizeof(id), f); Modified: trunk/OpenMPT/soundlib/Load_med.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_med.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/soundlib/Load_med.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -703,7 +703,7 @@ // Song Comments (null-terminated) UINT annotxt = BigEndian(pmex->annotxt); UINT annolen = BigEndian(pmex->annolen); - annolen = min(annolen, MED_MAX_COMMENT_LENGTH); //Thanks to Luigi Auriemma for pointing out an overflow risk + annolen = MIN(annolen, MED_MAX_COMMENT_LENGTH); //Thanks to Luigi Auriemma for pointing out an overflow risk if ((annotxt) && (annolen) && (annolen <= dwMemLength) && (annotxt <= dwMemLength - annolen) ) { ReadMessage(lpStream + annotxt, annolen - 1, leAutodetect); Modified: trunk/OpenMPT/soundlib/Load_mod.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mod.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/soundlib/Load_mod.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -96,7 +96,7 @@ { if(param <= 0x80) { - param = min(param << 1, 0xFF); + param = MIN(param << 1, 0xFF); } else if(param == 0xA4) // surround { @@ -118,8 +118,8 @@ case CMD_VOLUME: command = 0x0C; break; case CMD_PATTERNBREAK: command = 0x0D; param = ((param / 10) << 4) | (param % 10); break; case CMD_MODCMDEX: command = 0x0E; break; - case CMD_SPEED: command = 0x0F; param = min(param, (toXM) ? 0x1Fu : 0x20u); break; - case CMD_TEMPO: command = 0x0F; param = max(param, (toXM) ? 0x20u : 0x21u); break; + case CMD_SPEED: command = 0x0F; param = MIN(param, (toXM) ? 0x1Fu : 0x20u); break; + case CMD_TEMPO: command = 0x0F; param = MAX(param, (toXM) ? 0x20u : 0x21u); break; case CMD_GLOBALVOLUME: command = 'G' - 55; break; case CMD_GLOBALVOLSLIDE: command = 'H' - 55; break; case CMD_KEYOFF: command = 'K' - 55; break; @@ -227,7 +227,7 @@ mptSmp.Initialize(MOD_TYPE_MOD); mptSmp.nLength = length * 2; mptSmp.nFineTune = MOD2XMFineTune(finetune & 0x0F); - mptSmp.nVolume = 4 * min(volume, 64); + mptSmp.nVolume = 4 * MIN(volume, 64); SmpLength lStart = loopStart * 2; SmpLength lLength = loopLength * 2; @@ -304,7 +304,7 @@ if(mptSmp.uFlags[CHN_LOOP]) { loopStart = static_cast<uint16>(mptSmp.nLoopStart / 2); - loopLength = static_cast<uint16>(max(1, (mptSmp.nLoopEnd - mptSmp.nLoopStart) / 2)); + loopLength = static_cast<uint16>(MAX(1, (mptSmp.nLoopEnd - mptSmp.nLoopStart) / 2)); } return writeLength; @@ -353,7 +353,7 @@ m.param = 0x91; } else { - m.param = min(m.param * 2, 0xFF); + m.param = MIN(m.param * 2, 0xFF); } } } @@ -1159,7 +1159,7 @@ { // Maybe we can save some volume commands... command = 0x0C; - param = min(m.vol, 64); + param = MIN(m.vol, 64); } uint16 period = 0; @@ -1209,7 +1209,7 @@ // First two bytes of oneshot samples have to be 0 due to PT's one-shot loop const long sampleEnd = ftell(f); fseek(f, sampleStart, SEEK_SET); - fwrite(&silence, min(writtenBytes, 2), 1, f); + fwrite(&silence, MIN(writtenBytes, 2), 1, f); fseek(f, sampleEnd, SEEK_SET); } Modified: trunk/OpenMPT/soundlib/Load_okt.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_okt.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/soundlib/Load_okt.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -68,7 +68,7 @@ void ReadOKTSamples(FileReader &chunk, vector<bool> &sample7bit, CSoundFile *pSndFile) //------------------------------------------------------------------------------------ { - pSndFile->m_nSamples = min((SAMPLEINDEX)(chunk.BytesLeft() / sizeof(OktSample)), MAX_SAMPLES - 1); // typically 36 + pSndFile->m_nSamples = MIN((SAMPLEINDEX)(chunk.BytesLeft() / sizeof(OktSample)), MAX_SAMPLES - 1); // typically 36 sample7bit.resize(pSndFile->GetNumSamples()); for(SAMPLEINDEX nSmp = 1; nSmp <= pSndFile->GetNumSamples(); nSmp++) @@ -88,7 +88,7 @@ mptSmp.nC5Speed = 8287; mptSmp.nGlobalVol = 64; - mptSmp.nVolume = min(oktSmp.volume, 64) * 4; + mptSmp.nVolume = MIN(oktSmp.volume, 64) * 4; mptSmp.nLength = oktSmp.length & ~1; // round down // parse loops if (oktSmp.loopLength > 2 && static_cast<SmpLength>(oktSmp.loopStart) + static_cast<SmpLength>(oktSmp.loopLength) <= mptSmp.nLength) @@ -176,14 +176,14 @@ if (m->param) { m->command = CMD_NOTESLIDEDOWN; - m->param = 0x10 | min(0x0F, m->param); + m->param = 0x10 | MIN(0x0F, m->param); } break; case 30: // U Slide Up (Notes) if (m->param) { m->command = CMD_NOTESLIDEUP; - m->param = 0x10 | min(0x0F, m->param); + m->param = 0x10 | MIN(0x0F, m->param); } break; /* We don't have fine note slide, but this is supposed to happen once @@ -193,14 +193,14 @@ if (m->param) { m->command = CMD_NOTESLIDEDOWN; - m->param = 0x50 | min(0x0F, m->param); + m->param = 0x50 | MIN(0x0F, m->param); } break; case 17: // H Slide Up Once (Notes) if (m->param) { m->command = CMD_NOTESLIDEUP; - m->param = 0x50 | min(0x0F, m->param); + m->param = 0x50 | MIN(0x0F, m->param); } break; @@ -244,10 +244,10 @@ m->param = (m->param & 0x0F) << 4; // Dx0 break; case 6: - m->param = 0xF0 | min(m->param & 0x0F, 0x0E); // DFx + m->param = 0xF0 | MIN(m->param & 0x0F, 0x0E); // DFx break; case 7: - m->param = (min(m->param & 0x0F, 0x0E) << 4) | 0x0F; // DxF + m->param = (MIN(m->param & 0x0F, 0x0E) << 4) | 0x0F; // DxF break; default: // Junk. @@ -417,7 +417,7 @@ continue; // weird stuff? - mptSample.nLength = min(mptSample.nLength, sampleChunks[nFileSmp].GetLength()); + mptSample.nLength = MIN(mptSample.nLength, sampleChunks[nFileSmp].GetLength()); SampleIO( SampleIO::_8bit, Modified: trunk/OpenMPT/soundlib/Load_psm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_psm.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/soundlib/Load_psm.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -596,7 +596,7 @@ SAMPLEINDEX smp = static_cast<SAMPLEINDEX>(sampleHeader.sampleNumber + 1); if(smp < MAX_SAMPLES) { - m_nSamples = max(m_nSamples, smp); + m_nSamples = MAX(m_nSamples, smp); StringFixer::ReadString<StringFixer::nullTerminated>(m_szNames[smp], sampleHeader.sampleName); sampleHeader.ConvertToMPT(Samples[smp]); @@ -614,7 +614,7 @@ SAMPLEINDEX smp = static_cast<SAMPLEINDEX>(sampleHeader.sampleNumber + 1); if(smp < MAX_SAMPLES) { - m_nSamples = max(m_nSamples, smp); + m_nSamples = MAX(m_nSamples, smp); StringFixer::ReadString<StringFixer::nullTerminated>(m_szNames[smp], sampleHeader.sampleName); sampleHeader.ConvertToMPT(Samples[smp]); @@ -679,7 +679,7 @@ uint8 flags = rowChunk.ReadUint8(); uint8 channel = rowChunk.ReadUint8(); // Point to the correct channel - ModCommand &m = rowBase[min(m_nChannels - 1, channel)]; + ModCommand &m = rowBase[MIN(m_nChannels - 1, channel)]; if(flags & noteFlag) { @@ -709,7 +709,7 @@ // Volume present uint8 vol = rowChunk.ReadUint8(); m.volcmd = VOLCMD_VOLUME; - m.vol = (min(vol, 127) + 1) / 2; + m.vol = (MIN(vol, 127) + 1) / 2; } if(flags & effectFlag) @@ -1117,7 +1117,7 @@ || (fileHeader.formatVersion != 0x10 && fileHeader.formatVersion != 0x01) // why is this sometimes 0x01? || fileHeader.patternVersion != 0 // 255ch pattern version not supported (did anyone use this?) || (fileHeader.songType & 3) != 0 - || max(fileHeader.numChannelsPlay, fileHeader.numChannelsReal) == 0) + || MAX(fileHeader.numChannelsPlay, fileHeader.numChannelsReal) == 0) { return false; } @@ -1125,7 +1125,7 @@ // Seems to be valid! m_nType = MOD_TYPE_S3M; - m_nChannels = min(max(fileHeader.numChannelsPlay, fileHeader.numChannelsReal), MAX_BASECHANNELS); + m_nChannels = MIN(MAX(fileHeader.numChannelsPlay, fileHeader.numChannelsReal), MAX_BASECHANNELS); m_nSamplePreAmp = fileHeader.masterVolume; if(m_nSamplePreAmp == 255) { @@ -1170,7 +1170,7 @@ } SAMPLEINDEX smp = sampleHeader.sampleNumber; - m_nSamples = max(m_nSamples, smp); + m_nSamples = MAX(m_nSamples, smp); StringFixer::ReadString<StringFixer::nullTerminated>(m_szNames[smp], sampleHeader.name); sampleHeader.ConvertToMPT(Samples[smp]); @@ -1223,7 +1223,7 @@ continue; } - ModCommand &m = *Patterns[pat].GetpModCommand(curRow, min(chnFlag & channelMask, m_nChannels - 1)); + ModCommand &m = *Patterns[pat].GetpModCommand(curRow, MIN(chnFlag & channelMask, m_nChannels - 1)); if(chnFlag & noteFlag) { Modified: trunk/OpenMPT/soundlib/Load_ptm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ptm.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/soundlib/Load_ptm.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -90,7 +90,7 @@ m_nType = MOD_TYPE_PTM; m_nChannels = pfh.nchannels; - m_nSamples = min(pfh.nsamples, MAX_SAMPLES - 1); + m_nSamples = MIN(pfh.nsamples, MAX_SAMPLES - 1); dwMemPos = sizeof(PTMFILEHEADER); nOrders = (pfh.norders < MAX_ORDERS) ? pfh.norders : MAX_ORDERS-1; Order.ReadFromArray(pfh.orders, nOrders); Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -298,8 +298,8 @@ if(sampleType == typePCM) { mptSmp.nLength = length; - mptSmp.nLoopStart = min(loopStart, mptSmp.nLength - 1); - mptSmp.nLoopEnd = min(loopEnd, mptSmp.nLength); + mptSmp.nLoopStart = MIN(loopStart, mptSmp.nLength - 1); + mptSmp.nLoopEnd = MIN(loopEnd, mptSmp.nLength); mptSmp.uFlags.set(CHN_LOOP, (flags & smpLoop) != 0); } @@ -310,7 +310,7 @@ } // Volume / Panning - mptSmp.nVolume = min(defaultVolume, 64) * 4; + mptSmp.nVolume = MIN(defaultVolume, 64) * 4; // C-5 frequency mptSmp.nC5Speed = c5speed; @@ -333,9 +333,9 @@ if(mptSmp.pSample != nullptr) { sampleType = typePCM; - length = static_cast<uint32>(min(mptSmp.nLength, uint32_max)); - loopStart = static_cast<uint32>(min(mptSmp.nLoopStart, uint32_max)); - loopEnd = static_cast<uint32>(min(mptSmp.nLoopEnd, uint32_max)); + length = static_cast<uint32>(MIN(mptSmp.nLength, uint32_max)); + loopStart = static_cast<uint32>(MIN(mptSmp.nLoopStart, uint32_max)); + loopEnd = static_cast<uint32>(MIN(mptSmp.nLoopEnd, uint32_max)); smpLength = length; @@ -353,7 +353,7 @@ sampleType = typeNone; } - defaultVolume = static_cast<uint8>(min(mptSmp.nVolume / 4, 64)); + defaultVolume = static_cast<uint8>(MIN(mptSmp.nVolume / 4, 64)); if(mptSmp.nC5Speed != 0) { c5speed = mptSmp.nC5Speed; @@ -499,7 +499,7 @@ } // Global Volume - m_nDefaultGlobalVolume = min(fileHeader.globalVol, 64) * 4; + m_nDefaultGlobalVolume = MIN(fileHeader.globalVol, 64) * 4; // The following check is probably not very reliable, but it fixes a few tunes, e.g. // DARKNESS.S3M by Purple Motion (ST 3.00) and "Image of Variance" by C.C.Catch (ST 3.01): if(m_nDefaultGlobalVolume == 0 && fileHeader.cwtv < S3MFileHeader::trkST3_20) @@ -571,7 +571,7 @@ bool hasAdlibPatches = false; // Reading sample headers - m_nSamples = min(fileHeader.smpNum, MAX_SAMPLES - 1); + m_nSamples = MIN(fileHeader.smpNum, MAX_SAMPLES - 1); for(SAMPLEINDEX smp = 0; smp < m_nSamples; smp++) { S3MSampleHeader sampleHeader; @@ -613,7 +613,7 @@ int zxxCountRight = 0, zxxCountLeft = 0; // Reading patterns - const PATTERNINDEX readPatterns = min(fileHeader.patNum, MAX_PATTERNS); + const PATTERNINDEX readPatterns = MIN(fileHeader.patNum, MAX_PATTERNS); for(PATTERNINDEX pat = 0; pat < readPatterns; pat++) { // A zero parapointer indicates an empty pattern. @@ -681,7 +681,7 @@ } else { m.volcmd = VOLCMD_VOLUME; - m.vol = min(volume, 64); + m.vol = MIN(volume, 64); } } @@ -777,7 +777,7 @@ fileHeader.smpNum = static_cast<uint16>(writeSamples); // Patterns - PATTERNINDEX writePatterns = min(Patterns.GetNumPatterns(), 100u); + PATTERNINDEX writePatterns = MIN(Patterns.GetNumPatterns(), 100u); fileHeader.patNum = static_cast<uint16>(writePatterns); // Flags @@ -798,7 +798,7 @@ fileHeader.magic = S3MFileHeader::idSCRM; // Song Variables - fileHeader.globalVol = static_cast<uint8>(min(m_nDefaultGlobalVolume / 4, 64)); + fileHeader.globalVol = static_cast<uint8>(MIN(m_nDefaultGlobalVolume / 4, 64)); fileHeader.speed = static_cast<uint8>(Clamp(m_nDefaultSpeed, 1u, 254u)); fileHeader.tempo = static_cast<uint8>(Clamp(m_nDefaultTempo, 33u, 255u)); fileHeader.masterVolume = static_cast<uint8>(Clamp(m_nSamplePreAmp, 16u, 127u) | 0x80); @@ -931,7 +931,7 @@ const PatternRow rowBase = Patterns[pat].GetRow(row); - CHANNELINDEX writeChannels = min(32, GetNumChannels()); + CHANNELINDEX writeChannels = MIN(32, GetNumChannels()); for(CHANNELINDEX chn = 0; chn < writeChannels; chn++) { ModCommand &m = rowBase[chn]; @@ -970,7 +970,7 @@ { command = CMD_NONE; volcmd = VOLCMD_VOLUME; - vol = min(param, 64); + vol = MIN(param, 64); } if(volcmd == VOLCMD_VOLUME) @@ -1019,7 +1019,7 @@ buffer.insert(buffer.end(), 64, s3mEndOfRow); } - size_t length = min(buffer.size(), uint16_max); + size_t length = MIN(buffer.size(), uint16_max); buffer[0] = static_cast<uint8>(length & 0xFF); buffer[1] = static_cast<uint8>((length >> 8) & 0xFF); Modified: trunk/OpenMPT/soundlib/Load_ult.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ult.cpp 2013-04-11 22:59:30 UTC (rev 1851) +++ trunk/OpenMPT/soundlib/Load_ult.cpp 2013-04-12 13:19:24 UTC (rev 1852) @@ -240,15 +240,15 @@ { uint32 off = ((param1 << 8) | param2) >> 6; cmd1 = CMD_NONE; - param1 = (uint8)min(off, 0xFF); + param1 = (uint8)MIN(off, 0xFF); } else if(cmd1 == CMD_OFFSET) { uint32 off = param1 * 4; - param1 = (uint8)min(off, 0xFF); + param1 = (uint8)MIN(off, 0xFF); } else if(cmd2 == CMD_OFFSET) { uint32 off = param2 * 4; - param... [truncated message content] |
From: <man...@us...> - 2013-04-12 13:35:43
|
Revision: 1853 http://sourceforge.net/p/modplug/code/1853 Author: manxorist Date: 2013-04-12 13:35:31 +0000 (Fri, 12 Apr 2013) Log Message: ----------- [Ref] Replace Util::Min and Util::Max with std::min and std::max. Modified Paths: -------------- trunk/OpenMPT/common/misc_util.h trunk/OpenMPT/mptrack/AbstractVstEditor.cpp trunk/OpenMPT/mptrack/CleanupSong.cpp trunk/OpenMPT/mptrack/Ctrl_pat.h trunk/OpenMPT/mptrack/Ctrl_seq.cpp trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/Mainbar.cpp trunk/OpenMPT/mptrack/Mod2wave.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/Undo.cpp trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/VstPresets.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/soundlib/ITCompression.cpp trunk/OpenMPT/soundlib/LOAD_AMF.CPP trunk/OpenMPT/soundlib/LOAD_DMF.CPP trunk/OpenMPT/soundlib/Load_ams.cpp trunk/OpenMPT/soundlib/Load_imf.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_mod.cpp trunk/OpenMPT/soundlib/Load_mtm.cpp trunk/OpenMPT/soundlib/Load_psm.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Load_stm.cpp trunk/OpenMPT/soundlib/Load_ult.cpp trunk/OpenMPT/soundlib/Load_wav.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Message.cpp trunk/OpenMPT/soundlib/ModSequence.cpp trunk/OpenMPT/soundlib/SampleFormats.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp trunk/OpenMPT/soundlib/WAVTools.cpp trunk/OpenMPT/soundlib/XMTools.cpp trunk/OpenMPT/soundlib/load_j2b.cpp trunk/OpenMPT/soundlib/modsmp_ctrl.cpp trunk/OpenMPT/soundlib/pattern.cpp trunk/OpenMPT/soundlib/plugins/PluginEventQueue.h Modified: trunk/OpenMPT/common/misc_util.h =================================================================== --- trunk/OpenMPT/common/misc_util.h 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/common/misc_util.h 2013-04-12 13:35:31 UTC (rev 1853) @@ -259,14 +259,8 @@ template <> struct NumericTraits<uint64> {static const uint64 maxValue = uint64_max; static const uint64 minValue = 0;}; template <> struct NumericTraits<unsigned long> {static const unsigned long maxValue = ULONG_MAX; static const unsigned long minValue = 0;}; - // Like std::max, but avoids conflict with max-macro. - template <class T> inline const T& Max(const T& a, const T& b) {return (std::max)(a, b);} - - // Like std::min, but avoids conflict with min-macro. - template <class T> inline const T& Min(const T& a, const T& b) {return (std::min)(a, b);} - // Minimum of 3 values - template <class T> inline const T& Min(const T& a, const T& b, const T& c) {return Min(Min(a, b), c);} + template <class T> inline const T& Min(const T& a, const T& b, const T& c) {return std::min(std::min(a, b), c);} // Returns maximum value of given integer type. template <class T> inline T MaxValueOfType(const T&) {static_assert(std::numeric_limits<T>::is_integer == true, "Only integer types are allowed."); return (std::numeric_limits<T>::max)();} Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -478,7 +478,7 @@ m_pPresetMenuGroup[bank]->CreatePopupMenu(); CString label; - label.Format("Bank %d (%d-%d)", bank + 1, prog, Util::Min(prog + PRESETS_PER_GROUP - 1, numProgs)); + label.Format("Bank %d (%d-%d)", bank + 1, prog, std::min(prog + PRESETS_PER_GROUP - 1, numProgs)); m_PresetMenu.AppendMenu(MF_POPUP | (bank % 32 == 0 ? MF_MENUBREAK : 0), reinterpret_cast<UINT_PTR>(m_pPresetMenuGroup[bank]->m_hMenu), label); } } Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp =================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -582,7 +582,7 @@ loopLength = sample.nLoopEnd; if(sample.uFlags[CHN_SUSTAINLOOP]) { - loopLength = Util::Max(sample.nLoopEnd, sample.nSustainEnd); + loopLength = std::max(sample.nLoopEnd, sample.nSustainEnd); } } @@ -608,7 +608,7 @@ // Sustain loop is played before normal loop, and it can actually be located after the normal loop. if(sample.uFlags[CHN_SUSTAINLOOP]) { - loopLength = Util::Max(sample.nLoopEnd, sample.nSustainEnd); + loopLength = std::max(sample.nLoopEnd, sample.nSustainEnd); } } Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.h 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/mptrack/Ctrl_pat.h 2013-04-12 13:35:31 UTC (rev 1853) @@ -80,7 +80,7 @@ ORDERINDEX GetMargins() { return GetMargins(GetMarginsMax()); } // Returns the effective margin value. - ORDERINDEX GetMargins(const ORDERINDEX maxMargins) const { return Util::Min(maxMargins, static_cast<ORDERINDEX>(m_nOrderlistMargins)); } + ORDERINDEX GetMargins(const ORDERINDEX maxMargins) const { return std::min(maxMargins, static_cast<ORDERINDEX>(m_nOrderlistMargins)); } // Returns maximum margin value given current window width. ORDERINDEX GetMarginsMax() { return GetMarginsMax(GetLength()); } Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -293,7 +293,7 @@ { // Must move first shown sequence item to left in order to show // the new active order. - m_nXScroll = Util::Max(ORDERINDEX(0), static_cast<ORDERINDEX>(nOrder - nMargins)); + m_nXScroll = std::max(ORDERINDEX(0), static_cast<ORDERINDEX>(nOrder - nMargins)); SetScrollPos(SB_HORZ, m_nXScroll); InvalidateRect(NULL, FALSE); } else @@ -682,7 +682,7 @@ if(sndFile.Order.GetLength() > maxEntries) { // Only computed if potentially needed. - maxEntries = Util::Max(maxEntries, sndFile.Order.GetLengthTailTrimmed()); + maxEntries = std::max(maxEntries, sndFile.Order.GetLengthTailTrimmed()); } // Scrolling the shown orders(the showns rectangles)? @@ -737,7 +737,7 @@ { if(nPat == sndFile.Order.GetInvalidPatIndex()) strcpy(s, "---"); else if(nPat == sndFile.Order.GetIgnoreIndex()) strcpy(s, "+++"); - else if(nPat < Util::Max(sndFile.Patterns.Size(), sndFile.GetModSpecifications().patternsMax)) wsprintf(s, "%u", nPat); + else if(nPat < std::max(sndFile.Patterns.Size(), sndFile.GetModSpecifications().patternsMax)) wsprintf(s, "%u", nPat); else strcpy(s, "???"); } Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -2011,7 +2011,7 @@ m_pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_replace); // Swap sample buffer pointer to new buffer, update song + sample data & free old sample buffer - ctrlSmp::ReplaceSample(sample, (LPSTR)pNewSample, Util::Min(nLengthCounter, nNewSampleLength), *m_pSndFile); + ctrlSmp::ReplaceSample(sample, (LPSTR)pNewSample, std::min(nLengthCounter, nNewSampleLength), *m_pSndFile); // Free progress bar brushes DeleteObject((HBRUSH)green); Modified: trunk/OpenMPT/mptrack/Mainbar.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mainbar.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/mptrack/Mainbar.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -518,10 +518,10 @@ { if (n < 0) { - pSndFile->m_nMusicSpeed = Util::Max(UINT(nCurrentSpeed - 1), pSndFile->GetModSpecifications().speedMin); + pSndFile->m_nMusicSpeed = std::max(UINT(nCurrentSpeed - 1), pSndFile->GetModSpecifications().speedMin); } else { - pSndFile->m_nMusicSpeed = Util::Min(UINT(nCurrentSpeed + 1), pSndFile->GetModSpecifications().speedMax); + pSndFile->m_nMusicSpeed = std::min(UINT(nCurrentSpeed + 1), pSndFile->GetModSpecifications().speedMax); } m_SpinSpeed.SetPos(0); } @@ -1162,7 +1162,7 @@ if(horizontal) { - const int cx = Util::Max(1, rect.Width()); + const int cx = std::max(1, rect.Width()); int v = (vu * cx) >> 8; for(int rx = rect.left; rx <= rect.right; rx += 2) @@ -1182,7 +1182,7 @@ lastV[index] = v; } else { - const int cy = Util::Max(1, rect.Height()); + const int cy = std::max(1, rect.Height()); int v = (vu * cy) >> 8; for(int ry = rect.bottom - 1; ry > rect.top; ry -= 2) Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mod2wave.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/mptrack/Mod2wave.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -750,7 +750,7 @@ // calculate maximum samples ULONGLONG max = ullMaxSamples; - ULONGLONG l = ((ULONGLONG)m_pSndFile->GetSongTime()) * m_pWaveFormat->nSamplesPerSec * (ULONGLONG)Util::Max(1, 1 + m_pSndFile->GetRepeatCount()); + ULONGLONG l = ((ULONGLONG)m_pSndFile->GetSongTime()) * m_pWaveFormat->nSamplesPerSec * (ULONGLONG)std::max(1, 1 + m_pSndFile->GetRepeatCount()); if (m_nMaxPatterns > 0) { DWORD dwOrds = m_pSndFile->Order.GetLengthFirstEmpty(); Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -1033,7 +1033,7 @@ pChn->nPosLo = 0; pChn->nLoopStart = loopStart; pChn->nLoopEnd = loopEnd; - pChn->nLength = Util::Min(loopEnd, pChn->pModSample->nLength); + pChn->nLength = std::min(loopEnd, pChn->pModSample->nLength); } // Handle extra-loud flag @@ -1726,7 +1726,7 @@ m_SndFile.SetRepeatCount(0); } else { - m_SndFile.SetRepeatCount(Util::Max(0, wsdlg.loopCount - 1)); + m_SndFile.SetRepeatCount(std::max(0, wsdlg.loopCount - 1)); } CDoWaveConvert dwcdlg(&m_SndFile, thisName, &wsdlg.WaveFormat.Format, wsdlg.m_bNormalize, pMainFrm); @@ -2712,7 +2712,7 @@ CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); if(pMainFrm != nullptr) { - pMainFrm->SetElapsedTime(Util::Max(0.0, t)); + pMainFrm->SetElapsedTime(std::max(0.0, t)); } } Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -274,7 +274,7 @@ const SAMPLEINDEX oldNumSamples = m_SndFile.GetNumSamples(), newNumSamples = static_cast<SAMPLEINDEX>(newOrder.size()); - for(SAMPLEINDEX i = 0; i < Util::Min(newNumSamples, oldNumSamples); i++) + for(SAMPLEINDEX i = 0; i < std::min(newNumSamples, oldNumSamples); i++) { if(newOrder[i] != i + 1) { Modified: trunk/OpenMPT/mptrack/Undo.cpp =================================================================== --- trunk/OpenMPT/mptrack/Undo.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/mptrack/Undo.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -140,7 +140,7 @@ { // Add or remove channels vector<CHANNELINDEX> channels(undo.channelInfo->oldNumChannels, CHANNELINDEX_INVALID); - const CHANNELINDEX copyCount = Util::Min(sndFile.GetNumChannels(), undo.channelInfo->oldNumChannels); + const CHANNELINDEX copyCount = std::min(sndFile.GetNumChannels(), undo.channelInfo->oldNumChannels); for(CHANNELINDEX i = 0; i < copyCount; i++) { channels[i] = i; Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -328,7 +328,7 @@ tickDiff = envelope->Ticks[nPoint] - tickDiff; for(uint32 i = nPoint + 1; i < envelope->nNodes; i++) { - envelope->Ticks[i] = (uint16)(Util::Max(0, (int)envelope->Ticks[i] + tickDiff)); + envelope->Ticks[i] = (uint16)(std::max(0, (int)envelope->Ticks[i] + tickDiff)); } } @@ -2511,7 +2511,7 @@ if (nFlags == MK_CONTROL) { // Speed up zoom scrolling by some factor (might need some tuning). - const float speedUpFactor = Util::Max(1.0f, m_fZoom * 7.0f / ENV_MAX_ZOOM); + const float speedUpFactor = std::max(1.0f, m_fZoom * 7.0f / ENV_MAX_ZOOM); EnvSetZoom(m_fZoom + speedUpFactor * (zDelta / WHEEL_DELTA)); } Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -2901,7 +2901,7 @@ // Don't allow notes outside our supported note range. const ModCommand::NOTE noteMin = pSndFile->GetModSpecifications().noteMin; const ModCommand::NOTE noteMax = pSndFile->GetModSpecifications().noteMax; - const int instrMax = Util::Min(static_cast<int>(Util::MaxValueOfType(ModCommand::INSTR())), static_cast<int>(pSndFile->GetNumInstruments() ? pSndFile->GetModSpecifications().instrumentsMax : pSndFile->GetModSpecifications().samplesMax)); + const int instrMax = std::min(static_cast<int>(Util::MaxValueOfType(ModCommand::INSTR())), static_cast<int>(pSndFile->GetNumInstruments() ? pSndFile->GetModSpecifications().instrumentsMax : pSndFile->GetModSpecifications().samplesMax)); const EffectInfo effectInfo(*pSndFile); const int offset = up ? 1 : -1; Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -2790,7 +2790,7 @@ // Solve samplesPerPixel from [2], then "m_nZoom" from [1]. float zoom = static_cast<float>(smp.nLength) / static_cast<float>(m_rcClient.Width()); zoom = 1 + (log10(zoom) / log10(2.0f)); - return static_cast<UINT>(Util::Max(zoom + 1, MIN_ZOOM + 1.0f)); + return static_cast<UINT>(std::max(zoom + 1, MIN_ZOOM + 1.0f)); } Modified: trunk/OpenMPT/mptrack/View_tre.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/mptrack/View_tre.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -2122,8 +2122,8 @@ if(Reporting::Confirm(_T("Replace the current orderlist?"), _T("Sequence import")) == cnfNo) return false; } - pSndFile->Order.resize(Util::Min(pSndFile->GetModSpecifications().ordersMax, pOrigSeq->GetLength()), pSndFile->Order.GetInvalidPatIndex()); - for(ORDERINDEX nOrd = 0; nOrd < Util::Min(pSndFile->GetModSpecifications().ordersMax, pOrigSeq->GetLengthTailTrimmed()); nOrd++) + pSndFile->Order.resize(std::min(pSndFile->GetModSpecifications().ordersMax, pOrigSeq->GetLength()), pSndFile->Order.GetInvalidPatIndex()); + for(ORDERINDEX nOrd = 0; nOrd < std::min(pSndFile->GetModSpecifications().ordersMax, pOrigSeq->GetLengthTailTrimmed()); nOrd++) { PATTERNINDEX nOrigPat = pDragSndFile->Order.GetSequence(nOrigSeq)[nOrd]; // translate pattern index Modified: trunk/OpenMPT/mptrack/VstPresets.cpp =================================================================== --- trunk/OpenMPT/mptrack/VstPresets.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/mptrack/VstPresets.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -135,7 +135,7 @@ // Write unfinished header... We need to update the size once we're done writing. Write(header, f); - uint32 numProgs = Util::Max(plugin.GetNumPrograms(), VstInt32(1)), curProg = plugin.GetCurrentProgram(); + uint32 numProgs = std::max(plugin.GetNumPrograms(), VstInt32(1)), curProg = plugin.GetCurrentProgram(); WriteBE(numProgs, f); WriteBE(curProg, f); char reserved[124]; Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -1537,14 +1537,14 @@ VstInt32 CVstPlugin::GetNumPrograms() //----------------------------------- { - return Util::Max(m_Effect.numPrograms, VstInt32(0)); + return std::max(m_Effect.numPrograms, VstInt32(0)); } PlugParamIndex CVstPlugin::GetNumParameters() //------------------------------------------- { - return Util::Max(m_Effect.numParams, VstInt32(0)); + return std::max(m_Effect.numParams, VstInt32(0)); } @@ -2421,7 +2421,7 @@ bool bankChanged = (channel.currentBank != --wMidiBank) && (wMidiBank < 0x4000); bool progChanged = (channel.currentProgram != --nMidiProg) && (nMidiProg < 0x80); //get vol in [0,128[ - uint8 volume = static_cast<uint8>(Util::Min(vol / 2, 127)); + uint8 volume = static_cast<uint8>(std::min(vol / 2, 127)); // Bank change if(wMidiBank < 0x4000 && bankChanged) Modified: trunk/OpenMPT/soundlib/ITCompression.cpp =================================================================== --- trunk/OpenMPT/soundlib/ITCompression.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/ITCompression.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -119,7 +119,7 @@ void ITCompression::Compress(const void *data, SmpLength offset, SmpLength actualLength) //-------------------------------------------------------------------------------------- { - baseLength = Util::Min(actualLength, SmpLength(blockSize / sizeof(Properties::sample_t))); + baseLength = std::min(actualLength, SmpLength(blockSize / sizeof(Properties::sample_t))); CopySample<Properties::sample_t>(sampleData, data, offset, baseLength, mptSample.GetNumChannels()); @@ -374,7 +374,7 @@ void ITDecompression::Uncompress(void *target) //-------------------------------------------- { - curLength = Util::Min(mptSample.nLength - writtenSamples, SmpLength(ITCompression::blockSize / sizeof(Properties::sample_t))); + curLength = std::min(mptSample.nLength - writtenSamples, SmpLength(ITCompression::blockSize / sizeof(Properties::sample_t))); int width = Properties::defWidth; while(curLength > 0) Modified: trunk/OpenMPT/soundlib/LOAD_AMF.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_AMF.CPP 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/LOAD_AMF.CPP 2013-04-12 13:35:31 UTC (rev 1853) @@ -56,7 +56,7 @@ { mptSmp.Initialize(); mptSmp.nFineTune = MOD2XMFineTune(finetune); - mptSmp.nVolume = Util::Min(defaultVolume, uint8(64)) * 4u; + mptSmp.nVolume = std::min(defaultVolume, uint8(64)) * 4u; mptSmp.RelativeTone = transpose; mptSmp.nLength = length; @@ -272,7 +272,7 @@ // 03: Volume case 0x03: - param = Util::Min(param, uint8(64)); + param = std::min(param, uint8(64)); if(m.volcmd == VOLCMD_NONE || m.volcmd == VOLCMD_VOLUME) { m.volcmd = VOLCMD_VOLUME; @@ -465,7 +465,7 @@ } sample.nC5Speed = file.ReadUint16LE(); - sample.nVolume = Util::Min(file.ReadUint8(), uint8(64)) * 4u; + sample.nVolume = std::min(file.ReadUint8(), uint8(64)) * 4u; if(fileHeader.version < 10) { @@ -497,7 +497,7 @@ sample.nLoopStart = sample.nLoopEnd = 0; } - maxSamplePos = Util::Max(maxSamplePos, samplePos[smp - 1]); + maxSamplePos = std::max(maxSamplePos, samplePos[smp - 1]); } } @@ -507,7 +507,7 @@ uint16 trackCount = 0; for(vector<uint16>::const_iterator i = trackMap.begin(); i != trackMap.end(); i++) { - trackCount = Util::Max(trackCount, *i); + trackCount = std::max(trackCount, *i); } // Store Tracks Positions Modified: trunk/OpenMPT/soundlib/LOAD_DMF.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2013-04-12 13:35:31 UTC (rev 1853) @@ -390,7 +390,7 @@ } PatternRow m = sndFile.Patterns[pat].GetRow(0); - const CHANNELINDEX numChannels = Util::Min(sndFile.GetNumChannels(), CHANNELINDEX(patHead.numTracks)); + const CHANNELINDEX numChannels = std::min(sndFile.GetNumChannels(), CHANNELINDEX(patHead.numTracks)); // When breaking to a pattern with less channels that the previous pattern, // all voices in the now unused channels are killed: @@ -431,7 +431,7 @@ { case 1: // Set Tick Frame Speed settings.realBPMmode = false; - settings.tempoTicks = Util::Max(uint8(1), globalData); // Tempo in 1/4 rows per second + settings.tempoTicks = std::max(uint8(1), globalData); // Tempo in 1/4 rows per second settings.tempoBPM = 0; // Automatically updated by X-Tracker tempoChange = true; break; @@ -514,7 +514,7 @@ // For some reason, using settings.tempoTicks + 1 gives more accurate results than just settings.tempoTicks... (same problem in the old libmodplug DMF loader) // Original unoptimized formula: //const int tickspeed = (tempoRealBPMmode) ? MAX(1, (tempoData * beat * 4) / 60) : tempoData; - const int tickspeed = (settings.realBPMmode) ? Util::Max(1, settings.tempoBPM * settings.beat * 2) : ((settings.tempoTicks + 1) * 30); + const int tickspeed = (settings.realBPMmode) ? std::max(1, settings.tempoBPM * settings.beat * 2) : ((settings.tempoTicks + 1) * 30); // Try to find matching speed - try higher speeds first, so that effects like arpeggio and tremor work better. for(speed = 255; speed > 1; speed--) { @@ -975,7 +975,7 @@ { return false; } - const ORDERINDEX numOrders = Util::Min(MAX_ORDERS, static_cast<ORDERINDEX>((chunk.GetLength() - sizeof(DMFSequence)) / 2)); + const ORDERINDEX numOrders = std::min(MAX_ORDERS, static_cast<ORDERINDEX>((chunk.GetLength() - sizeof(DMFSequence)) / 2)); Order.resize(numOrders, Order.GetInvalidPatIndex()); for(ORDERINDEX i = 0; i < numOrders; i++) Modified: trunk/OpenMPT/soundlib/Load_ams.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ams.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/Load_ams.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -170,7 +170,7 @@ case CMD_VOLUME: m.command = CMD_NONE; m.volcmd = VOLCMD_VOLUME; - m.vol = static_cast<ModCommand::VOL>(Util::Min((m.param + 1) / 2, 64)); + m.vol = static_cast<ModCommand::VOL>(std::min((m.param + 1) / 2, 64)); break; case CMD_MODCMDEX: @@ -206,13 +206,13 @@ case 0x11: case 0x12: // Extra fine slides - m.param = static_cast<ModCommand::PARAM>(Util::Min(uint8(0x0F), m.param) | 0xE0); + m.param = static_cast<ModCommand::PARAM>(std::min(uint8(0x0F), m.param) | 0xE0); break; case 0x15: case 0x16: // Fine slides - m.param = static_cast<ModCommand::PARAM>((Util::Min(0x10, m.param + 1) / 2) | 0xF0); + m.param = static_cast<ModCommand::PARAM>((std::min(0x10, m.param + 1) / 2) | 0xF0); break; case 0x1E: @@ -247,7 +247,7 @@ case 0x1C: // Adjust channel volume range - m.param = static_cast<ModCommand::PARAM>(Util::Min((m.param + 1) / 2, 64)); + m.param = static_cast<ModCommand::PARAM>(std::min((m.param + 1) / 2, 64)); break; } } @@ -339,10 +339,10 @@ mptSmp.Initialize(); mptSmp.nLength = length; - mptSmp.nLoopStart = Util::Min(loopStart, length); - mptSmp.nLoopEnd = Util::Min(loopEnd, length); + mptSmp.nLoopStart = std::min(loopStart, length); + mptSmp.nLoopEnd = std::min(loopEnd, length); - mptSmp.nVolume = (Util::Min(uint8(127), volume) * 256 + 64) / 127; + mptSmp.nVolume = (std::min(uint8(127), volume) * 256 + 64) / 127; if(panFinetune & 0xF0) { mptSmp.nPan = (panFinetune & 0xF0); @@ -541,7 +541,7 @@ } STATIC_ASSERT(MAX_ENVPOINTS >= CountOf(data)); - mptEnv.nNodes = Util::Min(numPoints, uint8(CountOf(data))); + mptEnv.nNodes = std::min(numPoints, uint8(CountOf(data))); mptEnv.nLoopStart = loopStart; mptEnv.nLoopEnd = loopEnd; mptEnv.nSustainStart = mptEnv.nSustainEnd = sustainPoint; @@ -550,7 +550,7 @@ { if(i != 0) { - mptEnv.Ticks[i] = mptEnv.Ticks[i - 1] + static_cast<uint16>(Util::Max(1, data[i][0] | ((data[i][1] & 0x01) << 8))); + mptEnv.Ticks[i] = mptEnv.Ticks[i - 1] + static_cast<uint16>(std::max(1, data[i][0] | ((data[i][1] & 0x01) << 8))); } mptEnv.Values[i] = data[i][2]; } @@ -645,8 +645,8 @@ mptSmp.Initialize(); mptSmp.nLength = length; - mptSmp.nLoopStart = Util::Min(loopStart, length); - mptSmp.nLoopEnd = Util::Min(loopEnd, length); + mptSmp.nLoopStart = std::min(loopStart, length); + mptSmp.nLoopEnd = std::min(loopEnd, length); mptSmp.nC5Speed = c4speed * 2; if(c4speed == 0) @@ -657,7 +657,7 @@ uint32 newC4speed = ModSample::TransposeToFrequency(relativeTone, MOD2XMFineTune(panFinetune & 0x0F)); mptSmp.nC5Speed = (mptSmp.nC5Speed * newC4speed) / 8363; - mptSmp.nVolume = (Util::Min(uint8(127), volume) * 256 + 64) / 127; + mptSmp.nVolume = (std::min(uint8(127), volume) * 256 + 64) / 127; if(panFinetune & 0xF0) { mptSmp.nPan = (panFinetune & 0xF0); @@ -717,14 +717,14 @@ uint16 headerFlags; if(fileHeader.format == 0x202) { - m_nDefaultTempo = Util::Max(uint8(32), static_cast<uint8>(file.ReadUint16LE() >> 8)); // 16.16 Tempo - m_nDefaultSpeed = Util::Max(uint8(1), file.ReadUint8()); + m_nDefaultTempo = std::max(uint8(32), static_cast<uint8>(file.ReadUint16LE() >> 8)); // 16.16 Tempo + m_nDefaultSpeed = std::max(uint8(1), file.ReadUint8()); file.Skip(3); // Default values for pattern editor headerFlags = file.ReadUint16LE(); } else if(fileHeader.format == 0x201) { - m_nDefaultTempo = Util::Max(uint8(32), file.ReadUint8()); - m_nDefaultSpeed = Util::Max(uint8(1), file.ReadUint8()); + m_nDefaultTempo = std::max(uint8(32), file.ReadUint8()); + m_nDefaultSpeed = std::max(uint8(1), file.ReadUint8()); headerFlags = file.ReadUint8(); } else { @@ -793,9 +793,9 @@ // Scale envelopes to correct range for(size_t i = 0; i < MAX_ENVPOINTS; i++) { - instrument->VolEnv.Values[i] = Util::Min(uint8(ENVELOPE_MAX), static_cast<uint8>((instrument->VolEnv.Values[i] * ENVELOPE_MAX + 64u) / 127u)); - instrument->PanEnv.Values[i] = Util::Min(uint8(ENVELOPE_MAX), static_cast<uint8>((instrument->PanEnv.Values[i] * ENVELOPE_MAX + 128u) / 255u)); - instrument->PitchEnv.Values[i] = Util::Min(uint8(ENVELOPE_MAX), static_cast<uint8>(32 + (static_cast<int8>(instrument->PitchEnv.Values[i] - 128) * vibAmp) / 255)); + instrument->VolEnv.Values[i] = std::min(uint8(ENVELOPE_MAX), static_cast<uint8>((instrument->VolEnv.Values[i] * ENVELOPE_MAX + 64u) / 127u)); + instrument->PanEnv.Values[i] = std::min(uint8(ENVELOPE_MAX), static_cast<uint8>((instrument->PanEnv.Values[i] * ENVELOPE_MAX + 128u) / 255u)); + instrument->PitchEnv.Values[i] = std::min(uint8(ENVELOPE_MAX), static_cast<uint8>(32 + (static_cast<int8>(instrument->PitchEnv.Values[i] - 128) * vibAmp) / 255)); } // Sample headers - we will have to read them even for shadow samples, and we will have to load them several times, @@ -819,7 +819,7 @@ } firstSample.push_back(firstSmp); - m_nSamples = static_cast<SAMPLEINDEX>(Util::Min(MAX_SAMPLES - 1, GetNumSamples() + numSamples)); + m_nSamples = static_cast<SAMPLEINDEX>(std::min(MAX_SAMPLES - 1, GetNumSamples() + numSamples)); } // Text @@ -857,7 +857,7 @@ { c = textIn[readLen++]; uint32 count = textIn[readLen++]; - for(size_t i = Util::Min(descriptionHeader.unpackedLen - writeLen, count); i != 0; i--) + for(size_t i = std::min(descriptionHeader.unpackedLen - writeLen, count); i != 0; i--) { textOut[writeLen++] = c; } @@ -980,7 +980,7 @@ if(--i != 0 && ch == packCharacter) { uint8 repCount = *(in++); - repCount = static_cast<uint8>(Util::Min(static_cast<size_t>(repCount), j)); + repCount = static_cast<uint8>(std::min(static_cast<size_t>(repCount), j)); if(--i != 0 && repCount) { ch = *(in++); Modified: trunk/OpenMPT/soundlib/Load_imf.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_imf.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/Load_imf.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -117,9 +117,9 @@ uint16 minTick = 0; // minimum tick value for next node for(uint32 n = 0; n < mptEnv.nNodes; n++) { - minTick = mptEnv.Ticks[n] = Util::Max(minTick, nodes[e][n].tick); + minTick = mptEnv.Ticks[n] = std::max(minTick, nodes[e][n].tick); minTick++; - mptEnv.Values[n] = static_cast<uint8>(Util::Min(nodes[e][n].value >> shift, ENVELOPE_MAX)); + mptEnv.Values[n] = static_cast<uint8>(std::min(nodes[e][n].value >> shift, ENVELOPE_MAX)); } } Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -403,8 +403,8 @@ m_nDefaultGlobalVolume = fileHeader.globalvol << 1; if(m_nDefaultGlobalVolume > MAX_GLOBAL_VOLUME) m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME; if(fileHeader.speed) m_nDefaultSpeed = fileHeader.speed; - m_nDefaultTempo = Util::Max(uint8(32), fileHeader.tempo); // Tempo 31 is possible. due to conflicts with the rest of the engine, let's just clamp it to 32. - m_nSamplePreAmp = Util::Min(fileHeader.mv, uint8(128)); + m_nDefaultTempo = std::max(uint8(32), fileHeader.tempo); // Tempo 31 is possible. due to conflicts with the rest of the engine, let's just clamp it to 32. + m_nSamplePreAmp = std::min(fileHeader.mv, uint8(128)); // Reading Channels Pan Positions for(CHANNELINDEX i = 0; i < 64; i++) if(fileHeader.chnpan[i] != 0xFF) @@ -461,7 +461,7 @@ { if(insPos[n] > 0) { - minPtr = Util::Min(minPtr, insPos[n]); + minPtr = std::min(minPtr, insPos[n]); } } @@ -469,7 +469,7 @@ { if(smpPos[n] > 0) { - minPtr = Util::Min(minPtr, smpPos[n]); + minPtr = std::min(minPtr, smpPos[n]); } } @@ -477,13 +477,13 @@ { if(patPos[n] > 0) { - minPtr = Util::Min(minPtr, patPos[n]); + minPtr = std::min(minPtr, patPos[n]); } } if(fileHeader.special & ITFileHeader::embedSongMessage) { - minPtr = Util::Min(minPtr, fileHeader.msgoffset); + minPtr = std::min(minPtr, fileHeader.msgoffset); } // Reading IT Edit History Info @@ -557,7 +557,7 @@ if(file.ReadMagic("CNAM")) { FileReader chnNames = file.GetChunk(file.ReadUint32LE()); - const CHANNELINDEX readChns = Util::Min(MAX_BASECHANNELS, static_cast<CHANNELINDEX>(chnNames.GetLength() / MAX_CHANNELNAME)); + const CHANNELINDEX readChns = std::min(MAX_BASECHANNELS, static_cast<CHANNELINDEX>(chnNames.GetLength() / MAX_CHANNELNAME)); m_nChannels = readChns; for(CHANNELINDEX i = 0; i < readChns; i++) @@ -588,7 +588,7 @@ m_nInstruments = 0; if(fileHeader.flags & ITFileHeader::instrumentMode) { - m_nInstruments = Util::Min(fileHeader.insnum, INSTRUMENTINDEX(MAX_INSTRUMENTS - 1)); + m_nInstruments = std::min(fileHeader.insnum, INSTRUMENTINDEX(MAX_INSTRUMENTS - 1)); } for(INSTRUMENTINDEX i = 0; i < GetNumInstruments(); i++) { @@ -614,7 +614,7 @@ } // Reading Samples - m_nSamples = Util::Min(fileHeader.smpnum, SAMPLEINDEX(MAX_SAMPLES - 1)); + m_nSamples = std::min(fileHeader.smpnum, SAMPLEINDEX(MAX_SAMPLES - 1)); for(SAMPLEINDEX i = 0; i < GetNumSamples(); i++) { ITSample sampleHeader; @@ -629,12 +629,12 @@ if(file.Seek(sampleOffset)) { sampleHeader.GetSampleFormat(fileHeader.cwtv).ReadSample(Samples[i + 1], file); - lastSampleOffset = Util::Max(lastSampleOffset, file.GetPosition()); + lastSampleOffset = std::max(lastSampleOffset, file.GetPosition()); } } } } - m_nSamples = Util::Max(SAMPLEINDEX(1), GetNumSamples()); + m_nSamples = std::max(SAMPLEINDEX(1), GetNumSamples()); m_nMinPeriod = 8; m_nMaxPeriod = 0xF000; @@ -653,7 +653,7 @@ } LoadExtendedSongProperties(GetType(), file, &interpretModPlugMade); - const PATTERNINDEX numPats = Util::Min(static_cast<PATTERNINDEX>(patPos.size()), GetModSpecifications().patternsMax); + const PATTERNINDEX numPats = std::min(static_cast<PATTERNINDEX>(patPos.size()), GetModSpecifications().patternsMax); if(numPats != patPos.size()) { @@ -725,7 +725,7 @@ } } // Reading Patterns - Patterns.ResizeArray(Util::Max(MAX_PATTERNS, numPats)); + Patterns.ResizeArray(std::max(MAX_PATTERNS, numPats)); for(PATTERNINDEX pat = 0; pat < numPats; pat++) { if(patPos[pat] == 0 || !file.Seek(patPos[pat])) @@ -1026,8 +1026,8 @@ itHeader.id = ITFileHeader::itMagic; StringFixer::WriteString<StringFixer::nullTerminated>(itHeader.songname, m_szNames[0]); - itHeader.highlight_minor = (uint8)Util::Min(m_nDefaultRowsPerBeat, ROWINDEX(uint8_max)); - itHeader.highlight_major = (uint8)Util::Min(m_nDefaultRowsPerMeasure, ROWINDEX(uint8_max)); + itHeader.highlight_minor = (uint8)std::min(m_nDefaultRowsPerBeat, ROWINDEX(uint8_max)); + itHeader.highlight_major = (uint8)std::min(m_nDefaultRowsPerMeasure, ROWINDEX(uint8_max)); if(GetType() == MOD_TYPE_MPT) { @@ -1040,13 +1040,13 @@ { // An additional "---" pattern is appended so Impulse Tracker won't ignore the last order item. // Interestingly, this can exceed IT's 256 order limit. Also, IT will always save at least two orders. - itHeader.ordnum = Util::Min(Order.GetLengthTailTrimmed(), specs.ordersMax) + 1; + itHeader.ordnum = std::min(Order.GetLengthTailTrimmed(), specs.ordersMax) + 1; if(itHeader.ordnum < 2) itHeader.ordnum = 2; } - itHeader.insnum = Util::Min(m_nInstruments, specs.instrumentsMax); - itHeader.smpnum = Util::Min(m_nSamples, specs.samplesMax); - itHeader.patnum = Util::Min(Patterns.GetNumPatterns(), specs.patternsMax); + itHeader.insnum = std::min(m_nInstruments, specs.instrumentsMax); + itHeader.smpnum = std::min(m_nSamples, specs.samplesMax); + itHeader.patnum = std::min(Patterns.GetNumPatterns(), specs.patternsMax); // Parapointers vector<uint32> patpos(itHeader.patnum, 0); @@ -1289,7 +1289,7 @@ patpos[pat] = dwPos; // Write pattern header - ROWINDEX writeRows = Util::Min(Patterns[pat].GetNumRows(), ROWINDEX(uint16_max)); + ROWINDEX writeRows = std::min(Patterns[pat].GetNumRows(), ROWINDEX(uint16_max)); uint16 patinfo[4]; patinfo[0] = 0; patinfo[1] = (uint16)writeRows; @@ -2025,9 +2025,9 @@ // Case macros. #define CASE(id, data) \ - case id: fadr = reinterpret_cast<char *>(&data); maxReadCount = Util::Min(size_t(size), sizeof(data)); break; + case id: fadr = reinterpret_cast<char *>(&data); maxReadCount = std::min(size_t(size), sizeof(data)); break; #define CASE_NOTXM(id, data) \ - case id: if(modtype != MOD_TYPE_XM) { fadr = reinterpret_cast<char *>(&data); maxReadCount = Util::Min(size_t(size), sizeof(data));} break; + case id: if(modtype != MOD_TYPE_XM) { fadr = reinterpret_cast<char *>(&data); maxReadCount = std::min(size_t(size), sizeof(data));} break; while(file.BytesLeft() > 6) { @@ -2063,7 +2063,7 @@ if(size <= (MAX_BASECHANNELS - 64) * 2 && (size % 2u) == 0) { STATIC_ASSERT(CountOf(ChnSettings) >= 64); - const CHANNELINDEX loopLimit = Util::Min(uint16(size / 2), uint16(CountOf(ChnSettings) - 64)); + const CHANNELINDEX loopLimit = std::min(uint16(size / 2), uint16(CountOf(ChnSettings) - 64)); for(CHANNELINDEX i = 0; i < loopLimit; i++) { Modified: trunk/OpenMPT/soundlib/Load_mod.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mod.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/Load_mod.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -595,7 +595,7 @@ // Prevent clipping based on number of channels... If all channels are playing at full volume, "256 / #channels" // is the maximum possible sample pre-amp without getting distortion (Compatible mix levels given). // The more channels we have, the less likely it is that all of them are used at the same time, though, so clip at 32... - m_nSamplePreAmp = Util::Max(32, 256 / m_nChannels); + m_nSamplePreAmp = std::max(32, 256 / m_nChannels); m_SongFlags.reset(); // Setup channel pan positions and volume @@ -797,7 +797,7 @@ // UST only handles samples up to 9999 bytes. Master Soundtracker 1.0 and SoundTracker 2.0 introduce 32KB samples. if(sampleHeader.length > 4999 || sampleHeader.loopStart > 9999) { - minVersion = Util::Max(minVersion, MST1_00); + minVersion = std::max(minVersion, MST1_00); } } @@ -849,11 +849,11 @@ if(minVersion > UST1_80) { // D.O.C. SoundTracker IX re-introduced the variable tempo after some other versions dropped it. - minVersion = Util::Max(minVersion, hasDiskNames ? ST_IX : MST1_00); + minVersion = std::max(minVersion, hasDiskNames ? ST_IX : MST1_00); } else { // Ultimate Soundtracker 1.8 adds variable tempo - minVersion = Util::Max(minVersion, hasDiskNames ? UST1_80 : ST2_00_Exterminator); + minVersion = std::max(minVersion, hasDiskNames ? UST1_80 : ST2_00_Exterminator); } } } @@ -900,7 +900,7 @@ } else if(eff == 1 && param < 0x03) { // This doesn't look like an arpeggio. - minVersion = Util::Max(minVersion, ST2_00_Exterminator); + minVersion = std::max(minVersion, ST2_00_Exterminator); } break; case 0x0B: @@ -909,16 +909,16 @@ case 0x0C: case 0x0D: case 0x0E: - minVersion = Util::Max(minVersion, ST2_00_Exterminator); + minVersion = std::max(minVersion, ST2_00_Exterminator); if(eff == 0x0D && param == 0) { // Assume this is a pattern break command. - minVersion = Util::Max(minVersion, ST2_00); + minVersion = std::max(minVersion, ST2_00); } emptyCmds = 1; break; case 0x0F: - minVersion = Util::Max(minVersion, ST_III); + minVersion = std::max(minVersion, ST_III); break; } } @@ -1107,7 +1107,7 @@ // Write magic bytes char modMagic[6]; - CHANNELINDEX writeChannels = Util::Min(CHANNELINDEX(99), GetNumChannels()); + CHANNELINDEX writeChannels = std::min(CHANNELINDEX(99), GetNumChannels()); if(writeChannels == 4) { if(writePatterns < 64) Modified: trunk/OpenMPT/soundlib/Load_mtm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mtm.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/Load_mtm.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -64,7 +64,7 @@ void ConvertToMPT(ModSample &mptSmp) const { mptSmp.Initialize(); - mptSmp.nVolume = Util::Min(uint16(volume * 4), uint16(256)); + mptSmp.nVolume = std::min(uint16(volume * 4), uint16(256)); if(length > 2) { mptSmp.nLength = length; @@ -137,7 +137,7 @@ file.Skip(128 - readOrders); // Reading Patterns - const ROWINDEX rowsPerPat = Util::Min(ROWINDEX(fileHeader.beatsPerTrack), MAX_PATTERN_ROWS); + const ROWINDEX rowsPerPat = std::min(ROWINDEX(fileHeader.beatsPerTrack), MAX_PATTERN_ROWS); FileReader tracks = file.GetChunk(192 * fileHeader.numTracks); for(PATTERNINDEX pat = 0; pat <= fileHeader.lastPattern; pat++) Modified: trunk/OpenMPT/soundlib/Load_psm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_psm.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/Load_psm.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -1235,7 +1235,7 @@ { // volume present m.volcmd = VOLCMD_VOLUME; - m.vol = Util::Min(patternChunk.ReadUint8(), uint8(64)); + m.vol = std::min(patternChunk.ReadUint8(), uint8(64)); } if(chnFlag & effectFlag) { Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -806,7 +806,7 @@ fileHeader.usePanningTable = S3MFileHeader::idPanning; // Channel Table - const uint8 midCh = static_cast<uint8>(Util::Min(GetNumChannels() / 2, 8)); + const uint8 midCh = static_cast<uint8>(std::min(GetNumChannels() / 2, 8)); for(CHANNELINDEX chn = 0; chn < 32; chn++) { if(chn < GetNumChannels()) Modified: trunk/OpenMPT/soundlib/Load_stm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_stm.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/Load_stm.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -38,7 +38,7 @@ StringFixer::ReadString<StringFixer::nullTerminated>(mptSmp.filename, filename); mptSmp.nC5Speed = sampleRate; - mptSmp.nVolume = Util::Min(volume * 4u, 256u); + mptSmp.nVolume = std::min(volume * 4u, 256u); mptSmp.nLength = length; mptSmp.nLoopStart = loopStart; mptSmp.nLoopEnd = loopEnd; @@ -55,7 +55,7 @@ && mptSmp.nLoopEnd != 0xFFFF) { mptSmp.uFlags = CHN_LOOP; - mptSmp.nLoopEnd = Util::Min(mptSmp.nLoopEnd, mptSmp.nLength); + mptSmp.nLoopEnd = std::min(mptSmp.nLoopEnd, mptSmp.nLength); } } Modified: trunk/OpenMPT/soundlib/Load_ult.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ult.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/Load_ult.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -70,7 +70,7 @@ mptSmp.nLength = sizeEnd - sizeStart; mptSmp.nLoopStart = loopStart; - mptSmp.nLoopEnd = Util::Min(static_cast<SmpLength>(loopEnd), mptSmp.nLength); + mptSmp.nLoopEnd = std::min(static_cast<SmpLength>(loopEnd), mptSmp.nLength); mptSmp.nVolume = volume; mptSmp.nGlobalVol = 64; Modified: trunk/OpenMPT/soundlib/Load_wav.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_wav.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/Load_wav.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -55,7 +55,7 @@ return false; } - m_nChannels = Util::Max(wavFile.GetNumChannels(), uint16(2)); + m_nChannels = std::max(wavFile.GetNumChannels(), uint16(2)); if(Patterns.Insert(0, 64) || Patterns.Insert(1, 64)) { return false; @@ -66,7 +66,7 @@ // Setting up module length // Calculate sample length in ticks at tempo 125 const uint32 sampleTicks = ((sampleLength * 50) / wavFile.GetSampleRate()) + 1; - uint32 ticksPerRow = Util::Max((sampleTicks + 63u) / 63u, 1u); + uint32 ticksPerRow = std::max((sampleTicks + 63u) / 63u, 1u); Order.clear(); Order.Append(0); Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -257,7 +257,7 @@ || fileHeader.channels == 0 || fileHeader.channels > MAX_BASECHANNELS || _strnicmp(fileHeader.signature, "Extended Module: ", 17) - || !Order.ReadAsByte(file, Util::Min(ORDERINDEX(fileHeader.orders), MAX_ORDERS)) + || !Order.ReadAsByte(file, std::min(ORDERINDEX(fileHeader.orders), MAX_ORDERS)) || !file.Seek(fileHeader.size + 60)) { return false; @@ -281,7 +281,7 @@ m_nRestartPos = fileHeader.restartPos; m_nChannels = fileHeader.channels; - m_nInstruments = Util::Min(fileHeader.instruments, uint16(MAX_INSTRUMENTS - 1)); + m_nInstruments = std::min(fileHeader.instruments, uint16(MAX_INSTRUMENTS - 1)); m_nSamples = 0; m_nDefaultSpeed = Clamp(fileHeader.speed, uint16(1), uint16(31)); m_nDefaultTempo = Clamp(fileHeader.tempo, uint16(32), uint16(512)); @@ -456,7 +456,7 @@ // Read pattern names: "PNAM" if(file.ReadMagic("PNAM")) { - const PATTERNINDEX namedPats = Util::Min(static_cast<PATTERNINDEX>(file.ReadUint32LE() / MAX_PATTERNNAME), Patterns.Size()); + const PATTERNINDEX namedPats = std::min(static_cast<PATTERNINDEX>(file.ReadUint32LE() / MAX_PATTERNNAME), Patterns.Size()); for(PATTERNINDEX pat = 0; pat < namedPats; pat++) { @@ -470,7 +470,7 @@ // Read channel names: "CNAM" if(file.ReadMagic("CNAM")) { - const CHANNELINDEX namedChans = Util::Min(static_cast<CHANNELINDEX>(file.ReadUint32LE() / MAX_CHANNELNAME), GetNumChannels()); + const CHANNELINDEX namedChans = std::min(static_cast<CHANNELINDEX>(file.ReadUint32LE() / MAX_CHANNELNAME), GetNumChannels()); for(CHANNELINDEX chn = 0; chn < namedChans; chn++) { file.ReadString<StringFixer::maybeNullTerminated>(ChnSettings[chn].szName, MAX_CHANNELNAME); Modified: trunk/OpenMPT/soundlib/Message.cpp =================================================================== --- trunk/OpenMPT/soundlib/Message.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/Message.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -166,7 +166,7 @@ for(size_t line = 0, fpos = 0, cpos = 0; line < numLines; line++, fpos += (lineLength + lineEndingLength), cpos += (lineLength + 1)) { - memcpy(m_lpszSongComments + cpos, data + fpos, Util::Min(lineLength, length - fpos)); + memcpy(m_lpszSongComments + cpos, data + fpos, std::min(lineLength, length - fpos)); m_lpszSongComments[cpos + lineLength] = INTERNAL_LINEENDING; // fix weird chars Modified: trunk/OpenMPT/soundlib/ModSequence.cpp =================================================================== --- trunk/OpenMPT/soundlib/ModSequence.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/ModSequence.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -156,7 +156,7 @@ { const ORDERINDEX nLength = GetLength(); if(nLength == 0) return 0; - ORDERINDEX next = Util::Min(ORDERINDEX(nLength - 1), ORDERINDEX(start + 1)); + ORDERINDEX next = std::min(ORDERINDEX(nLength - 1), ORDERINDEX(start + 1)); while(next+1 < nLength && (*this)[next] == GetIgnoreIndex()) next++; return next; } @@ -167,7 +167,7 @@ { const ORDERINDEX nLength = GetLength(); if(start == 0 || nLength == 0) return 0; - ORDERINDEX prev = Util::Min(ORDERINDEX(start - 1), ORDERINDEX(nLength - 1)); + ORDERINDEX prev = std::min(ORDERINDEX(start - 1), ORDERINDEX(nLength - 1)); while(prev > 0 && (*this)[prev] == GetIgnoreIndex()) prev--; return prev; } @@ -583,7 +583,7 @@ } // Remove order name + fill up with empty patterns. m_sName = ""; - const ORDERINDEX nMinLength = Util::Min(ModSequenceSet::s_nCacheSize, m_pSndFile->GetModSpecifications().ordersMax); + const ORDERINDEX nMinLength = std::min(ModSequenceSet::s_nCacheSize, m_pSndFile->GetModSpecifications().ordersMax); if(GetLength() < nMinLength) resize(nMinLength); return true; Modified: trunk/OpenMPT/soundlib/SampleFormats.cpp =================================================================== --- trunk/OpenMPT/soundlib/SampleFormats.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/SampleFormats.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -1568,7 +1568,7 @@ samplemap[i] = smp; const FileReader::off_t offset = file.GetPosition(); ReadITSSample(smp, file, false); - extraOffset = Util::Max(extraOffset, file.GetPosition()); + extraOffset = std::max(extraOffset, file.GetPosition()); file.Seek(offset + sizeof(ITSample)); } if(GetNumSamples() < smp) m_nSamples = smp; @@ -1926,7 +1926,7 @@ } // Number of samples to be copied in this call - const SmpLength copySamples = Util::Min(static_cast<SmpLength>(frame->header.blocksize), static_cast<SmpLength>(sample.nLength - frame->header.number.sample_number)); + const SmpLength copySamples = std::min(static_cast<SmpLength>(frame->header.blocksize), static_cast<SmpLength>(sample.nLength - frame->header.number.sample_number)); // Number of target channels const uint8 modChannels = sample.GetNumChannels(); // Offset (in samples) into target data @@ -2245,7 +2245,7 @@ size_t FileReaderRead(void *fp, void *buf, size_t count) { FileReader &file = *static_cast<FileReader *>(fp); - size_t readBytes = Util::Min(count, static_cast<size_t>(file.BytesLeft())); + size_t readBytes = std::min(count, static_cast<size_t>(file.BytesLeft())); memcpy(buf, file.GetRawData(), readBytes); file.Skip(readBytes); return readBytes; Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -3699,10 +3699,10 @@ //data = (unsigned char)MIN((pChn->nCalcVolume * pChn->nGlobalVol * m_nGlobalVolume) >> (7 + 6 + 8), 127); } else if(macro[pos] == 'x') // x: pan set { - data = (unsigned char)Util::Min(pChn->nPan / 2, 127); + data = (unsigned char)std::min(pChn->nPan / 2, 127); } else if(macro[pos] == 'y') // y: calculated pan { - data = (unsigned char)Util::Min(pChn->nRealPan / 2, 127); + data = (unsigned char)std::min(pChn->nRealPan / 2, 127); } else if(macro[pos] == 'a') // a: high byte of bank select { if(pIns && pIns->wMidiBank) @@ -3987,7 +3987,7 @@ for(size_t pos = 0; pos < macroLen; pos += 3) { DWORD curData = 0; - memcpy(&curData, macro + pos, Util::Min(3u, macroLen - pos)); + memcpy(&curData, macro + pos, std::min(3u, macroLen - pos)); pPlugin->MidiSend(curData); } } Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -1462,7 +1462,7 @@ } SAMPLEINDEX nRemoved = 0; - for(SAMPLEINDEX nSmp = Util::Min(GetNumSamples(), static_cast<SAMPLEINDEX>(keepSamples.size() - 1)); nSmp >= 1; nSmp--) + for(SAMPLEINDEX nSmp = std::min(GetNumSamples(), static_cast<SAMPLEINDEX>(keepSamples.size() - 1)); nSmp >= 1; nSmp--) { if(!keepSamples[nSmp]) { @@ -2080,7 +2080,7 @@ // Previously the values were just added up, so let's fix this! m.volcmd = VOLCMD_NONE; const uint16 param = static_cast<uint16>(m.param) + static_cast<uint16>(m.vol << 4); - m.param = static_cast<uint8>(Util::Min(param, uint16(0xFF))); + m.param = static_cast<uint8>(std::min(param, uint16(0xFF))); } } Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/Sndfile.h 2013-04-12 13:35:31 UTC (rev 1853) @@ -708,7 +708,7 @@ bool ReadMessage(const BYTE *data, FileReader::off_t length, enmLineEndings lineEnding, void (*pTextConverter)(char &) = nullptr); bool ReadMessage(FileReader &file, FileReader::off_t length, enmLineEndings lineEnding, void (*pTextConverter)(char &) = nullptr) { - FileReader::off_t readLength = Util::Min(length, file.BytesLeft()); + FileReader::off_t readLength = std::min(length, file.BytesLeft()); bool success = ReadMessage(reinterpret_cast<const BYTE*>(file.GetRawData()), readLength, lineEnding, pTextConverter); file.Skip(readLength); return success; @@ -724,7 +724,7 @@ bool ReadFixedLineLengthMessage(const BYTE *data, const FileReader::off_t length, const size_t lineLength, const size_t lineEndingLength, void (*pTextConverter)(char &) = nullptr); bool ReadFixedLineLengthMessage(FileReader &file, const FileReader::off_t length, const size_t lineLength, const size_t lineEndingLength, void (*pTextConverter)(char &) = nullptr) { - FileReader::off_t readLength = Util::Min(length, file.BytesLeft()); + FileReader::off_t readLength = std::min(length, file.BytesLeft()); bool success = ReadFixedLineLengthMessage(reinterpret_cast<const BYTE*>(file.GetRawData()), readLength, lineLength, lineEndingLength, pTextConverter); file.Skip(readLength); return success; Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -2144,10 +2144,10 @@ uint8 vol = 0xFF; if(chn.rowCommand.volcmd == VOLCMD_VOLUME) { - vol = Util::Min(chn.rowCommand.vol, uint8(64)); + vol = std::min(chn.rowCommand.vol, uint8(64)); } else if(chn.rowCommand.command == CMD_VOLUME) { - vol = Util::Min(chn.rowCommand.param, uint8(64)); + vol = std::min(chn.rowCommand.param, uint8(64)); } const bool hasVolCommand = (vol != 0xFF); Modified: trunk/OpenMPT/soundlib/WAVTools.cpp =================================================================== --- trunk/OpenMPT/soundlib/WAVTools.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/WAVTools.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -161,9 +161,9 @@ { if(mptInfo.flags & WAVExtraChunk::setPanning) sample.uFlags.set(CHN_PANNING); - sample.nPan = Util::Min(mptInfo.defaultPan, uint16(256)); - sample.nVolume = Util::Min(mptInfo.defaultVolume, uint16(256)); - sample.nGlobalVol = Util::Min(mptInfo.globalVolume, uint16(64)); + sample.nPan = std::min(mptInfo.defaultPan, uint16(256)); + sample.nVolume = std::min(mptInfo.defaultVolume, uint16(256)); + sample.nGlobalVol = std::min(mptInfo.globalVolume, uint16(64)); sample.nVibType = mptInfo.vibratoType; sample.nVibSweep = mptInfo.vibratoSweep; sample.nVibDepth = mptInfo.vibratoDepth; @@ -188,7 +188,7 @@ // Some WAV files seem to have loops going from 0 to 0... We should ignore those. return; } - start = Util::Min(static_cast<SmpLength>(loopStart), sampleLength); + start = std::min(static_cast<SmpLength>(loopStart), sampleLength); end = Clamp(static_cast<SmpLength>(loopEnd), start, sampleLength); if(!mptLoopFix && end < sampleLength) { Modified: trunk/OpenMPT/soundlib/XMTools.cpp =================================================================== --- trunk/OpenMPT/soundlib/XMTools.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/XMTools.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -52,12 +52,12 @@ void XMInstrument::ConvertEnvelopeToXM(const InstrumentEnvelope &mptEnv, uint8 &numPoints, uint8 &flags, uint8 &sustain, uint8 &loopStart, uint8 &loopEnd, uint16 (&envData)[24]) //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- { - numPoints = static_cast<uint8>(Util::Min(12u, mptEnv.nNodes)); + numPoints = static_cast<uint8>(std::min(12u, mptEnv.nNodes)); // Envelope Data for(size_t i = 0; i < numPoints; i++) { - envData[i * 2] = Util::Min(mptEnv.Ticks[i], uint16_max); + envData[i * 2] = std::min(mptEnv.Ticks[i], uint16_max); envData[i * 2 + 1] = mptEnv.Values[i]; } @@ -67,9 +67,9 @@ if(mptEnv.dwFlags[ENV_LOOP]) flags |= XMInstrument::envLoop; // Envelope Loops - sustain = Util::Min(uint8(12), mptEnv.nSustainStart); - loopStart = Util::Min(uint8(12), mptEnv.nLoopStart); - loopEnd = Util::Min(uint8(12), mptEnv.nLoopEnd); + sustain = std::min(uint8(12), mptEnv.nSustainStart); + loopStart = std::min(uint8(12), mptEnv.nLoopStart); + loopEnd = std::min(uint8(12), mptEnv.nLoopEnd); } @@ -81,7 +81,7 @@ MemsetZero(*this); // FFF is maximum in the FT2 GUI, but it can also accept other values. MilkyTracker just allows 0...4095 and 32767 ("cut") - volFade = static_cast<uint16>(Util::Min(mptIns.nFadeOut, uint32(32767))); + volFade = static_cast<uint16>(std::min(mptIns.nFadeOut, uint32(32767))); // Convert envelopes ConvertEnvelopeToXM(mptIns.VolEnv, volPoints, volFlags, volSustain, volLoopStart, volLoopEnd, volEnv); @@ -108,7 +108,7 @@ midiChannel = (mptIns.nMidiChannel != MidiMappedChannel ? (mptIns.nMidiChannel - MidiFirstChannel) : 0); } midiProgram = (mptIns.nMidiProgram != 0 ? mptIns.nMidiProgram - 1 : 0); - pitchWheelRange = Util::Min(mptIns.midiPWD, int8(36)); + pitchWheelRange = std::min(mptIns.midiPWD, int8(36)); return static_cast<uint16>(sampleList.size()); } @@ -370,8 +370,8 @@ MemsetZero(*this); // Volume / Panning - vol = static_cast<uint8>(Util::Min(mptSmp.nVolume / 4u, 64u)); - pan = static_cast<uint8>(Util::Min(mptSmp.nPan, uint16(255))); + vol = static_cast<uint8>(std::min(mptSmp.nVolume / 4u, 64u)); + pan = static_cast<uint8>(std::min(mptSmp.nPan, uint16(255))); // Sample Frequency if((fromType & (MOD_TYPE_MOD | MOD_TYPE_XM))) Modified: trunk/OpenMPT/soundlib/load_j2b.cpp =================================================================== --- trunk/OpenMPT/soundlib/load_j2b.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/load_j2b.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -175,7 +175,7 @@ mptEnv.dwFlags.set(ENV_LOOP, (flags & AMFFEnvelope::envLoop) && mptEnv.nLoopStart <= mptEnv.nLoopEnd && mptEnv.nLoopStart <= mptEnv.nNodes); // The buggy mod2j2b converter will actually NOT limit this to 10 points if the envelope is longer. - mptEnv.nNodes = Util::Min(numPoints, static_cast<uint8>(10)); + mptEnv.nNodes = std::min(numPoints, static_cast<uint8>(10)); mptEnv.nSustainStart = mptEnv.nSustainEnd = sustainPoint; @@ -381,7 +381,7 @@ mptEnv.dwFlags.set(ENV_SUSTAIN, (flags & AMFFEnvelope::envSustain) && mptEnv.nSustainStart <= mptEnv.nNodes); mptEnv.dwFlags.set(ENV_LOOP, (flags & AMFFEnvelope::envLoop) && mptEnv.nLoopStart <= mptEnv.nLoopEnd && mptEnv.nLoopStart <= mptEnv.nNodes); - mptEnv.nNodes = Util::Min(numPoints + 1, 10); + mptEnv.nNodes = std::min(numPoints + 1, 10); mptEnv.nSustainStart = mptEnv.nSustainEnd = sustainPoint; @@ -502,8 +502,8 @@ void ConvertToMPT(AMInstrumentHeader &instrHeader, ModSample &mptSmp) const { mptSmp.Initialize(); - mptSmp.nPan = Util::Min(pan, static_cast<uint16>(32767)) * 256 / 32767; - mptSmp.nVolume = Util::Min(volume, static_cast<uint16>(32767)) * 256 / 32767; + mptSmp.nPan = std::min(pan, static_cast<uint16>(32767)) * 256 / 32767; + mptSmp.nVolume = std::min(volume, static_cast<uint16>(32767)) * 256 / 32767; mptSmp.nGlobalVol = 64; mptSmp.nLength = length; mptSmp.nLoopStart = loopStart; Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.cpp =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -565,8 +565,8 @@ if(!(smp.uFlags & CHN_LOOP) && (sndFile.GetType() & MOD_TYPE_MOD) && sampleOffset == 0) sampleOffset = 2; // Just look at the first four samples, starting from the given offset. - sampleOffset = Util::Min(sampleOffset, smp.nLength); - const SmpLength smpCount = Util::Min(4u, smp.nLength - sampleOffset) * smp.GetNumChannels(); + sampleOffset = std::min(sampleOffset, smp.nLength); + const SmpLength smpCount = std::min(4u, smp.nLength - sampleOffset) * smp.GetNumChannels(); if(smp.pSample == nullptr || smpCount == 0) return false; if(smp.GetElementarySampleSize() == 2) Modified: trunk/OpenMPT/soundlib/pattern.cpp =================================================================== --- trunk/OpenMPT/soundlib/pattern.cpp 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/pattern.cpp 2013-04-12 13:35:31 UTC (rev 1853) @@ -84,7 +84,7 @@ } // Copy over pattern data - memcpy(newPattern, m_ModCommands, GetNumChannels() * Util::Min(m_Rows, newRowCount) * sizeof(ModCommand)); + memcpy(newPattern, m_ModCommands, GetNumChannels() * std::min(m_Rows, newRowCount) * sizeof(ModCommand)); CriticalSection cs; FreePattern(m_ModCommands); Modified: trunk/OpenMPT/soundlib/plugins/PluginEventQueue.h =================================================================== --- trunk/OpenMPT/soundlib/plugins/PluginEventQueue.h 2013-04-12 13:19:24 UTC (rev 1852) +++ trunk/OpenMPT/soundlib/plugins/PluginEventQueue.h 2013-04-12 13:35:31 UTC (rev 1853) @@ -91,7 +91,7 @@ ASSERT(event->type != kVstMidiType || event->byteSize == sizeof(VstMid... [truncated message content] |
From: <man...@us...> - 2013-04-12 13:49:58
|
Revision: 1855 http://sourceforge.net/p/modplug/code/1855 Author: manxorist Date: 2013-04-12 13:49:50 +0000 (Fri, 12 Apr 2013) Log Message: ----------- [Ref] Remove Util::NumericTraits. Remove all global variables that made use of the compile-time values of Util::NumericTraits. Replace usages of these variables with std::numeric_limits. Modified Paths: -------------- trunk/OpenMPT/common/misc_util.h trunk/OpenMPT/common/serialization_utils.cpp trunk/OpenMPT/common/serialization_utils.h trunk/OpenMPT/mptrack/test/test.cpp Modified: trunk/OpenMPT/common/misc_util.h =================================================================== --- trunk/OpenMPT/common/misc_util.h 2013-04-12 13:39:35 UTC (rev 1854) +++ trunk/OpenMPT/common/misc_util.h 2013-04-12 13:49:50 UTC (rev 1855) @@ -245,20 +245,7 @@ namespace Util { - // Numeric traits provide compile time values for integer min, max limits. - template <class T> struct NumericTraits {}; - template <> struct NumericTraits<int8> {static const int8 maxValue = int8_max; static const int8 minValue = int8_min;}; - template <> struct NumericTraits<int16> {static const int16 maxValue = int16_max; static const int16 minValue = int16_min;}; - template <> struct NumericTraits<int32> {static const int32 maxValue = int32_max; static const int32 minValue = int32_min;}; - template <> struct NumericTraits<int64> {static const int64 maxValue = int64_max; static const int64 minValue = int64_min;}; - template <> struct NumericTraits<long> {static const long maxValue = LONG_MAX; static const long minValue = LONG_MIN;}; - template <> struct NumericTraits<uint8> {static const uint8 maxValue = uint8_max; static const uint8 minValue = 0;}; - template <> struct NumericTraits<uint16> {static const uint16 maxValue = uint16_max; static const uint16 minValue = 0;}; - template <> struct NumericTraits<uint32> {static const uint32 maxValue = uint32_max; static const uint32 minValue = 0;}; - template <> struct NumericTraits<uint64> {static const uint64 maxValue = uint64_max; static const uint64 minValue = 0;}; - template <> struct NumericTraits<unsigned long> {static const unsigned long maxValue = ULONG_MAX; static const unsigned long minValue = 0;}; - // Minimum of 3 values template <class T> inline const T& Min(const T& a, const T& b, const T& c) {return std::min(std::min(a, b), c);} Modified: trunk/OpenMPT/common/serialization_utils.cpp =================================================================== --- trunk/OpenMPT/common/serialization_utils.cpp 2013-04-12 13:39:35 UTC (rev 1854) +++ trunk/OpenMPT/common/serialization_utils.cpp 2013-04-12 13:49:50 UTC (rev 1855) @@ -553,7 +553,7 @@ { const Offtype nRawEntrySize = m_pOstrm->tellp() - posBeforeWrite; - if (nRawEntrySize > DataSize_max) + if (nRawEntrySize > std::numeric_limits<DataSize>::max()) { AddWriteNote(SNW_INSUFFICIENT_DATASIZETYPE); return; } DataSize nEntrySize = static_cast<DataSize>(nRawEntrySize); @@ -727,13 +727,13 @@ if (GetFlag(RwfRwHasMap)) { ReadAdaptive1248(iStrm, tempU64); - if(tempU64 > Offtype_max) + if(tempU64 > std::numeric_limits<Offtype>::max()) { AddReadNote(SNR_INSUFFICIENT_STREAM_OFFTYPE); return; } } const Offtype rawEndOfHdrData = iStrm.tellg() - m_posStart; - if (rawEndOfHdrData < 0 || rawEndOfHdrData > RposType_max) + if (rawEndOfHdrData < 0 || rawEndOfHdrData > std::numeric_limits<RposType>::max()) { AddReadNote(SNR_INSUFFICIENT_RPOSTYPE); return; } m_rposEndofHdrData = static_cast<RposType>(rawEndOfHdrData); @@ -787,7 +787,7 @@ { uint64 tempU64; ReadAdaptive1248(iStrm, tempU64); - if(tempU64 > Offtype_max) + if(tempU64 > std::numeric_limits<Offtype>::max()) { AddReadNote(SNR_INSUFFICIENT_STREAM_OFFTYPE); return; } mapData[i].rposStart = static_cast<RposType>(tempU64); } @@ -799,7 +799,7 @@ { uint64 tempU64; ReadAdaptive1248(iStrm, tempU64); - if(tempU64 > Offtype_max) + if(tempU64 > std::numeric_limits<Offtype>::max()) { AddReadNote(SNR_INSUFFICIENT_STREAM_OFFTYPE); return; } mapData[i].nSize = static_cast<DataSize>(tempU64); } Modified: trunk/OpenMPT/common/serialization_utils.h =================================================================== --- trunk/OpenMPT/common/serialization_utils.h 2013-04-12 13:39:35 UTC (rev 1854) +++ trunk/OpenMPT/common/serialization_utils.h 2013-04-12 13:49:50 UTC (rev 1855) @@ -34,19 +34,11 @@ typedef Offtype Postype; typedef std::streamsize Streamsize; -//typedef uintptr_t DataSize; // Data size type. -//typedef uintptr_t RposType; // Relative position type. -//typedef uintptr_t NumType; // Entry count type. typedef uintptr_t DataSize; // Data size type. typedef uintptr_t RposType; // Relative position type. typedef uintptr_t NumType; // Entry count type. -const DataSize DataSize_max = Util::NumericTraits<DataSize>::maxValue; -const RposType RposType_max = Util::NumericTraits<RposType>::maxValue; -const NumType NumType_max = Util::NumericTraits<NumType>::maxValue; -const DataSize invalidDatasize = DataSize_max; -const Offtype Offtype_min = Util::NumericTraits<Offtype>::minValue; -const Offtype Offtype_max = Util::NumericTraits<Offtype>::maxValue; +const DataSize invalidDatasize = DataSize(-1); typedef std::basic_string<TCHAR> String; Modified: trunk/OpenMPT/mptrack/test/test.cpp =================================================================== --- trunk/OpenMPT/mptrack/test/test.cpp 2013-04-12 13:39:35 UTC (rev 1854) +++ trunk/OpenMPT/mptrack/test/test.cpp 2013-04-12 13:49:50 UTC (rev 1855) @@ -199,11 +199,6 @@ VERIFY_EQUAL(int64_min, (std::numeric_limits<int64>::min)()); VERIFY_EQUAL(int64_max, (std::numeric_limits<int64>::max)()); VERIFY_EQUAL(uint64_max, (std::numeric_limits<uint64>::max)()); - - VERIFY_EQUAL(Util::NumericTraits<long>::minValue, (std::numeric_limits<long>::min)()); - VERIFY_EQUAL(Util::NumericTraits<long>::maxValue, (std::numeric_limits<long>::max)()); - VERIFY_EQUAL(Util::NumericTraits<unsigned long>::minValue, (std::numeric_limits<unsigned long>::min)()); - VERIFY_EQUAL(Util::NumericTraits<unsigned long>::maxValue, (std::numeric_limits<unsigned long>::max)()); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-04-12 14:57:27
|
Revision: 1858 http://sourceforge.net/p/modplug/code/1858 Author: manxorist Date: 2013-04-12 14:57:05 +0000 (Fri, 12 Apr 2013) Log Message: ----------- [Ref] Replace SNDMIX_* flags with PROCSUPPORT_* flags. Modified Paths: -------------- trunk/OpenMPT/mptrack/Mpdlgs.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/sounddsp/EQ.cpp trunk/OpenMPT/sounddsp/Reverb.cpp trunk/OpenMPT/soundlib/Fastmix.cpp trunk/OpenMPT/soundlib/Mmx_mix.cpp trunk/OpenMPT/soundlib/Snd_defs.h trunk/OpenMPT/soundlib/Sndfile.cpp Modified: trunk/OpenMPT/mptrack/Mpdlgs.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mpdlgs.cpp 2013-04-12 14:21:57 UTC (rev 1857) +++ trunk/OpenMPT/mptrack/Mpdlgs.cpp 2013-04-12 14:57:05 UTC (rev 1858) @@ -129,11 +129,11 @@ if (m_dwSoundSetup & SOUNDSETUP_SECONDARY) CheckDlgButton(IDC_CHECK4, MF_CHECKED); if (!(m_dwSoundSetup & SOUNDSETUP_NOBOOSTTHREADPRIORITY)) CheckDlgButton(IDC_CHECK5, MF_CHECKED); // Multimedia extensions - ::EnableWindow(::GetDlgItem(m_hWnd, IDC_CHECK3), (CSoundFile::GetSysInfo() & SYSMIX_ENABLEMMX) ? TRUE : FALSE); - if(CSoundFile::GetSysInfo() & SYSMIX_SSE) + ::EnableWindow(::GetDlgItem(m_hWnd, IDC_CHECK3), (CSoundFile::GetSysInfo() & PROCSUPPORT_MMX) ? TRUE : FALSE); + if(CSoundFile::GetSysInfo() & PROCSUPPORT_SSE) { SetDlgItemText(IDC_CHECK3, _T("Enable SSE acceleration")); - } else if (CSoundFile::GetSysInfo() & SYSMIX_3DNOW) + } else if (CSoundFile::GetSysInfo() & PROCSUPPORT_3DNOW) { SetDlgItemText(IDC_CHECK3, _T("Enable 3DNow! acceleration")); } @@ -613,7 +613,7 @@ } } m_CbnReverbPreset.SetCurSel(nSel); - if (!(CSoundFile::GetSysInfo() & SYSMIX_ENABLEMMX)) + if (!(CSoundFile::GetSysInfo() & PROCSUPPORT_MMX)) { ::EnableWindow(::GetDlgItem(m_hWnd, IDC_CHECK6), FALSE); m_SbReverbDepth.EnableWindow(FALSE); Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2013-04-12 14:21:57 UTC (rev 1857) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2013-04-12 14:57:05 UTC (rev 1858) @@ -891,12 +891,12 @@ // Initialize Audio DWORD sysinfo = CSoundFile::GetSysInfo(); - if(sysinfo & SYSMIX_ENABLEMMX) + if(sysinfo & PROCSUPPORT_MMX) { TrackerSettings::Instance().m_MixerSettings.MixerFlags |= SNDMIX_ENABLEMMX; TrackerSettings::Instance().m_ResamplerSettings.SrcMode = SRCMODE_SPLINE; } - if(sysinfo & SYSMIX_MMXEX) + if(sysinfo & PROCSUPPORT_MMXEX) { TrackerSettings::Instance().m_ResamplerSettings.SrcMode = SRCMODE_POLYPHASE; } Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2013-04-12 14:21:57 UTC (rev 1857) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2013-04-12 14:57:05 UTC (rev 1858) @@ -718,7 +718,7 @@ smin = 32767; smax = -32768; #ifdef ENABLE_MMX - if (sysinfo & SYSMIX_MMXEX) + if (sysinfo & PROCSUPPORT_MMXEX) { mmxex_findminmax16(p, scanlen, smplsize, &smin, &smax); } else @@ -741,7 +741,7 @@ smin = 127; smax = -128; #ifdef ENABLE_MMX - if (sysinfo & SYSMIX_MMXEX) + if (sysinfo & PROCSUPPORT_MMXEX) { mmxex_findminmax8(p, scanlen, smplsize, &smin, &smax); } else Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2013-04-12 14:21:57 UTC (rev 1857) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2013-04-12 14:57:05 UTC (rev 1858) @@ -3409,7 +3409,7 @@ #ifdef ENABLE_MMX #ifdef ENABLE_SSE - if(CSoundFile::GetSysInfo() & SYSMIX_SSE) + if(CSoundFile::GetSysInfo() & PROCSUPPORT_SSE) { SSEInterleaveFloatToInt16(inputs[0], inputs[1], samples); m_pMediaProcess->Process(samples * 2 * sizeof(int16), reinterpret_cast<BYTE *>(m_pMixBuffer), m_DataTime, DMO_INPLACE_NORMAL); Modified: trunk/OpenMPT/sounddsp/EQ.cpp =================================================================== --- trunk/OpenMPT/sounddsp/EQ.cpp 2013-04-12 14:21:57 UTC (rev 1857) +++ trunk/OpenMPT/sounddsp/EQ.cpp 2013-04-12 14:57:05 UTC (rev 1858) @@ -345,7 +345,7 @@ // Still allow the check, because the user can turn this on/off - if ((SysInfoFlags & SYSMIX_SSE) && (SoundSetupFlags & SNDMIX_ENABLEMMX)) + if ((SysInfoFlags & PROCSUPPORT_SSE) && (SoundSetupFlags & SNDMIX_ENABLEMMX)) { int sse_state, sse_eqstate; SSE_MonoMixToFloat(pbuffer, MixFloatBuffer, nCount*2, config.getIntToFloat()); @@ -371,7 +371,7 @@ // We still perform the MMX check because the user can enable/disable this - if ((SysInfoFlags & SYSMIX_3DNOW) && (SoundSetupFlags & SNDMIX_ENABLEMMX)) + if ((SysInfoFlags & PROCSUPPORT_3DNOW) && (SoundSetupFlags & SNDMIX_ENABLEMMX)) { AMD_MonoMixToFloat(pbuffer, MixFloatBuffer, nCount*2, config.getIntToFloat()); Modified: trunk/OpenMPT/sounddsp/Reverb.cpp =================================================================== --- trunk/OpenMPT/sounddsp/Reverb.cpp 2013-04-12 14:21:57 UTC (rev 1857) +++ trunk/OpenMPT/sounddsp/Reverb.cpp 2013-04-12 14:57:05 UTC (rev 1858) @@ -404,7 +404,7 @@ if ((!gnReverbSend) && (!gnReverbSamples)) return; if (!gnReverbSend) X86_StereoFill(MixReverbBuffer, nSamples, &gnRvbROfsVol, &gnRvbLOfsVol); - if (!(sysinfo & SYSMIX_ENABLEMMX)) return; + if (!(sysinfo & PROCSUPPORT_MMX)) return; // Dynamically adjust reverb master gains LONG lMasterGain; lMasterGain = ((g_RefDelay.lMasterGain * m_Settings.m_nReverbDepth) >> 4); Modified: trunk/OpenMPT/soundlib/Fastmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Fastmix.cpp 2013-04-12 14:21:57 UTC (rev 1857) +++ trunk/OpenMPT/soundlib/Fastmix.cpp 2013-04-12 14:57:05 UTC (rev 1858) @@ -1489,9 +1489,9 @@ pbuffer = MixSoundBuffer; #ifndef NO_REVERB #ifdef ENABLE_MMX - if((m_MixerSettings.DSPMask & SNDDSP_REVERB) && (gdwSysInfo & SYSMIX_ENABLEMMX) && !pChannel->dwFlags[CHN_NOREVERB]) + if((m_MixerSettings.DSPMask & SNDDSP_REVERB) && (gdwSysInfo & PROCSUPPORT_MMX) && !pChannel->dwFlags[CHN_NOREVERB]) pbuffer = MixReverbBuffer; - if(pChannel->dwFlags[CHN_REVERB] && (gdwSysInfo & SYSMIX_ENABLEMMX)) + if(pChannel->dwFlags[CHN_REVERB] && (gdwSysInfo & PROCSUPPORT_MMX)) pbuffer = MixReverbBuffer; #endif #endif @@ -1790,14 +1790,14 @@ if(m_MixerSettings.MixerFlags & SNDMIX_ENABLEMMX) { #ifdef ENABLE_SSE - if(gdwSysInfo & SYSMIX_SSE) + if(gdwSysInfo & PROCSUPPORT_SSE) { SSE_StereoMixToFloat(pSrc, pOut1, pOut2, nCount, m_PlayConfig.getIntToFloat()); return; } #endif // ENABLE_SSE #ifdef ENABLE_3DNOW - if(gdwSysInfo & SYSMIX_3DNOW) + if(gdwSysInfo & PROCSUPPORT_3DNOW) { AMD_StereoMixToFloat(pSrc, pOut1, pOut2, nCount, m_PlayConfig.getIntToFloat()); return; @@ -1816,7 +1816,7 @@ if(m_MixerSettings.MixerFlags & SNDMIX_ENABLEMMX) { #ifdef ENABLE_3DNOW - if(gdwSysInfo & SYSMIX_3DNOW) + if(gdwSysInfo & PROCSUPPORT_3DNOW) { AMD_FloatToStereoMix(pIn1, pIn2, pOut, nCount, m_PlayConfig.getFloatToInt()); return; @@ -1833,14 +1833,14 @@ if(m_MixerSettings.MixerFlags & SNDMIX_ENABLEMMX) { #ifdef ENABLE_SSE - if(gdwSysInfo & SYSMIX_SSE) + if(gdwSysInfo & PROCSUPPORT_SSE) { SSE_MonoMixToFloat(pSrc, pOut, nCount, m_PlayConfig.getIntToFloat()); return; } #endif // ENABLE_SSE #ifdef ENABLE_3DNOW - if(gdwSysInfo & SYSMIX_3DNOW) + if(gdwSysInfo & PROCSUPPORT_3DNOW) { AMD_MonoMixToFloat(pSrc, pOut, nCount, m_PlayConfig.getIntToFloat()); return; @@ -1858,7 +1858,7 @@ if(m_MixerSettings.MixerFlags & SNDMIX_ENABLEMMX) { #ifdef ENABLE_3DNOW - if(gdwSysInfo & SYSMIX_3DNOW) + if(gdwSysInfo & PROCSUPPORT_3DNOW) { AMD_FloatToMonoMix(pIn, pOut, nCount, m_PlayConfig.getFloatToInt()); return; Modified: trunk/OpenMPT/soundlib/Mmx_mix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Mmx_mix.cpp 2013-04-12 14:21:57 UTC (rev 1857) +++ trunk/OpenMPT/soundlib/Mmx_mix.cpp 2013-04-12 14:57:05 UTC (rev 1858) @@ -24,13 +24,9 @@ #include "sndfile.h" #include "../common/Reporting.h" -#define PROCSUPPORT_CPUID 0x01 -#define PROCSUPPORT_MMX 0x02 -#define PROCSUPPORT_MMXEX 0x04 -#define PROCSUPPORT_3DNOW 0x08 -#define PROCSUPPORT_SSE 0x10 -static unsigned int QueryProcessorExtensions() +DWORD CSoundFile::GetSysInfo() +//---------------------------- { static unsigned int fProcessorExtensions = 0; static bool bMMXChecked = false; @@ -86,26 +82,6 @@ } -DWORD CSoundFile::GetSysInfo() -//---------------------------- -{ - DWORD d = 0; - DWORD dwProcSupport = QueryProcessorExtensions(); - if (dwProcSupport & PROCSUPPORT_MMX) d |= SYSMIX_ENABLEMMX; - if (dwProcSupport & PROCSUPPORT_MMXEX) d |= SYSMIX_MMXEX; - if (dwProcSupport & PROCSUPPORT_3DNOW) d |= SYSMIX_3DNOW; - if (dwProcSupport & PROCSUPPORT_SSE) d |= SYSMIX_SSE; - return d; -} - - -////////////////////////////////////////////////////////////////////////////////// -// -// Misc. mix functions -// - - - //////////////////////////////////////////////////////////////////////////////////// // 3DNow! optimizations Modified: trunk/OpenMPT/soundlib/Snd_defs.h =================================================================== --- trunk/OpenMPT/soundlib/Snd_defs.h 2013-04-12 14:21:57 UTC (rev 1857) +++ trunk/OpenMPT/soundlib/Snd_defs.h 2013-04-12 14:57:05 UTC (rev 1858) @@ -234,12 +234,14 @@ #define DNA_NOTEOFF 1 #define DNA_NOTEFADE 2 -// Mixer Hardware-Dependent features -#define SYSMIX_ENABLEMMX 0x01 // Hardware acceleration features (MMX/3DNow!/SSE) are supported by this processor -#define SYSMIX_MMXEX 0x08 // Processor supports AMD MMX extensions -#define SYSMIX_3DNOW 0x10 // Processor supports AMD 3DNow! instructions -#define SYSMIX_SSE 0x20 // Processor supports SSE instructions +#define PROCSUPPORT_CPUID 0x01 +#define PROCSUPPORT_MMX 0x02 // Processor supports MMX instructions +#define PROCSUPPORT_MMXEX 0x04 // Processor supports AMD MMX extensions +#define PROCSUPPORT_3DNOW 0x08 // Processor supports AMD 3DNow! instructions +#define PROCSUPPORT_SSE 0x10 // Processor supports SSE instructions + + // Module flags FLAGSET(SongFlags) { Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2013-04-12 14:21:57 UTC (rev 1857) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2013-04-12 14:57:05 UTC (rev 1858) @@ -911,7 +911,7 @@ //---------------------------------------------------------------------------------------------------- { CriticalSection cs; - if(!(GetSysInfo() & SYSMIX_ENABLEMMX)) DSPMask &= ~SNDDSP_REVERB; + if(!(GetSysInfo() & PROCSUPPORT_MMX)) DSPMask &= ~SNDDSP_REVERB; m_MixerSettings.DSPMask = DSPMask; InitPlayer(FALSE); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2013-04-12 15:30:31
|
Revision: 1860 http://sourceforge.net/p/modplug/code/1860 Author: saga-games Date: 2013-04-12 15:30:19 +0000 (Fri, 12 Apr 2013) Log Message: ----------- [Ref] Right and left channel volume variable names were swapped ever since. Modified Paths: -------------- trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/soundlib/Fastmix.cpp trunk/OpenMPT/soundlib/ModChannel.cpp trunk/OpenMPT/soundlib/ModChannel.h trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2013-04-12 15:13:14 UTC (rev 1859) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2013-04-12 15:30:19 UTC (rev 1860) @@ -988,7 +988,7 @@ pChn->nGlobalVol = 64; pChn->nInsVol = 64; pChn->nPan = 128; - pChn->nRightVol = pChn->nLeftVol = 0; + pChn->leftVol = pChn->rightVol = 0; pChn->nROfs = pChn->nLOfs = 0; pChn->nCutOff = 0x7F; pChn->nResonance = 0; Modified: trunk/OpenMPT/soundlib/Fastmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Fastmix.cpp 2013-04-12 15:13:14 UTC (rev 1859) +++ trunk/OpenMPT/soundlib/Fastmix.cpp 2013-04-12 15:30:19 UTC (rev 1860) @@ -270,40 +270,40 @@ ///////////////////////////////////////////////////////////////////////////// #define SNDMIX_STOREMONOVOL\ - pvol[0] += vol * pChn->nRightVol;\ - pvol[1] += vol * pChn->nLeftVol;\ + pvol[0] += vol * pChn->leftVol;\ + pvol[1] += vol * pChn->rightVol;\ pvol += 2; #define SNDMIX_STORESTEREOVOL\ - pvol[0] += vol_l * pChn->nRightVol;\ - pvol[1] += vol_r * pChn->nLeftVol;\ + pvol[0] += vol_l * pChn->leftVol;\ + pvol[1] += vol_r * pChn->rightVol;\ pvol += 2; #define SNDMIX_STOREFASTMONOVOL\ - int v = vol * pChn->nRightVol;\ + int v = vol * pChn->leftVol;\ pvol[0] += v;\ pvol[1] += v;\ pvol += 2; #define SNDMIX_RAMPMONOVOL\ - nRampLeftVol += pChn->nLeftRamp;\ - nRampRightVol += pChn->nRightRamp;\ - pvol[0] += vol * (nRampRightVol >> VOLUMERAMPPRECISION);\ - pvol[1] += vol * (nRampLeftVol >> VOLUMERAMPPRECISION);\ + rampLeftVol += pChn->leftRamp;\ + rampRightVol += pChn->rightRamp;\ + pvol[0] += vol * (rampLeftVol >> VOLUMERAMPPRECISION);\ + pvol[1] += vol * (rampRightVol >> VOLUMERAMPPRECISION);\ pvol += 2; #define SNDMIX_RAMPFASTMONOVOL\ - nRampRightVol += pChn->nRightRamp;\ - int fastvol = vol * (nRampRightVol >> VOLUMERAMPPRECISION);\ + rampLeftVol += pChn->leftRamp;\ + int fastvol = vol * (rampLeftVol >> VOLUMERAMPPRECISION);\ pvol[0] += fastvol;\ pvol[1] += fastvol;\ pvol += 2; #define SNDMIX_RAMPSTEREOVOL\ - nRampLeftVol += pChn->nLeftRamp;\ - nRampRightVol += pChn->nRightRamp;\ - pvol[0] += vol_l * (nRampRightVol >> VOLUMERAMPPRECISION);\ - pvol[1] += vol_r * (nRampLeftVol >> VOLUMERAMPPRECISION);\ + rampLeftVol += pChn->leftRamp;\ + rampRightVol += pChn->rightRamp;\ + pvol[0] += vol_l * (rampLeftVol >> VOLUMERAMPPRECISION);\ + pvol[1] += vol_r * (rampRightVol >> VOLUMERAMPPRECISION);\ pvol += 2; @@ -388,27 +388,27 @@ // Volume Ramps #define BEGIN_RAMPMIX_INTERFACE(func)\ BEGIN_MIX_INTERFACE(func)\ - LONG nRampRightVol = pChannel->nRampRightVol;\ - LONG nRampLeftVol = pChannel->nRampLeftVol; + LONG rampLeftVol = pChannel->rampLeftVol;\ + LONG rampRightVol = pChannel->rampRightVol; #define END_RAMPMIX_INTERFACE()\ SNDMIX_ENDSAMPLELOOP\ - pChannel->nRampRightVol = nRampRightVol;\ - pChannel->nRightVol = nRampRightVol >> VOLUMERAMPPRECISION;\ - pChannel->nRampLeftVol = nRampLeftVol;\ - pChannel->nLeftVol = nRampLeftVol >> VOLUMERAMPPRECISION;\ + pChannel->rampLeftVol = rampLeftVol;\ + pChannel->leftVol = rampLeftVol >> VOLUMERAMPPRECISION;\ + pChannel->rampRightVol = rampRightVol;\ + pChannel->rightVol = rampRightVol >> VOLUMERAMPPRECISION;\ } #define BEGIN_FASTRAMPMIX_INTERFACE(func)\ BEGIN_MIX_INTERFACE(func)\ - LONG nRampRightVol = pChannel->nRampRightVol; + LONG rampLeftVol = pChannel->rampLeftVol; #define END_FASTRAMPMIX_INTERFACE()\ SNDMIX_ENDSAMPLELOOP\ - pChannel->nRampRightVol = nRampRightVol;\ - pChannel->nRampLeftVol = nRampRightVol;\ - pChannel->nRightVol = nRampRightVol >> VOLUMERAMPPRECISION;\ - pChannel->nLeftVol = pChannel->nRightVol;\ + pChannel->rampLeftVol = rampLeftVol;\ + pChannel->rampRightVol = rampLeftVol;\ + pChannel->leftVol = rampLeftVol >> VOLUMERAMPPRECISION;\ + pChannel->rightVol = pChannel->leftVol;\ } @@ -423,15 +423,15 @@ #define BEGIN_RAMPMIX_FLT_INTERFACE(func)\ BEGIN_MIX_INTERFACE(func)\ - LONG nRampRightVol = pChannel->nRampRightVol;\ - LONG nRampLeftVol = pChannel->nRampLeftVol; + LONG rampLeftVol = pChannel->rampLeftVol;\ + LONG rampRightVol = pChannel->rampRightVol; #define END_RAMPMIX_FLT_INTERFACE()\ SNDMIX_ENDSAMPLELOOP\ - pChannel->nRampRightVol = nRampRightVol;\ - pChannel->nRightVol = nRampRightVol >> VOLUMERAMPPRECISION;\ - pChannel->nRampLeftVol = nRampLeftVol;\ - pChannel->nLeftVol = nRampLeftVol >> VOLUMERAMPPRECISION;\ + pChannel->rampLeftVol = rampLeftVol;\ + pChannel->leftVol = rampLeftVol >> VOLUMERAMPPRECISION;\ + pChannel->rampRightVol = rampRightVol;\ + pChannel->rightVol = rampRightVol >> VOLUMERAMPPRECISION;\ } // Stereo Resonant Filters @@ -445,15 +445,15 @@ #define BEGIN_RAMPMIX_STFLT_INTERFACE(func)\ BEGIN_MIX_INTERFACE(func)\ - LONG nRampRightVol = pChannel->nRampRightVol;\ - LONG nRampLeftVol = pChannel->nRampLeftVol; + LONG rampLeftVol = pChannel->rampLeftVol;\ + LONG rampRightVol = pChannel->rampRightVol; #define END_RAMPMIX_STFLT_INTERFACE()\ SNDMIX_ENDSAMPLELOOP\ - pChannel->nRampRightVol = nRampRightVol;\ - pChannel->nRightVol = nRampRightVol >> VOLUMERAMPPRECISION;\ - pChannel->nRampLeftVol = nRampLeftVol;\ - pChannel->nLeftVol = nRampLeftVol >> VOLUMERAMPPRECISION;\ + pChannel->rampLeftVol = rampLeftVol;\ + pChannel->leftVol = rampLeftVol >> VOLUMERAMPPRECISION;\ + pChannel->rampRightVol = rampRightVol;\ + pChannel->rightVol = rampRightVol >> VOLUMERAMPPRECISION;\ } @@ -1476,8 +1476,8 @@ //rewbs.resamplerConf nFlags |= GetResamplingFlag(pChannel); //end rewbs.resamplerConf - if ((nFlags < 0x20) && (pChannel->nLeftVol == pChannel->nRightVol) - && ((!pChannel->nRampLength) || (pChannel->nLeftRamp == pChannel->nRightRamp))) + if ((nFlags < 0x20) && (pChannel->rightVol == pChannel->leftVol) + && ((!pChannel->nRampLength) || (pChannel->rightRamp == pChannel->leftRamp))) { pMixFuncTable = gpFastMixFunctionTable; } else @@ -1568,7 +1568,7 @@ // Should we mix this channel ? UINT naddmix; if (((nchmixed >= m_MixerSettings.m_nMaxMixChannels) && !IsRenderingToDisc()) - || ((!pChannel->nRampLength) && (!(pChannel->nLeftVol|pChannel->nRightVol)))) + || ((!pChannel->nRampLength) && (!(pChannel->rightVol|pChannel->leftVol)))) { LONG delta = (pChannel->nInc * (LONG)nSmpCount) + (LONG)pChannel->nPosLo; pChannel->nPosLo = delta & 0xFFFF; @@ -1598,9 +1598,9 @@ if (pChannel->nRampLength <= 0) { pChannel->nRampLength = 0; - pChannel->nRightVol = pChannel->nNewRightVol; - pChannel->nLeftVol = pChannel->nNewLeftVol; - pChannel->nRightRamp = pChannel->nLeftRamp = 0; + pChannel->leftVol = pChannel->newLeftVol; + pChannel->rightVol = pChannel->newRightVol; + pChannel->leftRamp = pChannel->rightRamp = 0; if(pChannel->dwFlags[CHN_NOTEFADE] && !pChannel->nFadeOutVol) { pChannel->nLength = 0; Modified: trunk/OpenMPT/soundlib/ModChannel.cpp =================================================================== --- trunk/OpenMPT/soundlib/ModChannel.cpp 2013-04-12 15:13:14 UTC (rev 1859) +++ trunk/OpenMPT/soundlib/ModChannel.cpp 2013-04-12 15:30:19 UTC (rev 1860) @@ -49,9 +49,9 @@ nCutOff = 0x7F; nResonance = 0; nFilterMode = 0; - nLeftVol = nRightVol = 0; - nNewLeftVol = nNewRightVol = 0; - nLeftRamp = nRightRamp = 0; + rightVol = leftVol = 0; + newRightVol = newLeftVol = 0; + rightRamp = leftRamp = 0; nVolume = 256; nVibratoPos = nTremoloPos = nPanbrelloPos = 0; Modified: trunk/OpenMPT/soundlib/ModChannel.h =================================================================== --- trunk/OpenMPT/soundlib/ModChannel.h 2013-04-12 15:13:14 UTC (rev 1859) +++ trunk/OpenMPT/soundlib/ModChannel.h 2013-04-12 15:30:19 UTC (rev 1860) @@ -34,17 +34,17 @@ uint32 nPos; // Current play position uint32 nPosLo; // 16-bit fractional part of play position int32 nInc; // 16.16 fixed point sample speed relative to mixing frequency (0x10000 = one sample per output sample, 0x20000 = two samples per output sample, etc...) - int32 nRightVol; // This is actually LEFT! >:( FIX THIS! - int32 nLeftVol; - int32 nRightRamp; - int32 nLeftRamp; + int32 leftVol; + int32 rightVol; + int32 leftRamp; + int32 rightRamp; SmpLength nLength; SmpLength nLoopStart; SmpLength nLoopEnd; FlagSet<ChannelFlags> dwFlags; - int32 nRampRightVol; - int32 nRampLeftVol; + int32 rampLeftVol; + int32 rampRightVol; float nFilter_Y1, nFilter_Y2; // Mono / left channel filter memory float nFilter_Y3, nFilter_Y4; // Right channel filter memory float nFilter_A0, nFilter_B0, nFilter_B1; // Filter coeffs @@ -53,11 +53,11 @@ int32 nRampLength; // Information not used in the mixer - FlagSet<ChannelFlags> dwOldFlags; // Flags from previous tick const void *pSample; // Currently playing sample, or previously played sample if no sample is playing. ModSample *pModSample; // Currently assigned sample slot ModInstrument *pModInstrument; // Currently assigned instrument slot - int32 nNewRightVol, nNewLeftVol; + FlagSet<ChannelFlags> dwOldFlags; // Flags from previous tick + int32 newLeftVol, newRightVol; int32 nRealVolume, nRealPan; int32 nVolume, nPan, nFadeOutVol; int32 nPeriod, nC5Speed, nPortamentoDest; Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-04-12 15:13:14 UTC (rev 1859) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-04-12 15:30:19 UTC (rev 1860) @@ -1223,7 +1223,7 @@ pChn->nVibratoPos = 0; } } - pChn->nLeftVol = pChn->nRightVol = 0; + pChn->rightVol = pChn->leftVol = 0; bool useFilter = !m_SongFlags[SONG_MPTFILTERMODE]; // Setup Initial Filter for this note if(pIns) @@ -1309,7 +1309,7 @@ // Always NNA cut - using if(!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_MT2)) || !m_nInstruments || forceCut) { - if(!pChn->nLength || pChn->dwFlags[CHN_MUTE] || !(pChn->nLeftVol | pChn->nRightVol)) + if(!pChn->nLength || pChn->dwFlags[CHN_MUTE] || !(pChn->rightVol | pChn->leftVol)) { return; } @@ -1328,7 +1328,7 @@ // Stop this channel pChn->nLength = pChn->nPos = pChn->nPosLo = 0; pChn->nROfs = pChn->nLOfs = 0; - pChn->nLeftVol = pChn->nRightVol = 0; + pChn->rightVol = pChn->leftVol = 0; return; } if(instr >= MAX_INSTRUMENTS) instr = 0; @@ -3887,7 +3887,7 @@ oldcutoff -= pChn->nCutOff; if(oldcutoff < 0) oldcutoff = -oldcutoff; if((pChn->nVolume > 0) || (oldcutoff < 0x10) - || !pChn->dwFlags[CHN_FILTER] || (!(pChn->nLeftVol | pChn->nRightVol))) + || !pChn->dwFlags[CHN_FILTER] || (!(pChn->rightVol | pChn->leftVol))) SetupChannelFilter(pChn, !pChn->dwFlags[CHN_FILTER]); return 4; Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2013-04-12 15:13:14 UTC (rev 1859) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2013-04-12 15:30:19 UTC (rev 1860) @@ -152,11 +152,11 @@ { ModChannel *pramp = &Chn[ChnMix[noff]]; if (!pramp) continue; - pramp->nNewLeftVol = pramp->nNewRightVol = 0; - pramp->nRightRamp = (-pramp->nRightVol << VOLUMERAMPPRECISION) / nRampLength; - pramp->nLeftRamp = (-pramp->nLeftVol << VOLUMERAMPPRECISION) / nRampLength; - pramp->nRampRightVol = pramp->nRightVol << VOLUMERAMPPRECISION; - pramp->nRampLeftVol = pramp->nLeftVol << VOLUMERAMPPRECISION; + pramp->newRightVol = pramp->newLeftVol = 0; + pramp->leftRamp = (-pramp->leftVol << VOLUMERAMPPRECISION) / nRampLength; + pramp->rightRamp = (-pramp->rightVol << VOLUMERAMPPRECISION) / nRampLength; + pramp->rampLeftVol = pramp->leftVol << VOLUMERAMPPRECISION; + pramp->rampRightVol = pramp->rightVol << VOLUMERAMPPRECISION; pramp->nRampLength = nRampLength; pramp->dwFlags.set(CHN_VOLUMERAMP); } @@ -573,8 +573,8 @@ { pChn->rowCommand = *m; - pChn->nLeftVol = pChn->nNewLeftVol; - pChn->nRightVol = pChn->nNewRightVol; + pChn->rightVol = pChn->newRightVol; + pChn->leftVol = pChn->newLeftVol; pChn->dwFlags.reset(CHN_PORTAMENTO | CHN_VIBRATO | CHN_TREMOLO | CHN_PANBRELLO); pChn->nCommand = CMD_NONE; pChn->m_plugParamValueStep = 0; @@ -1543,10 +1543,10 @@ void CSoundFile::ProcessRamping(ModChannel *pChn) //----------------------------------------------- { - pChn->nRightRamp = pChn->nLeftRamp = 0; - if(pChn->dwFlags[CHN_VOLUMERAMP] && (pChn->nRightVol != pChn->nNewRightVol || pChn->nLeftVol != pChn->nNewLeftVol)) + pChn->leftRamp = pChn->rightRamp = 0; + if(pChn->dwFlags[CHN_VOLUMERAMP] && (pChn->leftVol != pChn->newLeftVol || pChn->rightVol != pChn->newRightVol)) { - const bool rampUp = (pChn->nNewRightVol > pChn->nRightVol) || (pChn->nNewLeftVol > pChn->nLeftVol); + const bool rampUp = (pChn->newLeftVol > pChn->leftVol) || (pChn->newRightVol > pChn->rightVol); LONG rampLength, globalRampLength, instrRampLength = 0; rampLength = globalRampLength = (rampUp ? gnVolumeRampUpSamplesActual : m_MixerSettings.glVolumeRampDownSamples); //XXXih: add real support for bidi ramping here @@ -1563,13 +1563,13 @@ rampLength = 1; } - LONG nRightDelta = ((pChn->nNewRightVol - pChn->nRightVol) << VOLUMERAMPPRECISION); - LONG nLeftDelta = ((pChn->nNewLeftVol - pChn->nLeftVol) << VOLUMERAMPPRECISION); + LONG leftDelta = ((pChn->newLeftVol - pChn->leftVol) << VOLUMERAMPPRECISION); + LONG rightDelta = ((pChn->newRightVol - pChn->rightVol) << VOLUMERAMPPRECISION); // if (IsRenderingToDisc() // || m_Resampler.IsHQ()) if(IsRenderingToDisc() || (m_Resampler.IsHQ() && !enableCustomRamp)) { - if((pChn->nRightVol | pChn->nLeftVol) && (pChn->nNewRightVol | pChn->nNewLeftVol) && !pChn->dwFlags[CHN_FASTVOLRAMP]) + if((pChn->leftVol | pChn->rightVol) && (pChn->newLeftVol | pChn->newRightVol) && !pChn->dwFlags[CHN_FASTVOLRAMP]) { rampLength = m_nBufferCount; if(rampLength > (1 << (VOLUMERAMPPRECISION-1))) @@ -1583,28 +1583,28 @@ } } - pChn->nRightRamp = nRightDelta / rampLength; - pChn->nLeftRamp = nLeftDelta / rampLength; - pChn->nRightVol = pChn->nNewRightVol - ((pChn->nRightRamp * rampLength) >> VOLUMERAMPPRECISION); - pChn->nLeftVol = pChn->nNewLeftVol - ((pChn->nLeftRamp * rampLength) >> VOLUMERAMPPRECISION); + pChn->leftRamp = leftDelta / rampLength; + pChn->rightRamp = rightDelta / rampLength; + pChn->leftVol = pChn->newLeftVol - ((pChn->leftRamp * rampLength) >> VOLUMERAMPPRECISION); + pChn->rightVol = pChn->newRightVol - ((pChn->rightRamp * rampLength) >> VOLUMERAMPPRECISION); - if (pChn->nRightRamp|pChn->nLeftRamp) + if (pChn->leftRamp|pChn->rightRamp) { pChn->nRampLength = rampLength; } else { pChn->dwFlags.reset(CHN_VOLUMERAMP); - pChn->nRightVol = pChn->nNewRightVol; - pChn->nLeftVol = pChn->nNewLeftVol; + pChn->leftVol = pChn->newLeftVol; + pChn->rightVol = pChn->newRightVol; } } else { pChn->dwFlags.reset(CHN_VOLUMERAMP); - pChn->nRightVol = pChn->nNewRightVol; - pChn->nLeftVol = pChn->nNewLeftVol; + pChn->leftVol = pChn->newLeftVol; + pChn->rightVol = pChn->newRightVol; } - pChn->nRampRightVol = pChn->nRightVol << VOLUMERAMPPRECISION; - pChn->nRampLeftVol = pChn->nLeftVol << VOLUMERAMPPRECISION; + pChn->rampLeftVol = pChn->leftVol << VOLUMERAMPPRECISION; + pChn->rampRightVol = pChn->rightVol << VOLUMERAMPPRECISION; } @@ -1683,7 +1683,7 @@ // FT2 Compatibility: Prevent notes to be stopped after a fadeout. This way, a portamento effect can pick up a faded instrument which is long enough. // This occours for example in the bassline (channel 11) of jt_burn.xm. I hope this won't break anything else... // I also suppose this could decrease mixing performance a bit, but hey, which CPU can't handle 32 muted channels these days... :-) - if(pChn->dwFlags[CHN_NOTEFADE] && (!(pChn->nFadeOutVol|pChn->nRightVol|pChn->nLeftVol)) && (!IsCompatibleMode(TRK_FASTTRACKER2))) + if(pChn->dwFlags[CHN_NOTEFADE] && (!(pChn->nFadeOutVol|pChn->leftVol|pChn->rightVol)) && (!IsCompatibleMode(TRK_FASTTRACKER2))) { pChn->nLength = 0; pChn->nROfs = pChn->nLOfs = 0; @@ -1909,7 +1909,7 @@ } // Volume ramping - pChn->dwFlags.set(CHN_VOLUMERAMP, (pChn->nRealVolume | pChn->nLeftVol | pChn->nRightVol) != 0); + pChn->dwFlags.set(CHN_VOLUMERAMP, (pChn->nRealVolume | pChn->rightVol | pChn->leftVol) != 0); #ifdef ENABLE_STEREOVU if (pChn->nLeftVU > VUMETER_DECAY) pChn->nLeftVU -= VUMETER_DECAY; else pChn->nLeftVU = 0; @@ -1918,7 +1918,7 @@ // Check for too big nInc if (((pChn->nInc >> 16) + 1) >= (LONG)(pChn->nLoopEnd - pChn->nLoopStart)) pChn->dwFlags.reset(CHN_LOOP); - pChn->nNewRightVol = pChn->nNewLeftVol = 0; + pChn->newLeftVol = pChn->newRightVol = 0; pChn->pCurrentSample = ((pChn->pSample) && (pChn->nLength) && (pChn->nInc)) ? pChn->pSample : NULL; if (pChn->pCurrentSample) { @@ -1966,23 +1966,23 @@ { if (pan < 128) { - pChn->nNewLeftVol = (realvol * pan) >> 8; - pChn->nNewRightVol = (realvol * 128) >> 8; + pChn->newLeftVol = (realvol * 128) >> 8; + pChn->newRightVol = (realvol * pan) >> 8; } else { - pChn->nNewLeftVol = (realvol * 128) >> 8; - pChn->nNewRightVol = (realvol * (256 - pan)) >> 8; + pChn->newLeftVol = (realvol * (256 - pan)) >> 8; + pChn->newRightVol = (realvol * 128) >> 8; } } else { - pChn->nNewLeftVol = (realvol * pan) >> 8; - pChn->nNewRightVol = (realvol * (256 - pan)) >> 8; + pChn->newLeftVol = (realvol * (256 - pan)) >> 8; + pChn->newRightVol = (realvol * pan) >> 8; } } else { - pChn->nNewRightVol = (pChn->nRealVolume * kChnMasterVol) >> 8; - pChn->nNewLeftVol = pChn->nNewRightVol; + pChn->newLeftVol = (pChn->nRealVolume * kChnMasterVol) >> 8; + pChn->newRightVol = pChn->newLeftVol; } // Clipping volumes //if (pChn->nNewRightVol > 0xFFFF) pChn->nNewRightVol = 0xFFFF; @@ -2004,8 +2004,8 @@ if (!IsRenderingToDisc() && !m_Resampler.IsUltraHQ()) { int fmax = 0x20000; - if ((pChn->nNewLeftVol < 0x80) && (pChn->nNewRightVol < 0x80) - && (pChn->nLeftVol < 0x80) && (pChn->nRightVol < 0x80)) + if ((pChn->newRightVol < 0x80) && (pChn->newLeftVol < 0x80) + && (pChn->rightVol < 0x80) && (pChn->leftVol < 0x80)) { if (pChn->nInc >= 0xFF00) pChn->dwFlags.set(CHN_NOIDO); } else @@ -2030,11 +2030,11 @@ pChn->nNewLeftVol >>= MIXING_ATTENUATION; }*/ const int extraAttenuation = m_PlayConfig.getExtraSampleAttenuation(); - pChn->nNewRightVol >>= extraAttenuation; - pChn->nNewLeftVol >>= extraAttenuation; + pChn->newLeftVol >>= extraAttenuation; + pChn->newRightVol >>= extraAttenuation; // Dolby Pro-Logic Surround - if(pChn->dwFlags[CHN_SURROUND] && m_MixerSettings.gnChannels == 2) pChn->nNewLeftVol = - pChn->nNewLeftVol; + if(pChn->dwFlags[CHN_SURROUND] && m_MixerSettings.gnChannels == 2) pChn->newRightVol = - pChn->newRightVol; // Checking Ping-Pong Loops if(pChn->dwFlags[CHN_PINGPONGFLAG]) pChn->nInc = -pChn->nInc; @@ -2052,7 +2052,7 @@ if (pChn->nRightVU > 128) pChn->nRightVU = 0; #endif // ENABLE_STEREOVU if (pChn->nVUMeter > 0xFF) pChn->nVUMeter = 0; - pChn->nLeftVol = pChn->nRightVol = 0; + pChn->rightVol = pChn->leftVol = 0; pChn->nLength = 0; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-04-12 16:34:20
|
Revision: 1863 http://sourceforge.net/p/modplug/code/1863 Author: manxorist Date: 2013-04-12 16:34:12 +0000 (Fri, 12 Apr 2013) Log Message: ----------- [Ref] Remove MPPASMCALL and MPPFASTCALL. MPPASMCALL was __cdecl which is default anyway (and only really relevant for naked asm functions which are not used anywhere). MPPFASTCALL was just used once and got replaced with forceinline (the function has only one caller). [Ref] Remove some other bogus __cdecl as well. Modified Paths: -------------- trunk/OpenMPT/mptrack/Mod2wave.cpp trunk/OpenMPT/sounddsp/AGC.cpp trunk/OpenMPT/sounddsp/DSP.cpp trunk/OpenMPT/sounddsp/EQ.cpp trunk/OpenMPT/sounddsp/Reverb.cpp trunk/OpenMPT/soundlib/Fastmix.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp trunk/OpenMPT/soundlib/Waveform.cpp Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mod2wave.cpp 2013-04-12 16:17:43 UTC (rev 1862) +++ trunk/OpenMPT/mptrack/Mod2wave.cpp 2013-04-12 16:34:12 UTC (rev 1863) @@ -66,7 +66,7 @@ }; // this converts a buffer of 32-bit integer sample data to 32 bit floating point -static void __cdecl M2W_32ToFloat(void *pBuffer, long nCount) +static void M2W_32ToFloat(void *pBuffer, long nCount) { // const float _ki2f = 1.0f / (FLOAT)(ULONG)(0x80000000); //olivier const float _ki2f = 1.0f / (FLOAT)(ULONG)(0x7fffffff); //ericus' 32bit fix Modified: trunk/OpenMPT/sounddsp/AGC.cpp =================================================================== --- trunk/OpenMPT/sounddsp/AGC.cpp 2013-04-12 16:17:43 UTC (rev 1862) +++ trunk/OpenMPT/sounddsp/AGC.cpp 2013-04-12 16:34:12 UTC (rev 1863) @@ -26,7 +26,7 @@ #define MIXING_LIMITMAX (0x08100000) #define MIXING_LIMITMIN (-MIXING_LIMITMAX) -UINT MPPASMCALL X86_AGC(int *pBuffer, UINT nSamples, UINT nAGC) +UINT X86_AGC(int *pBuffer, UINT nSamples, UINT nAGC) //------------------------------------------------------------- { UINT result; Modified: trunk/OpenMPT/sounddsp/DSP.cpp =================================================================== --- trunk/OpenMPT/sounddsp/DSP.cpp 2013-04-12 16:17:43 UTC (rev 1862) +++ trunk/OpenMPT/sounddsp/DSP.cpp 2013-04-12 16:34:12 UTC (rev 1863) @@ -27,10 +27,10 @@ // DSP Effects internal state -extern VOID MPPASMCALL X86_InitMixBuffer(int *pBuffer, UINT nSamples); +extern VOID X86_InitMixBuffer(int *pBuffer, UINT nSamples); -static VOID MPPASMCALL X86_StereoDCRemoval(int *, UINT count, LONG *nDCRFlt_Y1l, LONG *nDCRFlt_X1l, LONG *nDCRFlt_Y1r, LONG *nDCRFlt_X1r); -static VOID MPPASMCALL X86_MonoDCRemoval(int *, UINT count, LONG *nDCRFlt_Y1l, LONG *nDCRFlt_X1l); +static VOID X86_StereoDCRemoval(int *, UINT count, LONG *nDCRFlt_Y1l, LONG *nDCRFlt_X1l, LONG *nDCRFlt_Y1r, LONG *nDCRFlt_X1r); +static VOID X86_MonoDCRemoval(int *, UINT count, LONG *nDCRFlt_Y1l, LONG *nDCRFlt_X1l); /////////////////////////////////////////////////////////////////////////////////// // @@ -394,7 +394,7 @@ #define DCR_AMOUNT 9 -static VOID MPPASMCALL X86_StereoDCRemoval(int *pBuffer, UINT nSamples, LONG *nDCRFlt_Y1l, LONG *nDCRFlt_X1l, LONG *nDCRFlt_Y1r, LONG *nDCRFlt_X1r) +static VOID X86_StereoDCRemoval(int *pBuffer, UINT nSamples, LONG *nDCRFlt_Y1l, LONG *nDCRFlt_X1l, LONG *nDCRFlt_Y1r, LONG *nDCRFlt_X1r) { int y1l=*nDCRFlt_Y1l, x1l=*nDCRFlt_X1l; int y1r=*nDCRFlt_Y1r, x1r=*nDCRFlt_X1r; @@ -440,7 +440,7 @@ } -static VOID MPPASMCALL X86_MonoDCRemoval(int *pBuffer, UINT nSamples, LONG *nDCRFlt_Y1l, LONG *nDCRFlt_X1l) +static VOID X86_MonoDCRemoval(int *pBuffer, UINT nSamples, LONG *nDCRFlt_Y1l, LONG *nDCRFlt_X1l) { int y1l=*nDCRFlt_Y1l, x1l=*nDCRFlt_X1l; _asm { Modified: trunk/OpenMPT/sounddsp/EQ.cpp =================================================================== --- trunk/OpenMPT/sounddsp/EQ.cpp 2013-04-12 16:17:43 UTC (rev 1862) +++ trunk/OpenMPT/sounddsp/EQ.cpp 2013-04-12 16:34:12 UTC (rev 1863) @@ -77,7 +77,7 @@ #define PBS_Y1 DWORD PTR [eax+28] #define PBS_Y2 DWORD PTR [eax+32] -static void __cdecl EQFilter(EQBANDSTRUCT *pbs, REAL *pbuffer, UINT nCount) +static void EQFilter(EQBANDSTRUCT *pbs, REAL *pbuffer, UINT nCount) //------------------------------------------------------------------------- { _asm { Modified: trunk/OpenMPT/sounddsp/Reverb.cpp =================================================================== --- trunk/OpenMPT/sounddsp/Reverb.cpp 2013-04-12 16:17:43 UTC (rev 1862) +++ trunk/OpenMPT/sounddsp/Reverb.cpp 2013-04-12 16:34:12 UTC (rev 1863) @@ -18,7 +18,7 @@ #pragma warning(disable:4725) // Pentium fdiv bug #pragma warning(disable:4731) // ebp modified -extern VOID MPPASMCALL X86_StereoFill(int *pBuffer, UINT nSamples, LPLONG lpROfs, LPLONG lpLOfs); +extern VOID X86_StereoFill(int *pBuffer, UINT nSamples, LPLONG lpROfs, LPLONG lpLOfs); Modified: trunk/OpenMPT/soundlib/Fastmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Fastmix.cpp 2013-04-12 16:17:43 UTC (rev 1862) +++ trunk/OpenMPT/soundlib/Fastmix.cpp 2013-04-12 16:34:12 UTC (rev 1863) @@ -374,10 +374,10 @@ ////////////////////////////////////////////////////////// // Interfaces -typedef VOID (MPPASMCALL * LPMIXINTERFACE)(ModChannel *, const CResampler *, int *, int *); +typedef VOID (* LPMIXINTERFACE)(ModChannel *, const CResampler *, int *, int *); #define BEGIN_MIX_INTERFACE(func)\ - VOID MPPASMCALL func(ModChannel *pChannel, const CResampler *pResampler, int *pbuffer, int *pbufmax)\ + VOID func(ModChannel *pChannel, const CResampler *pResampler, int *pbuffer, int *pbufmax)\ {\ LONG nPos; @@ -464,9 +464,9 @@ extern void X86_MonoMixToFloat(const int *pSrc, float *pOut, UINT nCount, const float _i2fc); extern void X86_FloatToMonoMix(const float *pIn, int *pOut, UINT nCount, const float _f2ic); -void MPPASMCALL X86_InitMixBuffer(int *pBuffer, UINT nSamples); -void MPPASMCALL X86_EndChannelOfs(ModChannel *pChannel, int *pBuffer, UINT nSamples); -void MPPASMCALL X86_StereoFill(int *pBuffer, UINT nSamples, LPLONG lpROfs, LPLONG lpLOfs); +void X86_InitMixBuffer(int *pBuffer, UINT nSamples); +void X86_EndChannelOfs(ModChannel *pChannel, int *pBuffer, UINT nSamples); +void X86_StereoFill(int *pBuffer, UINT nSamples, LPLONG lpROfs, LPLONG lpLOfs); #ifdef ENABLE_3DNOW @@ -1320,7 +1320,7 @@ ///////////////////////////////////////////////////////////////////////// -static LONG MPPFASTCALL GetSampleCount(ModChannel *pChn, LONG nSamples, bool bITBidiMode) +static forceinline LONG GetSampleCount(ModChannel *pChn, LONG nSamples, bool bITBidiMode) //--------------------------------------------------------------------------------------- { LONG nLoopStart = pChn->dwFlags[CHN_LOOP] ? pChn->nLoopStart : 0; @@ -1872,8 +1872,8 @@ #pragma warning (disable:4100) // Clip and convert to 8 bit -DWORD MPPASMCALL X86_Convert32To8(LPVOID lp16, int *pBuffer, DWORD lSampleCount) -//------------------------------------------------------------------------------ +DWORD X86_Convert32To8(LPVOID lp16, int *pBuffer, DWORD lSampleCount) +//------------------------------------------------------------------- { #ifdef ENABLE_X86 DWORD result; @@ -1923,8 +1923,8 @@ // Clip and convert to 16 bit -DWORD MPPASMCALL X86_Convert32To16(LPVOID lp16, int *pBuffer, DWORD lSampleCount) -//------------------------------------------------------------------------------- +DWORD X86_Convert32To16(LPVOID lp16, int *pBuffer, DWORD lSampleCount) +//-------------------------------------------------------------------- { #ifdef ENABLE_X86 DWORD result; @@ -1974,8 +1974,8 @@ // Clip and convert to 24 bit -DWORD MPPASMCALL X86_Convert32To24(LPVOID lp16, int *pBuffer, DWORD lSampleCount) -//------------------------------------------------------------------------------- +DWORD X86_Convert32To24(LPVOID lp16, int *pBuffer, DWORD lSampleCount) +//-------------------------------------------------------------------- { #ifdef ENABLE_X86 DWORD result; @@ -2036,8 +2036,8 @@ // Clip and convert to 32 bit -DWORD MPPASMCALL X86_Convert32To32(LPVOID lp16, int *pBuffer, DWORD lSampleCount) -//------------------------------------------------------------------------------- +DWORD X86_Convert32To32(LPVOID lp16, int *pBuffer, DWORD lSampleCount) +//-------------------------------------------------------------------- { #ifdef ENABLE_X86 DWORD result; @@ -2086,8 +2086,8 @@ // convert to 32 bit floats and do NOT clip to [-1,1] -DWORD MPPASMCALL Convert32ToFloat32(LPVOID lpBuffer, int *pBuffer, DWORD lSampleCount) -//------------------------------------------------------------------------------------ +DWORD Convert32ToFloat32(LPVOID lpBuffer, int *pBuffer, DWORD lSampleCount) +//------------------------------------------------------------------------- { const float factor = (1.0f/(float)MIXING_CLIPMAX); float *out = (float*)lpBuffer; @@ -2099,8 +2099,8 @@ } -void MPPASMCALL X86_InitMixBuffer(int *pBuffer, UINT nSamples) -//------------------------------------------------------------ +void X86_InitMixBuffer(int *pBuffer, UINT nSamples) +//------------------------------------------------- { memset(pBuffer, 0, nSamples * sizeof(int)); } @@ -2113,8 +2113,8 @@ #ifdef ENABLE_X86 -void MPPASMCALL X86_Dither(int *pBuffer, UINT nSamples, UINT nBits) -//----------------------------------------------------------------- +void X86_Dither(int *pBuffer, UINT nSamples, UINT nBits) +//------------------------------------------------------ { static int gDitherA, gDitherB; @@ -2163,8 +2163,8 @@ #endif -void MPPASMCALL X86_InterleaveFrontRear(int *pFrontBuf, int *pRearBuf, DWORD nSamples) -//------------------------------------------------------------------------------------ +void X86_InterleaveFrontRear(int *pFrontBuf, int *pRearBuf, DWORD nSamples) +//------------------------------------------------------------------------- { _asm { mov ecx, nSamples // ecx = samplecount @@ -2193,8 +2193,8 @@ } -VOID MPPASMCALL X86_MonoFromStereo(int *pMixBuf, UINT nSamples) -//------------------------------------------------------------- +VOID X86_MonoFromStereo(int *pMixBuf, UINT nSamples) +//-------------------------------------------------- { _asm { mov ecx, nSamples @@ -2217,8 +2217,8 @@ #define OFSDECAYMASK 0xFF -void MPPASMCALL X86_StereoFill(int *pBuffer, UINT nSamples, LPLONG lpROfs, LPLONG lpLOfs) -//--------------------------------------------------------------------------------------- +void X86_StereoFill(int *pBuffer, UINT nSamples, LPLONG lpROfs, LPLONG lpLOfs) +//---------------------------------------------------------------------------- { #ifdef ENABLE_X86 _asm { @@ -2314,8 +2314,8 @@ typedef struct ModChannel ModChannel_; -void MPPASMCALL X86_EndChannelOfs(ModChannel *pChannel, int *pBuffer, UINT nSamples) -//---------------------------------------------------------------------------------- +void X86_EndChannelOfs(ModChannel *pChannel, int *pBuffer, UINT nSamples) +//----------------------------------------------------------------------- { #ifdef ENABLE_X86 _asm { Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2013-04-12 16:17:43 UTC (rev 1862) +++ trunk/OpenMPT/soundlib/Sndfile.h 2013-04-12 16:34:12 UTC (rev 1863) @@ -763,15 +763,6 @@ #define VOLUMERAMPPRECISION 12 #define FADESONGDELAY 100 -// Calling conventions -#ifdef WIN32 -#define MPPASMCALL __cdecl -#define MPPFASTCALL __fastcall -#else -#define MPPASMCALL -#define MPPFASTCALL -#endif - #define MOD2XMFineTune(k) ((int)( (signed char)((k)<<4) )) #define XM2MODFineTune(k) ((int)( (k>>4)&0x0f )) Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2013-04-12 16:17:43 UTC (rev 1862) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2013-04-12 16:34:12 UTC (rev 1863) @@ -33,19 +33,19 @@ PMIXPLUGINCREATEPROC CSoundFile::gpMixPluginCreateProc = NULL; #endif -typedef DWORD (MPPASMCALL * LPCONVERTPROC)(LPVOID, int *, DWORD); +typedef DWORD (* LPCONVERTPROC)(LPVOID, int *, DWORD); -extern DWORD MPPASMCALL X86_Convert32To8(LPVOID lpBuffer, int *, DWORD nSamples); -extern DWORD MPPASMCALL X86_Convert32To16(LPVOID lpBuffer, int *, DWORD nSamples); -extern DWORD MPPASMCALL X86_Convert32To24(LPVOID lpBuffer, int *, DWORD nSamples); -extern DWORD MPPASMCALL X86_Convert32To32(LPVOID lpBuffer, int *, DWORD nSamples); -extern DWORD MPPASMCALL Convert32ToFloat32(LPVOID lpBuffer, int *pBuffer, DWORD lSampleCount); +extern DWORD X86_Convert32To8(LPVOID lpBuffer, int *, DWORD nSamples); +extern DWORD X86_Convert32To16(LPVOID lpBuffer, int *, DWORD nSamples); +extern DWORD X86_Convert32To24(LPVOID lpBuffer, int *, DWORD nSamples); +extern DWORD X86_Convert32To32(LPVOID lpBuffer, int *, DWORD nSamples); +extern DWORD Convert32ToFloat32(LPVOID lpBuffer, int *pBuffer, DWORD lSampleCount); #ifdef ENABLE_X86 -extern VOID MPPASMCALL X86_Dither(int *pBuffer, UINT nSamples, UINT nBits); +extern VOID X86_Dither(int *pBuffer, UINT nSamples, UINT nBits); #endif -extern VOID MPPASMCALL X86_InterleaveFrontRear(int *pFrontBuf, int *pRearBuf, DWORD nSamples); -extern VOID MPPASMCALL X86_StereoFill(int *pBuffer, UINT nSamples, LPLONG lpROfs, LPLONG lpLOfs); -extern VOID MPPASMCALL X86_MonoFromStereo(int *pMixBuf, UINT nSamples); +extern VOID X86_InterleaveFrontRear(int *pFrontBuf, int *pRearBuf, DWORD nSamples); +extern VOID X86_StereoFill(int *pBuffer, UINT nSamples, LPLONG lpROfs, LPLONG lpLOfs); +extern VOID X86_MonoFromStereo(int *pMixBuf, UINT nSamples); // Log tables for pre-amp // Pre-amp (or more precisely: Pre-attenuation) depends on the number of channels, Modified: trunk/OpenMPT/soundlib/Waveform.cpp =================================================================== --- trunk/OpenMPT/soundlib/Waveform.cpp 2013-04-12 16:17:43 UTC (rev 1862) +++ trunk/OpenMPT/soundlib/Waveform.cpp 2013-04-12 16:34:12 UTC (rev 1863) @@ -17,7 +17,7 @@ #pragma warning(disable:4100) #pragma warning(disable:4731) -void __cdecl X86_Normalize24BitBuffer(LPBYTE pbuffer, UINT dwSize, DWORD lmax24, int *poutput) +static void X86_Normalize24BitBuffer(LPBYTE pbuffer, UINT dwSize, DWORD lmax24, int *poutput) { _asm { mov esi, pbuffer // esi = edi = pbuffer @@ -54,11 +54,11 @@ #endif #ifdef ENABLE_X86 -extern void MPPASMCALL X86_Dither(int *pBuffer, UINT nSamples, UINT nBits); +extern void X86_Dither(int *pBuffer, UINT nSamples, UINT nBits); #endif -extern DWORD MPPASMCALL X86_Convert32To8(LPVOID lpBuffer, int *, DWORD nSamples); -extern DWORD MPPASMCALL X86_Convert32To16(LPVOID lpBuffer, int *, DWORD nSamples); -extern DWORD MPPASMCALL X86_Convert32To24(LPVOID lpBuffer, int *, DWORD nSamples); +extern DWORD X86_Convert32To8(LPVOID lpBuffer, int *, DWORD nSamples); +extern DWORD X86_Convert32To16(LPVOID lpBuffer, int *, DWORD nSamples); +extern DWORD X86_Convert32To24(LPVOID lpBuffer, int *, DWORD nSamples); UINT CSoundFile::Normalize24BitBuffer(LPBYTE pbuffer, UINT dwSize, DWORD lmax24, DWORD dwByteInc) //----------------------------------------------------------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <man...@us...> - 2013-04-12 16:58:18
|
Revision: 1864 http://sourceforge.net/p/modplug/code/1864 Author: manxorist Date: 2013-04-12 16:58:11 +0000 (Fri, 12 Apr 2013) Log Message: ----------- [Ref] Remove unneeded __cdecl in mix-plugin related code. Modified Paths: -------------- trunk/OpenMPT/mptrack/Vstplug.h trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/plugins/PlugInterface.h Modified: trunk/OpenMPT/mptrack/Vstplug.h =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.h 2013-04-12 16:34:12 UTC (rev 1863) +++ trunk/OpenMPT/mptrack/Vstplug.h 2013-04-12 16:58:11 UTC (rev 1864) @@ -347,7 +347,7 @@ VstIntPtr VstCallback(AEffect *effect, VstInt32 opcode, VstInt32 index, VstIntPtr value, void *ptr, float opt); VstIntPtr VstFileSelector(bool destructor, VstFileSelect *fileSel, const AEffect *effect); static VstIntPtr VSTCALLBACK MasterCallBack(AEffect *effect, VstInt32 opcode, VstInt32 index, VstIntPtr value, void *ptr, float opt); - static bool __cdecl CreateMixPluginProc(SNDMIXPLUGIN &, CSoundFile &); + static bool CreateMixPluginProc(SNDMIXPLUGIN &, CSoundFile &); VstTimeInfo timeInfo; //rewbs.VSTcompliance public: Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-04-12 16:34:12 UTC (rev 1863) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-04-12 16:58:11 UTC (rev 1864) @@ -4712,7 +4712,7 @@ } -PLUGINDEX __cdecl CSoundFile::GetChannelPlugin(CHANNELINDEX nChn, PluginMutePriority respectMutes) const +PLUGINDEX CSoundFile::GetChannelPlugin(CHANNELINDEX nChn, PluginMutePriority respectMutes) const //------------------------------------------------------------------------------------------------------ { const ModChannel &channel = Chn[nChn]; Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2013-04-12 16:34:12 UTC (rev 1863) +++ trunk/OpenMPT/soundlib/Sndfile.h 2013-04-12 16:58:11 UTC (rev 1864) @@ -59,7 +59,7 @@ #endif -typedef VOID (__cdecl * LPSNDMIXHOOKPROC)(int *, unsigned long, unsigned long); // buffer, samples, channels +typedef VOID (* LPSNDMIXHOOKPROC)(int *, unsigned long, unsigned long); // buffer, samples, channels #include "pattern.h" #include "patternContainer.h" @@ -731,9 +731,9 @@ } private: - PLUGINDEX __cdecl GetChannelPlugin(CHANNELINDEX nChn, PluginMutePriority respectMutes) const; - PLUGINDEX __cdecl GetActiveInstrumentPlugin(CHANNELINDEX, PluginMutePriority respectMutes) const; - IMixPlugin *__cdecl GetChannelInstrumentPlugin(CHANNELINDEX chn) const; + PLUGINDEX GetChannelPlugin(CHANNELINDEX nChn, PluginMutePriority respectMutes) const; + PLUGINDEX GetActiveInstrumentPlugin(CHANNELINDEX, PluginMutePriority respectMutes) const; + IMixPlugin * GetChannelInstrumentPlugin(CHANNELINDEX chn) const; void HandlePatternTransitionEvents(); Modified: trunk/OpenMPT/soundlib/plugins/PlugInterface.h =================================================================== --- trunk/OpenMPT/soundlib/plugins/PlugInterface.h 2013-04-12 16:34:12 UTC (rev 1863) +++ trunk/OpenMPT/soundlib/plugins/PlugInterface.h 2013-04-12 16:58:11 UTC (rev 1864) @@ -199,4 +199,4 @@ }; // rewbs.dryRatio: Hopefully this doesn't need to be a fixed size. class CSoundFile; -typedef bool (__cdecl *PMIXPLUGINCREATEPROC)(SNDMIXPLUGIN &, CSoundFile &); +typedef bool (*PMIXPLUGINCREATEPROC)(SNDMIXPLUGIN &, CSoundFile &); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2013-04-12 17:44:07
|
Revision: 1866 http://sourceforge.net/p/modplug/code/1866 Author: saga-games Date: 2013-04-12 17:43:54 +0000 (Fri, 12 Apr 2013) Log Message: ----------- [Ref] Moved song message functionality to own class SongMessage. Use std::string as an implementation base. Modified Paths: -------------- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp trunk/OpenMPT/mptrack/CleanupSong.cpp trunk/OpenMPT/mptrack/Ctrl_com.cpp trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/Mod2wave.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/Undo.cpp trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/VstPresets.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/Vstplug.h trunk/OpenMPT/mptrack/mod2midi.cpp trunk/OpenMPT/mptrack/mptrack_08.vcproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters trunk/OpenMPT/mptrack/test/test.cpp trunk/OpenMPT/soundlib/Dlsbank.cpp trunk/OpenMPT/soundlib/LOAD_DMF.CPP trunk/OpenMPT/soundlib/Load_669.cpp trunk/OpenMPT/soundlib/Load_ams.cpp trunk/OpenMPT/soundlib/Load_far.cpp trunk/OpenMPT/soundlib/Load_gdm.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_itp.cpp trunk/OpenMPT/soundlib/Load_mdl.cpp trunk/OpenMPT/soundlib/Load_med.cpp trunk/OpenMPT/soundlib/Load_mid.cpp trunk/OpenMPT/soundlib/Load_mt2.cpp trunk/OpenMPT/soundlib/Load_mtm.cpp trunk/OpenMPT/soundlib/Load_ult.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Message.cpp trunk/OpenMPT/soundlib/ModSequence.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/unzip/unzip.cpp trunk/OpenMPT/unzip/unzip.h Added Paths: ----------- trunk/OpenMPT/soundlib/FloatMixer.h trunk/OpenMPT/soundlib/Message.h Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -19,6 +19,7 @@ #include "../common/StringFixer.h" #include "MIDIMacros.h" #include "VstPresets.h" +#include "../soundlib/FileReader.h" #ifndef NO_VST Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp =================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -14,6 +14,7 @@ #include "Mainfrm.h" #include "modsmp_ctrl.h" #include "CleanupSong.h" +#include "../common/StringFixer.h" // Default checkbox state bool CModCleanupDlg::m_bCheckBoxes[CU_MAX_CLEANUP_OPTIONS] = Modified: trunk/OpenMPT/mptrack/Ctrl_com.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_com.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/mptrack/Ctrl_com.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -127,9 +127,10 @@ m_EditComments.SetRedraw(FALSE); m_EditComments.SetSel(0, -1, TRUE); m_EditComments.ReplaceSel(""); - if (m_pSndFile->m_lpszSongComments) + if(!m_pSndFile->songMessage.empty()) { - CHAR s[256], *p = m_pSndFile->m_lpszSongComments, c; + CHAR s[256], c; + const char *p = m_pSndFile->songMessage.c_str(); UINT ln = 0; while ((c = *p++) != NULL) { @@ -167,24 +168,23 @@ void CCtrlComments::OnCommentsChanged() //------------------------------------- { - CHAR s[256], *oldcomments = NULL; - if ((m_nLockCount) || (!m_pSndFile) || !m_pSndFile->GetModSpecifications().hasComments) return; if ((!m_bInitialized) || (!m_EditComments.m_hWnd) || (!m_EditComments.GetModify())) return; - if (m_pSndFile->m_lpszSongComments) - { - oldcomments = m_pSndFile->m_lpszSongComments; - m_pSndFile->m_lpszSongComments = NULL; - } + + CHAR s[LINE_LENGTH + 2]; + const char *oldMsg = m_pSndFile->songMessage.c_str(); + // Updating comments { - - UINT n = m_EditComments.GetLineCount(); LPSTR p = new char[n * LINE_LENGTH + 1]; + if (!p) + { + return; + } p[0] = 0; - if (!p) return; + for (UINT i=0; i<n; i++) { int ln = m_EditComments.GetLine(i, s, LINE_LENGTH); @@ -206,27 +206,20 @@ len--; p[len] = 0; } - if (p[0]) - m_pSndFile->m_lpszSongComments = p; - else - delete[] p; - if (oldcomments) + + m_EditComments.SetModify(FALSE); + if(p != m_pSndFile->songMessage) { - bool bSame = false; - if ((m_pSndFile->m_lpszSongComments) - && (!strcmp(m_pSndFile->m_lpszSongComments, oldcomments))) bSame = true; - delete[] oldcomments; - if (bSame) return; - } else - { - if (!m_pSndFile->m_lpszSongComments) return; + m_pSndFile->songMessage.assign(p); + + if(m_pModDoc) + { + m_pModDoc->SetModified(); + m_pModDoc->UpdateAllViews(NULL, HINT_MODCOMMENTS, this); + } } - if (m_pModDoc) - { - m_EditComments.SetModify(FALSE); - m_pModDoc->SetModified(); - m_pModDoc->UpdateAllViews(NULL, HINT_MODCOMMENTS, this); - } + + delete[] p; } } Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -27,6 +27,7 @@ #include "modsmp_ctrl.h" #include "Autotune.h" #include "../common/StringFixer.h" +#include "../soundlib/FileReader.h" #include <Shlwapi.h> #ifdef _DEBUG Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mod2wave.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/mptrack/Mod2wave.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -624,9 +624,9 @@ m_CbnGenre.GetWindowText(sText, sizeof(sText)); m_FileTags.genre = sText; - if (m_pSndFile->m_lpszSongComments) + if(!m_pSndFile->songMessage.empty()) { - m_FileTags.comments = m_pSndFile->GetSongMessage(leLF); + m_FileTags.comments = m_pSndFile->songMessage.GetFormatted(SongMessage::leLF); } else { Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -16,6 +16,7 @@ #include "dlsbank.h" #include "modsmp_ctrl.h" #include "../common/misc_util.h" +#include "../common/StringFixer.h" #pragma warning(disable:4244) //"conversion from 'type1' to 'type2', possible loss of data" Modified: trunk/OpenMPT/mptrack/Undo.cpp =================================================================== --- trunk/OpenMPT/mptrack/Undo.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/mptrack/Undo.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -14,6 +14,7 @@ #include "MainFrm.h" #include "modsmp_ctrl.h" #include "Undo.h" +#include "../common/StringFixer.h" #define new DEBUG_NEW Modified: trunk/OpenMPT/mptrack/View_tre.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/mptrack/View_tre.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -277,7 +277,7 @@ m_SongFile->Create(lpStream, NULL, dwLen); // Destroy some stuff that we're not going to use anyway. m_SongFile->Patterns.DestroyPatterns(); - m_SongFile->FreeMessage(); + m_SongFile->songMessage.clear(); } f.Unlock(); } Modified: trunk/OpenMPT/mptrack/VstPresets.cpp =================================================================== --- trunk/OpenMPT/mptrack/VstPresets.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/mptrack/VstPresets.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -11,10 +11,11 @@ #include "stdafx.h" #ifndef NO_VST -#include "Sndfile.h" +#include "../soundlib/Sndfile.h" #include "Vstplug.h" #include <vstsdk2.4/pluginterfaces/vst2.x/vstfxstore.h> #include "VstPresets.h" +#include "../soundlib/FileReader.h" // This part of the header is identical for both presets and banks. Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -25,6 +25,7 @@ #include "../common/version.h" #include "midimappingdialog.h" #include "../common/StringFixer.h" +#include "../soundlib/FileReader.h" #include "../soundlib/plugins/JBridge.h" #ifdef VST_USE_ALTERNATIVE_MAGIC //Pelya's plugin ID fix. Breaks fx presets, so let's avoid it for now. #define ZLIB_WINAPI Modified: trunk/OpenMPT/mptrack/Vstplug.h =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.h 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/mptrack/Vstplug.h 2013-04-12 17:43:54 UTC (rev 1866) @@ -18,6 +18,8 @@ #include "../soundlib/Snd_defs.h" #include "../soundlib/plugins/PluginMixBuffer.h" +#include "../common/StringFixer.h" + //#define kBuzzMagic 'Buzz' #define kDmoMagic 'DXMO' Modified: trunk/OpenMPT/mptrack/mod2midi.cpp =================================================================== --- trunk/OpenMPT/mptrack/mod2midi.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/mptrack/mod2midi.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -11,6 +11,7 @@ #include "stdafx.h" #include "Mptrack.h" #include "../soundlib/Sndfile.h" +#include "../common/StringFixer.h" #include "mod2midi.h" #include "Wav.h" @@ -393,12 +394,13 @@ } // Add Song comments on track 0 - if ((m_pSndFile->m_lpszSongComments) && (m_pSndFile->m_lpszSongComments[0])) + if(!m_pSndFile->songMessage.empty()) { + const std::string msg = m_pSndFile->songMessage.GetFormatted(SongMessage::leCR); tmp[0] = 0; tmp[1] = 0xff; tmp[2] = 0x02; Tracks[0].Write(tmp, 3); - Tracks[0].WriteLen(strlen(m_pSndFile->m_lpszSongComments)); - Tracks[0].Write(m_pSndFile->m_lpszSongComments, strlen(m_pSndFile->m_lpszSongComments)); + Tracks[0].WriteLen(msg.length()); + Tracks[0].Write(msg.c_str(), msg.length()); } // Add channel names Modified: trunk/OpenMPT/mptrack/mptrack_08.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_08.vcproj 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/mptrack/mptrack_08.vcproj 2013-04-12 17:43:54 UTC (rev 1866) @@ -1291,6 +1291,10 @@ > </File> <File + RelativePath="..\soundlib\Message.h" + > + </File> + <File RelativePath="..\soundlib\Load_669.cpp" > </File> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2013-04-12 17:43:54 UTC (rev 1866) @@ -417,6 +417,7 @@ <ClInclude Include="..\soundlib\FileReader.h" /> <ClInclude Include="..\soundlib\ITCompression.h" /> <ClInclude Include="..\soundlib\ITTools.h" /> + <ClInclude Include="..\soundlib\Message.h" /> <ClInclude Include="..\soundlib\MIDIEvents.h" /> <ClInclude Include="..\soundlib\MIDIMacros.h" /> <ClInclude Include="..\soundlib\MixerSettings.h" /> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2013-04-12 17:43:54 UTC (rev 1866) @@ -789,6 +789,9 @@ <ClInclude Include="..\sounddev\SoundDevice.h"> <Filter>Header Files\sounddev</Filter> </ClInclude> + <ClInclude Include="..\soundlib\Message.h"> + <Filter>Header Files</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <None Include="res\bitmap1.bmp"> Modified: trunk/OpenMPT/mptrack/test/test.cpp =================================================================== --- trunk/OpenMPT/mptrack/test/test.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/mptrack/test/test.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -328,7 +328,7 @@ // Global Variables VERIFY_EQUAL_NONCONT(strcmp(pSndFile->m_szNames[0], "Test Module"), 0); - VERIFY_EQUAL_NONCONT(pSndFile->m_lpszSongComments[0], 'O'); + VERIFY_EQUAL_NONCONT(pSndFile->songMessage.at(0), 'O'); VERIFY_EQUAL_NONCONT(pSndFile->m_nDefaultTempo, 139); VERIFY_EQUAL_NONCONT(pSndFile->m_nDefaultSpeed, 5); VERIFY_EQUAL_NONCONT(pSndFile->m_nGlobalVolume, 128); @@ -522,7 +522,7 @@ // Global Variables VERIFY_EQUAL_NONCONT(strcmp(pSndFile->m_szNames[0], "Test Module_____________X"), 0); - VERIFY_EQUAL_NONCONT(pSndFile->m_lpszSongComments[0], 'O'); + VERIFY_EQUAL_NONCONT(pSndFile->songMessage.at(0), 'O'); VERIFY_EQUAL_NONCONT(pSndFile->m_nDefaultTempo, 139); VERIFY_EQUAL_NONCONT(pSndFile->m_nDefaultSpeed, 5); VERIFY_EQUAL_NONCONT(pSndFile->m_nGlobalVolume, 128); Modified: trunk/OpenMPT/soundlib/Dlsbank.cpp =================================================================== --- trunk/OpenMPT/soundlib/Dlsbank.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/soundlib/Dlsbank.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -15,6 +15,7 @@ #include "dlsbank.h" #include "Wav.h" #include "../common/StringFixer.h" +#include "../soundlib/FileReader.h" #include "SampleIO.h" //#define DLSBANK_LOG Added: trunk/OpenMPT/soundlib/FloatMixer.h =================================================================== --- trunk/OpenMPT/soundlib/FloatMixer.h (rev 0) +++ trunk/OpenMPT/soundlib/FloatMixer.h 2013-04-12 17:43:54 UTC (rev 1866) @@ -0,0 +1,389 @@ +// FIXME left vs right +// FIXME: Playing samples backwards should reverse interpolation LUTs as well - we might need separate LUTs because otherwise we will add tons of branches. Done for linear interpolation. +// Konzept loop-wraparound: +// Hinter dem eigentlichen Sample Platz lassen f\xFCr 2x max LUT size * num channels * samplesize +// Die letzten LUT samples vor dem loopend und die ersten LUT samples nach dem loopstart werden dorthin kopiert +// -> Bzw bei pingpong-samples die letzten LUT samples umdrehen, statt die ersten LUT samples zu verwenden +// Je nachdem, wo wir uns im sample befinden, beim rendern dann das normale sample oder den loopteil hinter dem sample als pointer verwenden +// -> Auch f\xFCr pingpong-samples am samplestart? + +typedef float mixsample_t; + +extern mixsample_t gFastSincf[]; +extern mixsample_t gKaiserSincf[]; // 8-taps polyphase +extern mixsample_t gDownsample13xf[]; // 1.3x downsampling +extern mixsample_t gDownsample2xf[]; // 2x downsampling +extern mixsample_t gLinearInterpolationForward[]; +extern mixsample_t gLinearInterpolationBackward[]; + +////////////////////////////////////////////////////////////////////////// +// Sample conversion traits + +template<int channelsOut, int channelsIn, typename out, typename in> +struct BasicTraits +{ + static const int numChannelsIn = channelsIn; // Number of channels in sample + static const int numChannelsOut = channelsOut; // Number of mixer output channels + typedef out output_t; // Output buffer sample type + typedef in input_t; // Input buffer sample type + typedef out outbuf_t[channelsOut]; // Output buffer sampling point type + // To perform sample conversion, add a function with the following signature to your derived classes: + // static forceinline output_t Convert(const input_t x) +}; + +template<int channelsOut, int channelsIn, typename out, typename in, int int2float> +struct IntToFloatTraits : public BasicTraits<channelsOut, channelsIn, out, in> +{ + static_assert(std::numeric_limits<input_t>::is_integer, "Input must be integer"); + static_assert(!std::numeric_limits<output_t>::is_integer, "Output must be floating point"); + + static forceinline output_t Convert(const input_t x) + { + return static_cast<output_t>(x) * (static_cast<output_t>(1.0f) / static_cast<output_t>(int2float)); + } +}; + +typedef IntToFloatTraits<2, 1, mixsample_t, int8, -int8_min> Int8MToFloatS; +typedef IntToFloatTraits<2, 1, mixsample_t, int16, -int16_min> Int16MToFloatS; +typedef IntToFloatTraits<2, 2, mixsample_t, int8, -int8_min> Int8SToFloatS; +typedef IntToFloatTraits<2, 2, mixsample_t, int16, -int16_min> Int16SToFloatS; + + +////////////////////////////////////////////////////////////////////////// +// Interpolation templates + +template<class Traits> +struct NoInterpolation +{ + forceinline void Start(const ModChannel &) { } + forceinline void End(const ModChannel &) { } + + forceinline void operator() (typename Traits::outbuf_t &outSample, const typename Traits::input_t * const inBuffer, const int32) + { + static_assert(Traits::numChannelsIn <= Traits::numChannelsOut, "Too many input channels"); + + for(int i = 0; i < Traits::numChannelsIn; i++) + { + outSample[i] = Traits::Convert(inBuffer[i]); + } + } +}; + + +template<class Traits> +struct LinearInterpolation +{ + const mixsample_t *lut; + int dir; + + forceinline void Start(const ModChannel &chn) + { + lut = chn.nInc >= 0 ? gLinearInterpolationForward : gLinearInterpolationBackward; + dir = chn.nInc >= 0 ? Traits::numChannelsIn : -Traits::numChannelsIn; + } + + forceinline void End(const ModChannel &) { } + + forceinline void operator() (typename Traits::outbuf_t &outSample, const typename Traits::input_t * const inBuffer, const int32 posLo) + { + static_assert(Traits::numChannelsIn <= Traits::numChannelsOut, "Too many input channels"); + const mixsample_t fract = lut[posLo >> 8]; + + for(int i = 0; i < Traits::numChannelsIn; i++) + { + Traits::output_t srcVol = Traits::Convert(inBuffer[i]); + Traits::output_t destVol = Traits::Convert(inBuffer[i + dir]); + + outSample[i] = srcVol + fract * (destVol - srcVol); + } + } +}; + + +template<class Traits> +struct FastSincInterpolation +{ + forceinline void Start(const ModChannel &) { } + forceinline void End(const ModChannel &) { } + + forceinline void operator() (typename Traits::outbuf_t &outSample, const typename Traits::input_t * const inBuffer, const int32 posLo) + { + static_assert(Traits::numChannelsIn <= Traits::numChannelsOut, "Too many input channels"); + const mixsample_t *lut = gFastSincf + ((posLo >> 6) & 0x3FC); + + for(int i = 0; i < Traits::numChannelsIn; i++) + { + outSample[i] = + lut[0] * Traits::Convert(inBuffer[i - Traits::numChannelsIn]) + + lut[1] * Traits::Convert(inBuffer[i]) + + lut[2] * Traits::Convert(inBuffer[i + Traits::numChannelsIn]) + + lut[3] * Traits::Convert(inBuffer[i + 2 * Traits::numChannelsIn]); + } + } +}; + + +template<class Traits> +struct PolyphaseInterpolation +{ + const mixsample_t *sinc; + forceinline void Start(const ModChannel &chn) + { + sinc = (((chn.nInc > 0x13000) || (chn.nInc < -0x13000)) ? + (((chn.nInc > 0x18000) || (chn.nInc < -0x18000)) ? gDownsample2xf : gDownsample13xf) : gKaiserSincf); + } + + forceinline void End(const ModChannel &) { } + + forceinline void operator() (typename Traits::outbuf_t &outSample, const typename Traits::input_t * const inBuffer, const int32 posLo) + { + static_assert(Traits::numChannelsIn <= Traits::numChannelsOut, "Too many input channels"); + const mixsample_t *lut = sinc + ((posLo >> 1) & ~0x1F); + + for(int i = 0; i < Traits::numChannelsIn; i++) + { + outSample[i] = + lut[0] * Traits::Convert(inBuffer[i - 3 * Traits::numChannelsIn]) + + lut[1] * Traits::Convert(inBuffer[i - 2 * Traits::numChannelsIn]) + + lut[2] * Traits::Convert(inBuffer[i - Traits::numChannelsIn]) + + lut[3] * Traits::Convert(inBuffer[i]) + + lut[4] * Traits::Convert(inBuffer[i + Traits::numChannelsIn]) + + lut[5] * Traits::Convert(inBuffer[i + 2 * Traits::numChannelsIn]) + + lut[6] * Traits::Convert(inBuffer[i + 3 * Traits::numChannelsIn]) + + lut[7] * Traits::Convert(inBuffer[i + 4 * Traits::numChannelsIn]); + } + } +}; + + +template<class Traits> +struct FIRFilterInterpolation +{ + forceinline void Start(const ModChannel &) { } + forceinline void End(const ModChannel &) { } + + forceinline void operator() (typename Traits::outbuf_t &outSample, const typename Traits::input_t * const inBuffer, const int32 posLo) + { + static_assert(Traits::numChannelsIn <= Traits::numChannelsOut, "Too many input channels"); + const mixsample_t * const lut = CWindowedFIR::lutf + (((posLo + WFIR_FRACHALVE) >> WFIR_FRACSHIFT) & WFIR_FRACMASK); + + for(int i = 0; i < Traits::numChannelsIn; i++) + { + outSample[i] = + lut[0] * Traits::Convert(inBuffer[i - 3 * Traits::numChannelsIn]) + + lut[1] * Traits::Convert(inBuffer[i - 2 * Traits::numChannelsIn]) + + lut[2] * Traits::Convert(inBuffer[i - Traits::numChannelsIn]) + + lut[3] * Traits::Convert(inBuffer[i]) + + lut[4] * Traits::Convert(inBuffer[i + Traits::numChannelsIn]) + + lut[5] * Traits::Convert(inBuffer[i + 2 * Traits::numChannelsIn]) + + lut[6] * Traits::Convert(inBuffer[i + 3 * Traits::numChannelsIn]) + + lut[7] * Traits::Convert(inBuffer[i + 4 * Traits::numChannelsIn]); + } + } +}; + + +////////////////////////////////////////////////////////////////////////// +// Mixing templates (add sample to stereo mix) + +template<class Traits> +struct NoRamp +{ + typename Traits::output_t lVol, rVol; + + forceinline void Start(const ModChannel &chn) + { + lVol = static_cast<Traits::output_t>(chn.nLeftVol) * (1.0f / 4096.0f); + rVol = static_cast<Traits::output_t>(chn.nRightVol) * (1.0f / 4096.0f); + } + + forceinline void End(const ModChannel &) { } +}; + + +struct Ramp +{ + int32 lRamp, rRamp; + + forceinline void Start(const ModChannel &chn) + { + lRamp = chn.nRampLeftVol; + rRamp = chn.nRampRightVol; + } + + forceinline void End(ModChannel &chn) + { + chn.nRampLeftVol = lRamp; chn.nLeftVol = lRamp >> VOLUMERAMPPRECISION; + chn.nRampRightVol = rRamp; chn.nRightVol = rRamp >> VOLUMERAMPPRECISION; + } +}; + + +// Legacy optimization: If chn.nLeftVol == chn.nRightVol, save one multiplication instruction +template<class Traits> +struct MixMonoFastNoRamp : public NoRamp<Traits> +{ + forceinline void operator() (const typename Traits::outbuf_t &outSample, const ModChannel &chn, typename Traits::output_t * const outBuffer) + { + Traits::output_t vol = outSample[0] * lVol; + for(int i = 0; i < Traits::numChannelsOut; i++) + { + outBuffer[i] += vol; + } + } +}; + + +template<class Traits> +struct MixMonoNoRamp : public NoRamp<Traits> +{ + forceinline void operator() (const typename Traits::outbuf_t &outSample, const ModChannel &, typename Traits::output_t * const outBuffer) + { + outBuffer[0] += outSample[0] * lVol; + outBuffer[1] += outSample[0] * rVol; + } +}; + + +template<class Traits> +struct MixMonoRamp : public Ramp +{ + forceinline void operator() (const typename Traits::outbuf_t &outSample, const ModChannel &chn, typename Traits::output_t * const outBuffer) + { + // TODO volume is not float! + lRamp += chn.nLeftRamp; + rRamp += chn.nRightRamp; + outBuffer[0] += outSample[0] * (lRamp >> VOLUMERAMPPRECISION) * (1.0f / 4096.0f); + outBuffer[1] += outSample[0] * (rRamp >> VOLUMERAMPPRECISION) * (1.0f / 4096.0f); + } +}; + + +template<class Traits> +struct MixStereoNoRamp : public NoRamp<Traits> +{ + forceinline void operator() (const typename Traits::outbuf_t &outSample, const ModChannel &, typename Traits::output_t * const outBuffer) + { + outBuffer[0] += outSample[0] * lVol; + outBuffer[1] += outSample[1] * rVol; + } +}; + + +template<class Traits> +struct MixStereoRamp : public Ramp +{ + forceinline void operator() (const typename Traits::outbuf_t &outSample, const ModChannel &chn, typename Traits::output_t * const outBuffer) + { + // TODO volume is not float! + lRamp += chn.nLeftRamp; + rRamp += chn.nRightRamp; + outBuffer[0] += outSample[0] * (lRamp >> VOLUMERAMPPRECISION) * (1.0f / 4096.0f); + outBuffer[1] += outSample[1] * (rRamp >> VOLUMERAMPPRECISION) * (1.0f / 4096.0f); + } +}; + + +////////////////////////////////////////////////////////////////////////// +// Filter templates + + +template<class Traits> +struct NoFilter +{ + forceinline void Start(const ModChannel &) { } + forceinline void End(const ModChannel &) { } + + forceinline void operator() (const typename Traits::outbuf_t &, const ModChannel &) { } +}; + + +// Resonant filter +template<class Traits> +struct ResonantFilter +{ + // Filter history + typename Traits::output_t fy[Traits::numChannelsIn][2]; + + forceinline void Start(const ModChannel &chn) + { + for(int i = 0; i < Traits::numChannelsIn; i++) + { + fy[i][0] = chn.nFilter_Y[i][0]; + fy[i][1] = chn.nFilter_Y[i][1]; + } + } + + forceinline void End(ModChannel &chn) + { + for(int i = 0; i < Traits::numChannelsIn; i++) + { + chn.nFilter_Y[i][0] = fy[i][0]; + chn.nFilter_Y[i][1] = fy[i][1]; + } + } + + // Filter values are clipped to double the input range +#define ClipFilter(x) Clamp(x, static_cast<Traits::output_t>(-2.0f), static_cast<Traits::output_t>(2.0f)) + + forceinline void operator() (typename Traits::outbuf_t &outSample, const ModChannel &chn) + { + static_assert(Traits::numChannelsIn <= Traits::numChannelsOut, "Too many input channels"); + + for(int i = 0; i < Traits::numChannelsIn; i++) + { + Traits::output_t val = (outSample[i] * chn.nFilter_A0 + ClipFilter(fy[i][0]) * chn.nFilter_B0 + ClipFilter(fy[i][1]) * chn.nFilter_B1); + fy[i][1] = fy[i][0]; + fy[i][0] = val - (outSample[i] * chn.nFilter_HPf); + outSample[i] = val; + } + } + +#undef ClipFilter +}; + + +////////////////////////////////////////////////////////////////////////// +// Main sample render loop template + + +// Template parameters: +// Traits: A BasicTraits instance that defines the number of channels, sample buffer types, etc.. +// InterpolationFunc: Functor for reading the sample data and doing the SRC +// FilterFunc: Functor for applying the resonant filter +// MixFunc: Functor for mixing the computed sample data into the output buffer +template<class Traits, class InterpolationFunc, class FilterFunc, class MixFunc> +static void MPPASMCALL SampleLoop(ModChannel &chn, typename Traits::output_t *outBuffer, int numSamples) +{ + register ModChannel &c = chn; + const Traits::input_t *inSample = static_cast<const Traits::input_t *>(c.pCurrentSample) + c.nPos * Traits::numChannelsIn; + int32 smpPos = c.nPosLo; // 16.16 sample position relative to c.nPos + + InterpolationFunc interpolate; + FilterFunc filter; + MixFunc mix; + + // Do initialisation if necessary + interpolate.Start(c); + filter.Start(c); + mix.Start(c); + + register int samples = numSamples; + do + { + Traits::outbuf_t outSample; + interpolate(outSample, inSample + (smpPos >> 16) * Traits::numChannelsIn, (smpPos & 0xFFFF)); + filter(outSample, c); + mix(outSample, c, outBuffer); + outBuffer += Traits::numChannelsOut; + + smpPos += c.nInc; + } while(--samples); + + mix.End(c); + filter.End(c); + interpolate.End(c); + + c.nPos += smpPos >> 16; + c.nPosLo = smpPos & 0xFFFF; +}; Modified: trunk/OpenMPT/soundlib/LOAD_DMF.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2013-04-12 17:43:54 UTC (rev 1866) @@ -1030,7 +1030,7 @@ chunk = chunks.GetChunk(DMFChunk::idCMSG); if(chunk.IsValid()) { - ReadFixedLineLengthMessage(chunk, chunk.GetLength() - 1, 40, 0); + songMessage.ReadFixedLineLength(chunk, chunk.GetLength() - 1, 40, 0); } // Read sample headers + data Modified: trunk/OpenMPT/soundlib/Load_669.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_669.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/soundlib/Load_669.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -129,7 +129,7 @@ // Copy first song message line into song title StringFixer::ReadString<StringFixer::spacePadded>(m_szNames[0], fileHeader.songMessage, 36); // Song Message - ReadFixedLineLengthMessage(reinterpret_cast<const BYTE *>(fileHeader.songMessage), 108, 36, 0); + songMessage.ReadFixedLineLength(fileHeader.songMessage, 108, 36, 0); // Reading Orders Order.ReadFromArray(fileHeader.orders); Modified: trunk/OpenMPT/soundlib/Load_ams.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ams.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/soundlib/Load_ams.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -450,7 +450,7 @@ } // Packed text doesn't include any line breaks! - ReadFixedLineLengthMessage(&textOut[0], textOut.size(), 76, 0, ConvertAMSTextChars); + songMessage.ReadFixedLineLength(&textOut[0], textOut.size(), 76, 0, ConvertAMSTextChars); } // Read Order List @@ -828,7 +828,7 @@ uint8 composerLength = file.ReadUint8(); if(composerLength) { - ReadMessage(file, composerLength, leAutodetect, ConvertAMSTextChars); + songMessage.Read(file, composerLength, SongMessage::leAutodetect, ConvertAMSTextChars); } // Channel names @@ -867,7 +867,7 @@ } } // Packed text doesn't include any line breaks! - ReadFixedLineLengthMessage(&textOut[0], descriptionHeader.unpackedLen, 74, 0, ConvertAMSTextChars); + songMessage.ReadFixedLineLength(&textOut[0], descriptionHeader.unpackedLen, 74, 0, ConvertAMSTextChars); } // Read Order List Modified: trunk/OpenMPT/soundlib/Load_far.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_far.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/soundlib/Load_far.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -165,7 +165,7 @@ // Read song message if(fileHeader.messageLength != 0) { - ReadFixedLineLengthMessage(file, fileHeader.messageLength, 132, 0); // 132 characters per line... wow. :) + songMessage.ReadFixedLineLength(file, fileHeader.messageLength, 132, 0); // 132 characters per line... wow. :) } // Read orders Modified: trunk/OpenMPT/soundlib/Load_gdm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_gdm.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/soundlib/Load_gdm.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -509,7 +509,7 @@ // Read song comments if(fileHeader.messageTextLength > 0 && file.Seek(fileHeader.messageTextOffset)) { - ReadMessage(file, fileHeader.messageTextLength, leAutodetect); + songMessage.Read(file, fileHeader.messageTextLength, SongMessage::leAutodetect); } return true; Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -580,7 +580,7 @@ // Generally, IT files should use CR for line endings. However, ChibiTracker uses LF. One could do... // if(itHeader.cwtv == 0x0214 && itHeader.cmwt == 0x0214 && itHeader.reserved == ITFileHeader::chibiMagic) --> Chibi detected. // But we'll just use autodetection here: - ReadMessage(file, fileHeader.msglength, leAutodetect); + songMessage.Read(file, fileHeader.msglength, SongMessage::leAutodetect); } } @@ -1156,10 +1156,10 @@ // Comments uint16 msglength = 0; - if(m_lpszSongComments) + if(!songMessage.empty()) { itHeader.special |= ITFileHeader::embedSongMessage; - itHeader.msglength = msglength = (uint16)MIN(strlen(m_lpszSongComments) + 1, uint16_max); + itHeader.msglength = msglength = (uint16)MIN(songMessage.length() + 1, uint16_max); itHeader.msgoffset = dwHdrPos + dwExtra + (itHeader.insnum + itHeader.smpnum + itHeader.patnum) * 4; } @@ -1226,7 +1226,7 @@ if(itHeader.special & ITFileHeader::embedSongMessage) { dwPos += msglength; - fwrite(m_lpszSongComments, 1, msglength, f); + fwrite(songMessage.c_str(), 1, msglength, f); } // Writing instruments Modified: trunk/OpenMPT/soundlib/Load_itp.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_itp.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/soundlib/Load_itp.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -51,7 +51,7 @@ } // Song comments - ReadMessage(file, file.ReadUint32LE(), leCR); + songMessage.Read(file, file.ReadUint32LE(), SongMessage::leCR); // Song global config m_SongFlags = static_cast<SongFlags>(file.ReadUint32LE() & SONG_FILE_FLAGS); @@ -295,11 +295,14 @@ // Song comments // comment string length - id = m_lpszSongComments ? strlen(m_lpszSongComments)+1 : 0; - fwrite(&id, 1, sizeof(id), f); + { + const size_t msgLength = songMessage.empty() ? 0 : songMessage.length() + 1; + id = msgLength; + fwrite(&id, 1, sizeof(id), f); - // comment string - if(m_lpszSongComments) fwrite(&m_lpszSongComments[0], 1, strlen(m_lpszSongComments)+1, f); + // comment string + if(msgLength) fwrite(songMessage.c_str(), 1, msgLength, f); + } // Song global config Modified: trunk/OpenMPT/soundlib/Load_mdl.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mdl.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/soundlib/Load_mdl.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -348,7 +348,7 @@ #endif if(blocklen) { - ReadMessage(lpStream + dwMemPos, blocklen - 1, leCR); + songMessage.Read(lpStream + dwMemPos, blocklen - 1, SongMessage::leCR); } break; // PA: Pattern Data Modified: trunk/OpenMPT/soundlib/Load_med.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_med.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/soundlib/Load_med.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -706,7 +706,7 @@ annolen = MIN(annolen, MED_MAX_COMMENT_LENGTH); //Thanks to Luigi Auriemma for pointing out an overflow risk if ((annotxt) && (annolen) && (annolen <= dwMemLength) && (annotxt <= dwMemLength - annolen) ) { - ReadMessage(lpStream + annotxt, annolen - 1, leAutodetect); + songMessage.Read(lpStream + annotxt, annolen - 1, SongMessage::leAutodetect); } // Song Name UINT songname = BigEndian(pmex->songname); Modified: trunk/OpenMPT/soundlib/Load_mid.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mid.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/soundlib/Load_mid.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -722,17 +722,17 @@ memcpy(m_szNames[0], ptrk->ptracks, len); m_szNames[0][len] = 0; } else - if ((!m_lpszSongComments) && (ptrk->ptracks[0]) && (ptrk->ptracks[0] < 0x7F)) + if (songMessage.empty() && (ptrk->ptracks[0]) && (ptrk->ptracks[0] < 0x7F)) { - ReadMessage(ptrk->ptracks, len, leAutodetect); + songMessage.Read(ptrk->ptracks, len, SongMessage::leAutodetect); } break; // FF.02 [text]: Song Copyright case 0x02: if (!len) break; - if ((!m_lpszSongComments) && (ptrk->ptracks[0]) && (ptrk->ptracks[0] < 0x7F) && (len > 7)) + if (songMessage.empty() && (ptrk->ptracks[0]) && (ptrk->ptracks[0] < 0x7F) && (len > 7)) { - ReadMessage(ptrk->ptracks, len, leAutodetect); + songMessage.Read(ptrk->ptracks, len, SongMessage::leAutodetect); } break; // FF.03: Sequence Name Modified: trunk/OpenMPT/soundlib/Load_mt2.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mt2.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/soundlib/Load_mt2.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -267,7 +267,7 @@ { DWORD nTxtLen = dwLen; if (nTxtLen > 32000) nTxtLen = 32000; - ReadMessage(lpStream + dwMemPos + 1, nTxtLen - 1, leCRLF); + songMessage.Read(lpStream + dwMemPos + 1, nTxtLen - 1, SongMessage::leCRLF); } break; // SUM -> author name (or "Unregistered") Modified: trunk/OpenMPT/soundlib/Load_mtm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mtm.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/soundlib/Load_mtm.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -186,7 +186,7 @@ { // Read message with a fixed line length of 40 characters // (actually the last character is always null, so make that 39 + 1 padding byte) - ReadFixedLineLengthMessage(file, fileHeader.commentSize, 39, 1); + songMessage.ReadFixedLineLength(file, fileHeader.commentSize, 39, 1); } // Reading Samples Modified: trunk/OpenMPT/soundlib/Load_ult.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ult.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/soundlib/Load_ult.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -392,7 +392,7 @@ SetModFlag(MSF_COMPATIBLE_PLAY, true); // read "messageLength" lines, each containing 32 characters. - ReadFixedLineLengthMessage(file, fileHeader.messageLength * 32, 32, 0); + songMessage.ReadFixedLineLength(file, fileHeader.messageLength * 32, 32, 0); m_nSamples = static_cast<SAMPLEINDEX>(file.ReadUint8()); if(GetNumSamples() >= MAX_SAMPLES) Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -440,7 +440,7 @@ // Read song comments: "text" if(file.ReadMagic("text")) { - ReadMessage(file, file.ReadUint32LE(), leCR); + songMessage.Read(file, file.ReadUint32LE(), SongMessage::leCR); madeWith |= verConfirmed; } @@ -866,13 +866,13 @@ if(!compatibilityExport) { // Writing song comments - if ((m_lpszSongComments) && (m_lpszSongComments[0])) + if(!songMessage.empty()) { DWORD d = 0x74786574; fwrite(&d, 1, 4, f); - d = strlen(m_lpszSongComments); + d = songMessage.length(); fwrite(&d, 1, 4, f); - fwrite(m_lpszSongComments, 1, d, f); + fwrite(songMessage.c_str(), 1, d, f); } // Writing midi cfg if (m_SongFlags[SONG_EMBEDMIDICFG]) Modified: trunk/OpenMPT/soundlib/Message.cpp =================================================================== --- trunk/OpenMPT/soundlib/Message.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/soundlib/Message.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -14,59 +14,25 @@ #include "stdafx.h" -#include "Sndfile.h" +#include "Message.h" +#include "FileReader.h" -// Allocate memory for song message. -// [in] length: text length in characters, without possible trailing null terminator. -// [out] returns true on success. -bool CSoundFile::AllocateMessage(size_t length) -//--------------------------------------------- -{ - FreeMessage(); - try - { - if(length == Util::MaxValueOfType(length)) - { - return false; - } - length++; // + 1 for trailing null - m_lpszSongComments = new char[length]; - memset(m_lpszSongComments, 0, length); - return true; - } catch(MPTMemoryException) - { - m_lpszSongComments = nullptr; - return false; - } -} - - -// Free previously allocated song message memory -void CSoundFile::FreeMessage() -//---------------------------- -{ - delete[] m_lpszSongComments; - m_lpszSongComments = nullptr; -} - - // Read song message from a mapped file. // [in] data: pointer to the data in memory that is going to be read // [in] length: number of characters that should be read, not including a possible trailing null terminator (it is automatically appended). // [in] lineEnding: line ending formatting of the text in memory. // [in] pTextConverter: Pointer to a callback function which can be used to pre-process the read characters, if necessary (nullptr otherwise). // [out] returns true on success. -bool CSoundFile::ReadMessage(const BYTE *data, size_t length, enmLineEndings lineEnding, void (*pTextConverter)(char &)) -//---------------------------------------------------------------------------------------------------------------------- +bool SongMessage::Read(const void *data, size_t length, LineEnding lineEnding, ConverterFunc pTextConverter) +//---------------------------------------------------------------------------------------------------------- { - while(length != 0 && data[length - 1] == '\0') + const char *str = static_cast<const char *>(data); + while(length != 0 && str[length - 1] == '\0') { // Ignore trailing null character. length--; } - char c; - // Simple line-ending detection algorithm. VERY simple. if(lineEnding == leAutodetect) { @@ -75,7 +41,7 @@ // find CRs, LFs and CRLFs for(size_t i = 0; i < length; i++) { - c = data[i]; + char c = str[i]; if(pTextConverter != nullptr) pTextConverter(c); @@ -100,7 +66,7 @@ // calculate the final amount of characters to be allocated. for(size_t i = 0; i < length; i++) { - c = data[i]; + char c = str[i]; if(pTextConverter != nullptr) pTextConverter(c); @@ -108,13 +74,12 @@ finalLength++; } - if(!AllocateMessage(finalLength)) - return false; + resize(finalLength); size_t cpos = 0; for(size_t i = 0; i < length; i++, cpos++) { - c = data[i]; + char c = str[i]; if(pTextConverter != nullptr) pTextConverter(c); @@ -122,22 +87,22 @@ { case '\r': if(lineEnding != leLF) - m_lpszSongComments[cpos] = INTERNAL_LINEENDING; + at(cpos) = INTERNAL_LINEENDING; else - m_lpszSongComments[cpos] = ' '; + at(cpos) = ' '; if(lineEnding == leCRLF) i++; // skip the LF break; case '\n': if(lineEnding != leCR && lineEnding != leCRLF) - m_lpszSongComments[cpos] = INTERNAL_LINEENDING; + at(cpos) = INTERNAL_LINEENDING; else - m_lpszSongComments[cpos] = ' '; + at(cpos) = ' '; break; case '\0': - m_lpszSongComments[cpos] = ' '; + at(cpos) = ' '; break; default: - m_lpszSongComments[cpos] = c; + at(cpos) = c; break; } } @@ -146,6 +111,16 @@ } +bool SongMessage::Read(FileReader &file, const size_t length, LineEnding lineEnding, ConverterFunc pTextConverter) +//---------------------------------------------------------------------------------------------------------------- +{ + FileReader::off_t readLength = std::min(static_cast<FileReader::off_t>(length), file.BytesLeft()); + bool success = Read(file.GetRawData(), readLength, lineEnding, pTextConverter); + file.Skip(readLength); + return success; +} + + // Read comments with fixed line length from a mapped file. // [in] data: pointer to the data in memory that is going to be read // [in] length: number of characters that should be read, not including a possible trailing null terminator (it is automatically appended). @@ -153,34 +128,35 @@ // [in] lineEndingLength: The padding space between two fixed lines. (there could for example be a null char after every line) // [in] pTextConverter: Pointer to a callback function which can be used to pre-process the read characters, if necessary (nullptr otherwise). // [out] returns true on success. -bool CSoundFile::ReadFixedLineLengthMessage(const BYTE *data, const size_t length, const size_t lineLength, const size_t lineEndingLength, void (*pTextConverter)(char &)) -//------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +bool SongMessage::ReadFixedLineLength(const void *data, const size_t length, const size_t lineLength, const size_t lineEndingLength, ConverterFunc pTextConverter) +//---------------------------------------------------------------------------------------------------------------------------------------------------------------- { + const char *str = static_cast<const char *>(data); if(lineLength == 0) return false; const size_t numLines = (length / (lineLength + lineEndingLength)); const size_t finalLength = numLines * (lineLength + 1); - if(!AllocateMessage(finalLength)) - return false; + clear(); + reserve(finalLength); for(size_t line = 0, fpos = 0, cpos = 0; line < numLines; line++, fpos += (lineLength + lineEndingLength), cpos += (lineLength + 1)) { - memcpy(m_lpszSongComments + cpos, data + fpos, std::min(lineLength, length - fpos)); - m_lpszSongComments[cpos + lineLength] = INTERNAL_LINEENDING; + append(str + fpos, std::min(lineLength, length - fpos)); + at(cpos + lineLength) = INTERNAL_LINEENDING; // fix weird chars for(size_t lpos = 0; lpos < lineLength; lpos++) { // Pre-process text - if(pTextConverter != nullptr) pTextConverter(m_lpszSongComments[cpos + lpos]); + if(pTextConverter != nullptr) pTextConverter(at(cpos + lpos)); - switch(m_lpszSongComments[cpos + lpos]) + switch(at(cpos + lpos)) { case '\0': case '\n': case '\r': - m_lpszSongComments[cpos + lpos] = ' '; + at(cpos + lpos) = ' '; break; } @@ -190,46 +166,57 @@ } +bool SongMessage::ReadFixedLineLength(FileReader &file, const size_t length, const size_t lineLength, const size_t lineEndingLength, ConverterFunc pTextConverter) +//---------------------------------------------------------------------------------------------------------------------------------------------------------------- +{ + FileReader::off_t readLength = std::min(static_cast<FileReader::off_t>(length), file.BytesLeft()); + bool success = ReadFixedLineLength(file.GetRawData(), readLength, lineLength, lineEndingLength, pTextConverter); + file.Skip(readLength); + return success; +} + + // Retrieve song message. // [in] lineEnding: line ending formatting of the text in memory. // [in] pTextConverter: Pointer to a callback function which can be used to post-process the written characters, if necessary (nullptr otherwise). // [out] returns formatted song message. -mpt::String CSoundFile::GetSongMessage(const enmLineEndings lineEnding, void (*pTextConverter)(char &)) const -//------------------------------------------------------------------------------------------------------- +std::string SongMessage::GetFormatted(const LineEnding lineEnding, ConverterFunc pTextConverter) const +//---------------------------------------------------------------------------------------------------- { - mpt::String comments; + std::string comments; - if(m_lpszSongComments == nullptr) + if(empty()) { return comments; } - const size_t len = strlen(m_lpszSongComments); - comments.reserve(len); + const size_t len = length(); + comments.resize(len); + size_t writePos = 0; for(size_t i = 0; i < len; i++) { - if(m_lpszSongComments[i] == INTERNAL_LINEENDING) + if(at(i) == INTERNAL_LINEENDING) { switch(lineEnding) { case leCR: default: - comments.append(1, '\r'); + comments.at(writePos++) = '\r'; break; case leCRLF: - comments.append(1, 'r'); + comments.at(writePos++) = '\r'; // Intentional fall-through case leLF: - comments.append(1, '\n'); + comments.at(writePos++) = '\n'; break; } } else { - char c = m_lpszSongComments[i]; + char c = at(i); // Pre-process text if(pTextConverter != nullptr) pTextConverter(c); - comments.append(1, c); + comments.at(writePos++) = c; } } return comments; Added: trunk/OpenMPT/soundlib/Message.h =================================================================== --- trunk/OpenMPT/soundlib/Message.h (rev 0) +++ trunk/OpenMPT/soundlib/Message.h 2013-04-12 17:43:54 UTC (rev 1866) @@ -0,0 +1,64 @@ +/* + * Message.h + * --------- + * Purpose: Various functions for processing song messages (allocating, reading from file...) + * Notes : (currently none) + * Authors: OpenMPT Devs + * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. + */ + + +#pragma once + +#include <string> + +class FileReader; + +//==================================== +class SongMessage : public std::string +//==================================== +{ +public: + + typedef void (*ConverterFunc)(char &); + + // Line ending types (for reading song messages from module files) + enum LineEnding + { + leCR, // Carriage Return (0x0D, \r) + leLF, // Line Feed (0x0A \n) + leCRLF, // Carriage Return, Line Feed (0x0D0A, \r\n) + leMixed, // It is not defined whether Carriage Return or Line Feed is the actual line ending. Both are accepted. + leAutodetect, // Detect suitable line ending + }; + + enum + { + INTERNAL_LINEENDING = '\r', // The character that represents line endings internally + }; + + // Read song message from a mapped file. + // [in] data: pointer to the data in memory that is going to be read + // [in] length: number of characters that should be read, not including a possible trailing null terminator (it is automatically appended). + // [in] lineEnding: line ending formatting of the text in memory. + // [in] pTextConverter: Pointer to a callback function which can be used to pre-process the read characters, if necessary (nullptr otherwise). + // [out] returns true on success. + bool Read(const void *data, const size_t length, LineEnding lineEnding, ConverterFunc pTextConverter = nullptr); + bool Read(FileReader &file, const size_t length, LineEnding lineEnding, ConverterFunc pTextConverter = nullptr); + + // Read comments with fixed line length from a mapped file. + // [in] data: pointer to the data in memory that is going to be read + // [in] length: number of characters that should be read, not including a possible trailing null terminator (it is automatically appended). + // [in] lineLength: The fixed length of a line. + // [in] lineEndingLength: The padding space between two fixed lines. (there could for example be a null char after every line) + // [in] pTextConverter: Pointer to a callback function which can be used to pre-process the read characters, if necessary (nullptr otherwise). + // [out] returns true on success. + bool ReadFixedLineLength(const void *data, const size_t length, const size_t lineLength, const size_t lineEndingLength, ConverterFunc pTextConverter = nullptr); + bool ReadFixedLineLength(FileReader &file, const size_t length, const size_t lineLength, const size_t lineEndingLength, ConverterFunc pTextConverter = nullptr); + + // Retrieve song message. + // [in] lineEnding: line ending formatting of the text in memory. + // [in] pTextConverter: Pointer to a callback function which can be used to post-process the written characters, if necessary (nullptr otherwise). + // [out] returns formatted song message. + std::string GetFormatted(const LineEnding lineEnding, ConverterFunc pTextConverter = nullptr) const; +}; Modified: trunk/OpenMPT/soundlib/ModSequence.cpp =================================================================== --- trunk/OpenMPT/soundlib/ModSequence.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/soundlib/ModSequence.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -17,6 +17,7 @@ #include "../common/version.h" #include "../common/serialization_utils.h" #include "../common/Reporting.h" +#include "FileReader.h" #include <functional> #define str_SequenceTruncationNote (GetStrI18N((_TEXT("Module has sequence of length %u; it will be truncated to maximum supported length, %u.")))) Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -16,9 +16,10 @@ #endif // MODPLUG_TRACKER #include "../common/version.h" #include "../common/serialization_utils.h" -#include "sndfile.h" +#include "Sndfile.h" #include "tuningcollection.h" #include "../common/StringFixer.h" +#include "FileReader.h" #ifndef NO_COPYRIGHT #ifndef NO_MMCMP_SUPPORT @@ -432,7 +433,6 @@ m_nMixChannels = 0; m_nSamples = 0; m_nInstruments = 0; - m_lpszSongComments = nullptr; m_nFreqFactor = m_nTempoFactor = 128; m_nMinPeriod = MIN_PERIOD; m_nMaxPeriod = 0x7FFF; @@ -529,7 +529,6 @@ m_nSamplePreAmp = 48; m_nVSTiVolume = 48; m_nMaxOrderPosition = 0; - m_lpszSongComments = nullptr; m_nMixLevels = mixLevels_compatible; // Will be overridden if appropriate. MemsetZero(ChnMix); MemsetZero(Instruments); @@ -538,6 +537,7 @@ //Order.assign(MAX_ORDERS, Order.GetInvalidPatIndex()); Order.resize(1); Patterns.ClearPatterns(); + songMessage.clear(); for (CHANNELINDEX nChn = 0; nChn < MAX_BASECHANNELS; nChn++) { @@ -647,9 +647,9 @@ #ifdef ZIPPED_MOD_SUPPORT // Read archive comment if there is no song comment - if((!m_lpszSongComments) && unzip.GetComments(false)) + if(!songMessage.empty() && unzip.GetComments(false)) { - m_lpszSongComments = (LPSTR)unzip.GetComments(true); + songMessage.assign(unzip.GetComments(true)); } #endif #ifdef MMCMP_SUPPORT @@ -835,7 +835,7 @@ Patterns.DestroyPatterns(); - FreeMessage(); + songMessage.clear(); for(SAMPLEINDEX i = 1; i < MAX_SAMPLES; i++) { Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/soundlib/Sndfile.h 2013-04-12 17:43:54 UTC (rev 1866) @@ -31,7 +31,7 @@ #include "modcommand.h" #include "plugins/PlugInterface.h" #include "RowVisitor.h" -#include "FileReader.h" +#include "Message.h" #include "Resampler.h" #include "../sounddsp/Reverb.h" @@ -65,17 +65,6 @@ #include "patternContainer.h" #include "ModSequence.h" - -// Line ending types (for reading song messages from module files) -enum enmLineEndings -{ - leCR, // Carriage Return (0x0D, \r) - leLF, // Line Feed (0x0A \n) - leCRLF, // Carriage Return, Line Feed (0x0D0A, \r\n) - leMixed, // It is not defined whether Carriage Return or Line Feed is the actual line ending. Both are accepted. - leAutodetect, // Detect suitable line ending -}; - #define INTERNAL_LINEENDING '\r' // The character that represents line endings internally @@ -310,7 +299,6 @@ LONG m_nRepeatCount; // -1 means repeat infinitely. DWORD m_nGlobalFadeSamples, m_nGlobalFadeMaxSamples; UINT m_nMaxOrderPosition; - LPSTR m_lpszSongComments; UINT ChnMix[MAX_CHANNELS]; // Channels to be mixed ModChannel Chn[MAX_CHANNELS]; // Mixing channels... First m_nChannel channels are master channels (i.e. they are never NNA channels)! ModChannelSettings ChnSettings[MAX_BASECHANNELS]; // Initial channels settings @@ -336,6 +324,9 @@ // For handling backwards jumps and stuff to prevent infinite loops when counting the mod length or rendering to wav. RowVisitor visitedSongRows; + // Song message + SongMessage songMessage; + // -> CODE#0023 // -> DESC="IT project files (.itp)" mpt::String m_szInstrumentPath[MAX_INSTRUMENTS]; @@ -682,54 +673,6 @@ // WAV export UINT Normalize24BitBuffer(LPBYTE pbuffer, UINT cbsizebytes, DWORD lmax24, DWORD dwByteInc); - // Song message helper functions -public: - // Allocate memory for song message. - // [in] length: text length in characters, without possible trailing null terminator. - // [out] returns true on success. - bool AllocateMessage(size_t length); - - // Free previously allocated song message memory. - void FreeMessage(); - - // Retrieve song message. - // [in] lineEnding: line ending formatting of the text in memory. - // [in] pTextConverter: Pointer to a callback function which can be used to post-process the written characters, if necessary (nullptr otherwise). - // [out] returns formatted song message. - mpt::String GetSongMessage(const enmLineEndings lineEnding, void (*pTextConverter)(char &) = nullptr) const; - -protected: - // Read song message from a mapped file. - // [in] data: pointer to the data in memory that is going to be read - // [in] length: number of characters that should be read, not including a possible trailing null terminator (it is automatically appended). - // [in] lineEnding: line ending formatting of the text in memory. - // [in] pTextConverter: Pointer to a callback function which can be used to pre-process the read characters, if necessary (nullptr otherwise). - // [out] returns true on success. - bool ReadMessage(const BYTE *data, FileReader::off_t length, enmLineEndings lineEnding, void (*pTextConverter)(char &) = nullptr); - bool ReadMessage(FileReader &file, FileReader::off_t length, enmLineEndings lineEnding, void (*pTextConverter)(char &) = nullptr) - { - FileReader::off_t readLength = std::min(length, file.BytesLeft()); - bool success = ReadMessage(reinterpret_cast<const BYTE*>(file.GetRawData()), readLength, lineEnding, pTextConverter); - file.Skip(readLength); - return success; - } - - // Read comments with fixed line length from a mapped file. - // [in] data: pointer to the data in memory that is going to be read - // [in] length: number of characters that should be read, not including a possible trailing null terminator (it is automatically appended). - // [in] lineLength: The fixed length of a line. - // [in] lineEndingLength: The padding space between two fixed lines. (there could for example be a null char after every line) - // [in] pTextConverter: Pointer to a callback function which can be used to pre-process the read characters, if necessary (nullptr otherwise). - // [out] returns true on success. - bool ReadFixedLineLengthMessage(const BYTE *data, const FileReader::off_t length, const size_t lineLength, const size_t lineEndingLength, void (*pTextConverter)(char &) = nullptr); - bool ReadFixedLineLengthMessage(FileReader &file, const FileReader::off_t length, const size_t lineLength, const size_t lineEndingLength, void (*pTextConverter)(char &) = nullptr) - { - FileReader::off_t readLength = std::min(length, file.BytesLeft()); - bool success = ReadFixedLineLengthMessage(reinterpret_cast<const BYTE*>(file.GetRawData()), readLength, lineLength, lineEndingLength, pTextConverter); - file.Skip(readLength); - return success; - } - private: PLUGINDEX GetChannelPlugin(CHANNELINDEX nChn, PluginMutePriority respectMutes) const; PLUGINDEX GetActiveInstrumentPlugin(CHANNELINDEX, PluginMutePriority respectMutes) const; Modified: trunk/OpenMPT/unzip/unzip.cpp =================================================================== --- trunk/OpenMPT/unzip/unzip.cpp 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/unzip/unzip.cpp 2013-04-12 17:43:54 UTC (rev 1866) @@ -205,8 +205,8 @@ } -void *CZipArchive::GetComments(bool get) -//-------------------------------------- +const char *CZipArchive::GetComments(bool get) +//-------------------------------------------- { unz_global_info info; if(zipFile == nullptr || unzGetGlobalInfo(zipFile, &info) != UNZ_OK) @@ -216,7 +216,7 @@ if(!get) { - return reinterpret_cast<void *>((info.size_comment > 0) ? 1 : 0); + return reinterpret_cast<char *>((info.size_comment > 0) ? 1 : 0); } else if(info.size_comment > 0) { if(info.size_comment < Util::MaxValueOfType(info.size_comment)) Modified: trunk/OpenMPT/unzip/unzip.h =================================================================== --- trunk/OpenMPT/unzip/unzip.h 2013-04-12 17:05:17 UTC (rev 1865) +++ trunk/OpenMPT/unzip/unzip.h 2013-04-12 17:43:54 UTC (rev 1866) @@ -23,7 +23,7 @@ FileReader GetOutputFile() const { return outFile; } bool IsArchive() const; bool ExtractFile(); - void *GetComments(bool get); + const char *GetComments(bool get); CZipArchive(FileReader &file, const std::vector<const char *> &ext); ~CZipArchive(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2013-04-12 17:47:39
|
Revision: 1867 http://sourceforge.net/p/modplug/code/1867 Author: saga-games Date: 2013-04-12 17:47:32 +0000 (Fri, 12 Apr 2013) Log Message: ----------- [Imp] When changing MIDI input devices, instantly apply this change. Previously the old MIDI device was kept open. [Ref] Removed accidentally added FloatMixer.h Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp Removed Paths: ------------- trunk/OpenMPT/soundlib/FloatMixer.h Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2013-04-12 17:43:54 UTC (rev 1866) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2013-04-12 17:47:32 UTC (rev 1867) @@ -1751,8 +1751,15 @@ BOOL CMainFrame::SetupMidi(DWORD d, LONG n) //----------------------------------------- { + bool deviceChanged = (TrackerSettings::Instance().m_nMidiDevice != n); TrackerSettings::Instance().m_dwMidiSetup = d; TrackerSettings::Instance().m_nMidiDevice = n; + if(deviceChanged && shMidiIn) + { + // Device has changed, close the old one. + midiCloseDevice(); + midiOpenDevice(); + } return TRUE; } Deleted: trunk/OpenMPT/soundlib/FloatMixer.h =================================================================== --- trunk/OpenMPT/soundlib/FloatMixer.h 2013-04-12 17:43:54 UTC (rev 1866) +++ trunk/OpenMPT/soundlib/FloatMixer.h 2013-04-12 17:47:32 UTC (rev 1867) @@ -1,389 +0,0 @@ -// FIXME left vs right -// FIXME: Playing samples backwards should reverse interpolation LUTs as well - we might need separate LUTs because otherwise we will add tons of branches. Done for linear interpolation. -// Konzept loop-wraparound: -// Hinter dem eigentlichen Sample Platz lassen f\xFCr 2x max LUT size * num channels * samplesize -// Die letzten LUT samples vor dem loopend und die ersten LUT samples nach dem loopstart werden dorthin kopiert -// -> Bzw bei pingpong-samples die letzten LUT samples umdrehen, statt die ersten LUT samples zu verwenden -// Je nachdem, wo wir uns im sample befinden, beim rendern dann das normale sample oder den loopteil hinter dem sample als pointer verwenden -// -> Auch f\xFCr pingpong-samples am samplestart? - -typedef float mixsample_t; - -extern mixsample_t gFastSincf[]; -extern mixsample_t gKaiserSincf[]; // 8-taps polyphase -extern mixsample_t gDownsample13xf[]; // 1.3x downsampling -extern mixsample_t gDownsample2xf[]; // 2x downsampling -extern mixsample_t gLinearInterpolationForward[]; -extern mixsample_t gLinearInterpolationBackward[]; - -////////////////////////////////////////////////////////////////////////// -// Sample conversion traits - -template<int channelsOut, int channelsIn, typename out, typename in> -struct BasicTraits -{ - static const int numChannelsIn = channelsIn; // Number of channels in sample - static const int numChannelsOut = channelsOut; // Number of mixer output channels - typedef out output_t; // Output buffer sample type - typedef in input_t; // Input buffer sample type - typedef out outbuf_t[channelsOut]; // Output buffer sampling point type - // To perform sample conversion, add a function with the following signature to your derived classes: - // static forceinline output_t Convert(const input_t x) -}; - -template<int channelsOut, int channelsIn, typename out, typename in, int int2float> -struct IntToFloatTraits : public BasicTraits<channelsOut, channelsIn, out, in> -{ - static_assert(std::numeric_limits<input_t>::is_integer, "Input must be integer"); - static_assert(!std::numeric_limits<output_t>::is_integer, "Output must be floating point"); - - static forceinline output_t Convert(const input_t x) - { - return static_cast<output_t>(x) * (static_cast<output_t>(1.0f) / static_cast<output_t>(int2float)); - } -}; - -typedef IntToFloatTraits<2, 1, mixsample_t, int8, -int8_min> Int8MToFloatS; -typedef IntToFloatTraits<2, 1, mixsample_t, int16, -int16_min> Int16MToFloatS; -typedef IntToFloatTraits<2, 2, mixsample_t, int8, -int8_min> Int8SToFloatS; -typedef IntToFloatTraits<2, 2, mixsample_t, int16, -int16_min> Int16SToFloatS; - - -////////////////////////////////////////////////////////////////////////// -// Interpolation templates - -template<class Traits> -struct NoInterpolation -{ - forceinline void Start(const ModChannel &) { } - forceinline void End(const ModChannel &) { } - - forceinline void operator() (typename Traits::outbuf_t &outSample, const typename Traits::input_t * const inBuffer, const int32) - { - static_assert(Traits::numChannelsIn <= Traits::numChannelsOut, "Too many input channels"); - - for(int i = 0; i < Traits::numChannelsIn; i++) - { - outSample[i] = Traits::Convert(inBuffer[i]); - } - } -}; - - -template<class Traits> -struct LinearInterpolation -{ - const mixsample_t *lut; - int dir; - - forceinline void Start(const ModChannel &chn) - { - lut = chn.nInc >= 0 ? gLinearInterpolationForward : gLinearInterpolationBackward; - dir = chn.nInc >= 0 ? Traits::numChannelsIn : -Traits::numChannelsIn; - } - - forceinline void End(const ModChannel &) { } - - forceinline void operator() (typename Traits::outbuf_t &outSample, const typename Traits::input_t * const inBuffer, const int32 posLo) - { - static_assert(Traits::numChannelsIn <= Traits::numChannelsOut, "Too many input channels"); - const mixsample_t fract = lut[posLo >> 8]; - - for(int i = 0; i < Traits::numChannelsIn; i++) - { - Traits::output_t srcVol = Traits::Convert(inBuffer[i]); - Traits::output_t destVol = Traits::Convert(inBuffer[i + dir]); - - outSample[i] = srcVol + fract * (destVol - srcVol); - } - } -}; - - -template<class Traits> -struct FastSincInterpolation -{ - forceinline void Start(const ModChannel &) { } - forceinline void End(const ModChannel &) { } - - forceinline void operator() (typename Traits::outbuf_t &outSample, const typename Traits::input_t * const inBuffer, const int32 posLo) - { - static_assert(Traits::numChannelsIn <= Traits::numChannelsOut, "Too many input channels"); - const mixsample_t *lut = gFastSincf + ((posLo >> 6) & 0x3FC); - - for(int i = 0; i < Traits::numChannelsIn; i++) - { - outSample[i] = - lut[0] * Traits::Convert(inBuffer[i - Traits::numChannelsIn]) - + lut[1] * Traits::Convert(inBuffer[i]) - + lut[2] * Traits::Convert(inBuffer[i + Traits::numChannelsIn]) - + lut[3] * Traits::Convert(inBuffer[i + 2 * Traits::numChannelsIn]); - } - } -}; - - -template<class Traits> -struct PolyphaseInterpolation -{ - const mixsample_t *sinc; - forceinline void Start(const ModChannel &chn) - { - sinc = (((chn.nInc > 0x13000) || (chn.nInc < -0x13000)) ? - (((chn.nInc > 0x18000) || (chn.nInc < -0x18000)) ? gDownsample2xf : gDownsample13xf) : gKaiserSincf); - } - - forceinline void End(const ModChannel &) { } - - forceinline void operator() (typename Traits::outbuf_t &outSample, const typename Traits::input_t * const inBuffer, const int32 posLo) - { - static_assert(Traits::numChannelsIn <= Traits::numChannelsOut, "Too many input channels"); - const mixsample_t *lut = sinc + ((posLo >> 1) & ~0x1F); - - for(int i = 0; i < Traits::numChannelsIn; i++) - { - outSample[i] = - lut[0] * Traits::Convert(inBuffer[i - 3 * Traits::numChannelsIn]) - + lut[1] * Traits::Convert(inBuffer[i - 2 * Traits::numChannelsIn]) - + lut[2] * Traits::Convert(inBuffer[i - Traits::numChannelsIn]) - + lut[3] * Traits::Convert(inBuffer[i]) - + lut[4] * Traits::Convert(inBuffer[i + Traits::numChannelsIn]) - + lut[5] * Traits::Convert(inBuffer[i + 2 * Traits::numChannelsIn]) - + lut[6] * Traits::Convert(inBuffer[i + 3 * Traits::numChannelsIn]) - + lut[7] * Traits::Convert(inBuffer[i + 4 * Traits::numChannelsIn]); - } - } -}; - - -template<class Traits> -struct FIRFilterInterpolation -{ - forceinline void Start(const ModChannel &) { } - forceinline void End(const ModChannel &) { } - - forceinline void operator() (typename Traits::outbuf_t &outSample, const typename Traits::input_t * const inBuffer, const int32 posLo) - { - static_assert(Traits::numChannelsIn <= Traits::numChannelsOut, "Too many input channels"); - const mixsample_t * const lut = CWindowedFIR::lutf + (((posLo + WFIR_FRACHALVE) >> WFIR_FRACSHIFT) & WFIR_FRACMASK); - - for(int i = 0; i < Traits::numChannelsIn; i++) - { - outSample[i] = - lut[0] * Traits::Convert(inBuffer[i - 3 * Traits::numChannelsIn]) - + lut[1] * Traits::Convert(inBuffer[i - 2 * Traits::numChannelsIn]) - + lut[2] * Traits::Convert(inBuffer[i - Traits::numChannelsIn]) - + lut[3] * Traits::Convert(inBuffer[i]) - + lut[4] * Traits::Convert(inBuffer[i + Traits::numChannelsIn]) - + lut[5] * Traits::Convert(inBuffer[i + 2 * Traits::numChannelsIn]) - + lut[6] * Traits::Convert(inBuffer[i + 3 * Traits::numChannelsIn]) - + lut[7] * Traits::Convert(inBuffer[i + 4 * Traits::numChannelsIn]); - } - } -}; - - -////////////////////////////////////////////////////////////////////////// -// Mixing templates (add sample to stereo mix) - -template<class Traits> -struct NoRamp -{ - typename Traits::output_t lVol, rVol; - - forceinline void Start(const ModChannel &chn) - { - lVol = static_cast<Traits::output_t>(chn.nLeftVol) * (1.0f / 4096.0f); - rVol = static_cast<Traits::output_t>(chn.nRightVol) * (1.0f / 4096.0f); - } - - forceinline void End(const ModChannel &) { } -}; - - -struct Ramp -{ - int32 lRamp, rRamp; - - forceinline void Start(const ModChannel &chn) - { - lRamp = chn.nRampLeftVol; - rRamp = chn.nRampRightVol; - } - - forceinline void End(ModChannel &chn) - { - chn.nRampLeftVol = lRamp; chn.nLeftVol = lRamp >> VOLUMERAMPPRECISION; - chn.nRampRightVol = rRamp; chn.nRightVol = rRamp >> VOLUMERAMPPRECISION; - } -}; - - -// Legacy optimization: If chn.nLeftVol == chn.nRightVol, save one multiplication instruction -template<class Traits> -struct MixMonoFastNoRamp : public NoRamp<Traits> -{ - forceinline void operator() (const typename Traits::outbuf_t &outSample, const ModChannel &chn, typename Traits::output_t * const outBuffer) - { - Traits::output_t vol = outSample[0] * lVol; - for(int i = 0; i < Traits::numChannelsOut; i++) - { - outBuffer[i] += vol; - } - } -}; - - -template<class Traits> -struct MixMonoNoRamp : public NoRamp<Traits> -{ - forceinline void operator() (const typename Traits::outbuf_t &outSample, const ModChannel &, typename Traits::output_t * const outBuffer) - { - outBuffer[0] += outSample[0] * lVol; - outBuffer[1] += outSample[0] * rVol; - } -}; - - -template<class Traits> -struct MixMonoRamp : public Ramp -{ - forceinline void operator() (const typename Traits::outbuf_t &outSample, const ModChannel &chn, typename Traits::output_t * const outBuffer) - { - // TODO volume is not float! - lRamp += chn.nLeftRamp; - rRamp += chn.nRightRamp; - outBuffer[0] += outSample[0] * (lRamp >> VOLUMERAMPPRECISION) * (1.0f / 4096.0f); - outBuffer[1] += outSample[0] * (rRamp >> VOLUMERAMPPRECISION) * (1.0f / 4096.0f); - } -}; - - -template<class Traits> -struct MixStereoNoRamp : public NoRamp<Traits> -{ - forceinline void operator() (const typename Traits::outbuf_t &outSample, const ModChannel &, typename Traits::output_t * const outBuffer) - { - outBuffer[0] += outSample[0] * lVol; - outBuffer[1] += outSample[1] * rVol; - } -}; - - -template<class Traits> -struct MixStereoRamp : public Ramp -{ - forceinline void operator() (const typename Traits::outbuf_t &outSample, const ModChannel &chn, typename Traits::output_t * const outBuffer) - { - // TODO volume is not float! - lRamp += chn.nLeftRamp; - rRamp += chn.nRightRamp; - outBuffer[0] += outSample[0] * (lRamp >> VOLUMERAMPPRECISION) * (1.0f / 4096.0f); - outBuffer[1] += outSample[1] * (rRamp >> VOLUMERAMPPRECISION) * (1.0f / 4096.0f); - } -}; - - -////////////////////////////////////////////////////////////////////////// -// Filter templates - - -template<class Traits> -struct NoFilter -{ - forceinline void Start(const ModChannel &) { } - forceinline void End(const ModChannel &) { } - - forceinline void operator() (const typename Traits::outbuf_t &, const ModChannel &) { } -}; - - -// Resonant filter -template<class Traits> -struct ResonantFilter -{ - // Filter history - typename Traits::output_t fy[Traits::numChannelsIn][2]; - - forceinline void Start(const ModChannel &chn) - { - for(int i = 0; i < Traits::numChannelsIn; i++) - { - fy[i][0] = chn.nFilter_Y[i][0]; - fy[i][1] = chn.nFilter_Y[i][1]; - } - } - - forceinline void End(ModChannel &chn) - { - for(int i = 0; i < Traits::numChannelsIn; i++) - { - chn.nFilter_Y[i][0] = fy[i][0]; - chn.nFilter_Y[i][1] = fy[i][1]; - } - } - - // Filter values are clipped to double the input range -#define ClipFilter(x) Clamp(x, static_cast<Traits::output_t>(-2.0f), static_cast<Traits::output_t>(2.0f)) - - forceinline void operator() (typename Traits::outbuf_t &outSample, const ModChannel &chn) - { - static_assert(Traits::numChannelsIn <= Traits::numChannelsOut, "Too many input channels"); - - for(int i = 0; i < Traits::numChannelsIn; i++) - { - Traits::output_t val = (outSample[i] * chn.nFilter_A0 + ClipFilter(fy[i][0]) * chn.nFilter_B0 + ClipFilter(fy[i][1]) * chn.nFilter_B1); - fy[i][1] = fy[i][0]; - fy[i][0] = val - (outSample[i] * chn.nFilter_HPf); - outSample[i] = val; - } - } - -#undef ClipFilter -}; - - -////////////////////////////////////////////////////////////////////////// -// Main sample render loop template - - -// Template parameters: -// Traits: A BasicTraits instance that defines the number of channels, sample buffer types, etc.. -// InterpolationFunc: Functor for reading the sample data and doing the SRC -// FilterFunc: Functor for applying the resonant filter -// MixFunc: Functor for mixing the computed sample data into the output buffer -template<class Traits, class InterpolationFunc, class FilterFunc, class MixFunc> -static void MPPASMCALL SampleLoop(ModChannel &chn, typename Traits::output_t *outBuffer, int numSamples) -{ - register ModChannel &c = chn; - const Traits::input_t *inSample = static_cast<const Traits::input_t *>(c.pCurrentSample) + c.nPos * Traits::numChannelsIn; - int32 smpPos = c.nPosLo; // 16.16 sample position relative to c.nPos - - InterpolationFunc interpolate; - FilterFunc filter; - MixFunc mix; - - // Do initialisation if necessary - interpolate.Start(c); - filter.Start(c); - mix.Start(c); - - register int samples = numSamples; - do - { - Traits::outbuf_t outSample; - interpolate(outSample, inSample + (smpPos >> 16) * Traits::numChannelsIn, (smpPos & 0xFFFF)); - filter(outSample, c); - mix(outSample, c, outBuffer); - outBuffer += Traits::numChannelsOut; - - smpPos += c.nInc; - } while(--samples); - - mix.End(c); - filter.End(c); - interpolate.End(c); - - c.nPos += smpPos >> 16; - c.nPosLo = smpPos & 0xFFFF; -}; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |