public static byte[] Resample(this WaveFormat waveFormat, byte[] data, WaveFormat outputFormat) { if (waveFormat.Equals(outputFormat)) { return(data); } if (outputFormat.Encoding != WaveFormatEncoding.IeeeFloat) { throw new NotSupportedException("Only float supported."); } if (outputFormat.Channels > 1) { throw new NotSupportedException("Only mono supported."); } var sampleProvider = waveFormat.GetSampleProvider(data); if (waveFormat.Channels > 1) { sampleProvider = new StereoToMonoSampleProvider(sampleProvider); } var numSamples = waveFormat.SampleRate; var buffer = new float[numSamples]; var samples = new List <float>(); var samplesRead = sampleProvider.Read(buffer, 0, buffer.Length); while (samplesRead > 0) { var floats = samplesRead == buffer.Length ? buffer : buffer.Take(samplesRead).ToArray(); samples.AddRange(floats); samplesRead = sampleProvider.Read(buffer, 0, buffer.Length); } buffer = samples.Resampled(waveFormat.SampleRate, outputFormat.SampleRate); var output = new byte[buffer.Length * sizeof(float)]; var waveBuffer = new WaveBuffer(output); for (var i = 0; i < buffer.Length; i++) { waveBuffer.FloatBuffer[i] = buffer[i]; } return(output); }
public PeakInfo[] Sample(WaveFormat waveFormat, byte[] data) { var sampleProvider = waveFormat.GetSampleProvider(data); var numSamples = waveFormat.SampleRate * waveFormat.Channels / PeaksPerSecond; var samples = new float[numSamples]; var peaks = new List <PeakInfo>(); var samplesRead = sampleProvider.Read(samples, 0, samples.Length); // only full buffers, so we get "exactly" #PeaksPerSecond peaks while (samplesRead > 0) { var floats = samplesRead == samples.Length ? samples : samples.Take(samplesRead).ToArray(); var peak = GetPeaks(waveFormat, floats); peaks.Add(peak); samplesRead = sampleProvider.Read(samples, 0, samples.Length); } return(peaks.ToArray()); }