void WaveTrack::GetEnvelopeValues(double *buffer, int bufferLen, double t0, double tstep) { memset(buffer, 0, sizeof(double)*bufferLen); double startTime = t0; double endTime = t0+tstep*bufferLen; for (WaveClipList::Node* it=GetClipIterator(); it; it=it->GetNext()) { WaveClip *clip = it->GetData(); if (clip->GetStartTime() < endTime && clip->GetEndTime() > startTime) { double* rbuf = buffer; int rlen = bufferLen; double rt0 = t0; if (rt0 < clip->GetStartTime()) { int dx = (int) floor((clip->GetStartTime() - rt0) / tstep + 0.5); rbuf += dx; rlen -= dx; rt0 = clip->GetStartTime(); } if (rt0+rlen*tstep > clip->GetEndTime()) { rlen = (int) ((clip->GetEndTime()-rt0) / tstep); } clip->GetEnvelope()->GetValues(rbuf, rlen, rt0, tstep); } } }
Envelope* WaveTrack::GetEnvelopeAtX(int xcoord) { WaveClip* clip = GetClipAtX(xcoord); if (clip) return clip->GetEnvelope(); else return NULL; }