bool WaveTrack::InsertSilence(double t, double len) { if (len <= 0) return false; if (mClips.IsEmpty()) { // Special case if there is no clip yet WaveClip* clip = CreateClip(); return clip->InsertSilence(0, len); } for (WaveClipList::Node* it=GetClipIterator(); it; it=it->GetNext()) { WaveClip *clip = it->GetData(); if (clip->GetStartTime() > t) clip->Offset(len); else if (clip->GetEndTime() > t) { return clip->InsertSilence(t, len); } } return true; }
bool WaveTrack::Join(double t0, double t1) { // Merge all WaveClips overlapping selection into one WaveClipList::Node* it; WaveClipList clipsToDelete; WaveClip *newClip; for (it=GetClipIterator(); it; it=it->GetNext()) { WaveClip *clip = it->GetData(); if (clip->GetStartTime() < t1-(1.0/mRate) && clip->GetEndTime()-(1.0/mRate) > t0) { // Put in sorted order int i; for(i=0; i<clipsToDelete.GetCount(); i++) if (clipsToDelete[i]->GetStartTime() > clip->GetStartTime()) break; //printf("Insert clip %.6f at position %d\n", clip->GetStartTime(), i); clipsToDelete.Insert(i, clip); } } newClip = CreateClip(); double t = clipsToDelete[0]->GetOffset(); newClip->SetOffset(t); for(it=clipsToDelete.GetFirst(); it; it=it->GetNext()) { WaveClip *clip = it->GetData(); //printf("t=%.6f adding clip (offset %.6f, %.6f ... %.6f)\n", // t, clip->GetOffset(), clip->GetStartTime(), clip->GetEndTime()); if (clip->GetOffset() - t > (1.0 / mRate)) { double addedSilence = (clip->GetOffset() - t); //printf("Adding %.6f seconds of silence\n"); newClip->InsertSilence(t, addedSilence); t += addedSilence; } //printf("Pasting at %.6f\n", t); newClip->Paste(t, clip); t = newClip->GetEndTime(); mClips.DeleteObject(clip); delete clip; } return true; }