Skip to content

Commit

Permalink
Snapshots: include track phase (polarity)
Browse files Browse the repository at this point in the history
  • Loading branch information
nofishonfriday committed Mar 15, 2019
1 parent 64e9ebe commit 1d900b9
Show file tree
Hide file tree
Showing 5 changed files with 105 additions and 71 deletions.
116 changes: 70 additions & 46 deletions Snapshots/SnapshotClass.cpp
Expand Up @@ -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)
Expand Down Expand Up @@ -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())
Expand All @@ -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);
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -376,7 +384,7 @@ void TrackSnapshot::GetChunk(WDL_FastString* chunk)
{
char guidStr[64];
guidToString(&m_guid, guidStr);
chunk->AppendFormatted(SNM_MAX_CHUNK_LINE_LENGTH, "<TRACK %s %.14f %.14f %d %d %d %d %d %d %.14f %.14f %.14f %.14f\n", guidStr, m_dVol, m_dPan, m_bMute ? 1 : 0, m_iSolo, m_iFXEn, m_iVis ^ 2, m_iSel, m_iPanMode, m_dPanWidth, m_dPanL, m_dPanR, m_dPanLaw);
chunk->AppendFormatted(SNM_MAX_CHUNK_LINE_LENGTH, "<TRACK %s %.14f %.14f %d %d %d %d %d %d %.14f %.14f %.14f %.14f %.14f\n", guidStr, m_dVol, m_dPan, m_bMute ? 1 : 0, m_iSolo, m_iFXEn, m_iVis ^ 2, m_iSel, m_iPanMode, m_dPanWidth, m_dPanL, m_dPanR, m_dPanLaw, m_bPhase);
chunk->AppendFormatted(SNM_MAX_CHUNK_LINE_LENGTH, "NAME \"%s\" %d\n", m_sName.Get(), m_iTrackNum);

m_sends.GetChunk(chunk);
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
}

Expand All @@ -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);
Expand Down
22 changes: 12 additions & 10 deletions Snapshots/SnapshotClass.h
Expand Up @@ -74,6 +74,7 @@ class TrackSnapshot
int m_iFXEn;
int m_iVis;
int m_iSel;
bool m_bPhase;
WDL_PtrList<FXSnapshot> m_fx;
WDL_TypedBuf<char> m_sFXChain;
TrackSends m_sends;
Expand Down Expand Up @@ -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
{
Expand Down
5 changes: 3 additions & 2 deletions resource.h
Expand Up @@ -444,15 +444,16 @@
#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
//
#ifdef APSTUDIO_INVOKED
#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
30 changes: 17 additions & 13 deletions sws_extension.rc
Expand Up @@ -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
Expand All @@ -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
Expand Down
3 changes: 3 additions & 0 deletions 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)

Expand Down

0 comments on commit 1d900b9

Please sign in to comment.