public static void Concatenate(string outputFile, IEnumerable <string> sourceFiles) { byte[] buffer = new byte[1024]; WaveFileWriter waveFileWriter = null; try { foreach (string sourceFile in sourceFiles) { using (var reader = new MediaFoundationReader(sourceFile)) { using (var resampledReader = new ResamplerDmoStream(reader, new WaveFormat( reader.WaveFormat.SampleRate, reader.WaveFormat.BitsPerSample, reader.WaveFormat.Channels))) { if (waveFileWriter == null) { waveFileWriter = new WaveFileWriter(outputFile, reader.WaveFormat); } else { if (!reader.WaveFormat.Equals(waveFileWriter.WaveFormat)) { throw new InvalidOperationException( "Can't concatenate WAV Files that don't share the same format"); } } int read; while ((read = resampledReader.Read(buffer, 0, buffer.Length)) > 0) { waveFileWriter.WriteData(buffer, 0, read); } } } } } finally { if (waveFileWriter != null) { waveFileWriter.Dispose(); } } }
public void CanReadABlockFromResamplerStream() { //using (WaveFileReader reader = new WaveFileReader("C:\\Users\\Mark\\Recording\\REAPER\\ideas-2008-05-17.wav")) WaveFormat inputFormat = new WaveFormat(44100, 16, 1); using (WaveStream reader = new NullWaveStream(inputFormat, inputFormat.AverageBytesPerSecond * 20)) { using (ResamplerDmoStream resampler = new ResamplerDmoStream(reader, WaveFormat.CreateIeeeFloatWaveFormat(48000, 2))) { // try to read 10 ms; int bytesToRead = resampler.WaveFormat.AverageBytesPerSecond / 100; byte[] buffer = new byte[bytesToRead]; int count = resampler.Read(buffer, 0, bytesToRead); Assert.That(count > 0, "Bytes Read"); } } }
private byte[] ResampleBytesDMO(byte[] inputByteArray, int length) { byte[] outBuffer = new byte[length * bufferMultiplier]; buf.AddSamples(inputByteArray, 0, length); int read = dmoResampler.Read(outBuffer, 0, outBuffer.Length); if (read == 0) { return(new byte[0]); } else { byte[] finalBuf = new byte[read]; Buffer.BlockCopy(outBuffer, 0, finalBuf, 0, read); return(finalBuf); } }
private void ResampleAWholeStream(WaveFormat inputFormat, WaveFormat outputFormat) { using (WaveStream reader = new NullWaveStream(inputFormat, inputFormat.AverageBytesPerSecond * 20)) { using (ResamplerDmoStream resampler = new ResamplerDmoStream(reader, outputFormat)) { // try to read 10 ms; int bytesToRead = resampler.WaveFormat.AverageBytesPerSecond / 100; byte[] buffer = new byte[bytesToRead]; int count; int total = 0; do { count = resampler.Read(buffer, 0, bytesToRead); total += count; //Assert.AreEqual(count, bytesToRead, "Bytes Read"); } while (count > 0); //Debug.WriteLine(String.Format("Converted input length {0} to {1}", reader.Length, total)); } } }