using NAudio.Wave; using NAudio.Wave.SampleProviders; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Windows; namespace QuikDawEditor.EditingClasses; public class ClipStream { public WaveStream clipWaveStreamNormal; public WaveStream clipWaveStreamReversed; public string baseFileName = ""; public ClipStream(string fileName) { switch (Path.GetExtension(fileName)) { case ".mp3": clipWaveStreamNormal = new Mp3FileReader(fileName); break; case ".wav": clipWaveStreamNormal = new WaveFileReader(fileName); break; } baseFileName = Path.GetFileName(fileName); } public void CreateReversedWaveStream() { WaveFormat createWaveFormat = clipWaveStreamNormal.WaveFormat; //Reverse the stream List revbufferlist = new List(); clipWaveStreamNormal.Position = 0; float[] revBuffer = new float[createWaveFormat.SampleRate]; //ISampleProvider sourceProvider = new WdlResamplingSampleProvider(clipWaveStreamNormal.ToSampleProvider(), 44100); ISampleProvider sourceProvider = null; //Force resample to 44100 switch (createWaveFormat.SampleRate) { case 44100: sourceProvider = new WdlResamplingSampleProvider(clipWaveStreamNormal.ToSampleProvider(), 44100); break; case 48000: sourceProvider = new WdlResamplingSampleProvider(clipWaveStreamNormal.ToSampleProvider(), 48000); break; } int read; do { Array.Clear(revBuffer, 0, revBuffer.Length); read = sourceProvider.Read(revBuffer, 0, revBuffer.Length); revbufferlist.AddRange(revBuffer); } while (read > 0); revbufferlist.Reverse(); //revBuffer = revbufferlist.Skip(44100).ToArray(); // Remove 1 sec of silence at end which is moved to front when reversed revBuffer = revbufferlist.Skip(createWaveFormat.SampleRate * 2 / createWaveFormat.Channels).ToArray(); // Remove 1 sec of silence at end which is moved to front when reversed MemoryStream mstream = new MemoryStream(); WaveFileWriter recordingWFWriter = new WaveFileWriter(mstream, createWaveFormat); mstream.Position = 0; recordingWFWriter.WriteSamples(revBuffer, 0, revBuffer.Length); mstream.Position = 0; //myClipStream.clipWaveStream = new WaveFileReader(mstream); //Error because "no riff wave header"; clipWaveStreamReversed = new RawSourceWaveStream(mstream, createWaveFormat); clipWaveStreamReversed.Position = 0; //Don't close the new stream //recordingWFWriter.Close(); can't do this } //public void Close() //{ // clipWuseWaveStream.Close(); // useWaveStream.Dispose(); //} }