void SaveTracksFolderStates(COMMAND_T* _ct) { const char* strState = !_ct->user ? "I_FOLDERDEPTH" : "I_FOLDERCOMPACT"; WDL_PtrList_DeleteOnDestroy<SNM_TrackInt>* saveList = !_ct->user ? &g_trackFolderStates : &g_trackFolderCompactStates; saveList->Empty(true); for (int i=1; i <= GetNumTracks(); i++) // skip master { MediaTrack* tr = CSurf_TrackFromID(i, false); if (tr && *(int*)GetSetMediaTrackInfo(tr, "I_SELECTED", NULL)) saveList->Add(new SNM_TrackInt(tr, *(int*)GetSetMediaTrackInfo(tr, strState, NULL))); } }
void SetAllMasterOutputMutes(COMMAND_T* ct) { MediaTrack* tr = CSurf_TrackFromID(0, false); int i = 0; bool bMute = ct->user ? true : false; while (GetSetTrackSendInfo(tr, 1, i, "B_MUTE", NULL)) { GetSetTrackSendInfo(tr, 1, i++, "B_MUTE", &bMute); } if (i) Undo_OnStateChangeEx(SWS_CMD_SHORTNAME(ct), UNDO_STATE_TRACKCFG, 0); }
void RemoveAllEnvsSelTracks(COMMAND_T* _ct) { bool updated = false; for (int i=0; i <= GetNumTracks(); i++) // incl. master if (MediaTrack* tr = CSurf_TrackFromID(i, false)) if (tr && *(int*)GetSetMediaTrackInfo(tr, "I_SELECTED", NULL)) { SNM_TrackEnvParserPatcher p(tr); updated |= p.RemoveEnvelopes(); } if (updated) Undo_OnStateChangeEx2(NULL, SWS_CMD_SHORTNAME(_ct), UNDO_STATE_ALL, -1); }
void TogInTCP(COMMAND_T*) { for (int i = 1; i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); if (*(int*)GetSetMediaTrackInfo(tr, "I_SELECTED", NULL)) SetTrackVis(tr, GetTrackVis(tr) ^ 2); } TrackList_AdjustWindows(MAJORADJUST); UpdateTimeline(); Undo_OnStateChangeEx(__LOCALIZE("Toggle selected tracks visible in TCP","sws_undo"), UNDO_STATE_TRACKCFG, -1); }
void SelOnlyTrackWithSelEnv(COMMAND_T* _ct) { bool updated = false; if (MediaTrack* envtr = GetTrackWithSelEnv()) for (int i=0; i <= GetNumTracks(); i++) // incl. master if (envtr == CSurf_TrackFromID(i, false)) { updated = SNM_SetSelectedTrack(NULL, envtr, true); break; } if (updated) Undo_OnStateChangeEx2(NULL, SWS_CMD_SHORTNAME(_ct), UNDO_STATE_ALL, -1); }
void SetMasterOutputVol(COMMAND_T* ct) { MediaTrack* tr = CSurf_TrackFromID(0, false); int iOutput = abs((int)ct->user) >> 8; if (GetSetTrackSendInfo(tr, 1, iOutput, "D_VOL", NULL)) { double dVol = DB2VAL((double)((abs((int)ct->user) & 0xFF) * (ct->user >= 0 ? 1 : -1))); GetSetTrackSendInfo(tr, 1, iOutput, "D_VOL", &dVol); TrackList_AdjustWindows(false); Undo_OnStateChangeEx(SWS_CMD_SHORTNAME(ct), UNDO_STATE_TRACKCFG, 0); } }
void TogMPSend(COMMAND_T* = NULL) { bool bMPSend; for (int i = 1; i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); if (*(int*)GetSetMediaTrackInfo(tr, "I_SELECTED", NULL)) { bMPSend = !*(bool*)GetSetMediaTrackInfo(tr, "B_MAINSEND", NULL); GetSetMediaTrackInfo(tr, "B_MAINSEND", &bMPSend); } } }
void RestoreActiveTakes(COMMAND_T*) { for (int i = 1; i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); if (*(int*)GetSetMediaTrackInfo(tr, "I_SELECTED", NULL)) // Find the saved track for (int j = 0; j < g_activeTakeTracks.Get()->GetSize(); j++) if (TrackMatchesGuid(tr, &g_activeTakeTracks.Get()->Get(j)->m_guid)) g_activeTakeTracks.Get()->Get(j)->Restore(tr); } UpdateArrange(); }
WDL_PtrList<void>* FilteredVisState::GetFilteredTracks() { static WDL_PtrList<void> tracks; tracks.Empty(false); for (int i = 1; i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); if (MatchesFilter(tr)) tracks.Add(tr); } return &tracks; }
void TogMuteRecvs(COMMAND_T* = NULL) { bool bMute; for (int i = 1; i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); if (*(int*)GetSetMediaTrackInfo(tr, "I_SELECTED", NULL)) for (int j = 0; GetSetTrackSendInfo(tr, -1, j, "P_SRCTRACK", NULL); j++) { bMute = !*(bool*)GetSetTrackSendInfo(tr, -1, j, "B_MUTE", NULL); GetSetTrackSendInfo(tr, -1, j, "B_MUTE", &bMute); } } }
void RemoveTrackGrouping(COMMAND_T* _ct) { int updates = 0; for (int i=0; i <= GetNumTracks(); i++) // incl. master { MediaTrack* tr = CSurf_TrackFromID(i, false); if (tr && *(int*)GetSetMediaTrackInfo(tr, "I_SELECTED", NULL)) { SNM_ChunkParserPatcher p(tr); updates += p.RemoveLines("GROUP_FLAGS", true); // brutal removing ok: "GROUP_FLAGS" is not part of freeze data } } if (updates) Undo_OnStateChangeEx2(NULL, SWS_CMD_SHORTNAME(_ct), UNDO_STATE_ALL, -1); }
void SWS_GetSelectedTracks(WDL_TypedBuf<MediaTrack*>* buf, bool bMaster) { buf->Resize(0); for (int i = (bMaster ? 0 : 1); i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); if (*(int*)GetSetMediaTrackInfo(tr, "I_SELECTED", NULL)) { int pos = buf->GetSize(); buf->Resize(pos + 1); buf->Get()[pos] = tr; } } }
void TrackOrderedCol(COMMAND_T* = NULL) { int iCurPos = 0; UpdateCustomColors(); for (int i = 1; i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); if (*(int*)GetSetMediaTrackInfo(tr, "I_SELECTED", NULL)) { COLORREF cr = g_custColors[iCurPos++ % 16] | 0x1000000; GetSetMediaTrackInfo(tr, "I_CUSTOMCOLOR", &cr); } } Undo_OnStateChangeEx(__LOCALIZE("Set track(s) to ordered custom color color(s)","sws_undo"), UNDO_STATE_TRACKCFG, -1); }
void ShowSelOnly(COMMAND_T*) { for (int i = 1; i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); if (*(int*)GetSetMediaTrackInfo(tr, "I_SELECTED", NULL)) SetTrackVis(tr, 3); else SetTrackVis(tr, 0); } TrackList_AdjustWindows(MAJORADJUST); UpdateTimeline(); Undo_OnStateChangeEx(__LOCALIZE("Show selected tracks, hide others","sws_undo"), UNDO_STATE_TRACKCFG, -1); }
void TrackCustomColor(int iCustColor) { COLORREF cr; UpdateCustomColors(); cr = g_custColors[iCustColor] | 0x1000000; for (int i = 0; i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); if (*(int*)GetSetMediaTrackInfo(tr, "I_SELECTED", NULL)) GetSetMediaTrackInfo(tr, "I_CUSTOMCOLOR", &cr); } char cUndoText[100]; sprintf(cUndoText, __LOCALIZE_VERFMT("Set track(s) to custom color %d","sws_undo"), iCustColor+1); Undo_OnStateChangeEx(cUndoText, UNDO_STATE_TRACKCFG, -1); }
int IsMinimizeTracks(COMMAND_T* ct) { int mins=0, seltrs=0; for (int i=0; i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); if (*(int*)GetSetMediaTrackInfo(tr, "I_SELECTED", NULL)) { seltrs++; if (*(int*)GetSetMediaTrackInfo(tr, "I_HEIGHTOVERRIDE", NULL)==1) mins++; } } return seltrs && seltrs==mins; }
void SelMutedItems(COMMAND_T* ct) { for (int i = 1; i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); for (int j = 0; j < GetTrackNumMediaItems(tr); j++) { MediaItem* mi = GetTrackMediaItem(tr, j); bool sel = *(bool*)GetSetMediaItemInfo(mi, "B_MUTE", NULL); if ((int)ct->user == 0) sel = !sel; GetSetMediaItemInfo(mi, "B_UISEL", &sel); } } UpdateTimeline(); }
void MasterOutputMute(COMMAND_T* ct, int mode) // mode 0==toggle, 1==set mute, 2==set unmute { MediaTrack* tr = CSurf_TrackFromID(0, false); bool* pMute; if ((pMute = (bool*)GetSetTrackSendInfo(tr, 1, (int)ct->user, "B_MUTE", NULL))) { bool bMute; if (mode == 0) bMute = *pMute ? false : true; else bMute = mode == 1 ? true : false; GetSetTrackSendInfo(tr, 1, (int)ct->user, "B_MUTE", &bMute); Undo_OnStateChangeEx(SWS_CMD_SHORTNAME(ct), UNDO_STATE_TRACKCFG, 0); } }
void OrganizeByVol(COMMAND_T* ct) { for (int iTrack = 1; iTrack <= GetNumTracks(); iTrack++) { WDL_TypedBuf<MediaItem*> items; SWS_GetSelectedMediaItemsOnTrack(&items, CSurf_TrackFromID(iTrack, false)); if (items.GetSize() > 1) { double dStart = *(double*)GetSetMediaItemInfo(items.Get()[0], "D_POSITION", NULL); double* pVol = new double[items.GetSize()]; ANALYZE_PCM a; memset(&a, 0, sizeof(a)); if (ct->user == 2) { // Windowed mode, set the window size char str[100]; GetPrivateProfileString(SWS_INI, SWS_RMS_KEY, "-20,0.1", str, 100, get_ini_file()); char* pWindow = strchr(str, ','); a.dWindowSize = pWindow ? atof(pWindow+1) : 0.1; } for (int i = 0; i < items.GetSize(); i++) { pVol[i] = -1.0; if (AnalyzeItem(items.Get()[i], &a)) pVol[i] = ct->user ? a.dRMS : a.dPeakVal; } // Sort and arrange items from min to max RMS while (true) { int iItem = -1; double dMinVol = 1e99; for (int i = 0; i < items.GetSize(); i++) if (pVol[i] >= 0.0 && pVol[i] < dMinVol) { dMinVol = pVol[i]; iItem = i; } if (iItem == -1) break; pVol[iItem] = -1.0; GetSetMediaItemInfo(items.Get()[iItem], "D_POSITION", &dStart); dStart += *(double*)GetSetMediaItemInfo(items.Get()[iItem], "D_LENGTH", NULL); } delete [] pVol; UpdateTimeline(); Undo_OnStateChangeEx(SWS_CMD_SHORTNAME(ct), UNDO_STATE_ITEMS, -1); } } }
void SelLockedItems(COMMAND_T* = NULL) { for (int i = 1; i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); for (int j = 0; j < GetTrackNumMediaItems(tr); j++) { MediaItem* mi = GetTrackMediaItem(tr, j); if (*(char*)GetSetMediaItemInfo(mi, "C_LOCK", NULL)) GetSetMediaItemInfo(mi, "B_UISEL", &g_i1); else GetSetMediaItemInfo(mi, "B_UISEL", &g_i0); } } UpdateTimeline(); }
void BlackItem(COMMAND_T* = NULL) { int iBlack = 0x1000000 | RGB(0, 0, 0); for (int i = 1; i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); for (int j = 0; j < GetTrackNumMediaItems(tr); j++) { MediaItem* mi = GetTrackMediaItem(tr, j); if (*(bool*)GetSetMediaItemInfo(mi, "B_UISEL", NULL)) GetSetMediaItemInfo(mi, "I_CUSTOMCOLOR", &iBlack); } } Undo_OnStateChange(__LOCALIZE("Set item(s) color black","sws_undo")); UpdateTimeline(); }
void TrackRandomCol(COMMAND_T* = NULL) { COLORREF cr; // All black check if (AllBlack()) return; while (!(cr = g_custColors[rand() % 16])); cr |= 0x1000000; for (int i = 0; i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); if (*(int*)GetSetMediaTrackInfo(tr, "I_SELECTED", NULL)) GetSetMediaTrackInfo(tr, "I_CUSTOMCOLOR", &cr); } Undo_OnStateChangeEx(__LOCALIZE("Set track(s) to one random custom color","sws_undo"), UNDO_STATE_TRACKCFG, -1); }
// flags&1=incl. items, &2=incl. markers/regions, &4=incl. envelopes double SNM_GetProjectLength(int _flags) { double prjlen = 0.0, pos, end; if (_flags&2) { int x=0; bool isRgn; while ((x = EnumProjectMarkers2(NULL, x, &isRgn, &pos, &end, NULL, NULL))) { if (isRgn) { if (end > prjlen) prjlen = end; } else { if (pos > prjlen) prjlen = pos; } } } if ((_flags&1) || (_flags&4)) { double len; for (int i=0; i <= GetNumTracks(); i++) { if (MediaTrack* tr = CSurf_TrackFromID(i, false)) { int cnt= i>0 ? GetTrackNumMediaItems(tr) : 0; // skip master if (_flags&1) for (int j=0; j<cnt; j++) { if (MediaItem* item = GetTrackMediaItem(tr,j)) { pos = *(double*)GetSetMediaItemInfo(item, "D_POSITION", NULL); len = *(double*)GetSetMediaItemInfo(item, "D_LENGTH", NULL); if ((pos+len)>prjlen) prjlen = pos+len; } } cnt=CountTrackEnvelopes(tr); if (_flags&4) for (int j=0; j<cnt; j++) { if (TrackEnvelope* env = GetTrackEnvelope(tr,j)) { if (int ptcnt=CountEnvelopePoints(env)) { pos=prjlen; GetEnvelopePoint(env, ptcnt-1, &pos, NULL, NULL, NULL, NULL); if (pos>prjlen) prjlen = pos; } } } } } } return prjlen; }
void ColorTrackNextCust(COMMAND_T* = NULL) { if (AllBlack()) return; for (int j = 1; j <= GetNumTracks(); j++) { MediaTrack* tr = CSurf_TrackFromID(j, false); if (*(int*)GetSetMediaTrackInfo(tr, "I_SELECTED", NULL)) { COLORREF cr = *(int*)GetSetMediaTrackInfo(tr, "I_CUSTOMCOLOR", NULL) & 0xFFFFFF; cr = GetNextCustColor(cr) | 0x1000000; GetSetMediaTrackInfo(tr, "I_CUSTOMCOLOR", &cr); } } Undo_OnStateChangeEx(__LOCALIZE("Set track(s) to next custom color","sws_undo"), UNDO_STATE_TRACKCFG, -1); }
// Gradient stuffs void TrackGradient(COMMAND_T* = NULL) { int iNumSel = NumSelTracks(); int iCurPos = 0; if (iNumSel < 2) return; for (int i = 1; i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); if (*(int*)GetSetMediaTrackInfo(tr, "I_SELECTED", NULL)) { COLORREF cr = CalcGradient(g_crGradStart, g_crGradEnd, (double)iCurPos++ / (iNumSel-1)) | 0x1000000; GetSetMediaTrackInfo(tr, "I_CUSTOMCOLOR", &cr); } } Undo_OnStateChangeEx(__LOCALIZE("Set tracks to color gradient","sws_undo"), UNDO_STATE_TRACKCFG, -1); }
void ItemToTrackCol(COMMAND_T* = NULL) { for (int i = 1; i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); COLORREF cr = *(COLORREF*)GetSetMediaTrackInfo(tr, "I_CUSTOMCOLOR", NULL); for (int j = 0; j < GetTrackNumMediaItems(tr); j++) { MediaItem* mi = GetTrackMediaItem(tr, j); if (*(bool*)GetSetMediaItemInfo(mi, "B_UISEL", NULL)) GetSetMediaItemInfo(mi, "I_CUSTOMCOLOR", &cr); } } Undo_OnStateChange(__LOCALIZE("Set selected item(s) to respective track color","sws_undo")); UpdateTimeline(); }
void InputMatch(COMMAND_T* ct) { int iInput = -2; // Would use -1, but that's for "Input: None" for (int i = 1; i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); if (*(int*)GetSetMediaTrackInfo(tr, "I_SELECTED", NULL)) { if (iInput == -2) iInput = *(int*)GetSetMediaTrackInfo(tr, "I_RECINPUT", NULL); else GetSetMediaTrackInfo(tr, "I_RECINPUT", &iInput); } } TrackList_AdjustWindows(false); Undo_OnStateChangeEx(SWS_CMD_SHORTNAME(ct), UNDO_STATE_TRACKCFG, -1); }
void SWS_GetSelectedMediaItems(WDL_TypedBuf<MediaItem*>* buf) { buf->Resize(0); for (int i = 1; i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); for (int j = 0; j < GetTrackNumMediaItems(tr); j++) { MediaItem* item = GetTrackMediaItem(tr, j); if (*(bool*)GetSetMediaItemInfo(item, "B_UISEL", NULL)) { int pos = buf->GetSize(); buf->Resize(pos + 1); buf->Get()[pos] = item; } } } }
void UnselNotRender(COMMAND_T* = NULL) { for (int i = 1; i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); for (int j = 0; j < GetTrackNumMediaItems(tr); j++) { MediaItem* mi = GetTrackMediaItem(tr, j); if (GetMediaItemNumTakes(mi)) { PCM_source* src = (PCM_source*)GetSetMediaItemTakeInfo(GetMediaItemTake(mi, -1), "P_SOURCE", NULL); if (src && src->GetFileName() && !strstr(src->GetFileName(), "render")) GetSetMediaItemInfo(mi, "B_UISEL", &g_bFalse); } } } UpdateTimeline(); }
void TogItemSel(COMMAND_T* = NULL) { // Toggle item's selection states on selected tracks bool bSel; MediaTrack* tr; MediaItem* mi; for (int i = 1; i <= GetNumTracks(); i++) { tr = CSurf_TrackFromID(i, false); if (*(int*)GetSetMediaTrackInfo(tr, "I_SELECTED", NULL)) for (int j = 0; j < GetTrackNumMediaItems(tr); j++) { mi = GetTrackMediaItem(tr, j); bSel = !*(bool*)GetSetMediaItemInfo(mi, "B_UISEL", NULL); GetSetMediaItemInfo(mi, "B_UISEL", &bSel); } } UpdateTimeline(); }