private void Process(SoundTouch <TSampleType, TLongSampleType> pSoundTouch, WavInFile inFile, WavOutFile outFile) { int nSamples; var sampleBuffer = new TSampleType[BUFF_SIZE]; if ((inFile == null) || (outFile == null)) { return; // nothing to do. } int nChannels = inFile.GetNumChannels(); int buffSizeSamples = BUFF_SIZE / nChannels; // Process samples read from the input file while (!inFile.Eof()) { // Read a chunk of samples from the input file int num = inFile.Read(sampleBuffer, BUFF_SIZE); nSamples = num / inFile.GetNumChannels(); // Feed the samples into SoundTouch processor pSoundTouch.PutSamples(sampleBuffer, nSamples); do { nSamples = pSoundTouch.ReceiveSamples(sampleBuffer, buffSizeSamples); outFile.Write(sampleBuffer, nSamples * nChannels); } while (nSamples != 0); } // Now the input file is processed, yet 'flush' few last samples that are // hiding in the SoundTouch's internal processing pipeline. pSoundTouch.Flush(); do { nSamples = pSoundTouch.ReceiveSamples(sampleBuffer, buffSizeSamples); outFile.Write(sampleBuffer, nSamples * nChannels); } while (nSamples != 0); }
private void ProcessWav(XTempoJob param) { var outFileName = string.IsNullOrEmpty(param.AlternativeOutputPath) ? param.SourceFileName.GenerateOutPutPath() : param.AlternativeOutputPath; var soundTouch = new SoundTouch <TSampleType, TLongSampleType>(); if (param.SourceData != null) { File.WriteAllBytes(param.SourceFileName, param.SourceData); } using (var inFile = new WavInFile(param.SourceFileName)) using (var outFile = new WavOutFile(outFileName, (inFile).GetSampleRate(), (inFile).GetNumBits(), (inFile).GetNumChannels())) { Setup(soundTouch, inFile.GetSampleRate(), inFile.GetNumChannels(), param.TempoDelta, param.PitchDelta); Process(soundTouch, inFile, outFile); } param.ResulFileName = outFileName; if (param.ReturnData) { param.OutputData = File.ReadAllBytes(outFileName); File.Delete(outFileName); } }