⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 reverse.cpp

📁 Audacity是一款用於錄音和編輯聲音的、免費的開放源碼軟體。它可以執行於Mac OS X、Microsoft Windows、GNU/Linux和其它作業系統
💻 CPP
字号:
/**********************************************************************  Audacity: A Digital Audio Editor  Reverse.cpp  Mark Phillips  This class reverses the selected audio.**********************************************************************/#include <math.h>#include "Reverse.h"#include "../WaveTrack.h"//// EffectReverse//EffectReverse::EffectReverse(){}bool EffectReverse::Process(){   TrackListIterator iter(mWaveTracks);   WaveTrack *track = (WaveTrack *) iter.First();   int count = 0;   while (track) {      double trackStart = track->GetStartTime();      double trackEnd = track->GetEndTime();      double t0 = mT0 < trackStart? trackStart: mT0;      double t1 = mT1 > trackEnd? trackEnd: mT1;      if (t1 > t0) {         longSampleCount start = track->TimeToLongSamples(t0);         longSampleCount end = track->TimeToLongSamples(t1);         sampleCount len = (sampleCount)(end - start);         if (!ProcessOne(count, track, start, len))            return false;      }      track = (WaveTrack *) iter.Next();      count++;   }   return true;}bool EffectReverse::ProcessOne(int count, WaveTrack *track,                               longSampleCount start, sampleCount len){   // keep track of two blocks whose data we will swap   longSampleCount first = start;   longSampleCount second;   sampleCount blockSize = track->GetMaxBlockSize();   float tmp;   float *buffer1 = new float[blockSize];   float *buffer2 = new float[blockSize];      sampleCount originalLen = len;   while (len > 1) {      sampleCount block = track->GetBestBlockSize(first);      if (block > len / 2)         block = len / 2;      second = first + (len - block);      track->Get((samplePtr)buffer1, floatSample, first, block);      track->Get((samplePtr)buffer2, floatSample, second, block);      for (int i = 0; i < block; i++) {         tmp = buffer1[i];         buffer1[i] = buffer2[block-i-1];         buffer2[block-i-1] = tmp;      }      track->Set((samplePtr)buffer1, floatSample, first, block);      track->Set((samplePtr)buffer2, floatSample, second, block);      len -= 2 * block;      first += block;            TrackProgress(count, 2*(first-start) / (double) originalLen);   }   delete[] buffer1;   delete[] buffer2;   return true;}// Indentation settings for Vim and Emacs and unique identifier for Arch, a// version control system. Please do not modify past this point.//// Local Variables:// c-basic-offset: 3// indent-tabs-mode: nil// End://// vim: et sts=3 sw=3// arch-tag: 47d91d2a-befd-4921-a19d-6cb8376428eb

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -