void WaveTrack::UpdateLocationsCache() { WaveClipList::Node *it, *jt; mDisplayNumLocations = 0; for (it=GetClipIterator(); it; it=it->GetNext()) { WaveClip* clip = it->GetData(); mDisplayNumLocations += clip->GetCutLines()->GetCount(); for (jt=GetClipIterator(); jt; jt=jt->GetNext()) { WaveClip* clip2 = jt->GetData(); if (clip != clip2 && fabs(clip->GetEndTime()-clip2->GetStartTime()) < WAVETRACK_MERGE_POINT_TOLERANCE) mDisplayNumLocations++; } } if (mDisplayNumLocations == 0) return; if (mDisplayNumLocations > mDisplayNumLocationsAllocated) { // Only realloc, if we need more space than before. Otherwise // just use block from before. if (mDisplayLocations) delete[] mDisplayLocations; mDisplayLocations = new Location[mDisplayNumLocations]; mDisplayNumLocationsAllocated = mDisplayNumLocations; } int curpos = 0; for (it=GetClipIterator(); it; it=it->GetNext()) { WaveClip* clip = it->GetData(); WaveClipList* cutlines = clip->GetCutLines(); for (jt = cutlines->GetFirst(); jt; jt=jt->GetNext()) { mDisplayLocations[curpos].typ = locationCutLine; mDisplayLocations[curpos].pos = jt->GetData()->GetOffset() + it->GetData()->GetOffset(); curpos++; } for (jt=GetClipIterator(); jt; jt=jt->GetNext()) { WaveClip* clip2 = jt->GetData(); if (clip != clip2 && fabs(clip->GetEndTime()-clip2->GetStartTime()) < WAVETRACK_MERGE_POINT_TOLERANCE) { mDisplayLocations[curpos].typ = locationMergePoint; mDisplayLocations[curpos].pos = clip->GetEndTime(); mDisplayLocations[curpos].clipidx1 = mClips.IndexOf(clip); mDisplayLocations[curpos].clipidx2 = mClips.IndexOf(clip2); curpos++; } } } }