Update of /cvsroot/audacity/audacity-src/src/effects
In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv29215
Modified Files:
StereoToMono.cpp StereoToMono.h
Log Message:
Make this work if the two tracks are of different lengths + speedup if offset
is large.
Index: StereoToMono.h
===================================================================
RCS file: /cvsroot/audacity/audacity-src/src/effects/StereoToMono.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- StereoToMono.h 12 Jul 2008 15:25:47 -0000 1.10
+++ StereoToMono.h 25 Apr 2009 00:33:42 -0000 1.11
@@ -46,10 +46,11 @@
private:
bool ProcessOne(int);
- sampleCount mLeftTrackLen;
- sampleCount mRightTrackLen;
+ sampleCount mStart;
+ sampleCount mEnd;
WaveTrack *mLeftTrack;
WaveTrack *mRightTrack;
+ WaveTrack *mOutTrack;
};
Index: StereoToMono.cpp
===================================================================
RCS file: /cvsroot/audacity/audacity-src/src/effects/StereoToMono.cpp,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -d -r1.13 -r1.14
--- StereoToMono.cpp 23 Mar 2009 00:32:54 -0000 1.13
+++ StereoToMono.cpp 25 Apr 2009 00:33:42 -0000 1.14
@@ -69,18 +69,17 @@
float curMonoFrame;
sampleCount idealBlockLen = mLeftTrack->GetMaxBlockSize() * 2;
- sampleCount index = 0;
- sampleCount outTrackOffset = 0;
+ sampleCount index = mStart;
float *leftBuffer = new float[idealBlockLen];
float *rightBuffer = new float[idealBlockLen];
bool rc;
- while (index < mLeftTrackLen) {
+ while (index < mEnd) {
rc = mLeftTrack->Get((samplePtr)leftBuffer, floatSample, index,
idealBlockLen);
rc = mRightTrack->Get((samplePtr)rightBuffer, floatSample, index,
idealBlockLen);
sampleCount limit = idealBlockLen;
- if ((index + idealBlockLen) > mLeftTrackLen) {
- limit = mLeftTrackLen - index;
+ if ((index + idealBlockLen) > mEnd) {
+ limit = mEnd - index;
}
for (sampleCount i = 0; i < limit; ++i) {
index++;
@@ -89,12 +88,15 @@
curMonoFrame = (curLeftFrame + curRightFrame) / 2.0;
leftBuffer[i] = curMonoFrame;
}
- rc = mLeftTrack->Set((samplePtr)leftBuffer, floatSample, outTrackOffset,
limit);
- outTrackOffset += limit;
- if (TrackProgress(count, 2.*((double)index / (double)mLeftTrackLen)))
+ rc = mOutTrack->Append((samplePtr)leftBuffer, floatSample, limit);
+ if (TrackProgress(count, 2.*((double)index / (double)(mEnd - mStart))))
return false;
}
+ double minStart = wxMin(mLeftTrack->GetStartTime(),
mRightTrack->GetStartTime());
+ mLeftTrack->Clear(mLeftTrack->GetStartTime(), mLeftTrack->GetEndTime());
+ mOutTrack->Flush();
+ mLeftTrack->HandlePaste(minStart, mOutTrack);
mLeftTrack->SetLinked(false);
mRightTrack->SetLinked(false);
mLeftTrack->SetChannel(Track::MonoChannel);
@@ -118,23 +120,36 @@
mLeftTrack = (WaveTrack *)iter.First();
bool refreshIter = false;
+ if(mLeftTrack)
+ {
+ // create a new WaveTrack to hold all of the output
+ AudacityProject *p = GetActiveProject();
+ mOutTrack = p->GetTrackFactory()->NewWaveTrack(floatSample,
mLeftTrack->GetRate());
+ }
+
int count = 0;
while (mLeftTrack) {
if (mLeftTrack->GetKind() == Track::Wave &&
- mLeftTrack->GetSelected() &&
- mLeftTrack->GetLinked()) {
+ mLeftTrack->GetSelected() &&
+ mLeftTrack->GetLinked()) {
mRightTrack = (WaveTrack *)iter.Next();
- mLeftTrackLen =
mLeftTrack->TimeToLongSamples(mLeftTrack->GetEndTime());
- mRightTrackLen =
mRightTrack->TimeToLongSamples(mRightTrack->GetEndTime());
- long diff = abs((long)mRightTrackLen - (long)mLeftTrackLen);
-
- if ((diff <= 2) && (mLeftTrack->GetRate() == mRightTrack->GetRate()))
{
+ if ((mLeftTrack->GetRate() == mRightTrack->GetRate())) {
+ sampleCount leftTrackStart =
mLeftTrack->TimeToLongSamples(mLeftTrack->GetStartTime());
+ sampleCount rightTrackStart =
mRightTrack->TimeToLongSamples(mRightTrack->GetStartTime());
+ mStart = wxMin(leftTrackStart, rightTrackStart);
+
+ sampleCount leftTrackEnd =
mLeftTrack->TimeToLongSamples(mLeftTrack->GetEndTime());
+ sampleCount rightTrackEnd =
mRightTrack->TimeToLongSamples(mRightTrack->GetEndTime());
+ mEnd = wxMax(leftTrackEnd, rightTrackEnd);
+
bGoodResult = ProcessOne(count);
if (!bGoodResult)
break;
+ mOutTrack->Clear(mOutTrack->GetStartTime(),
mOutTrack->GetEndTime());
+
// The right channel has been deleted, so we must restart from the
beginning
refreshIter = true;
}
@@ -149,7 +164,9 @@
}
count++;
}
-
+
+ if(mOutTrack)
+ delete mOutTrack;
this->ReplaceProcessedWaveTracks(bGoodResult);
return bGoodResult;
}
------------------------------------------------------------------------------
Crystal Reports - New Free Runtime and 30 Day Trial
Check out the new simplified licensign option that enables unlimited
royalty-free distribution of the report engine for externally facing
server and web deployment.
http://p.sf.net/sfu/businessobjects
_______________________________________________
Audacity-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/audacity-cvs