CWSOLA.h
上传用户:anhe341234
上传日期:2021-04-11
资源大小:398k
文件大小:2k
源码类别:

Windows编程

开发平台:

Visual C++

  1. //---------------------------------------------------------------------------
  2. #ifndef CWSOLAH
  3. #define CWSOLAH
  4. //---------------------------------------------------------------------------
  5. #include "TReader.h"
  6. #define BLOCK_ALIGN 4
  7. enum TimeStretchMode {tsmWOLA, tsmWSOLA};
  8. enum WSOLAXMode {wxmFast, wxmGood};
  9. //typedef void (__stdcall  *FillFunc)(unsigned long bytes, Buffer& buffer_to_fill);
  10. using AudioReader::TReader;
  11. class CWOLA {
  12.   enum WindowRamp{wRampUp,wRampDown};
  13.   Buffer WorkBuffer;
  14.   AudioReader::TReader* Reader;
  15.   unsigned int copysize, WindowLength;
  16.   int cbBuffer; //Output buffer size
  17.   int SearchWin;
  18.   int delta_target;
  19.   double step_error; //Corrects for small errors in step size
  20.   //For use in Xcorr and general speedup
  21.   unsigned int XCorrLength,XCorrStart,XCorrEnd;
  22.   std::vector<float> Window;
  23.   float* XCorrWin;
  24.   
  25.   TimeStretchMode tsmode;
  26.   WSOLAXMode wxmode;
  27.   void SetUpWindow();
  28.   void ApplyWindow(char* buffer, WindowRamp rampdir);
  29.   void ApplyWindow(float* buffer, WindowRamp rampdir);
  30.   void MixBuffers(char* dest, char* mix_in);
  31.   void MixBuffers(float* dest, float* mix_in);
  32.   int WSOLAProcessBlock(float Speed, char* outbuff);
  33.   int WSOLAProcessBlock(float Speed, float* outbuff);
  34.   int WOLAProcessBlock(float Speed, char* outbuff);
  35.   int WOLAProcessBlock(float Speed, float* outbuff);
  36.   int SearchBestXCorr(char* to_be_matched, char* searchbuffer);
  37.   int SearchBestXCorr(float* to_be_matched, float* searchbuffer);
  38.   int SearchBestXCorrFast(char* to_be_matched, char* searchbuffer);
  39.   int SearchBestXCorrFast(float* to_be_matched, float* searchbuffer);
  40. public:
  41.   CWOLA(int wl, int cbbuf, int srch_win, AudioReader::TReader* areader) :
  42.         WindowLength(wl),
  43.         cbBuffer(cbbuf), SearchWin(srch_win), Reader(areader), XCorrWin(NULL),
  44.         copysize(BLOCK_ALIGN*wl),tsmode(tsmWOLA),wxmode(wxmFast)
  45.           {SetUpWindow();
  46.            WorkBuffer.data.resize(3*wl*BLOCK_ALIGN,0);
  47.            WorkBuffer.pos = WorkBuffer.data.begin() + 3*wl*BLOCK_ALIGN;
  48.            delta_target = 0;
  49.            step_error = 0;};
  50.   int ProcessBlock(float Speed, char* outbuffer); //returns bytes used from source
  51.   void SetMode(TimeStretchMode new_mode){tsmode = new_mode;};
  52.   void SetMode(WSOLAXMode new_mode) {wxmode = new_mode;}
  53. };
  54. #endif