diff --git a/NAudio.Extras/CachedSound.cs b/NAudio.Extras/CachedSound.cs index 19beca51..cf612d5d 100644 --- a/NAudio.Extras/CachedSound.cs +++ b/NAudio.Extras/CachedSound.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.IO; using System.Linq; using NAudio.Wave; @@ -9,23 +10,48 @@ namespace NAudio.Extras /// public class CachedSound { - public float[] AudioData { get; } - public WaveFormat WaveFormat { get; } + public float[] AudioData { get; protected set; } + public WaveFormat WaveFormat { get; protected set; } public CachedSound(string audioFileName) { using (var audioFileReader = new AudioFileReader(audioFileName)) { - // TODO: could add resampling in here if required - WaveFormat = audioFileReader.WaveFormat; - var wholeFile = new List((int)(audioFileReader.Length / 4)); - var readBuffer = new float[audioFileReader.WaveFormat.SampleRate * audioFileReader.WaveFormat.Channels]; - int samplesRead; - while ((samplesRead = audioFileReader.Read(readBuffer, 0, readBuffer.Length)) > 0) - { - wholeFile.AddRange(readBuffer.Take(samplesRead)); - } - AudioData = wholeFile.ToArray(); + Init(audioFileReader); } } + + public CachedSound(Stream sound) + { + + using (var audioFileReader = new WaveFileReader(sound)) + { + Init(audioFileReader); + } + } + + protected void Init(WaveStream waveStream) + { + if (!(waveStream is ISampleProvider sampleProvider)) + { + sampleProvider = waveStream.ToSampleProvider(); + } + + // TODO: could add resampling in here if required + WaveFormat = sampleProvider.WaveFormat; + var wholeFile = new List((int)(waveStream.Length / 4)); + var readBuffer = new float[WaveFormat.SampleRate * WaveFormat.Channels]; + int samplesRead; + while ((samplesRead = sampleProvider.Read(readBuffer, 0, readBuffer.Length)) > 0) + { + wholeFile.AddRange(readBuffer.Take(samplesRead)); + } + AudioData = wholeFile.ToArray(); + + } + + protected CachedSound() + { + // no-op but makes this easier on subclasses + } } } \ No newline at end of file