From e6c43712b887b9e31efb2fe7b098339bc0861d29 Mon Sep 17 00:00:00 2001 From: "v.audacity" Date: Sun, 12 Aug 2012 22:03:12 +0000 Subject: [PATCH] Clayton's "third patch" for http://bugzilla.audacityteam.org/show_bug.cgi?id=557 --- lib-src/sbsms/src/sms.cpp | 89 ++------------------------------ lib-src/sbsms/src/track.cpp | 15 ++++-- lib-src/sbsms/src/track.h | 1 + lib-src/sbsms/src/trackpoint.cpp | 50 +++++++----------- lib-src/sbsms/src/trackpoint.h | 1 + 5 files changed, 37 insertions(+), 119 deletions(-) diff --git a/lib-src/sbsms/src/sms.cpp b/lib-src/sbsms/src/sms.cpp index 6fa73b821..7a6c3520d 100644 --- a/lib-src/sbsms/src/sms.cpp +++ b/lib-src/sbsms/src/sms.cpp @@ -618,12 +618,10 @@ void SMS :: render(int c, list &renderers) } else if(time >= t->start) { if(time <= t->last) { t->updateM(time,synthModeOutput); - if(band == 4 || band != 4) { for(list::iterator i = renderers.begin(); i != renderers.end(); ++i) { SBSMSRenderer *renderer = *i; renderer->render(c,t); } - } t->step(time); } ++tt; @@ -659,13 +657,6 @@ TrackPoint *SMS :: nearestForward(TrackPoint **begin, TrackPoint *tp0, float *mi if(df2 > maxDF2) break; float dM2 = dBApprox(tp1->m2,tp0->m2); float cost2 = (df2+dMCoeff2*dM2); - if(0 && dNCoeff2 != 0.0f) { - if(tp0->owner) { - cost2 += dNCoeff2 * (tp0->owner->size()owner->size() maxCost2) continue; if(cost2 < (*minCost2)) { (*minCost2) = cost2; @@ -693,13 +684,6 @@ TrackPoint *SMS :: nearestReverse(TrackPoint **begin, TrackPoint *tp0, float *mi if(df2 > maxDF2) break; float dM2 = dBApprox(tp1->m2,tp0->m2); float cost2 = (df2+dMCoeff2*dM2); - if(0 &&dNCoeff2 != 0.0f) { - if(tp0->owner) { - cost2 += dNCoeff2 * (tp0->owner->size()owner->size() maxCost2) continue; if(cost2 < (*minCost2)) { (*minCost2) = cost2; @@ -1267,6 +1251,7 @@ void SMS :: start(long offset, int c) ++tt; assignTracks[c].erase(eraseMe); returnTrackIndex(c,t); + t->absorb(); delete t; continue; } @@ -1357,7 +1342,7 @@ void SMS :: splitMerge(int c) tp->cont = minH; } } - if(1&&tp->cont) { + if(tp->cont) { tp->owner->point.insert(tp->owner->point.begin(),tp->cont); tp->owner->first--; tp->owner->bStitch = true; @@ -1393,7 +1378,7 @@ void SMS :: splitMerge(int c) tp->cont = minH; } } - if(1&&tp->cont) { + if(tp->cont) { tp->owner->point.insert(tp->owner->point.end(),tp->cont); tp->owner->last++; tp->owner->bStitch = true; @@ -1482,20 +1467,6 @@ void SMS :: add(grain *g0, grain *g1, grain *g2, int c) bool bX1 = false; TrackPoint *prev = NULL; - /* - float xt2sum = 1.0f; - bool bTroughN1sum = false; - bool bTroughN2sum = false; - float x0sum = 1.0f; - float y0sum = mag2[1]; - float x1sum = 0.0f; - float y1sum = 0.0f; - bool bX0sum = !lo; - bool bX1sum = false; - TrackPoint *prevsum = NULL; - TrackPoint *psum = NULL; - */ - Slice *slice = new Slice(band,addtime[c]); for(int k=1; k<=kEnd; k++) { @@ -1515,31 +1486,6 @@ void SMS :: add(grain *g0, grain *g1, grain *g2, int c) } else { TrackPoint *p = new TrackPoint(slice,peak2N,x2[c],mag2,mag2,k,N,band); - /* - if(psum) { - if(p->x - psum->x > peakWidth2) { - if(prev) { - prev->pn = psum; - psum->pp = prev; - } else { - slice->bottom = psum; - } - slice->top = psum; - prev = psum; - prevsum = psum; - psum->xtn2 = maxK; - bTroughN1sum = true; - bTroughN2sum = true; - psum->xtp2 = xt2sum; - psum->x01 = x0sum; - psum->y01 = y0sum; - } else { - delete psum; - } - } - psum = NULL; - */ - if(prev) { prev->pn = p; p->pp = prev; @@ -1564,34 +1510,6 @@ void SMS :: add(grain *g0, grain *g1, grain *g2, int c) bTroughN2 = false; } } - - /* - if(mag2sum[k] > mag2sum[k-1] && mag2sum[k] >= mag2sum[k+1]) { - if(k < kLo) { - x0sum = findExtremum(mag2sum,mag2,k,&y0sum); - bX0sum = true; - } else if(k > kHi) { - if(!bX1sum) { - x1sum = findExtremum(mag2sum,mag2,k,&y1sum); - if(prevsum) { - prevsum->x01 = x1sum; - prevsum->y01 = y1sum; - } - bX1sum = true; - } - } else { - if(!prev || k - prev->x > peakWidth2) { - psum = new TrackPoint(slice,peak2N,x2[c],mag2sum,mag2,k,N,band); - } - } - } else if(mag2sum[k] <= mag2sum[k-1] && mag2sum[k] <= mag2sum[k+1]) { - xt2sum = findExtremum(mag2sum,mag2,k,NULL); - if(bTroughN2sum) { - prevsum->xtn2 = xt2; - bTroughN2sum = false; - } - } - */ } if(bTroughN2) { prev->xtn2 = (float)kEnd; @@ -1749,6 +1667,7 @@ void SMS :: add(grain *g0, grain *g1, grain *g2, int c) p; ) { TrackPoint *pn = p->pn; if(p->m2 < m2min) { + p->absorb(); delete p; } p = pn; diff --git a/lib-src/sbsms/src/track.cpp b/lib-src/sbsms/src/track.cpp index 68cbf889f..b81718a91 100644 --- a/lib-src/sbsms/src/track.cpp +++ b/lib-src/sbsms/src/track.cpp @@ -41,10 +41,7 @@ Track :: ~Track() { i != point.end(); ++i) { TrackPoint *tp = (*i); - if(tp) { - if(tp->owner == this) { - tp->owner = NULL; - } + if(tp) { tp->destroy(); } } @@ -348,4 +345,14 @@ void Track :: synth(float *out, } } +void Track :: absorb() +{ + for(vector::iterator i = point.begin(); + i != point.end(); + ++i) { + TrackPoint *tp = (*i); + tp->absorb(); + } +} + } diff --git a/lib-src/sbsms/src/track.h b/lib-src/sbsms/src/track.h index 4e3a8802a..62b631e9a 100644 --- a/lib-src/sbsms/src/track.h +++ b/lib-src/sbsms/src/track.h @@ -56,6 +56,7 @@ protected: void step(const TimeType &time); void synth(float *out, const TimeType &synthtime, int n, int mode, int c); bool jump(TrackPoint *tp0, TrackPoint *tp1); + void absorb(); friend class SMS; friend class SynthRenderer; diff --git a/lib-src/sbsms/src/trackpoint.cpp b/lib-src/sbsms/src/trackpoint.cpp index f3ed331dc..3afdced59 100644 --- a/lib-src/sbsms/src/trackpoint.cpp +++ b/lib-src/sbsms/src/trackpoint.cpp @@ -78,50 +78,40 @@ TrackPoint :: TrackPoint(Slice *slice, float *peak, audio *gx, float *mag, float phSynth = ph; } +void TrackPoint :: absorb() +{ + if(pp && pn) { + if(pp->y * peak[lrintf(pp->x - x)] > pn->y * peak[lrintf(pn->x - x)]) { + pp->m2 += m2; + } else { + pn->m2 += m2; + } + } else if(pp) { + if(y01 == 0.0f || y01 * peak[lrintf(x01 - x)] < pp->y * peak[lrintf(pp->x - x)]) { + pp->m2 += m2; + } + } else if(pn) { + if(y01 == 0.0f || y01 * peak[lrintf(x01 - x)] < pn->y * peak[lrintf(pn->x - x)]) { + pn->m2 += m2; + } + } +} + TrackPoint :: ~TrackPoint() { for(int d=0;d<3;d++) { if(dup[d]) { - m2 = 0.0f; dup[d]->dup[2-d] = NULL; } } - m2 = 0; if(slice) slice->remove(this); if(pp && pn) { pp->pn = pn; pn->pp = pp; - if(!(owner && owner->bRender)) { - if(pp->y * peak[lrintf(pp->x - x)] > pn->y * peak[lrintf(pn->x - x)]) { - pp->m2 += m2; - pp->xtn2 = xtn2; - pn->xtp2 = xtn2; - } else { - pn->m2 += m2; - pp->xtn2 = xtp2; - pn->xtp2 = xtp2; - } - } } else if(pp) { - pp->pn = NULL; - if(!(owner && owner->bRender)) { - if(y01 == 0.0f || y01 * peak[lrintf(x01 - x)] < pp->y * peak[lrintf(pp->x - x)]) { - pp->x01 = x01; - pp->y01 = y01; - pp->m2 += m2; - pp->xtn2 = xtn2; - } - } + pp->pn = NULL; } else if(pn) { pn->pp = NULL; - if(!(owner && owner->bRender)) { - if(y01 == 0.0f || y01 * peak[lrintf(x01 - x)] < pn->y * peak[lrintf(pn->x - x)]) { - pn->x01 = x01; - pn->y01 = y01; - pn->m2 += m2; - pn->xtp2 = xtp2; - } - } } } diff --git a/lib-src/sbsms/src/trackpoint.h b/lib-src/sbsms/src/trackpoint.h index 81cf2ba83..5a0431d9e 100644 --- a/lib-src/sbsms/src/trackpoint.h +++ b/lib-src/sbsms/src/trackpoint.h @@ -19,6 +19,7 @@ public: float getF(); float getM(); float getPhase(); + void absorb(); protected: TrackPoint *pp; TrackPoint *pn;