public void SetWaveData(byte[] data) { if (data == null || data.Length == 0) { lock (lockObj) { this.data = new float[0]; } return; } var samples = new List <float>(); using (var stream = new MemoryStream(data)) { using (var waveFileReader = new WaveFileReader(stream)) { if (waveFileReader.WaveFormat.SampleRate != 44100) { throw new Exception($"SampleRate {waveFileReader.WaveFormat.SampleRate}"); } ISampleProvider sampleProvider = null; switch (waveFileReader.WaveFormat.BitsPerSample) { case 8: sampleProvider = new Pcm8BitToSampleProvider(waveFileReader); break; case 16: sampleProvider = new Pcm16BitToSampleProvider(waveFileReader); break; case 24: sampleProvider = new Pcm24BitToSampleProvider(waveFileReader); break; case 32: sampleProvider = new Pcm32BitToSampleProvider(waveFileReader); break; default: throw new Exception($"Unexpected bits per sample {waveFileReader.WaveFormat.BitsPerSample}"); } if (waveFileReader.WaveFormat.Channels == 2) { sampleProvider = sampleProvider.ToMono(1, 0); } else if (waveFileReader.WaveFormat.Channels != 1) { throw new Exception($"Unexpected channel count {waveFileReader.WaveFormat.Channels}"); } var buffer = new float[sampleProvider.WaveFormat.SampleRate]; int n; while ((n = sampleProvider.Read(buffer, 0, buffer.Length)) > 0) { samples.AddRange(buffer.Take(n)); } } } lock (lockObj) { this.data = samples.ToArray(); ApplyEnvelope(this.data, envelope); } }
public override float[] ReadMonoFromFile(string pathToFile, int sampleRate, int secondsToRead, int startAtSecond) { using (var reader = new MediaFoundationReader(pathToFile)) { int actualSampleRate = reader.WaveFormat.SampleRate; int bitsPerSample = reader.WaveFormat.BitsPerSample; reader.Seek(actualSampleRate * bitsPerSample / 8 * startAtSecond, System.IO.SeekOrigin.Begin); using (var resampler = new MediaFoundationResampler(reader, WaveFormat.CreateIeeeFloatWaveFormat(sampleRate, 1))) { float[] buffer = new float[sampleRate * 20]; // 20 seconds buffer List <float[]> chunks = new List <float[]>(); int totalFloatsToRead = secondsToRead == 0 ? int.MaxValue : secondsToRead * sampleRate; int totalFloatsRead = 0; Pcm32BitToSampleProvider pcmReader = new Pcm32BitToSampleProvider(resampler); while (totalFloatsRead < totalFloatsToRead) { // get re-sampled/mono data int floatsRead = pcmReader.Read(buffer, 0, buffer.Length); if (floatsRead == 0) { break; } totalFloatsRead += floatsRead; float[] chunk; if (totalFloatsRead > totalFloatsToRead) { chunk = new float[(totalFloatsToRead - (totalFloatsRead - floatsRead))]; Array.Copy(buffer, chunk, totalFloatsToRead - (totalFloatsRead - floatsRead)); } else { chunk = new float[floatsRead]; // each float contains 4 bytes Array.Copy(buffer, chunk, floatsRead); } chunks.Add(chunk); } if (totalFloatsRead < (secondsToRead * sampleRate)) { return(null); /*not enough samples to return the requested data*/ } float[] data = ConcatenateChunksOfSamples(chunks); return(data); } } }
public override float[] ReadMonoFromFile(string pathToFile, int sampleRate, int secondsToRead, int startAtSecond) { using (var reader = new MediaFoundationReader(pathToFile)) { int actualSampleRate = reader.WaveFormat.SampleRate; int bitsPerSample = reader.WaveFormat.BitsPerSample; reader.Seek(actualSampleRate * bitsPerSample / 8 * startAtSecond, System.IO.SeekOrigin.Begin); using (var resampler = new MediaFoundationResampler(reader, WaveFormat.CreateIeeeFloatWaveFormat(sampleRate, 1))) { float[] buffer = new float[sampleRate * 20]; // 20 seconds buffer List<float[]> chunks = new List<float[]>(); int totalFloatsToRead = secondsToRead == 0 ? int.MaxValue : secondsToRead * sampleRate; int totalFloatsRead = 0; Pcm32BitToSampleProvider pcmReader = new Pcm32BitToSampleProvider(resampler); while (totalFloatsRead < totalFloatsToRead) { // get re-sampled/mono data int floatsRead = pcmReader.Read(buffer, 0, buffer.Length); if (floatsRead == 0) { break; } totalFloatsRead += floatsRead; float[] chunk; if (totalFloatsRead > totalFloatsToRead) { chunk = new float[(totalFloatsToRead - (totalFloatsRead - floatsRead))]; Array.Copy(buffer, chunk, totalFloatsToRead - (totalFloatsRead - floatsRead)); } else { chunk = new float[floatsRead]; // each float contains 4 bytes Array.Copy(buffer, chunk, floatsRead); } chunks.Add(chunk); } if (totalFloatsRead < (secondsToRead * sampleRate)) { return null; /*not enough samples to return the requested data*/ } float[] data = ConcatenateChunksOfSamples(chunks); return data; } } }
public static MemorySampleProvider FromStream(Stream stream) { using (var waveProvider = new WaveFileReader(stream)) { ISampleProvider sampleProvider = null; switch (waveProvider.WaveFormat.BitsPerSample) { case 8: sampleProvider = new Pcm8BitToSampleProvider(waveProvider); break; case 16: sampleProvider = new Pcm16BitToSampleProvider(waveProvider); break; case 24: sampleProvider = new Pcm24BitToSampleProvider(waveProvider); break; case 32: sampleProvider = new Pcm32BitToSampleProvider(waveProvider); break; default: Log.Error($"Unknown PCM bits per sample {waveProvider.WaveFormat.BitsPerSample}"); return(null); } var format = sampleProvider.WaveFormat; var samples = new List <float>(); var buffer = new float[format.SampleRate]; var n = 0; while ((n = sampleProvider.Read(buffer, 0, buffer.Length)) > 0) { samples.AddRange(buffer.Take(n)); } var data = samples.ToArray(); return(new MemorySampleProvider() { WaveFormat = format, data = data, }); } }