Skip to content

Commit

Permalink
Improve performances vs mass item selection for a bunch of actions
Browse files Browse the repository at this point in the history
Dealing with thousands of selected items is totally realistic so using
CountSelectedMediaItems() and GetSelectedMediaItem() is a big issue: they are O(MN).
Ideally, these functions should be banned from the extension, it was too much job though...
So, this commit just prevent calling CountSelectedMediaItems() in loops.

Also constantify some related vars.
  • Loading branch information
Jeff0S committed Jan 29, 2016
1 parent 54ef888 commit cd204f6
Show file tree
Hide file tree
Showing 18 changed files with 108 additions and 64 deletions.
6 changes: 3 additions & 3 deletions Breeder/BR_EnvelopeUtil.cpp
Expand Up @@ -2141,11 +2141,11 @@ MediaItem_Take* GetTakeEnvParent (TrackEnvelope* envelope, BR_EnvType* type)
{
if (envelope)
{
int itemCount = CountMediaItems(NULL);
const int itemCount = CountMediaItems(NULL);
for (int i = 0; i < itemCount; ++i)
{
MediaItem* item = GetMediaItem(NULL, i);
int takeCount = CountTakes(item);
const int takeCount = CountTakes(item);
for (int j = 0; j < takeCount; ++j)
{
MediaItem_Take* take = GetTake(item, j);
Expand All @@ -2157,7 +2157,7 @@ MediaItem_Take* GetTakeEnvParent (TrackEnvelope* envelope, BR_EnvType* type)
else if (GetTakeEnv(take, PITCH) == envelope) returnType = PITCH;
else
{
int envelopeCount = CountTakeEnvelopes(take);
const int envelopeCount = CountTakeEnvelopes(take);
for (int k = 0; k < envelopeCount; ++k)
{
if (GetTakeEnvelope(take, k) == envelope)
Expand Down
16 changes: 11 additions & 5 deletions Breeder/BR_Loudness.cpp
Expand Up @@ -3054,7 +3054,9 @@ void BR_AnalyzeLoudnessWnd::OnCommand (WPARAM wParam, LPARAM lParam)
if (m_properties.clearAnalyzed)
m_analyzeQueue.Add(new BR_LoudnessObject(GetMasterTrack(NULL)));
}
for (int i = 0; i < CountSelectedTracks(NULL); ++i)

const int cnt=CountSelectedTracks(NULL);
for (int i = 0; i < cnt; ++i)
{
if (BR_LoudnessObject* object = this->IsObjectInList(GetSelectedTrack(NULL, i)))
m_analyzeQueue.Add(object);
Expand All @@ -3064,7 +3066,8 @@ void BR_AnalyzeLoudnessWnd::OnCommand (WPARAM wParam, LPARAM lParam)
}
else
{
for (int i = 0; i < CountSelectedMediaItems(NULL); ++i)
const int cnt=CountSelectedMediaItems(NULL);
for (int i = 0; i < cnt; ++i)
{
if (MediaItem_Take* take = GetActiveTake(GetSelectedMediaItem(NULL, i)))
{
Expand Down Expand Up @@ -3881,12 +3884,14 @@ static WDL_DLGRET NormalizeCommandDialogProc (HWND hwnd, UINT uMsg, WPARAM wPara
if (*(int*)GetSetMediaTrackInfo(GetMasterTrack(NULL), "I_SELECTED", NULL))
objects.Add(new BR_LoudnessObject(GetMasterTrack(NULL)));

for (int i = 0; i < CountSelectedTracks(NULL); ++i)
const int cnt=CountSelectedTracks(NULL);
for (int i = 0; i < cnt; ++i)
objects.Add(new BR_LoudnessObject(GetSelectedTrack(NULL, i)));
}
else
{
for (int i = 0; i < CountSelectedMediaItems(NULL); ++i)
const int cnt=CountSelectedMediaItems(NULL);
for (int i = 0; i < cnt; ++i)
{
if (MediaItem_Take* take = GetActiveTake(GetSelectedMediaItem(NULL, i)))
objects.Add(new BR_LoudnessObject(take));
Expand Down Expand Up @@ -3949,7 +3954,8 @@ void NormalizeLoudness (COMMAND_T* ct)
WDL_PtrList_DeleteOnDestroy<BR_LoudnessObject> objects;
if (abs((int)ct->user) == 1)
{
for (int i = 0; i < CountSelectedMediaItems(NULL); ++i)
const int cnt=CountSelectedMediaItems(NULL);
for (int i = 0; i < cnt; ++i)
{
if (MediaItem_Take* take = GetActiveTake(GetSelectedMediaItem(NULL, i)))
objects.Add(new BR_LoudnessObject(take));
Expand Down
23 changes: 15 additions & 8 deletions Breeder/BR_Misc.cpp
Expand Up @@ -550,7 +550,8 @@ void MarkersAtNotes (COMMAND_T* ct)
PreventUIRefresh(1);

bool update = false;
for (int i = 0; i < CountSelectedMediaItems(NULL); ++i)
const int cnt=CountSelectedMediaItems(NULL);
for (int i = 0; i < cnt; ++i)
{
MediaItem* item = GetSelectedMediaItem(NULL, i);
MediaItem_Take* take = GetActiveTake(item);
Expand Down Expand Up @@ -593,7 +594,8 @@ void MarkersAtStretchMarkers (COMMAND_T* ct)

PreventUIRefresh(1);
bool update = false;
for (int i = 0; i < CountSelectedMediaItems(NULL); ++i)
const int cnt=CountSelectedMediaItems(NULL);
for (int i = 0; i < cnt; ++i)
{
MediaItem_Take* take = GetActiveTake(GetSelectedMediaItem(NULL, i));
double iStart = GetMediaItemInfo_Value(GetSelectedMediaItem(NULL, i), "D_POSITION");
Expand Down Expand Up @@ -634,13 +636,14 @@ void MarkerAtMouse (COMMAND_T* ct)

void MarkersRegionsAtItems (COMMAND_T* ct)
{
if (!CountSelectedMediaItems(NULL) || ((int)ct->user == 0 && IsLocked(MARKERS)) || ((int)ct->user == 1 && IsLocked(REGIONS)))
const int cnt=CountSelectedMediaItems(NULL);
if (!cnt || ((int)ct->user == 0 && IsLocked(MARKERS)) || ((int)ct->user == 1 && IsLocked(REGIONS)))
return;

Undo_BeginBlock2(NULL);
PreventUIRefresh(1);

for (int i = 0; i < CountSelectedMediaItems(NULL); ++i)
for (int i = 0; i < cnt; ++i)
{
MediaItem* item = GetSelectedMediaItem(NULL, i);
double iStart = *(double*)GetSetMediaItemInfo(item, "D_POSITION", NULL);
Expand Down Expand Up @@ -693,7 +696,8 @@ void MidiItemTempo (COMMAND_T* ct)
PreventUIRefresh(1);
bool ignoreTempo = ((int)ct->user == 2 || (int)ct->user == 3);
bool update = false;
for (int i = 0; i < CountSelectedMediaItems(NULL); ++i)
const int cnt=CountSelectedMediaItems(NULL);
for (int i = 0; i < cnt; ++i)
{
MediaItem* item = GetSelectedMediaItem(NULL, i);
if (!IsItemLocked(item))
Expand Down Expand Up @@ -729,7 +733,8 @@ void MidiItemTrim (COMMAND_T* ct)
return;

bool update = false;
for (int i = 0; i < CountSelectedMediaItems(0); ++i)
const int cnt=CountSelectedMediaItems(NULL);
for (int i = 0; i < cnt; ++i)
{
MediaItem* item = GetSelectedMediaItem(0, i);
if (DoesItemHaveMidiEvents(item) && !IsItemLocked(item))
Expand Down Expand Up @@ -821,7 +826,8 @@ void ToggleItemOnline (COMMAND_T* ct)
if (IsLocked(ITEM_FULL))
return;

for (int i = 0; i < CountSelectedMediaItems(NULL); ++i)
const int cnt=CountSelectedMediaItems(NULL);
for (int i = 0; i < cnt; ++i)
{
MediaItem* item = GetSelectedMediaItem(NULL, i);
if (!IsItemLocked(item))
Expand All @@ -839,7 +845,8 @@ void ToggleItemOnline (COMMAND_T* ct)
void ItemSourcePathToClipBoard (COMMAND_T* ct)
{
WDL_FastString sourceList;
for (int i = 0; i < CountSelectedMediaItems(NULL); ++i)
const int cnt=CountSelectedMediaItems(NULL);
for (int i = 0; i < cnt; ++i)
{
MediaItem* item = GetSelectedMediaItem(NULL, i);
if (PCM_source* source = GetMediaItemTake_Source(GetActiveTake(item)))
Expand Down
2 changes: 1 addition & 1 deletion Breeder/BR_MouseUtil.cpp
Expand Up @@ -1425,7 +1425,7 @@ int BR_MouseInfo::IsMouseOverEnvelopeLineTake (MediaItem_Take* take, int takeHei

// Get all visible take envelopes
vector<TrackEnvelope*> envelopes;
int count = CountTakeEnvelopes(take);
const int count = CountTakeEnvelopes(take);
for (int i = 0; i < count; ++i)
{
TrackEnvelope* envelope = GetTakeEnvelope(take, i);
Expand Down
2 changes: 1 addition & 1 deletion Breeder/BR_ProjState.cpp
Expand Up @@ -807,7 +807,7 @@ void BR_ItemMuteState::Save (bool selectedOnly)
{
m_items.clear();

int count = (selectedOnly) ? CountSelectedMediaItems(NULL) : CountMediaItems(NULL);
const int count = (selectedOnly) ? CountSelectedMediaItems(NULL) : CountMediaItems(NULL);
for (int i = 0; i < count; ++i)
{
MediaItem* item = (selectedOnly) ? GetSelectedMediaItem(NULL, i) : GetMediaItem(NULL, i);
Expand Down
2 changes: 1 addition & 1 deletion Breeder/BR_Tempo.cpp
Expand Up @@ -1165,7 +1165,7 @@ void DeleteTempoPreserveItems (COMMAND_T* ct)
double firstMarker;
tempoMap.GetPoint(tempoMap.GetSelected(0), &firstMarker, NULL, NULL, NULL);

int itemCount = ((int)ct->user) ? CountSelectedMediaItems(NULL) : CountMediaItems(NULL);
const int itemCount = ((int)ct->user) ? CountSelectedMediaItems(NULL) : CountMediaItems(NULL);
items.reserve(itemCount);
for (int i = 0; i < itemCount; ++i)
{
Expand Down
2 changes: 1 addition & 1 deletion Fingers/RprItem.cpp
Expand Up @@ -128,7 +128,7 @@ void RprItemCtr::doSort()

RprItemCtrPtr RprItemCollec::getSelected()
{
int count = CountSelectedMediaItems(0);
const int count = CountSelectedMediaItems(0);

RprItemCtrPtr ctr(new RprItemCtr);
for(int i = 0; i < count; i++) {
Expand Down
2 changes: 1 addition & 1 deletion IX/Label.cpp
Expand Up @@ -221,7 +221,7 @@ void RunLabelCommand(WDL_FastString* cmd, const char* undoName)

char buf[512];
int itemCount = 0;
int numSel = CountSelectedMediaItems(NULL);
const int numSel = CountSelectedMediaItems(NULL);
for (int iTrack = 1; iTrack <= GetNumTracks(); iTrack++)
{
WDL_TypedBuf<MediaItem*> items;
Expand Down
40 changes: 24 additions & 16 deletions Misc/Adam.cpp
Expand Up @@ -3020,20 +3020,22 @@ void UpdateTrackTimebaseToolbar()
// Item timebase actions
void AWSelItemsTimebaseProj(COMMAND_T* t)
{
for (int i = 0; i < CountSelectedMediaItems(NULL); i++)
const int cnt=CountSelectedMediaItems(NULL);
for (int i = 0; i < cnt; i++)
SetMediaItemInfo_Value(GetSelectedMediaItem(NULL, i), "C_BEATATTACHMODE", -1);
UpdateItemTimebaseToolbar();

if (CountSelectedMediaItems(NULL) > 0)
if (cnt)
Undo_OnStateChangeEx(SWS_CMD_SHORTNAME(t), UNDO_STATE_TRACKCFG, -1);
}

int IsSelItemsTimebaseProj(COMMAND_T* = NULL)
{
if (CountSelectedMediaItems(NULL) == 0)
const int cnt=CountSelectedMediaItems(NULL);
if (!cnt)
return 0;

for (int i = 0; i < CountSelectedMediaItems(NULL); i++)
for (int i = 0; i < cnt; i++)
{
if (GetMediaItemInfo_Value(GetSelectedMediaItem(NULL, i), "C_BEATATTACHMODE") != -1)
return 0;
Expand All @@ -3043,20 +3045,22 @@ int IsSelItemsTimebaseProj(COMMAND_T* = NULL)

void AWSelItemsTimebaseTime(COMMAND_T* t)
{
for (int i = 0; i < CountSelectedMediaItems(NULL); i++)
const int cnt=CountSelectedMediaItems(NULL);
for (int i = 0; i < cnt; i++)
SetMediaItemInfo_Value(GetSelectedMediaItem(NULL, i), "C_BEATATTACHMODE", 0);
UpdateItemTimebaseToolbar();

if (CountSelectedMediaItems(NULL) > 0)
if (cnt)
Undo_OnStateChangeEx(SWS_CMD_SHORTNAME(t), UNDO_STATE_TRACKCFG, -1);
}

int IsSelItemsTimebaseTime(COMMAND_T* = NULL)
{
if (CountSelectedMediaItems(NULL) == 0)
const int cnt=CountSelectedMediaItems(NULL);
if (!cnt)
return 0;

for (int i = 0; i < CountSelectedMediaItems(NULL); i++)
for (int i = 0; i < cnt; i++)
{
if (GetMediaItemInfo_Value(GetSelectedMediaItem(NULL, i), "C_BEATATTACHMODE") != 0)
return 0;
Expand All @@ -3066,20 +3070,22 @@ int IsSelItemsTimebaseTime(COMMAND_T* = NULL)

void AWSelItemsTimebaseBeatPos(COMMAND_T* t)
{
for (int i = 0; i < CountSelectedMediaItems(NULL); i++)
const int cnt=CountSelectedMediaItems(NULL);
for (int i = 0; i < cnt; i++)
SetMediaItemInfo_Value(GetSelectedMediaItem(NULL, i), "C_BEATATTACHMODE", 2);
UpdateItemTimebaseToolbar();

if (CountSelectedMediaItems(NULL) > 0)
if (cnt)
Undo_OnStateChangeEx(SWS_CMD_SHORTNAME(t), UNDO_STATE_TRACKCFG, -1);
}

int IsSelItemsTimebaseBeatPos(COMMAND_T* = NULL)
{
if (CountSelectedMediaItems(NULL) == 0)
const int cnt=CountSelectedMediaItems(NULL);
if (!cnt)
return 0;

for (int i = 0; i < CountSelectedMediaItems(NULL); i++)
for (int i = 0; i < cnt; i++)
{
if (GetMediaItemInfo_Value(GetSelectedMediaItem(NULL, i), "C_BEATATTACHMODE") != 2)
return 0;
Expand All @@ -3089,20 +3095,22 @@ int IsSelItemsTimebaseBeatPos(COMMAND_T* = NULL)

void AWSelItemsTimebaseBeatAll(COMMAND_T* t)
{
for (int i = 0; i < CountSelectedMediaItems(NULL); i++)
const int cnt=CountSelectedMediaItems(NULL);
for (int i = 0; i < cnt; i++)
SetMediaItemInfo_Value(GetSelectedMediaItem(NULL, i), "C_BEATATTACHMODE", 1);
UpdateItemTimebaseToolbar();

if (CountSelectedMediaItems(NULL) > 0)
if (cnt)
Undo_OnStateChangeEx(SWS_CMD_SHORTNAME(t), UNDO_STATE_TRACKCFG, -1);
}

int IsSelItemsTimebaseBeatAll(COMMAND_T* = NULL)
{
if (CountSelectedMediaItems(NULL) == 0)
const int cnt=CountSelectedMediaItems(NULL);
if (!cnt)
return 0;

for (int i = 0; i < CountSelectedMediaItems(NULL); i++)
for (int i = 0; i < cnt; i++)
{
if (GetMediaItemInfo_Value(GetSelectedMediaItem(NULL, i), "C_BEATATTACHMODE") != 1)
return 0;
Expand Down
6 changes: 4 additions & 2 deletions Misc/Context.cpp
Expand Up @@ -38,7 +38,8 @@ bool AreThereSelItemsInTimeSel()
if (t1 != t2)
{
// see if sel items are in the time selection
for (int i = 0; i < CountSelectedMediaItems(0); i++)
const int cnt=CountSelectedMediaItems(NULL);
for (int i = 0; i < cnt; i++)
{
MediaItem* item = GetSelectedMediaItem(0, i);
double dItemPos = *(double*)GetSetMediaItemInfo(item, "D_POSITION", NULL);
Expand All @@ -53,7 +54,8 @@ bool AreThereSelItemsInTimeSel()
bool AreThereItemsUnderCursor(bool bSel)
{
double dCursor = GetCursorPosition();
for (int i = 0; i < (bSel ? CountSelectedMediaItems(0) : CountMediaItems(0)); i++)
const int cnt = (bSel ? CountSelectedMediaItems(NULL) : CountMediaItems(NULL));
for (int i = 0; i < cnt; i++)
{
MediaItem* item = bSel ? GetSelectedMediaItem(0, i) : GetMediaItem(0, i);
double dItemStart = *(double*)GetSetMediaItemInfo(item, "D_POSITION", NULL);
Expand Down
18 changes: 12 additions & 6 deletions Misc/ItemParams.cpp
Expand Up @@ -68,7 +68,8 @@ void LoopItemSection(COMMAND_T*)
{
WDL_PtrList<void> items;
WDL_PtrList<void> sections;
for (int i = 0; i < CountSelectedMediaItems(0); i++)
const int cnt=CountSelectedMediaItems(NULL);
for (int i = 0; i < cnt; i++)
{
MediaItem* item = GetSelectedMediaItem(0, i);
items.Add(item);
Expand Down Expand Up @@ -207,7 +208,8 @@ double QuantizeTime(double dTime, double dMin, double dMax)
void QuantizeItemEdges(COMMAND_T* t)
{
// Eventually a dialog? for now quantize to grid
for (int i = 0; i < CountSelectedMediaItems(NULL); i++)
const int cnt=CountSelectedMediaItems(NULL);
for (int i = 0; i < cnt; i++)
{
MediaItem* item = GetSelectedMediaItem(NULL, i);
double dStart = *(double*)GetSetMediaItemInfo(item, "D_POSITION", NULL);
Expand Down Expand Up @@ -257,7 +259,8 @@ void QuantizeItemEdges(COMMAND_T* t)
void SetChanModeAllTakes(COMMAND_T* t)
{
int mode = (int)t->user;
for (int i = 0; i < CountSelectedMediaItems(NULL); i++)
const int cnt=CountSelectedMediaItems(NULL);
for (int i = 0; i < cnt; i++)
{
MediaItem* item = GetSelectedMediaItem(NULL, i);
for (int j = 0; j < CountTakes(item); j++)
Expand All @@ -271,7 +274,8 @@ void SetChanModeAllTakes(COMMAND_T* t)
void SetPreservePitch(COMMAND_T* t)
{
bool bPP = t->user ? true : false;
for (int i = 0; i < CountSelectedMediaItems(NULL); i++)
const int cnt=CountSelectedMediaItems(NULL);
for (int i = 0; i < cnt; i++)
{
MediaItem* item = GetSelectedMediaItem(NULL, i);
for (int j = 0; j < CountTakes(item); j++)
Expand All @@ -284,7 +288,8 @@ void SetPreservePitch(COMMAND_T* t)

void SetPitch(COMMAND_T* t)
{
for (int i = 0; i < CountSelectedMediaItems(NULL); i++)
const int cnt=CountSelectedMediaItems(NULL);
for (int i = 0; i < cnt; i++)
{
MediaItem* item = GetSelectedMediaItem(NULL, i);
for (int j = 0; j < CountTakes(item); j++)
Expand All @@ -304,7 +309,8 @@ void SetPitch(COMMAND_T* t)
// Modified by SWS to change the rate of all takes and to use snap offset
void NudgePlayrate(COMMAND_T *t)
{
for(int i = 0; i < CountSelectedMediaItems(NULL); i++)
const int cnt=CountSelectedMediaItems(NULL);
for(int i = 0; i < cnt; i++)
{
MediaItem* item = GetSelectedMediaItem(NULL, i);
double snapOffset = *(double*)GetSetMediaItemInfo(item, "D_SNAPOFFSET", NULL);
Expand Down
3 changes: 2 additions & 1 deletion Xenakios/AutoRename.cpp
Expand Up @@ -323,7 +323,8 @@ bool MyTakeSortByTimeFunc (MediaItem_Take *a,MediaItem_Take *b)
void DoAutoRename(COMMAND_T*)
{
g_VecTakesToRename.clear();
for (int i = 0; i < CountSelectedMediaItems(NULL); i++)
const int cnt=CountSelectedMediaItems(NULL);
for (int i = 0; i < cnt; i++)
{
MediaItem* item = GetSelectedMediaItem(NULL, i);
MediaItem_Take* take = GetMediaItemTake(item, -1);
Expand Down

0 comments on commit cd204f6

Please sign in to comment.