mirror of
https://github.com/cookiengineer/audacity
synced 2025-08-02 17:09:26 +02:00
Clayton's "third patch" for http://bugzilla.audacityteam.org/show_bug.cgi?id=557
This commit is contained in:
parent
27985d3631
commit
e6c43712b8
@ -618,12 +618,10 @@ void SMS :: render(int c, list<SBSMSRenderer*> &renderers)
|
|||||||
} else if(time >= t->start) {
|
} else if(time >= t->start) {
|
||||||
if(time <= t->last) {
|
if(time <= t->last) {
|
||||||
t->updateM(time,synthModeOutput);
|
t->updateM(time,synthModeOutput);
|
||||||
if(band == 4 || band != 4) {
|
|
||||||
for(list<SBSMSRenderer*>::iterator i = renderers.begin(); i != renderers.end(); ++i) {
|
for(list<SBSMSRenderer*>::iterator i = renderers.begin(); i != renderers.end(); ++i) {
|
||||||
SBSMSRenderer *renderer = *i;
|
SBSMSRenderer *renderer = *i;
|
||||||
renderer->render(c,t);
|
renderer->render(c,t);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
t->step(time);
|
t->step(time);
|
||||||
}
|
}
|
||||||
++tt;
|
++tt;
|
||||||
@ -659,13 +657,6 @@ TrackPoint *SMS :: nearestForward(TrackPoint **begin, TrackPoint *tp0, float *mi
|
|||||||
if(df2 > maxDF2) break;
|
if(df2 > maxDF2) break;
|
||||||
float dM2 = dBApprox(tp1->m2,tp0->m2);
|
float dM2 = dBApprox(tp1->m2,tp0->m2);
|
||||||
float cost2 = (df2+dMCoeff2*dM2);
|
float cost2 = (df2+dMCoeff2*dM2);
|
||||||
if(0 && dNCoeff2 != 0.0f) {
|
|
||||||
if(tp0->owner) {
|
|
||||||
cost2 += dNCoeff2 * (tp0->owner->size()<minTrackSize?1.0f:0.0f);
|
|
||||||
} else {
|
|
||||||
cost2 += dNCoeff2 * (tp1->owner->size()<minTrackSize?1.0f:0.0f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(cost2 > maxCost2) continue;
|
if(cost2 > maxCost2) continue;
|
||||||
if(cost2 < (*minCost2)) {
|
if(cost2 < (*minCost2)) {
|
||||||
(*minCost2) = cost2;
|
(*minCost2) = cost2;
|
||||||
@ -693,13 +684,6 @@ TrackPoint *SMS :: nearestReverse(TrackPoint **begin, TrackPoint *tp0, float *mi
|
|||||||
if(df2 > maxDF2) break;
|
if(df2 > maxDF2) break;
|
||||||
float dM2 = dBApprox(tp1->m2,tp0->m2);
|
float dM2 = dBApprox(tp1->m2,tp0->m2);
|
||||||
float cost2 = (df2+dMCoeff2*dM2);
|
float cost2 = (df2+dMCoeff2*dM2);
|
||||||
if(0 &&dNCoeff2 != 0.0f) {
|
|
||||||
if(tp0->owner) {
|
|
||||||
cost2 += dNCoeff2 * (tp0->owner->size()<minTrackSize?1.0f:0.0f);
|
|
||||||
} else {
|
|
||||||
cost2 += dNCoeff2 * (tp1->owner->size()<minTrackSize?1.0f:0.0f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(cost2 > maxCost2) continue;
|
if(cost2 > maxCost2) continue;
|
||||||
if(cost2 < (*minCost2)) {
|
if(cost2 < (*minCost2)) {
|
||||||
(*minCost2) = cost2;
|
(*minCost2) = cost2;
|
||||||
@ -1267,6 +1251,7 @@ void SMS :: start(long offset, int c)
|
|||||||
++tt;
|
++tt;
|
||||||
assignTracks[c].erase(eraseMe);
|
assignTracks[c].erase(eraseMe);
|
||||||
returnTrackIndex(c,t);
|
returnTrackIndex(c,t);
|
||||||
|
t->absorb();
|
||||||
delete t;
|
delete t;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1357,7 +1342,7 @@ void SMS :: splitMerge(int c)
|
|||||||
tp->cont = minH;
|
tp->cont = minH;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(1&&tp->cont) {
|
if(tp->cont) {
|
||||||
tp->owner->point.insert(tp->owner->point.begin(),tp->cont);
|
tp->owner->point.insert(tp->owner->point.begin(),tp->cont);
|
||||||
tp->owner->first--;
|
tp->owner->first--;
|
||||||
tp->owner->bStitch = true;
|
tp->owner->bStitch = true;
|
||||||
@ -1393,7 +1378,7 @@ void SMS :: splitMerge(int c)
|
|||||||
tp->cont = minH;
|
tp->cont = minH;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(1&&tp->cont) {
|
if(tp->cont) {
|
||||||
tp->owner->point.insert(tp->owner->point.end(),tp->cont);
|
tp->owner->point.insert(tp->owner->point.end(),tp->cont);
|
||||||
tp->owner->last++;
|
tp->owner->last++;
|
||||||
tp->owner->bStitch = true;
|
tp->owner->bStitch = true;
|
||||||
@ -1482,20 +1467,6 @@ void SMS :: add(grain *g0, grain *g1, grain *g2, int c)
|
|||||||
bool bX1 = false;
|
bool bX1 = false;
|
||||||
TrackPoint *prev = NULL;
|
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]);
|
Slice *slice = new Slice(band,addtime[c]);
|
||||||
|
|
||||||
for(int k=1; k<=kEnd; k++) {
|
for(int k=1; k<=kEnd; k++) {
|
||||||
@ -1515,31 +1486,6 @@ void SMS :: add(grain *g0, grain *g1, grain *g2, int c)
|
|||||||
} else {
|
} else {
|
||||||
TrackPoint *p = new TrackPoint(slice,peak2N,x2[c],mag2,mag2,k,N,band);
|
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) {
|
if(prev) {
|
||||||
prev->pn = p;
|
prev->pn = p;
|
||||||
p->pp = prev;
|
p->pp = prev;
|
||||||
@ -1564,34 +1510,6 @@ void SMS :: add(grain *g0, grain *g1, grain *g2, int c)
|
|||||||
bTroughN2 = false;
|
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) {
|
if(bTroughN2) {
|
||||||
prev->xtn2 = (float)kEnd;
|
prev->xtn2 = (float)kEnd;
|
||||||
@ -1749,6 +1667,7 @@ void SMS :: add(grain *g0, grain *g1, grain *g2, int c)
|
|||||||
p; ) {
|
p; ) {
|
||||||
TrackPoint *pn = p->pn;
|
TrackPoint *pn = p->pn;
|
||||||
if(p->m2 < m2min) {
|
if(p->m2 < m2min) {
|
||||||
|
p->absorb();
|
||||||
delete p;
|
delete p;
|
||||||
}
|
}
|
||||||
p = pn;
|
p = pn;
|
||||||
|
@ -42,9 +42,6 @@ Track :: ~Track() {
|
|||||||
++i) {
|
++i) {
|
||||||
TrackPoint *tp = (*i);
|
TrackPoint *tp = (*i);
|
||||||
if(tp) {
|
if(tp) {
|
||||||
if(tp->owner == this) {
|
|
||||||
tp->owner = NULL;
|
|
||||||
}
|
|
||||||
tp->destroy();
|
tp->destroy();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -348,4 +345,14 @@ void Track :: synth(float *out,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Track :: absorb()
|
||||||
|
{
|
||||||
|
for(vector<TrackPoint*>::iterator i = point.begin();
|
||||||
|
i != point.end();
|
||||||
|
++i) {
|
||||||
|
TrackPoint *tp = (*i);
|
||||||
|
tp->absorb();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -56,6 +56,7 @@ protected:
|
|||||||
void step(const TimeType &time);
|
void step(const TimeType &time);
|
||||||
void synth(float *out, const TimeType &synthtime, int n, int mode, int c);
|
void synth(float *out, const TimeType &synthtime, int n, int mode, int c);
|
||||||
bool jump(TrackPoint *tp0, TrackPoint *tp1);
|
bool jump(TrackPoint *tp0, TrackPoint *tp1);
|
||||||
|
void absorb();
|
||||||
|
|
||||||
friend class SMS;
|
friend class SMS;
|
||||||
friend class SynthRenderer;
|
friend class SynthRenderer;
|
||||||
|
@ -78,50 +78,40 @@ TrackPoint :: TrackPoint(Slice *slice, float *peak, audio *gx, float *mag, float
|
|||||||
phSynth = ph;
|
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()
|
TrackPoint :: ~TrackPoint()
|
||||||
{
|
{
|
||||||
for(int d=0;d<3;d++) {
|
for(int d=0;d<3;d++) {
|
||||||
if(dup[d]) {
|
if(dup[d]) {
|
||||||
m2 = 0.0f;
|
|
||||||
dup[d]->dup[2-d] = NULL;
|
dup[d]->dup[2-d] = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m2 = 0;
|
|
||||||
if(slice) slice->remove(this);
|
if(slice) slice->remove(this);
|
||||||
if(pp && pn) {
|
if(pp && pn) {
|
||||||
pp->pn = pn;
|
pp->pn = pn;
|
||||||
pn->pp = pp;
|
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) {
|
} else if(pp) {
|
||||||
pp->pn = NULL;
|
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if(pn) {
|
} else if(pn) {
|
||||||
pn->pp = NULL;
|
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ public:
|
|||||||
float getF();
|
float getF();
|
||||||
float getM();
|
float getM();
|
||||||
float getPhase();
|
float getPhase();
|
||||||
|
void absorb();
|
||||||
protected:
|
protected:
|
||||||
TrackPoint *pp;
|
TrackPoint *pp;
|
||||||
TrackPoint *pn;
|
TrackPoint *pn;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user