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 &#45; New Free Runtime and 30 Day Trial
Check out the new simplified licensign option that enables unlimited
royalty&#45;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

Reply via email to