From 1d900b92f5d68cdbb4ace60e7322257367d800b6 Mon Sep 17 00:00:00 2001 From: nofish Date: Fri, 15 Mar 2019 20:51:54 +0100 Subject: [PATCH] Snapshots: include track phase (polarity) closes #455 --- Snapshots/SnapshotClass.cpp | 116 ++++++++++++++++++++++-------------- Snapshots/SnapshotClass.h | 22 +++---- resource.h | 5 +- sws_extension.rc | 30 ++++++---- whatsnew.txt | 3 + 5 files changed, 105 insertions(+), 71 deletions(-) diff --git a/Snapshots/SnapshotClass.cpp b/Snapshots/SnapshotClass.cpp index 52699dcb3..d6beef616 100644 --- a/Snapshots/SnapshotClass.cpp +++ b/Snapshots/SnapshotClass.cpp @@ -169,18 +169,19 @@ TrackSnapshot::TrackSnapshot(MediaTrack* tr, int mask) else m_guid = *(GUID*)GetSetMediaTrackInfo(tr, "GUID", NULL); - m_dVol = *((double*)GetSetMediaTrackInfo(tr, "D_VOL", NULL)); - m_dPan = *((double*)GetSetMediaTrackInfo(tr, "D_PAN", NULL)); - m_bMute = *((bool*)GetSetMediaTrackInfo(tr, "B_MUTE", NULL)); - m_iSolo = *((int*)GetSetMediaTrackInfo(tr, "I_SOLO", NULL)); - m_iFXEn = *((int*)GetSetMediaTrackInfo(tr, "I_FXEN", NULL)); - m_iVis = GetTrackVis(tr); - m_iSel = *((int*)GetSetMediaTrackInfo(tr, "I_SELECTED", NULL)); - m_iPanMode = *((int*)GetSetMediaTrackInfo(tr, "I_PANMODE", NULL)); - m_dPanWidth = *((double*)GetSetMediaTrackInfo(tr, "D_WIDTH", NULL)); - m_dPanL = *((double*)GetSetMediaTrackInfo(tr, "D_DUALPANL", NULL)); - m_dPanR = *((double*)GetSetMediaTrackInfo(tr, "D_DUALPANR", NULL)); - m_dPanLaw = *((double*)GetSetMediaTrackInfo(tr, "D_PANLAW", NULL)); + m_dVol = *((double*)GetSetMediaTrackInfo(tr, "D_VOL", NULL)); + m_dPan = *((double*)GetSetMediaTrackInfo(tr, "D_PAN", NULL)); + m_bMute = *((bool*)GetSetMediaTrackInfo(tr, "B_MUTE", NULL)); + m_iSolo = *((int*)GetSetMediaTrackInfo(tr, "I_SOLO", NULL)); + m_iFXEn = *((int*)GetSetMediaTrackInfo(tr, "I_FXEN", NULL)); + m_iVis = GetTrackVis(tr); + m_iSel = *((int*)GetSetMediaTrackInfo(tr, "I_SELECTED", NULL)); + m_iPanMode = *((int*)GetSetMediaTrackInfo(tr, "I_PANMODE", NULL)); + m_dPanWidth = *((double*)GetSetMediaTrackInfo(tr, "D_WIDTH", NULL)); + m_dPanL = *((double*)GetSetMediaTrackInfo(tr, "D_DUALPANL", NULL)); + m_dPanR = *((double*)GetSetMediaTrackInfo(tr, "D_DUALPANR", NULL)); + m_dPanLaw = *((double*)GetSetMediaTrackInfo(tr, "D_PANLAW", NULL)); + m_bPhase = *((bool*)GetSetMediaTrackInfo(tr, "B_PHASE", NULL)); // Don't bother storing the sends if it's masked if (mask & SENDS_MASK) @@ -217,14 +218,15 @@ TrackSnapshot::TrackSnapshot(MediaTrack* tr, int mask) // "Copy" constructor with mask large items don't get copied too TrackSnapshot::TrackSnapshot(TrackSnapshot& ts):m_sends(ts.m_sends) { - m_guid = ts.m_guid; - m_dVol = ts.m_dVol; - m_dPan = ts.m_dPan; - m_bMute = ts.m_bMute; - m_iSolo = ts.m_iSolo; - m_iFXEn = ts.m_iFXEn; - m_iVis = ts.m_iVis; - m_iSel = ts.m_iSel; + m_guid = ts.m_guid; + m_dVol = ts.m_dVol; + m_dPan = ts.m_dPan; + m_bMute = ts.m_bMute; + m_iSolo = ts.m_iSolo; + m_iFXEn = ts.m_iFXEn; + m_iVis = ts.m_iVis; + m_iSel = ts.m_iSel; + m_bPhase = ts.m_bPhase; for (int i = 0; i < ts.m_fx.GetSize(); i++) m_fx.Add(new FXSnapshot(*ts.m_fx.Get(i))); if (ts.m_sFXChain.GetSize()) @@ -234,29 +236,31 @@ TrackSnapshot::TrackSnapshot(TrackSnapshot& ts):m_sends(ts.m_sends) } m_sName.Set(ts.m_sName.Get()); m_iTrackNum = ts.m_iTrackNum; - m_iPanMode = ts.m_iPanMode; - m_dPanWidth = ts.m_dPanWidth; - m_dPanL = ts.m_dPanL; - m_dPanR = ts.m_dPanR; - m_dPanLaw = ts.m_dPanLaw; + m_iPanMode = ts.m_iPanMode; + m_dPanWidth = ts.m_dPanWidth; + m_dPanL = ts.m_dPanL; + m_dPanR = ts.m_dPanR; + m_dPanLaw = ts.m_dPanLaw; + m_bPhase = ts.m_bPhase; } TrackSnapshot::TrackSnapshot(LineParser* lp) { stringToGuid(lp->gettoken_str(1), &m_guid); - m_dVol = lp->gettoken_float(2); - m_dPan = lp->gettoken_float(3); - m_bMute = lp->gettoken_int(4) ? true : false; - m_iSolo = lp->gettoken_int(5); - m_iFXEn = lp->gettoken_int(6); + m_dVol = lp->gettoken_float(2); + m_dPan = lp->gettoken_float(3); + m_bMute = lp->gettoken_int(4) ? true : false; + m_iSolo = lp->gettoken_int(5); + m_iFXEn = lp->gettoken_int(6); // For backward compat, flip the TCP vis bit - m_iVis = lp->gettoken_int(7) ^ 2; - m_iSel = lp->gettoken_int(8); - m_iPanMode = lp->getnumtokens() < 10 ? -1 : lp->gettoken_int(9); // If loading old format, set pan mode to -1 for proj default - m_dPanWidth = lp->gettoken_float(10); - m_dPanL = lp->gettoken_float(11); - m_dPanR = lp->gettoken_float(12); + m_iVis = lp->gettoken_int(7) ^ 2; + m_iSel = lp->gettoken_int(8); + m_iPanMode = lp->getnumtokens() < 10 ? -1 : lp->gettoken_int(9); // If loading old format, set pan mode to -1 for proj default + m_dPanWidth = lp->gettoken_float(10); + m_dPanL = lp->gettoken_float(11); + m_dPanR = lp->gettoken_float(12); m_dPanLaw = lp->getnumtokens() < 14 ? -100.0 : lp->gettoken_float(13); // If loading old format, set law to -2 for "ignore" + m_bPhase = lp->gettoken_int(14) ? true : false; // Set the track name "early" for backward compat MediaTrack* tr = GuidToTrack(&m_guid); @@ -349,6 +353,10 @@ bool TrackSnapshot::UpdateReaper(int mask, bool bSelOnly, int* fxErr, bool wantC { if (wantChunk) m_sends.UpdateReaper(tr, pFix); } + if (mask & PHASE_MASK) + { + GetSetMediaTrackInfo(tr, "B_PHASE", &m_bPhase); + } PreventUIRefresh(-1); @@ -376,7 +384,7 @@ void TrackSnapshot::GetChunk(WDL_FastString* chunk) { char guidStr[64]; guidToString(&m_guid, guidStr); - chunk->AppendFormatted(SNM_MAX_CHUNK_LINE_LENGTH, "AppendFormatted(SNM_MAX_CHUNK_LINE_LENGTH, "AppendFormatted(SNM_MAX_CHUNK_LINE_LENGTH, "NAME \"%s\" %d\n", m_sName.Get(), m_iTrackNum); m_sends.GetChunk(chunk); @@ -609,6 +617,17 @@ void TrackSnapshot::GetDetails(WDL_FastString* details, int iMask) details->Append("\r\n"); } } + if (iMask & PHASE_MASK) + { + if (m_iTrackNum != 0) // no phase switch on master + { + details->Append(__LOCALIZE("Phase", "sws_DLG_101")); + details->Append(": "); + details->Append(m_bPhase ? __LOCALIZE("inverted", "sws_DLG_101") : __LOCALIZE("normal", "sws_DLG_101")); + details->Append("\r\n"); + } + + } } void TrackSnapshot::GetSetEnvelope(MediaTrack* tr, WDL_FastString* str, const char* env, bool bSet) @@ -953,6 +972,10 @@ char* Snapshot::Tooltip(char* str, int maxLen) n += _snprintf(str + n, maxLen - n, "%s", ", "); n += _snprintf(str + n, maxLen - n, "%s", __LOCALIZE("selection","sws_DLG_101")); } + if (m_iMask & PHASE_MASK && n < maxLen) { + n += _snprintf(str + n, maxLen - n, "%s", ", "); + n += _snprintf(str + n, maxLen - n, "%s", __LOCALIZE("phase", "sws_DLG_101")); + } return str; } @@ -964,16 +987,17 @@ void Snapshot::SetName(const char* name) char newName[20]; switch(m_iMask) { - case VOL_MASK: sprintf(newName, "%s %d", __LOCALIZE("Vol","sws_DLG_101"), m_iSlot); break; - case PAN_MASK: sprintf(newName, "%s %d", __LOCALIZE("Pan","sws_DLG_101"), m_iSlot); break; - case MUTE_MASK: sprintf(newName, "%s %d", __LOCALIZE("Mute","sws_DLG_101"), m_iSlot); break; - case SOLO_MASK: sprintf(newName, "%s %d", __LOCALIZE("Solo","sws_DLG_101"), m_iSlot); break; + case VOL_MASK: sprintf(newName, "%s %d", __LOCALIZE("Vol","sws_DLG_101"), m_iSlot); break; + case PAN_MASK: sprintf(newName, "%s %d", __LOCALIZE("Pan","sws_DLG_101"), m_iSlot); break; + case MUTE_MASK: sprintf(newName, "%s %d", __LOCALIZE("Mute","sws_DLG_101"), m_iSlot); break; + case SOLO_MASK: sprintf(newName, "%s %d", __LOCALIZE("Solo","sws_DLG_101"), m_iSlot); break; case FXATM_MASK: // fallthrough - case FXCHAIN_MASK: sprintf(newName, "%s %d", __LOCALIZE("FX","sws_DLG_101"), m_iSlot); break; - case SENDS_MASK: sprintf(newName, "%s %d", __LOCALIZE("Sends","sws_DLG_101"), m_iSlot); break; - case VIS_MASK: sprintf(newName, "%s %d", __LOCALIZE("Vis","sws_DLG_101"), m_iSlot); break; - case SEL_MASK: sprintf(newName, "%s %d", __LOCALIZE("Sel","sws_DLG_101"), m_iSlot); break; - default: sprintf(newName, "%s %d", __LOCALIZE("Mix","sws_DLG_101"), m_iSlot); break; + case FXCHAIN_MASK: sprintf(newName, "%s %d", __LOCALIZE("FX","sws_DLG_101"), m_iSlot); break; + case SENDS_MASK: sprintf(newName, "%s %d", __LOCALIZE("Sends","sws_DLG_101"), m_iSlot); break; + case VIS_MASK: sprintf(newName, "%s %d", __LOCALIZE("Vis","sws_DLG_101"), m_iSlot); break; + case SEL_MASK: sprintf(newName, "%s %d", __LOCALIZE("Sel","sws_DLG_101"), m_iSlot); break; + case PHASE_MASK: sprintf(newName, "%s %d", __LOCALIZE("Phase", "sws_DLG_101"), m_iSlot); break; + default: sprintf(newName, "%s %d", __LOCALIZE("Mix","sws_DLG_101"), m_iSlot); break; } m_cName = new char[strlen(newName)+1]; strcpy(m_cName, newName); diff --git a/Snapshots/SnapshotClass.h b/Snapshots/SnapshotClass.h index 4fec640fa..8b4e144d8 100644 --- a/Snapshots/SnapshotClass.h +++ b/Snapshots/SnapshotClass.h @@ -74,6 +74,7 @@ class TrackSnapshot int m_iFXEn; int m_iVis; int m_iSel; + bool m_bPhase; WDL_PtrList m_fx; WDL_TypedBuf m_sFXChain; TrackSends m_sends; @@ -101,19 +102,20 @@ class TrackSnapshot #define PAN_MASK 0x002 #define MUTE_MASK 0x004 #define SOLO_MASK 0x008 -#define FXATM_MASK 0x010 -#define SENDS_MASK 0x020 -//#define SELONLY_MASK 0x040 -#define VIS_MASK 0x080 -#define SEL_MASK 0x100 -#define FXCHAIN_MASK 0x200 +#define FXATM_MASK 0x010 +#define SENDS_MASK 0x020 +//#define SELONLY_MASK 0x040 +#define VIS_MASK 0x080 +#define SEL_MASK 0x100 +#define FXCHAIN_MASK 0x200 +#define PHASE_MASK 0x400 #define ALL_MASK 0xFEF // large enough for forward compat, leave out FXATM -#define MIX_MASK (VOL_MASK | PAN_MASK | MUTE_MASK | SOLO_MASK | FXCHAIN_MASK | SENDS_MASK) +#define MIX_MASK (VOL_MASK | PAN_MASK | MUTE_MASK | SOLO_MASK | FXCHAIN_MASK | SENDS_MASK | PHASE_MASK) // Map controls to mask elements -const int cSSMasks[] = { VOL_MASK, PAN_MASK, MUTE_MASK, SOLO_MASK, SENDS_MASK, VIS_MASK, SEL_MASK, FXCHAIN_MASK }; -const int cSSCtrls[] = { IDC_VOL, IDC_PAN, IDC_MUTE, IDC_SOLO, IDC_SENDS, IDC_VISIBILITY, IDC_SELECTION, IDC_FXCHAIN }; -#define MASK_CTRLS 8 +const int cSSMasks[] = { VOL_MASK, PAN_MASK, MUTE_MASK, SOLO_MASK, SENDS_MASK, VIS_MASK, SEL_MASK, FXCHAIN_MASK, PHASE_MASK }; +const int cSSCtrls[] = { IDC_VOL, IDC_PAN, IDC_MUTE, IDC_SOLO, IDC_SENDS, IDC_VISIBILITY, IDC_SELECTION, IDC_FXCHAIN, IDC_PHASE }; +#define MASK_CTRLS 9 class Snapshot { diff --git a/resource.h b/resource.h index 0c8513380..05aef70ea 100644 --- a/resource.h +++ b/resource.h @@ -444,7 +444,8 @@ #define IDC_ALL_POS_H_COMBO 1356 #define IDC_ALL_POS_V_COMBO 1357 #define IDC_ALL_FOREGROUND 1358 -#define IDC_DELTRACKSPROMPT 1359 +#define IDC_DELTRACKSPROMPT 1359 // snapshots +#define IDC_PHASE 1360 // snapshots // Next default values for new objects // @@ -452,7 +453,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 189 #define _APS_NEXT_COMMAND_VALUE 40000 -#define _APS_NEXT_CONTROL_VALUE 1360 +#define _APS_NEXT_CONTROL_VALUE 1361 #define _APS_NEXT_SYMED_VALUE 100 #endif #endif diff --git a/sws_extension.rc b/sws_extension.rc index 1c9dacc5e..1ed64adbc 100644 --- a/sws_extension.rc +++ b/sws_extension.rc @@ -119,14 +119,16 @@ STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFR CAPTION "SWS Snapshots" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN +#define Y_OFFSET_CHECKBOX 12 +#define Y_OFFSET_PUSHBTN 17 CONTROL "",IDC_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,5,3,125,221 PUSHBUTTON "&New",IDC_SAVE,136,3,27,13 - PUSHBUTTON "Previous",IDC_PREVIOUS,140,212 + 17,41,13 - PUSHBUTTON "Next",IDC_NEXT,182,212 + 17,41,13 - PUSHBUTTON "Move Up",IDC_SWAP_UP,140,225 + 17,41,13 - PUSHBUTTON "Move Down",IDC_SWAP_DOWN,182,225 + 17,41,13 + PUSHBUTTON "Previous",IDC_PREVIOUS,140,212+Y_OFFSET_CHECKBOX+Y_OFFSET_PUSHBTN,41,13 + PUSHBUTTON "Next",IDC_NEXT,182,212+Y_OFFSET_CHECKBOX+Y_OFFSET_PUSHBTN,41,13 + PUSHBUTTON "Move Up",IDC_SWAP_UP,140,225+Y_OFFSET_CHECKBOX+Y_OFFSET_PUSHBTN,41,13 + PUSHBUTTON "Move Down",IDC_SWAP_DOWN,182,225+Y_OFFSET_CHECKBOX+Y_OFFSET_PUSHBTN,41,13 LTEXT "Del: Alt-click\nSave: Ctrl-click",IDC_HELPTEXT,171,3,54,18 - GROUPBOX "Filter",IDC_FILTERGROUP,135,18,88,99 + GROUPBOX "Filter",IDC_FILTERGROUP,135,18,88,99+Y_OFFSET_CHECKBOX CONTROL "Full Track Mix",IDC_MIX,"Button",BS_AUTORADIOBUTTON | WS_GROUP,140,29,70,10 CONTROL "Current Visibility",IDC_CURVIS,"Button",BS_AUTORADIOBUTTON,140,41,70,10 CONTROL "Custom",IDC_CUSTOM,"Button",BS_AUTORADIOBUTTON,140,53,70,10 @@ -138,16 +140,18 @@ BEGIN CONTROL "Sends",IDC_SENDS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,171,91,35,10 CONTROL "Vis",IDC_VISIBILITY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,103,27,10 CONTROL "Selection",IDC_SELECTION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,171,103,45,10 - CONTROL "Filter on Recall",IDC_APPLYRECALL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,122,63,10 - CONTROL "Save Sel Tracks Only",IDC_SELECTEDONLY_SAVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,135,81,10 - CONTROL "Recall Sel Tracks Only",IDC_SELECTEDONLY_RECALL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,148,81,10 - CONTROL "Show Snapshots for\nSelected Tracks Only",IDC_SHOWSELONLY, - "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,140,160,81,17 - CONTROL "Prompt for Name",IDC_NAMEPROMPT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,179,70,10 - CONTROL "Hide New Tracks\non Vis Recall",IDC_HIDENEW,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,140,192,78,14 - CONTROL "Prompt on recalling\ndeleted tracks", IDC_DELTRACKSPROMPT, "Button", BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP, 140, 211, 78, 14 + CONTROL "Phase", IDC_PHASE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 140, 115, 45, 10 + CONTROL "Filter on Recall",IDC_APPLYRECALL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,122+Y_OFFSET_CHECKBOX,63,10 + CONTROL "Save Sel Tracks Only",IDC_SELECTEDONLY_SAVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,135+Y_OFFSET_CHECKBOX,81,10 + CONTROL "Recall Sel Tracks Only",IDC_SELECTEDONLY_RECALL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,148+Y_OFFSET_CHECKBOX,81,10 + CONTROL "Show Snapshots for\nSelected Tracks Only",IDC_SHOWSELONLY,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,140,160+Y_OFFSET_CHECKBOX,81,17 + CONTROL "Prompt for Name",IDC_NAMEPROMPT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,179+Y_OFFSET_CHECKBOX,70,10 + CONTROL "Hide New Tracks\non Vis Recall",IDC_HIDENEW,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,140,192+Y_OFFSET_CHECKBOX,78,14 + CONTROL "Prompt on recalling\ndeleted tracks", IDC_DELTRACKSPROMPT, "Button", BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,140,211+Y_OFFSET_CHECKBOX,78,14 PUSHBUTTON "<- Hide Options",IDC_OPTIONS,136,212,85,13,NOT WS_VISIBLE EDITTEXT IDC_EDIT,45,28,40,12,ES_AUTOHSCROLL | NOT WS_VISIBLE | NOT WS_BORDER +#undef Y_OFFSET_CHECKBOX +#undef Y_OFFSET_PUSHBTN END IDD_COLOR DIALOGEX 0, 0, 123, 146 diff --git a/whatsnew.txt b/whatsnew.txt index 3aadfdb46..b5b273436 100644 --- a/whatsnew.txt +++ b/whatsnew.txt @@ -1,3 +1,6 @@ +Fixes: ++Issue 455: Snapshots: Include track phase (polarity) in Full Track Mix, add separate Phase tickbox in Custom filter + New features: +Snapshots: Add option to (not) prompt for deleting abandoned items when recalling snapshots which contain deleted tracks (snapshots will be recalled and abandoned items deleted without confirmation with this option disabled) (Issue 1073)